diff options
289 files changed, 7418 insertions, 3371 deletions
diff --git a/Android.bp b/Android.bp index 8b53bf1685c1..acd3b34d4e7b 100644 --- a/Android.bp +++ b/Android.bp @@ -25,6 +25,18 @@ // // READ ME: ######################################################## +// TODO(b/21090328): Remove filter after we are ready to. +soong_config_module_type { + name: "java_library_with_nonpublic_deps", + module_type: "java_library", + config_namespace: "ANDROID", + bool_variables: ["include_nonpublic_framework_api"], + properties: [ + "static_libs", + "libs", + ], +} + package { default_applicable_licenses: ["frameworks_base_license"], } @@ -142,7 +154,7 @@ filegroup { ], } -java_library { +java_library_with_nonpublic_deps { name: "framework-updatable-stubs-module_libs_api", static_libs: [ "android.net.ipsec.ike.stubs.module_lib", @@ -161,11 +173,18 @@ java_library { "framework-uwb.stubs.module_lib", "framework-wifi.stubs.module_lib", ], + soong_config_variables: { + include_nonpublic_framework_api: { + static_libs: [ + "framework-supplementalapi.stubs.module_lib", + ], + }, + }, sdk_version: "module_current", visibility: ["//visibility:private"], } -java_library { +java_library_with_nonpublic_deps { name: "framework-all", installable: false, static_libs: [ @@ -186,6 +205,13 @@ java_library { "framework-wifi.impl", "updatable-media", ], + soong_config_variables: { + include_nonpublic_framework_api: { + static_libs: [ + "framework-supplementalapi.stubs.module_lib", + ], + }, + }, apex_available: ["//apex_available:platform"], sdk_version: "core_platform", visibility: [ diff --git a/StubLibraries.bp b/StubLibraries.bp index 3b11036495c8..9543fbd38a73 100644 --- a/StubLibraries.bp +++ b/StubLibraries.bp @@ -23,6 +23,14 @@ // and comparing them against the checked in API signature, and also checking compatibility // with the latest frozen API signature. +// TODO(b/21090328): Remove filter after we are ready to. +soong_config_module_type_import { + from: "frameworks/base/Android.bp", + module_types: [ + "java_library_with_nonpublic_deps", + ], +} + ///////////////////////////////////////////////////////////////////// // Common metalava configs ///////////////////////////////////////////////////////////////////// @@ -299,21 +307,35 @@ java_defaults { visibility: ["//visibility:private"], } -java_library { +java_library_with_nonpublic_deps { name: "android-non-updatable.stubs", defaults: ["android-non-updatable_defaults_stubs_current"], srcs: [":api-stubs-docs-non-updatable"], libs: modules_public_stubs, + soong_config_variables: { + include_nonpublic_framework_api: { + libs: [ + "framework-supplementalapi.stubs", + ], + }, + }, dist: { dir: "apistubs/android/public", }, } -java_library { +java_library_with_nonpublic_deps { name: "android-non-updatable.stubs.system", defaults: ["android-non-updatable_defaults_stubs_current"], srcs: [":system-api-stubs-docs-non-updatable"], libs: modules_system_stubs, + soong_config_variables: { + include_nonpublic_framework_api: { + libs: [ + "framework-supplementalapi.stubs", + ], + }, + }, dist: { dir: "apistubs/android/system", }, @@ -334,11 +356,18 @@ java_library { }, } -java_library { +java_library_with_nonpublic_deps { name: "android-non-updatable.stubs.test", defaults: ["android-non-updatable_defaults_stubs_current"], srcs: [":test-api-stubs-docs-non-updatable"], libs: modules_system_stubs, + soong_config_variables: { + include_nonpublic_framework_api: { + libs: [ + "framework-supplementalapi.stubs", + ], + }, + }, dist: { dir: "apistubs/android/test", }, @@ -357,21 +386,35 @@ java_defaults { defaults_visibility: ["//frameworks/base/services"], } -java_library { +java_library_with_nonpublic_deps { name: "android_stubs_current", static_libs: modules_public_stubs + [ "android-non-updatable.stubs", "private-stub-annotations-jar", ], + soong_config_variables: { + include_nonpublic_framework_api: { + static_libs: [ + "framework-supplementalapi.stubs", + ], + }, + }, defaults: ["android.jar_defaults"], } -java_library { +java_library_with_nonpublic_deps { name: "android_system_stubs_current", static_libs: modules_system_stubs + [ "android-non-updatable.stubs.system", "private-stub-annotations-jar", ], + soong_config_variables: { + include_nonpublic_framework_api: { + static_libs: [ + "framework-supplementalapi.stubs", + ], + }, + }, defaults: [ "android.jar_defaults", "android_stubs_dists_default", @@ -392,7 +435,7 @@ java_library { ], } -java_library { +java_library_with_nonpublic_deps { name: "android_test_stubs_current", // Modules do not have test APIs, but we want to include their SystemApis, like we include // the SystemApi of framework-non-updatable-sources. @@ -400,6 +443,13 @@ java_library { "android-non-updatable.stubs.test", "private-stub-annotations-jar", ], + soong_config_variables: { + include_nonpublic_framework_api: { + static_libs: [ + "framework-supplementalapi.stubs", + ], + }, + }, defaults: [ "android.jar_defaults", "android_stubs_dists_default", diff --git a/core/api/current.txt b/core/api/current.txt index 69c425927bbd..4fb42f2fc2fc 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -1420,6 +1420,7 @@ package android { field public static final int supportsMultipleDisplays = 16844182; // 0x1010596 field public static final int supportsPictureInPicture = 16844023; // 0x10104f7 field public static final int supportsRtl = 16843695; // 0x10103af + field public static final int supportsStylusHandwriting; field public static final int supportsSwitchingToNextInputMethod = 16843755; // 0x10103eb field public static final int supportsUploading = 16843419; // 0x101029b field public static final int suppressesSpellChecker = 16844355; // 0x1010643 @@ -10249,6 +10250,7 @@ package android.content { method @Nullable public String getPackageName(); method public int getUid(); method public boolean isTrusted(@NonNull android.content.Context); + method @NonNull public static android.content.AttributionSource myAttributionSource(); method public void writeToParcel(@NonNull android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.content.AttributionSource> CREATOR; } @@ -16589,6 +16591,26 @@ package android.graphics { method public boolean setUseCompositingLayer(boolean, @Nullable android.graphics.Paint); } + public class RuntimeShader extends android.graphics.Shader { + ctor public RuntimeShader(@NonNull String); + ctor public RuntimeShader(@NonNull String, boolean); + method public boolean isForceOpaque(); + method public void setColorUniform(@NonNull String, @ColorInt int); + method public void setColorUniform(@NonNull String, @ColorLong long); + method public void setColorUniform(@NonNull String, @NonNull android.graphics.Color); + method public void setFloatUniform(@NonNull String, float); + method public void setFloatUniform(@NonNull String, float, float); + method public void setFloatUniform(@NonNull String, float, float, float); + method public void setFloatUniform(@NonNull String, float, float, float, float); + method public void setFloatUniform(@NonNull String, @NonNull float[]); + method public void setInputShader(@NonNull String, @NonNull android.graphics.Shader); + method public void setIntUniform(@NonNull String, int); + method public void setIntUniform(@NonNull String, int, int); + method public void setIntUniform(@NonNull String, int, int, int); + method public void setIntUniform(@NonNull String, int, int, int, int); + method public void setIntUniform(@NonNull String, @NonNull int[]); + } + public class Shader { ctor @Deprecated public Shader(); method public boolean getLocalMatrix(@NonNull android.graphics.Matrix); @@ -26126,11 +26148,14 @@ package android.media.tv { field public static final String COLUMN_INTERNAL_PROVIDER_FLAG2 = "internal_provider_flag2"; field public static final String COLUMN_INTERNAL_PROVIDER_FLAG3 = "internal_provider_flag3"; field public static final String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4"; + field public static final String COLUMN_INTERNAL_PROVIDER_ID = "internal_provider_id"; field public static final String COLUMN_LONG_DESCRIPTION = "long_description"; + field public static final String COLUMN_MULTI_SERIES_ID = "multi_series_id"; field public static final String COLUMN_POSTER_ART_URI = "poster_art_uri"; field public static final String COLUMN_RECORDING_PROHIBITED = "recording_prohibited"; field public static final String COLUMN_REVIEW_RATING = "review_rating"; field public static final String COLUMN_REVIEW_RATING_STYLE = "review_rating_style"; + field public static final String COLUMN_SCRAMBLED = "scrambled"; field public static final String COLUMN_SEARCHABLE = "searchable"; field public static final String COLUMN_SEASON_DISPLAY_NUMBER = "season_display_number"; field @Deprecated public static final String COLUMN_SEASON_NUMBER = "season_number"; @@ -26190,7 +26215,9 @@ package android.media.tv { field public static final String COLUMN_INTERNAL_PROVIDER_FLAG2 = "internal_provider_flag2"; field public static final String COLUMN_INTERNAL_PROVIDER_FLAG3 = "internal_provider_flag3"; field public static final String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4"; + field public static final String COLUMN_INTERNAL_PROVIDER_ID = "internal_provider_id"; field public static final String COLUMN_LONG_DESCRIPTION = "long_description"; + field public static final String COLUMN_MULTI_SERIES_ID = "multi_series_id"; field public static final String COLUMN_POSTER_ART_URI = "poster_art_uri"; field public static final String COLUMN_RECORDING_DATA_BYTES = "recording_data_bytes"; field public static final String COLUMN_RECORDING_DATA_URI = "recording_data_uri"; @@ -27305,13 +27332,11 @@ package android.net { method @NonNull public android.net.VpnService.Builder addDnsServer(@NonNull java.net.InetAddress); method @NonNull public android.net.VpnService.Builder addDnsServer(@NonNull String); method @NonNull public android.net.VpnService.Builder addRoute(@NonNull java.net.InetAddress, int); - method @NonNull public android.net.VpnService.Builder addRoute(@NonNull android.net.IpPrefix); method @NonNull public android.net.VpnService.Builder addRoute(@NonNull String, int); method @NonNull public android.net.VpnService.Builder addSearchDomain(@NonNull String); method @NonNull public android.net.VpnService.Builder allowBypass(); method @NonNull public android.net.VpnService.Builder allowFamily(int); method @Nullable public android.os.ParcelFileDescriptor establish(); - method @NonNull public android.net.VpnService.Builder excludeRoute(@NonNull android.net.IpPrefix); method @NonNull public android.net.VpnService.Builder setBlocking(boolean); method @NonNull public android.net.VpnService.Builder setConfigureIntent(@NonNull android.app.PendingIntent); method @NonNull public android.net.VpnService.Builder setHttpProxy(@NonNull android.net.ProxyInfo); @@ -41451,6 +41476,7 @@ package android.telephony { field public static final String KEY_CDMA_NONROAMING_NETWORKS_STRING_ARRAY = "cdma_nonroaming_networks_string_array"; field public static final String KEY_CDMA_ROAMING_MODE_INT = "cdma_roaming_mode_int"; field public static final String KEY_CDMA_ROAMING_NETWORKS_STRING_ARRAY = "cdma_roaming_networks_string_array"; + field public static final String KEY_CELLULAR_USAGE_SETTING_INT = "cellular_usage_setting_int"; field public static final String KEY_CHECK_PRICING_WITH_CARRIER_FOR_DATA_ROAMING_BOOL = "check_pricing_with_carrier_data_roaming_bool"; field public static final String KEY_CI_ACTION_ON_SYS_UPDATE_BOOL = "ci_action_on_sys_update_bool"; field public static final String KEY_CI_ACTION_ON_SYS_UPDATE_EXTRA_STRING = "ci_action_on_sys_update_extra_string"; @@ -43067,6 +43093,7 @@ package android.telephony { method public int getSimSlotIndex(); method public int getSubscriptionId(); method public int getSubscriptionType(); + method public int getUsageSetting(); method public boolean isEmbedded(); method public boolean isOpportunistic(); method public void writeToParcel(android.os.Parcel, int); @@ -43141,6 +43168,10 @@ package android.telephony { field public static final int PHONE_NUMBER_SOURCE_UICC = 1; // 0x1 field public static final int SUBSCRIPTION_TYPE_LOCAL_SIM = 0; // 0x0 field public static final int SUBSCRIPTION_TYPE_REMOTE_SIM = 1; // 0x1 + field public static final int USAGE_SETTING_DATA_CENTRIC = 2; // 0x2 + field public static final int USAGE_SETTING_DEFAULT = 0; // 0x0 + field public static final int USAGE_SETTING_UNKNOWN = -1; // 0xffffffff + field public static final int USAGE_SETTING_VOICE_CENTRIC = 1; // 0x1 } public static class SubscriptionManager.OnOpportunisticSubscriptionsChangedListener { @@ -52834,6 +52865,7 @@ package android.view.inputmethod { method public android.graphics.drawable.Drawable loadIcon(android.content.pm.PackageManager); method public CharSequence loadLabel(android.content.pm.PackageManager); method public boolean shouldShowInInputMethodPicker(); + method public boolean supportsStylusHandwriting(); method public boolean suppressesSpellChecker(); method public void writeToParcel(android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.view.inputmethod.InputMethodInfo> CREATOR; diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 4aee6ccd091f..99e47b1c6b90 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -311,6 +311,7 @@ package android { field public static final String TV_VIRTUAL_REMOTE_CONTROLLER = "android.permission.TV_VIRTUAL_REMOTE_CONTROLLER"; field public static final String UNLIMITED_SHORTCUTS_API_CALLS = "android.permission.UNLIMITED_SHORTCUTS_API_CALLS"; field public static final String UPDATE_APP_OPS_STATS = "android.permission.UPDATE_APP_OPS_STATS"; + field public static final String UPDATE_DEVICE_MANAGEMENT_RESOURCES = "android.permission.UPDATE_DEVICE_MANAGEMENT_RESOURCES"; field public static final String UPDATE_DOMAIN_VERIFICATION_USER_SELECTION = "android.permission.UPDATE_DOMAIN_VERIFICATION_USER_SELECTION"; field public static final String UPDATE_FONTS = "android.permission.UPDATE_FONTS"; field public static final String UPDATE_LOCK = "android.permission.UPDATE_LOCK"; @@ -9302,6 +9303,7 @@ package android.os { method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public void setUserIcon(@NonNull android.graphics.Bitmap) throws android.os.UserManager.UserOperationException; method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public void setUserName(@Nullable String); method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.CREATE_USERS}) public boolean someUserHasAccount(@NonNull String, @NonNull String); + field @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public static final String ACTION_CREATE_SUPERVISED_USER = "android.os.action.CREATE_SUPERVISED_USER"; field public static final String ACTION_USER_RESTRICTIONS_CHANGED = "android.os.action.USER_RESTRICTIONS_CHANGED"; field @Deprecated public static final String DISALLOW_OEM_UNLOCK = "no_oem_unlock"; field public static final String DISALLOW_RUN_IN_BACKGROUND = "no_run_in_background"; @@ -12616,6 +12618,7 @@ package android.telephony { } public class TelephonyManager { + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void addCarrierPrivilegesListener(int, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.TelephonyManager.CarrierPrivilegesListener); method @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_PHONE_STATE, android.Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION}) @WorkerThread public void bootstrapAuthenticationRequest(int, @NonNull android.net.Uri, @NonNull android.telephony.gba.UaSecurityProtocolIdentifier, boolean, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.TelephonyManager.BootstrapAuthenticationCallback); method @Deprecated @RequiresPermission(android.Manifest.permission.CALL_PHONE) public void call(String, String); method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public android.telephony.PinResult changeIccLockPin(@NonNull String, @NonNull String); @@ -12684,10 +12687,14 @@ package android.telephony { method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getVoiceActivationState(); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean handlePinMmi(String); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean handlePinMmiForSubscriber(int, String); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean iccCloseLogicalChannelBySlot(int, int); - method @Nullable @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public android.telephony.IccOpenLogicalChannelResponse iccOpenLogicalChannelBySlot(int, @Nullable String, int); - method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public String iccTransmitApduBasicChannelBySlot(int, int, int, int, int, int, @Nullable String); - method @Nullable @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public String iccTransmitApduLogicalChannelBySlot(int, int, int, int, int, int, int, @Nullable String); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void iccCloseLogicalChannelByPort(int, int, int); + method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean iccCloseLogicalChannelBySlot(int, int); + method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public android.telephony.IccOpenLogicalChannelResponse iccOpenLogicalChannelByPort(int, int, @Nullable String, int); + method @Deprecated @Nullable @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public android.telephony.IccOpenLogicalChannelResponse iccOpenLogicalChannelBySlot(int, @Nullable String, int); + method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public String iccTransmitApduBasicChannelByPort(int, int, int, int, int, int, int, @Nullable String); + method @Deprecated @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public String iccTransmitApduBasicChannelBySlot(int, int, int, int, int, int, @Nullable String); + method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public String iccTransmitApduLogicalChannelByPort(int, int, int, int, int, int, int, int, @Nullable String); + method @Deprecated @Nullable @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public String iccTransmitApduLogicalChannelBySlot(int, int, int, int, int, int, int, @Nullable String); method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isAnyRadioPoweredOn(); method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isApnMetered(int); method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isApplicationOnUicc(int); @@ -12713,6 +12720,7 @@ package android.telephony { method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void notifyOtaEmergencyNumberDbInstalled(); method @RequiresPermission(android.Manifest.permission.REBOOT) public int prepareForUnattendedReboot(); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean rebootRadio(); + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void removeCarrierPrivilegesListener(@NonNull android.telephony.TelephonyManager.CarrierPrivilegesListener); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void reportDefaultNetworkStatus(boolean); method @RequiresPermission(allOf={android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.MODIFY_PHONE_STATE}) public void requestCellInfoUpdate(@NonNull android.os.WorkSource, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.TelephonyManager.CellInfoCallback); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void requestModemActivityInfo(@NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<android.telephony.ModemActivityInfo,android.telephony.TelephonyManager.ModemActivityInfoException>); @@ -12889,6 +12897,10 @@ package android.telephony { field public static final int RESULT_SUCCESS = 0; // 0x0 } + public static interface TelephonyManager.CarrierPrivilegesListener { + method public void onCarrierPrivilegesChanged(@NonNull java.util.List<java.lang.String>, @NonNull int[]); + } + public static class TelephonyManager.ModemActivityInfoException extends java.lang.Exception { method public int getErrorCode(); field public static final int ERROR_INVALID_INFO_RECEIVED = 2; // 0x2 @@ -13136,6 +13148,7 @@ package android.telephony.data { method public final int getSlotIndex(); method public final void notifyApnUnthrottled(@NonNull String); method public final void notifyDataCallListChanged(java.util.List<android.telephony.data.DataCallResponse>); + method public final void notifyDataProfileUnthrottled(@NonNull android.telephony.data.DataProfile); method public void requestDataCallList(@NonNull android.telephony.data.DataServiceCallback); method public void setDataProfile(@NonNull java.util.List<android.telephony.data.DataProfile>, boolean, @NonNull android.telephony.data.DataServiceCallback); method public void setInitialAttachApn(@NonNull android.telephony.data.DataProfile, boolean, @NonNull android.telephony.data.DataServiceCallback); @@ -13146,6 +13159,7 @@ package android.telephony.data { public class DataServiceCallback { method public void onApnUnthrottled(@NonNull String); method public void onDataCallListChanged(@NonNull java.util.List<android.telephony.data.DataCallResponse>); + method public void onDataProfileUnthrottled(@NonNull android.telephony.data.DataProfile); method public void onDeactivateDataCallComplete(int); method public void onRequestDataCallListComplete(int, @NonNull java.util.List<android.telephony.data.DataCallResponse>); method public void onSetDataProfileComplete(int); diff --git a/core/java/android/app/cloudsearch/OWNERS b/core/java/android/app/cloudsearch/OWNERS new file mode 100644 index 000000000000..aa4da3b4bee0 --- /dev/null +++ b/core/java/android/app/cloudsearch/OWNERS @@ -0,0 +1,4 @@ +# Bug component: 758286 + +huiwu@google.com +srazdan@google.com diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java index 429751215763..2d1ecfb5e052 100644 --- a/core/java/android/bluetooth/BluetoothAdapter.java +++ b/core/java/android/bluetooth/BluetoothAdapter.java @@ -797,7 +797,7 @@ public final class BluetoothAdapter { @RequiresNoPermission public static synchronized BluetoothAdapter getDefaultAdapter() { if (sAdapter == null) { - sAdapter = createAdapter(BluetoothManager.resolveAttributionSource(null)); + sAdapter = createAdapter(AttributionSource.myAttributionSource()); } return sAdapter; } diff --git a/core/java/android/bluetooth/BluetoothDevice.java b/core/java/android/bluetooth/BluetoothDevice.java index 9ff4dc3bb125..93f026860856 100644 --- a/core/java/android/bluetooth/BluetoothDevice.java +++ b/core/java/android/bluetooth/BluetoothDevice.java @@ -1177,7 +1177,7 @@ public final class BluetoothDevice implements Parcelable, Attributable { mAddress = address; mAddressType = ADDRESS_TYPE_PUBLIC; - mAttributionSource = BluetoothManager.resolveAttributionSource(null); + mAttributionSource = AttributionSource.myAttributionSource(); } /** {@hide} */ diff --git a/core/java/android/bluetooth/BluetoothManager.java b/core/java/android/bluetooth/BluetoothManager.java index c93de41b5b36..fef6f225dd3b 100644 --- a/core/java/android/bluetooth/BluetoothManager.java +++ b/core/java/android/bluetooth/BluetoothManager.java @@ -16,14 +16,10 @@ package android.bluetooth; -import android.annotation.NonNull; -import android.annotation.Nullable; import android.annotation.RequiresFeature; import android.annotation.RequiresNoPermission; import android.annotation.RequiresPermission; import android.annotation.SystemService; -import android.app.ActivityThread; -import android.app.AppGlobals; import android.bluetooth.annotations.RequiresBluetoothConnectPermission; import android.bluetooth.annotations.RequiresLegacyBluetoothPermission; import android.content.AttributionSource; @@ -68,37 +64,11 @@ public final class BluetoothManager { * @hide */ public BluetoothManager(Context context) { - mAttributionSource = resolveAttributionSource(context); + mAttributionSource = (context != null) ? context.getAttributionSource() : + AttributionSource.myAttributionSource(); mAdapter = BluetoothAdapter.createAdapter(mAttributionSource); } - /** {@hide} */ - public static @NonNull AttributionSource resolveAttributionSource(@Nullable Context context) { - AttributionSource res = null; - if (context != null) { - res = context.getAttributionSource(); - } - if (res == null) { - res = ActivityThread.currentAttributionSource(); - } - if (res == null) { - int uid = android.os.Process.myUid(); - if (uid == android.os.Process.ROOT_UID) { - uid = android.os.Process.SYSTEM_UID; - } - try { - res = new AttributionSource.Builder(uid) - .setPackageName(AppGlobals.getPackageManager().getPackagesForUid(uid)[0]) - .build(); - } catch (RemoteException ignored) { - } - } - if (res == null) { - throw new IllegalStateException("Failed to resolve AttributionSource"); - } - return res; - } - /** * Get the BLUETOOTH Adapter for this device. * diff --git a/core/java/android/content/AttributionSource.java b/core/java/android/content/AttributionSource.java index 6ae2bb5b642a..157e709a67f0 100644 --- a/core/java/android/content/AttributionSource.java +++ b/core/java/android/content/AttributionSource.java @@ -22,6 +22,7 @@ import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.annotation.TestApi; import android.app.ActivityThread; +import android.app.AppGlobals; import android.os.Binder; import android.os.Build; import android.os.IBinder; @@ -191,10 +192,42 @@ public final class AttributionSource implements Parcelable { return new ScopedParcelState(this); } - /** @hide */ - public static AttributionSource myAttributionSource() { - return new AttributionSource(Process.myUid(), ActivityThread.currentOpPackageName(), - /*attributionTag*/ null, (String[]) /*renouncedPermissions*/ null, /*next*/ null); + /** + * Returns a generic {@link AttributionSource} that represents the entire + * calling process. + * + * <p>Callers are <em>strongly</em> encouraged to use a more specific + * attribution source whenever possible, such as from + * {@link Context#getAttributionSource()}, since that enables developers to + * have more detailed and scoped control over attribution within + * sub-components of their app. + * + * @see Context#createAttributionContext(String) + * @see Context#getAttributionTag() + * @return a generic {@link AttributionSource} representing the entire + * calling process + * @throws IllegalStateException when no accurate {@link AttributionSource} + * can be determined + */ + public static @NonNull AttributionSource myAttributionSource() { + + final AttributionSource globalSource = ActivityThread.currentAttributionSource(); + if (globalSource != null) { + return globalSource; + } + + int uid = Process.myUid(); + if (uid == Process.ROOT_UID) { + uid = Process.SYSTEM_UID; + } + try { + return new AttributionSource.Builder(uid) + .setPackageName(AppGlobals.getPackageManager().getPackagesForUid(uid)[0]) + .build(); + } catch (Exception ignored) { + } + + throw new IllegalStateException("Failed to resolve AttributionSource"); } /** @@ -247,7 +280,7 @@ public final class AttributionSource implements Parcelable { * whether the attribution source is one for the calling app to prevent the caller * to pass you a source from another app without including themselves in the * attribution chain. - *f + * * @return if the attribution source cannot be trusted to be from the caller. */ public boolean checkCallingUid() { diff --git a/core/java/android/net/VpnService.java b/core/java/android/net/VpnService.java index 1ae1b050d32f..2ced05693755 100644 --- a/core/java/android/net/VpnService.java +++ b/core/java/android/net/VpnService.java @@ -41,7 +41,6 @@ import android.os.RemoteException; import android.os.ServiceManager; import android.os.UserHandle; -import com.android.internal.annotations.VisibleForTesting; import com.android.internal.net.NetworkUtilsInternal; import com.android.internal.net.VpnConfig; @@ -51,7 +50,6 @@ import java.net.Inet6Address; import java.net.InetAddress; import java.net.Socket; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Set; @@ -473,13 +471,6 @@ public class VpnService extends Service { } } - private static void checkNonPrefixBytes(@NonNull InetAddress address, int prefixLength) { - final IpPrefix prefix = new IpPrefix(address, prefixLength); - if (!prefix.getAddress().equals(address)) { - throw new IllegalArgumentException("Bad address"); - } - } - /** * Helper class to create a VPN interface. This class should be always * used within the scope of the outer {@link VpnService}. @@ -490,9 +481,9 @@ public class VpnService extends Service { private final VpnConfig mConfig = new VpnConfig(); @UnsupportedAppUsage - private final List<LinkAddress> mAddresses = new ArrayList<>(); + private final List<LinkAddress> mAddresses = new ArrayList<LinkAddress>(); @UnsupportedAppUsage - private final List<RouteInfo> mRoutes = new ArrayList<>(); + private final List<RouteInfo> mRoutes = new ArrayList<RouteInfo>(); public Builder() { mConfig.user = VpnService.this.getClass().getName(); @@ -564,6 +555,7 @@ public class VpnService extends Service { throw new IllegalArgumentException("Bad address"); } mAddresses.add(new LinkAddress(address, prefixLength)); + mConfig.updateAllowedFamilies(address); return this; } @@ -587,68 +579,28 @@ public class VpnService extends Service { * Add a network route to the VPN interface. Both IPv4 and IPv6 * routes are supported. * - * If a route with the same destination is already present, its type will be updated. - * - * @throws IllegalArgumentException if the route is invalid. - */ - @NonNull - private Builder addRoute(@NonNull IpPrefix prefix, int type) { - check(prefix.getAddress(), prefix.getPrefixLength()); - - final RouteInfo newRoute = new RouteInfo(prefix, /* gateway */ - null, /* interface */ null, type); - - final int index = findRouteIndexByDestination(newRoute); - - if (index == -1) { - mRoutes.add(newRoute); - } else { - mRoutes.set(index, newRoute); - } - - return this; - } - - /** - * Add a network route to the VPN interface. Both IPv4 and IPv6 - * routes are supported. - * * Adding a route implicitly allows traffic from that address family * (i.e., IPv4 or IPv6) to be routed over the VPN. @see #allowFamily * - * Calling this method overrides previous calls to {@link #excludeRoute} for the same - * destination. - * - * If multiple routes match the packet destination, route with the longest prefix takes - * precedence. - * * @throws IllegalArgumentException if the route is invalid. */ @NonNull public Builder addRoute(@NonNull InetAddress address, int prefixLength) { - checkNonPrefixBytes(address, prefixLength); - - return addRoute(new IpPrefix(address, prefixLength), RouteInfo.RTN_UNICAST); - } + check(address, prefixLength); - /** - * Add a network route to the VPN interface. Both IPv4 and IPv6 - * routes are supported. - * - * Adding a route implicitly allows traffic from that address family - * (i.e., IPv4 or IPv6) to be routed over the VPN. @see #allowFamily - * - * Calling this method overrides previous calls to {@link #excludeRoute} for the same - * destination. - * - * If multiple routes match the packet destination, route with the longest prefix takes - * precedence. - * - * @throws IllegalArgumentException if the route is invalid. - */ - @NonNull - public Builder addRoute(@NonNull IpPrefix prefix) { - return addRoute(prefix, RouteInfo.RTN_UNICAST); + int offset = prefixLength / 8; + byte[] bytes = address.getAddress(); + if (offset < bytes.length) { + for (bytes[offset] <<= prefixLength % 8; offset < bytes.length; ++offset) { + if (bytes[offset] != 0) { + throw new IllegalArgumentException("Bad address"); + } + } + } + mRoutes.add(new RouteInfo(new IpPrefix(address, prefixLength), null, null, + RouteInfo.RTN_UNICAST)); + mConfig.updateAllowedFamilies(address); + return this; } /** @@ -659,12 +611,6 @@ public class VpnService extends Service { * Adding a route implicitly allows traffic from that address family * (i.e., IPv4 or IPv6) to be routed over the VPN. @see #allowFamily * - * Calling this method overrides previous calls to {@link #excludeRoute} for the same - * destination. - * - * If multiple routes match the packet destination, route with the longest prefix takes - * precedence. - * * @throws IllegalArgumentException if the route is invalid. * @see #addRoute(InetAddress, int) */ @@ -674,23 +620,6 @@ public class VpnService extends Service { } /** - * Exclude a network route from the VPN interface. Both IPv4 and IPv6 - * routes are supported. - * - * Calling this method overrides previous calls to {@link #addRoute} for the same - * destination. - * - * If multiple routes match the packet destination, route with the longest prefix takes - * precedence. - * - * @throws IllegalArgumentException if the route is invalid. - */ - @NonNull - public Builder excludeRoute(@NonNull IpPrefix prefix) { - return addRoute(prefix, RouteInfo.RTN_THROW); - } - - /** * Add a DNS server to the VPN connection. Both IPv4 and IPv6 * addresses are supported. If none is set, the DNS servers of * the default network will be used. @@ -971,23 +900,5 @@ public class VpnService extends Service { throw new IllegalStateException(e); } } - - private int findRouteIndexByDestination(RouteInfo route) { - for (int i = 0; i < mRoutes.size(); i++) { - if (mRoutes.get(i).getDestination().equals(route.getDestination())) { - return i; - } - } - return -1; - } - - /** - * Method for testing, to observe mRoutes while builder is being used. - * @hide - */ - @VisibleForTesting - public List<RouteInfo> routes() { - return Collections.unmodifiableList(mRoutes); - } } } diff --git a/core/java/android/os/BatteryConsumer.java b/core/java/android/os/BatteryConsumer.java index ba9332dece26..c6071959f438 100644 --- a/core/java/android/os/BatteryConsumer.java +++ b/core/java/android/os/BatteryConsumer.java @@ -161,6 +161,7 @@ public abstract class BatteryConsumer { */ @IntDef(prefix = {"PROCESS_STATE_"}, value = { PROCESS_STATE_ANY, + PROCESS_STATE_UNSPECIFIED, PROCESS_STATE_FOREGROUND, PROCESS_STATE_BACKGROUND, PROCESS_STATE_FOREGROUND_SERVICE, @@ -169,7 +170,8 @@ public abstract class BatteryConsumer { public @interface ProcessState { } - public static final int PROCESS_STATE_ANY = 0; + public static final int PROCESS_STATE_UNSPECIFIED = 0; + public static final int PROCESS_STATE_ANY = PROCESS_STATE_UNSPECIFIED; public static final int PROCESS_STATE_FOREGROUND = 1; public static final int PROCESS_STATE_BACKGROUND = 2; public static final int PROCESS_STATE_FOREGROUND_SERVICE = 3; @@ -180,7 +182,7 @@ public abstract class BatteryConsumer { static { // Assign individually to avoid future mismatch - sProcessStateNames[PROCESS_STATE_ANY] = "any"; + sProcessStateNames[PROCESS_STATE_UNSPECIFIED] = "unspecified"; sProcessStateNames[PROCESS_STATE_FOREGROUND] = "fg"; sProcessStateNames[PROCESS_STATE_BACKGROUND] = "bg"; sProcessStateNames[PROCESS_STATE_FOREGROUND_SERVICE] = "fgs"; @@ -188,6 +190,7 @@ public abstract class BatteryConsumer { private static final int[] SUPPORTED_POWER_COMPONENTS_PER_PROCESS_STATE = { POWER_COMPONENT_CPU, + POWER_COMPONENT_MOBILE_RADIO, }; static final int COLUMN_INDEX_BATTERY_CONSUMER_TYPE = 0; @@ -213,7 +216,7 @@ public abstract class BatteryConsumer { sb.append("powerComponent=").append(sPowerComponentNames[powerComponent]); dimensionSpecified = true; } - if (processState != PROCESS_STATE_ANY) { + if (processState != PROCESS_STATE_UNSPECIFIED) { if (dimensionSpecified) { sb.append(", "); } @@ -283,7 +286,7 @@ public abstract class BatteryConsumer { if (mShortString == null) { StringBuilder sb = new StringBuilder(); sb.append(powerComponentIdToString(powerComponent)); - if (processState != PROCESS_STATE_ANY) { + if (processState != PROCESS_STATE_UNSPECIFIED) { sb.append(':'); sb.append(processStateToString(processState)); } @@ -333,7 +336,7 @@ public abstract class BatteryConsumer { * for all values of other dimensions such as process state. */ public Key getKey(@PowerComponent int componentId) { - return mData.getKey(componentId, PROCESS_STATE_ANY); + return mData.getKey(componentId, PROCESS_STATE_UNSPECIFIED); } /** @@ -352,7 +355,7 @@ public abstract class BatteryConsumer { */ public double getConsumedPower(@PowerComponent int componentId) { return mPowerComponents.getConsumedPower( - mData.getKeyOrThrow(componentId, PROCESS_STATE_ANY)); + mData.getKeyOrThrow(componentId, PROCESS_STATE_UNSPECIFIED)); } /** @@ -374,7 +377,7 @@ public abstract class BatteryConsumer { */ public @PowerModel int getPowerModel(@BatteryConsumer.PowerComponent int componentId) { return mPowerComponents.getPowerModel( - mData.getKeyOrThrow(componentId, PROCESS_STATE_ANY)); + mData.getKeyOrThrow(componentId, PROCESS_STATE_UNSPECIFIED)); } /** @@ -706,7 +709,7 @@ public abstract class BatteryConsumer { if (isSupported) { for (int processState = 0; processState < PROCESS_STATE_COUNT; processState++) { - if (processState == PROCESS_STATE_ANY) { + if (processState == PROCESS_STATE_UNSPECIFIED) { continue; } @@ -789,7 +792,7 @@ public abstract class BatteryConsumer { @NonNull public T setConsumedPower(@PowerComponent int componentId, double componentPower, @PowerModel int powerModel) { - mPowerComponentsBuilder.setConsumedPower(getKey(componentId, PROCESS_STATE_ANY), + mPowerComponentsBuilder.setConsumedPower(getKey(componentId, PROCESS_STATE_UNSPECIFIED), componentPower, powerModel); return (T) this; } @@ -825,8 +828,9 @@ public abstract class BatteryConsumer { @NonNull public T setUsageDurationMillis(@UidBatteryConsumer.PowerComponent int componentId, long componentUsageTimeMillis) { - mPowerComponentsBuilder.setUsageDurationMillis(getKey(componentId, PROCESS_STATE_ANY), - componentUsageTimeMillis); + mPowerComponentsBuilder + .setUsageDurationMillis(getKey(componentId, PROCESS_STATE_UNSPECIFIED), + componentUsageTimeMillis); return (T) this; } diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java index 584f3c43911b..fa209cc02cd1 100644 --- a/core/java/android/os/BatteryStats.java +++ b/core/java/android/os/BatteryStats.java @@ -669,7 +669,7 @@ public abstract class BatteryStats implements Parcelable { case BatteryStats.Uid.PROCESS_STATE_FOREGROUND_SERVICE: return BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE; default: - return BatteryConsumer.PROCESS_STATE_ANY; + return BatteryConsumer.PROCESS_STATE_UNSPECIFIED; } } @@ -963,6 +963,13 @@ public abstract class BatteryStats implements Parcelable { public abstract long getNetworkActivityPackets(int type, int which); @UnsupportedAppUsage public abstract long getMobileRadioActiveTime(int which); + + /** + * Returns the amount of time (in microseconds) this UID was in the specified processState. + */ + public abstract long getMobileRadioActiveTimeInProcessState( + @BatteryConsumer.ProcessState int processState); + public abstract int getMobileRadioActiveCount(int which); /** @@ -1061,6 +1068,16 @@ public abstract class BatteryStats implements Parcelable { public abstract long getMobileRadioMeasuredBatteryConsumptionUC(); /** + * Returns the battery consumption (in microcoulombs) of the uid's radio usage when in the + * specified process state. + * Will return {@link #POWER_DATA_UNAVAILABLE} if data is unavailable. + * + * {@hide} + */ + public abstract long getMobileRadioMeasuredBatteryConsumptionUC( + @BatteryConsumer.ProcessState int processState); + + /** * Returns the battery consumption (in microcoulombs) of the screen while on and uid active, * derived from on device power measurement data. * Will return {@link #POWER_DATA_UNAVAILABLE} if data is unavailable. diff --git a/core/java/android/os/BatteryUsageStats.java b/core/java/android/os/BatteryUsageStats.java index ed44fb62ee79..a23dae80625d 100644 --- a/core/java/android/os/BatteryUsageStats.java +++ b/core/java/android/os/BatteryUsageStats.java @@ -556,7 +556,7 @@ public final class BatteryUsageStats implements Parcelable, Closeable { } String label = BatteryConsumer.powerComponentIdToString(componentId); - if (key.processState != BatteryConsumer.PROCESS_STATE_ANY) { + if (key.processState != BatteryConsumer.PROCESS_STATE_UNSPECIFIED) { label = label + "(" + BatteryConsumer.processStateToString(key.processState) + ")"; } diff --git a/core/java/android/os/Binder.java b/core/java/android/os/Binder.java index e2d7847b85e9..429450ce8e5e 100644 --- a/core/java/android/os/Binder.java +++ b/core/java/android/os/Binder.java @@ -1308,10 +1308,11 @@ public class Binder implements IBinder { data.readCallingWorkSourceUid()); observer.callEnded(callSession, data.dataSize(), reply.dataSize(), workSourceUid); } + + checkParcel(this, code, reply, "Unreasonably large binder reply buffer"); + reply.recycle(); + data.recycle(); } - checkParcel(this, code, reply, "Unreasonably large binder reply buffer"); - reply.recycle(); - data.recycle(); // Just in case -- we are done with the IPC, so there should be no more strict // mode violations that have gathered for this thread. Either they have been diff --git a/core/java/android/os/PowerComponents.java b/core/java/android/os/PowerComponents.java index e8631119bbc6..590494cd3273 100644 --- a/core/java/android/os/PowerComponents.java +++ b/core/java/android/os/PowerComponents.java @@ -18,6 +18,7 @@ package android.os; import static android.os.BatteryConsumer.POWER_COMPONENT_ANY; import static android.os.BatteryConsumer.POWER_COMPONENT_COUNT; import static android.os.BatteryConsumer.PROCESS_STATE_ANY; +import static android.os.BatteryConsumer.PROCESS_STATE_UNSPECIFIED; import static android.os.BatteryConsumer.convertMahToDeciCoulombs; import android.annotation.NonNull; @@ -339,7 +340,7 @@ class PowerComponents { serializer.startTag(null, BatteryUsageStats.XML_TAG_COMPONENT); serializer.attributeInt(null, BatteryUsageStats.XML_ATTR_ID, componentId); - if (key.processState != PROCESS_STATE_ANY) { + if (key.processState != PROCESS_STATE_UNSPECIFIED) { serializer.attributeInt(null, BatteryUsageStats.XML_ATTR_PROCESS_STATE, key.processState); } @@ -398,7 +399,7 @@ class PowerComponents { switch (parser.getName()) { case BatteryUsageStats.XML_TAG_COMPONENT: { int componentId = -1; - int processState = PROCESS_STATE_ANY; + int processState = PROCESS_STATE_UNSPECIFIED; double powerMah = 0; long durationMs = 0; int model = BatteryConsumer.POWER_MODEL_UNDEFINED; diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java index 563d6cc3e07f..b3639e419a56 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -1546,6 +1546,17 @@ public class UserManager { private static final String ACTION_CREATE_USER = "android.os.action.CREATE_USER"; /** + * Action to start an activity to create a supervised user. + * Only devices with non-empty config_supervisedUserCreationPackage support this. + * + * @hide + */ + @SystemApi + @RequiresPermission(Manifest.permission.MANAGE_USERS) + public static final String ACTION_CREATE_SUPERVISED_USER = + "android.os.action.CREATE_SUPERVISED_USER"; + + /** * Extra containing a name for the user being created. Optional parameter passed to * ACTION_CREATE_USER activity. * @hide diff --git a/core/java/android/provider/Telephony.java b/core/java/android/provider/Telephony.java index a00dd514112f..e3c396976f6c 100644 --- a/core/java/android/provider/Telephony.java +++ b/core/java/android/provider/Telephony.java @@ -5453,5 +5453,12 @@ public final class Telephony { */ public static final String COLUMN_PHONE_NUMBER_SOURCE_IMS = "phone_number_source_ims"; + + /** + * TelephonyProvider column name for the device's preferred usage setting. + * + * @hide + */ + public static final String COLUMN_USAGE_SETTING = "usage_setting"; } } diff --git a/core/java/android/service/cloudsearch/OWNERS b/core/java/android/service/cloudsearch/OWNERS new file mode 100644 index 000000000000..aa4da3b4bee0 --- /dev/null +++ b/core/java/android/service/cloudsearch/OWNERS @@ -0,0 +1,4 @@ +# Bug component: 758286 + +huiwu@google.com +srazdan@google.com diff --git a/core/java/android/telephony/TelephonyRegistryManager.java b/core/java/android/telephony/TelephonyRegistryManager.java index e7f89204c1ec..9eaaa91532d0 100644 --- a/core/java/android/telephony/TelephonyRegistryManager.java +++ b/core/java/android/telephony/TelephonyRegistryManager.java @@ -36,18 +36,24 @@ import android.telephony.Annotation.PreciseDisconnectCauses; import android.telephony.Annotation.RadioPowerState; import android.telephony.Annotation.SimActivationState; import android.telephony.Annotation.SrvccState; +import android.telephony.TelephonyManager.CarrierPrivilegesListener; import android.telephony.emergency.EmergencyNumber; import android.telephony.ims.ImsReasonInfo; import android.util.ArraySet; import android.util.Log; +import com.android.internal.annotations.GuardedBy; +import com.android.internal.listeners.ListenerExecutor; +import com.android.internal.telephony.ICarrierPrivilegesListener; import com.android.internal.telephony.IOnSubscriptionsChangedListener; import com.android.internal.telephony.ITelephonyRegistry; +import java.lang.ref.WeakReference; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.WeakHashMap; import java.util.concurrent.Executor; /** @@ -1214,4 +1220,117 @@ public class TelephonyRegistryManager { listenFromCallback(false, false, subId, pkgName, attributionTag, callback, new int[0], notifyNow); } + + private static class CarrierPrivilegesListenerWrapper extends ICarrierPrivilegesListener.Stub + implements ListenerExecutor { + private final WeakReference<CarrierPrivilegesListener> mListener; + private final Executor mExecutor; + + CarrierPrivilegesListenerWrapper(CarrierPrivilegesListener listener, Executor executor) { + mListener = new WeakReference<>(listener); + mExecutor = executor; + } + + @Override + public void onCarrierPrivilegesChanged( + List<String> privilegedPackageNames, int[] privilegedUids) { + Binder.withCleanCallingIdentity( + () -> + executeSafely( + mExecutor, + mListener::get, + cpl -> + cpl.onCarrierPrivilegesChanged( + privilegedPackageNames, privilegedUids))); + } + } + + @GuardedBy("sCarrierPrivilegeListeners") + private static final WeakHashMap< + CarrierPrivilegesListener, WeakReference<CarrierPrivilegesListenerWrapper>> + sCarrierPrivilegeListeners = new WeakHashMap<>(); + + /** + * Registers a {@link CarrierPrivilegesListener} on the given {@code logicalSlotIndex} to + * receive callbacks when the set of packages with carrier privileges changes. The callback will + * immediately be called with the latest state. + * + * @param logicalSlotIndex The SIM slot to listen on + * @param executor The executor where {@code listener} will be invoked + * @param listener The callback to register + */ + public void addCarrierPrivilegesListener( + int logicalSlotIndex, + @NonNull @CallbackExecutor Executor executor, + @NonNull CarrierPrivilegesListener listener) { + if (listener == null || executor == null) { + throw new IllegalArgumentException("listener and executor must be non-null"); + } + synchronized (sCarrierPrivilegeListeners) { + WeakReference<CarrierPrivilegesListenerWrapper> existing = + sCarrierPrivilegeListeners.get(listener); + if (existing != null && existing.get() != null) { + Log.d(TAG, "addCarrierPrivilegesListener: listener already registered"); + return; + } + CarrierPrivilegesListenerWrapper wrapper = + new CarrierPrivilegesListenerWrapper(listener, executor); + sCarrierPrivilegeListeners.put(listener, new WeakReference<>(wrapper)); + try { + sRegistry.addCarrierPrivilegesListener( + logicalSlotIndex, + wrapper, + mContext.getOpPackageName(), + mContext.getAttributionTag()); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + } + + /** + * Unregisters a {@link CarrierPrivilegesListener}. + * + * @param listener The callback to unregister + */ + public void removeCarrierPrivilegesListener(@NonNull CarrierPrivilegesListener listener) { + if (listener == null) { + throw new IllegalArgumentException("listener must be non-null"); + } + synchronized (sCarrierPrivilegeListeners) { + WeakReference<CarrierPrivilegesListenerWrapper> ref = + sCarrierPrivilegeListeners.remove(listener); + if (ref == null) return; + CarrierPrivilegesListenerWrapper wrapper = ref.get(); + if (wrapper == null) return; + try { + sRegistry.removeCarrierPrivilegesListener(wrapper, mContext.getOpPackageName()); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + } + + /** + * Notify listeners that the set of packages with carrier privileges has changed. + * + * @param logicalSlotIndex The SIM slot the change occurred on + * @param privilegedPackageNames The updated set of packages names with carrier privileges + * @param privilegedUids The updated set of UIDs with carrier privileges + */ + public void notifyCarrierPrivilegesChanged( + int logicalSlotIndex, + @NonNull List<String> privilegedPackageNames, + @NonNull int[] privilegedUids) { + if (privilegedPackageNames == null || privilegedUids == null) { + throw new IllegalArgumentException( + "privilegedPackageNames and privilegedUids must be non-null"); + } + try { + sRegistry.notifyCarrierPrivilegesChanged( + logicalSlotIndex, privilegedPackageNames, privilegedUids); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } } diff --git a/core/java/android/view/MotionEvent.java b/core/java/android/view/MotionEvent.java index adb8b86493d5..8db62f6553eb 100644 --- a/core/java/android/view/MotionEvent.java +++ b/core/java/android/view/MotionEvent.java @@ -1872,7 +1872,7 @@ public final class MotionEvent extends InputEvent implements Parcelable { float x, float y, float pressure, float size, int metaState, float xPrecision, float yPrecision, int deviceId, int edgeFlags) { return obtain(downTime, eventTime, action, x, y, pressure, size, metaState, - xPrecision, yPrecision, deviceId, edgeFlags, InputDevice.SOURCE_UNKNOWN, + xPrecision, yPrecision, deviceId, edgeFlags, InputDevice.SOURCE_CLASS_POINTER, DEFAULT_DISPLAY); } diff --git a/core/java/android/view/ViewDebug.java b/core/java/android/view/ViewDebug.java index 07d5fc533a3a..25e0eca12bf3 100644 --- a/core/java/android/view/ViewDebug.java +++ b/core/java/android/view/ViewDebug.java @@ -1896,7 +1896,7 @@ public class ViewDebug { private Canvas mCanvas; private Bitmap mBitmap; - private boolean mEnabledHwBitmapsInSwMode; + private boolean mEnabledHwFeaturesInSwMode; @Override public Canvas getCanvas(View view, int width, int height) { @@ -1913,7 +1913,7 @@ public class ViewDebug { if (mCanvas == null) { mCanvas = new Canvas(); } - mEnabledHwBitmapsInSwMode = mCanvas.isHwBitmapsInSwModeEnabled(); + mEnabledHwFeaturesInSwMode = mCanvas.isHwFeaturesInSwModeEnabled(); mCanvas.setBitmap(mBitmap); return mCanvas; } @@ -1921,7 +1921,7 @@ public class ViewDebug { @Override public Bitmap createBitmap() { mCanvas.setBitmap(null); - mCanvas.setHwBitmapsInSwModeEnabled(mEnabledHwBitmapsInSwMode); + mCanvas.setHwFeaturesInSwModeEnabled(mEnabledHwFeaturesInSwMode); return mBitmap; } } diff --git a/core/java/android/view/inputmethod/InputMethodInfo.java b/core/java/android/view/inputmethod/InputMethodInfo.java index 96198c64fa56..7e6e6fd23654 100644 --- a/core/java/android/view/inputmethod/InputMethodInfo.java +++ b/core/java/android/view/inputmethod/InputMethodInfo.java @@ -141,6 +141,12 @@ public final class InputMethodInfo implements Parcelable { private final int mHandledConfigChanges; /** + * The flag whether this IME supports Handwriting using stylus input. + */ + private final boolean mSupportsStylusHandwriting; + + + /** * @param service the {@link ResolveInfo} corresponds in which the IME is implemented. * @return a unique ID to be returned by {@link #getId()}. We have used * {@link ComponentName#flattenToShortString()} for this purpose (and it is already @@ -234,6 +240,8 @@ public final class InputMethodInfo implements Parcelable { com.android.internal.R.styleable.InputMethod_showInInputMethodPicker, true); mHandledConfigChanges = sa.getInt( com.android.internal.R.styleable.InputMethod_configChanges, 0); + mSupportsStylusHandwriting = sa.getBoolean( + com.android.internal.R.styleable.InputMethod_supportsStylusHandwriting, false); sa.recycle(); final int depth = parser.getDepth(); @@ -323,6 +331,7 @@ public final class InputMethodInfo implements Parcelable { mService = ResolveInfo.CREATOR.createFromParcel(source); mSubtypes = new InputMethodSubtypeArray(source); mHandledConfigChanges = source.readInt(); + mSupportsStylusHandwriting = source.readBoolean(); mForceDefault = false; } @@ -335,7 +344,7 @@ public final class InputMethodInfo implements Parcelable { settingsActivity, null /* subtypes */, 0 /* isDefaultResId */, false /* forceDefault */, true /* supportsSwitchingToNextInputMethod */, false /* inlineSuggestionsEnabled */, false /* isVrOnly */, - 0 /* handledConfigChanges */); + 0 /* handledConfigChanges */, false /* supportsStylusHandwriting */); } /** @@ -349,7 +358,8 @@ public final class InputMethodInfo implements Parcelable { this(buildFakeResolveInfo(packageName, className, label), false /* isAuxIme */, settingsActivity, null /* subtypes */, 0 /* isDefaultResId */, false /* forceDefault */, true /* supportsSwitchingToNextInputMethod */, - false /* inlineSuggestionsEnabled */, false /* isVrOnly */, handledConfigChanges); + false /* inlineSuggestionsEnabled */, false /* isVrOnly */, handledConfigChanges, + false /* supportsStylusHandwriting */); } /** @@ -361,7 +371,8 @@ public final class InputMethodInfo implements Parcelable { boolean forceDefault) { this(ri, isAuxIme, settingsActivity, subtypes, isDefaultResId, forceDefault, true /* supportsSwitchingToNextInputMethod */, false /* inlineSuggestionsEnabled */, - false /* isVrOnly */, 0 /* handledconfigChanges */); + false /* isVrOnly */, 0 /* handledconfigChanges */, + false /* supportsStylusHandwriting */); } /** @@ -373,7 +384,7 @@ public final class InputMethodInfo implements Parcelable { boolean supportsSwitchingToNextInputMethod, boolean isVrOnly) { this(ri, isAuxIme, settingsActivity, subtypes, isDefaultResId, forceDefault, supportsSwitchingToNextInputMethod, false /* inlineSuggestionsEnabled */, isVrOnly, - 0 /* handledConfigChanges */); + 0 /* handledConfigChanges */, false /* supportsStylusHandwriting */); } /** @@ -383,7 +394,7 @@ public final class InputMethodInfo implements Parcelable { public InputMethodInfo(ResolveInfo ri, boolean isAuxIme, String settingsActivity, List<InputMethodSubtype> subtypes, int isDefaultResId, boolean forceDefault, boolean supportsSwitchingToNextInputMethod, boolean inlineSuggestionsEnabled, - boolean isVrOnly, int handledConfigChanges) { + boolean isVrOnly, int handledConfigChanges, boolean supportsStylusHandwriting) { final ServiceInfo si = ri.serviceInfo; mService = ri; mId = new ComponentName(si.packageName, si.name).flattenToShortString(); @@ -398,6 +409,7 @@ public final class InputMethodInfo implements Parcelable { mShowInInputMethodPicker = true; mIsVrOnly = isVrOnly; mHandledConfigChanges = handledConfigChanges; + mSupportsStylusHandwriting = supportsStylusHandwriting; } private static ResolveInfo buildFakeResolveInfo(String packageName, String className, @@ -556,6 +568,14 @@ public final class InputMethodInfo implements Parcelable { return mHandledConfigChanges; } + /** + * Returns if IME supports handwriting using stylus input. + * @attr ref android.R.styleable#InputMethod_supportsStylusHandwriting + */ + public boolean supportsStylusHandwriting() { + return mSupportsStylusHandwriting; + } + public void dump(Printer pw, String prefix) { pw.println(prefix + "mId=" + mId + " mSettingsActivityName=" + mSettingsActivityName @@ -563,7 +583,8 @@ public final class InputMethodInfo implements Parcelable { + " mSupportsSwitchingToNextInputMethod=" + mSupportsSwitchingToNextInputMethod + " mInlineSuggestionsEnabled=" + mInlineSuggestionsEnabled + " mSuppressesSpellChecker=" + mSuppressesSpellChecker - + " mShowInInputMethodPicker=" + mShowInInputMethodPicker); + + " mShowInInputMethodPicker=" + mShowInInputMethodPicker + + " mSupportsStylusHandwriting=" + mSupportsStylusHandwriting); pw.println(prefix + "mIsDefaultResId=0x" + Integer.toHexString(mIsDefaultResId)); pw.println(prefix + "Service:"); @@ -667,6 +688,7 @@ public final class InputMethodInfo implements Parcelable { mService.writeToParcel(dest, flags); mSubtypes.writeToParcel(dest); dest.writeInt(mHandledConfigChanges); + dest.writeBoolean(mSupportsStylusHandwriting); } /** diff --git a/core/java/com/android/internal/net/VpnConfig.java b/core/java/com/android/internal/net/VpnConfig.java index b579be03acbd..2a203acebc72 100644 --- a/core/java/com/android/internal/net/VpnConfig.java +++ b/core/java/com/android/internal/net/VpnConfig.java @@ -34,6 +34,8 @@ import android.os.Parcel; import android.os.Parcelable; import android.os.UserHandle; +import java.net.Inet4Address; +import java.net.InetAddress; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -91,8 +93,8 @@ public class VpnConfig implements Parcelable { public String interfaze; public String session; public int mtu = -1; - public List<LinkAddress> addresses = new ArrayList<>(); - public List<RouteInfo> routes = new ArrayList<>(); + public List<LinkAddress> addresses = new ArrayList<LinkAddress>(); + public List<RouteInfo> routes = new ArrayList<RouteInfo>(); public List<String> dnsServers; public List<String> searchDomains; public List<String> allowedApplications; @@ -112,32 +114,12 @@ public class VpnConfig implements Parcelable { public VpnConfig() { } - public VpnConfig(VpnConfig other) { - user = other.user; - interfaze = other.interfaze; - session = other.session; - mtu = other.mtu; - addresses = copyOf(other.addresses); - routes = copyOf(other.routes); - dnsServers = copyOf(other.dnsServers); - searchDomains = copyOf(other.searchDomains); - allowedApplications = copyOf(other.allowedApplications); - disallowedApplications = copyOf(other.disallowedApplications); - configureIntent = other.configureIntent; - startTime = other.startTime; - legacy = other.legacy; - blocking = other.blocking; - allowBypass = other.allowBypass; - allowIPv4 = other.allowIPv4; - allowIPv6 = other.allowIPv6; - isMetered = other.isMetered; - underlyingNetworks = other.underlyingNetworks != null ? Arrays.copyOf( - other.underlyingNetworks, other.underlyingNetworks.length) : null; - proxyInfo = other.proxyInfo; - } - - private static <T> List<T> copyOf(List<T> list) { - return list != null ? new ArrayList<>(list) : null; + public void updateAllowedFamilies(InetAddress address) { + if (address instanceof Inet4Address) { + allowIPv4 = true; + } else { + allowIPv6 = true; + } } public void addLegacyRoutes(String routesStr) { @@ -149,6 +131,7 @@ public class VpnConfig implements Parcelable { //each route is ip/prefix RouteInfo info = new RouteInfo(new IpPrefix(route), null, null, RouteInfo.RTN_UNICAST); this.routes.add(info); + updateAllowedFamilies(info.getDestination().getAddress()); } } @@ -161,6 +144,7 @@ public class VpnConfig implements Parcelable { //each address is ip/prefix LinkAddress addr = new LinkAddress(address); this.addresses.add(addr); + updateAllowedFamilies(addr.getAddress()); } } diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index c2224b4ab9d1..209c64a02324 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -161,7 +161,7 @@ public class BatteryStatsImpl extends BatteryStats { private static final int MAGIC = 0xBA757475; // 'BATSTATS' // Current on-disk Parcel version - static final int VERSION = 204; + static final int VERSION = 205; // The maximum number of names wakelocks we will keep track of // per uid; once the limit is reached, we batch the remaining wakelocks @@ -240,6 +240,7 @@ public class BatteryStatsImpl extends BatteryStats { private static final int[] SUPPORTED_PER_PROCESS_STATE_STANDARD_ENERGY_BUCKETS = { MeasuredEnergyStats.POWER_BUCKET_CPU, + MeasuredEnergyStats.POWER_BUCKET_MOBILE_RADIO, }; // TimeInState counters need NUM_PROCESS_STATE states in order to accommodate @@ -582,6 +583,8 @@ public class BatteryStatsImpl extends BatteryStats { int UPDATE_ALL = UPDATE_CPU | UPDATE_WIFI | UPDATE_RADIO | UPDATE_BT | UPDATE_RPM | UPDATE_DISPLAY; + int UPDATE_ON_PROC_STATE_CHANGE = UPDATE_WIFI | UPDATE_RADIO | UPDATE_BT; + @IntDef(flag = true, prefix = "UPDATE_", value = { UPDATE_CPU, UPDATE_WIFI, @@ -608,6 +611,8 @@ public class BatteryStatsImpl extends BatteryStats { Future<?> scheduleSyncDueToBatteryLevelChange(long delayMillis); /** Schedule removal of UIDs corresponding to a removed user */ Future<?> scheduleCleanupDueToRemovedUser(int userId); + /** Schedule a sync because of a process state change */ + Future<?> scheduleSyncDueToProcessStateChange(long delayMillis); } public Handler mHandler; @@ -1703,7 +1708,6 @@ public class BatteryStatsImpl extends BatteryStats { } } - private static class TimeMultiStateCounter implements TimeBaseObs { private final TimeBase mTimeBase; private final LongMultiStateCounter mCounter; @@ -1736,10 +1740,6 @@ public class BatteryStatsImpl extends BatteryStats { mCounter.setEnabled(false, elapsedRealtimeUs / 1000); } - public LongMultiStateCounter getCounter() { - return mCounter; - } - public int getStateCount() { return mCounter.getStateCount(); } @@ -1753,8 +1753,8 @@ public class BatteryStatsImpl extends BatteryStats { return mCounter.updateValue(value, timestampMs); } - public void addCount(long delta) { - mCounter.addCount(delta); + private void increment(long increment, long timestampMs) { + mCounter.incrementValue(increment, timestampMs); } /** @@ -1764,6 +1764,10 @@ public class BatteryStatsImpl extends BatteryStats { return mCounter.getCount(procState); } + public long getTotalCountLocked() { + return mCounter.getTotalCount(); + } + public void logState(Printer pw, String prefix) { pw.println(prefix + "mCounter=" + mCounter); } @@ -7985,7 +7989,7 @@ public class BatteryStatsImpl extends BatteryStats { LongSamplingCounter[] mNetworkByteActivityCounters; LongSamplingCounter[] mNetworkPacketActivityCounters; - LongSamplingCounter mMobileRadioActiveTime; + TimeMultiStateCounter mMobileRadioActiveTime; LongSamplingCounter mMobileRadioActiveCount; /** @@ -8195,6 +8199,7 @@ public class BatteryStatsImpl extends BatteryStats { final int batteryConsumerProcessState = mapUidProcessStateToBatteryConsumerProcessState(procState); getCpuActiveTimeCounter().setState(batteryConsumerProcessState, elapsedTimeMs); + getMobileRadioActiveTimeCounter().setState(batteryConsumerProcessState, elapsedTimeMs); final MeasuredEnergyStats energyStats = getOrCreateMeasuredEnergyStatsIfSupportedLocked(); if (energyStats != null) { @@ -8594,11 +8599,10 @@ public class BatteryStatsImpl extends BatteryStats { /** Adds the given charge to the given standard power bucket for this uid. */ @GuardedBy("mBsi") private void addChargeToStandardBucketLocked(long chargeDeltaUC, - @StandardPowerBucket int powerBucket) { + @StandardPowerBucket int powerBucket, long timestampMs) { final MeasuredEnergyStats measuredEnergyStats = getOrCreateMeasuredEnergyStatsLocked(); - measuredEnergyStats.updateStandardBucket(powerBucket, chargeDeltaUC, - mBsi.mClock.elapsedRealtime()); + measuredEnergyStats.updateStandardBucket(powerBucket, chargeDeltaUC, timestampMs); } /** Adds the given charge to the given custom power bucket for this uid. */ @@ -8690,6 +8694,13 @@ public class BatteryStatsImpl extends BatteryStats { @GuardedBy("mBsi") @Override + public long getMobileRadioMeasuredBatteryConsumptionUC(int processState) { + return getMeasuredBatteryConsumptionUC(MeasuredEnergyStats.POWER_BUCKET_MOBILE_RADIO, + processState); + } + + @GuardedBy("mBsi") + @Override public long getScreenOnMeasuredBatteryConsumptionUC() { return getMeasuredBatteryConsumptionUC(MeasuredEnergyStats.POWER_BUCKET_SCREEN_ON); } @@ -9228,9 +9239,7 @@ public class BatteryStatsImpl extends BatteryStats { } void noteNetworkActivityLocked(int type, long deltaBytes, long deltaPackets) { - if (mNetworkByteActivityCounters == null) { - initNetworkActivityLocked(); - } + ensureNetworkActivityLocked(); if (type >= 0 && type < NUM_NETWORK_ACTIVITY_TYPES) { mNetworkByteActivityCounters[type].addCountLocked(deltaBytes); mNetworkPacketActivityCounters[type].addCountLocked(deltaPackets); @@ -9240,14 +9249,25 @@ public class BatteryStatsImpl extends BatteryStats { } } - void noteMobileRadioActiveTimeLocked(long batteryUptime) { - if (mNetworkByteActivityCounters == null) { - initNetworkActivityLocked(); - } - mMobileRadioActiveTime.addCountLocked(batteryUptime); + void noteMobileRadioActiveTimeLocked(long batteryUptimeDeltaUs, long elapsedTimeMs) { + ensureNetworkActivityLocked(); + getMobileRadioActiveTimeCounter().increment(batteryUptimeDeltaUs, elapsedTimeMs); mMobileRadioActiveCount.addCountLocked(1); } + private TimeMultiStateCounter getMobileRadioActiveTimeCounter() { + if (mMobileRadioActiveTime == null) { + final long timestampMs = mBsi.mClock.elapsedRealtime(); + mMobileRadioActiveTime = new TimeMultiStateCounter( + mBsi.mOnBatteryTimeBase, BatteryConsumer.PROCESS_STATE_COUNT, timestampMs); + mMobileRadioActiveTime.setState( + mapUidProcessStateToBatteryConsumerProcessState(mProcessState), + timestampMs); + mMobileRadioActiveTime.update(0, timestampMs); + } + return mMobileRadioActiveTime; + } + @Override public boolean hasNetworkActivity() { return mNetworkByteActivityCounters != null; @@ -9275,8 +9295,20 @@ public class BatteryStatsImpl extends BatteryStats { @Override public long getMobileRadioActiveTime(int which) { - return mMobileRadioActiveTime != null - ? mMobileRadioActiveTime.getCountLocked(which) : 0; + return getMobileRadioActiveTimeInProcessState(BatteryConsumer.PROCESS_STATE_ANY); + } + + @Override + public long getMobileRadioActiveTimeInProcessState( + @BatteryConsumer.ProcessState int processState) { + if (mMobileRadioActiveTime == null) { + return 0; + } + if (processState == BatteryConsumer.PROCESS_STATE_ANY) { + return mMobileRadioActiveTime.getTotalCountLocked(); + } else { + return mMobileRadioActiveTime.getCountLocked(processState); + } } @Override @@ -9388,18 +9420,17 @@ public class BatteryStatsImpl extends BatteryStats { } } - void initNetworkActivityLocked() { - detachIfNotNull(mNetworkByteActivityCounters); + void ensureNetworkActivityLocked() { + if (mNetworkByteActivityCounters != null) { + return; + } + mNetworkByteActivityCounters = new LongSamplingCounter[NUM_NETWORK_ACTIVITY_TYPES]; - detachIfNotNull(mNetworkPacketActivityCounters); mNetworkPacketActivityCounters = new LongSamplingCounter[NUM_NETWORK_ACTIVITY_TYPES]; for (int i = 0; i < NUM_NETWORK_ACTIVITY_TYPES; i++) { mNetworkByteActivityCounters[i] = new LongSamplingCounter(mBsi.mOnBatteryTimeBase); mNetworkPacketActivityCounters[i] = new LongSamplingCounter(mBsi.mOnBatteryTimeBase); } - detachIfNotNull(mMobileRadioActiveTime); - mMobileRadioActiveTime = new LongSamplingCounter(mBsi.mOnBatteryTimeBase); - detachIfNotNull(mMobileRadioActiveCount); mMobileRadioActiveCount = new LongSamplingCounter(mBsi.mOnBatteryTimeBase); } @@ -9896,7 +9927,12 @@ public class BatteryStatsImpl extends BatteryStats { mNetworkByteActivityCounters[i].writeToParcel(out); mNetworkPacketActivityCounters[i].writeToParcel(out); } - mMobileRadioActiveTime.writeToParcel(out); + if (mMobileRadioActiveTime != null) { + out.writeBoolean(true); + mMobileRadioActiveTime.writeToParcel(out); + } else { + out.writeBoolean(false); + } mMobileRadioActiveCount.writeToParcel(out); } else { out.writeInt(0); @@ -9996,6 +10032,7 @@ public class BatteryStatsImpl extends BatteryStats { @GuardedBy("mBsi") void readFromParcelLocked(TimeBase timeBase, TimeBase screenOffTimeBase, Parcel in) { + final long timestampMs = mBsi.mClock.elapsedRealtime(); mOnBatteryBackgroundTimeBase.readFromParcel(in); mOnBatteryScreenOffBackgroundTimeBase.readFromParcel(in); @@ -10205,7 +10242,14 @@ public class BatteryStatsImpl extends BatteryStats { mNetworkPacketActivityCounters[i] = new LongSamplingCounter(mBsi.mOnBatteryTimeBase, in); } - mMobileRadioActiveTime = new LongSamplingCounter(mBsi.mOnBatteryTimeBase, in); + if (in.readBoolean()) { + final TimeMultiStateCounter counter = + new TimeMultiStateCounter(mBsi.mOnBatteryTimeBase, in, timestampMs); + if (counter.getStateCount() == BatteryConsumer.PROCESS_STATE_COUNT) { + mMobileRadioActiveTime = counter; + } + } + mMobileRadioActiveCount = new LongSamplingCounter(mBsi.mOnBatteryTimeBase, in); } else { mNetworkByteActivityCounters = null; @@ -10247,7 +10291,6 @@ public class BatteryStatsImpl extends BatteryStats { mScreenOffCpuFreqTimeMs = LongSamplingCounterArray.readFromParcel( in, mBsi.mOnBatteryScreenOffTimeBase); - final long timestampMs = mBsi.mClock.elapsedRealtime(); int stateCount = in.readInt(); if (stateCount != 0) { final TimeMultiStateCounter counter = new TimeMultiStateCounter( @@ -11182,6 +11225,9 @@ public class BatteryStatsImpl extends BatteryStats { onBatteryScreenOffCounter.setState(uidRunningState, elapsedRealtimeMs); } + final int prevBatteryConsumerProcessState = + mapUidProcessStateToBatteryConsumerProcessState(mProcessState); + mProcessState = uidRunningState; updateOnBatteryBgTimeBase(uptimeMs * 1000, elapsedRealtimeMs * 1000); @@ -11191,11 +11237,15 @@ public class BatteryStatsImpl extends BatteryStats { mapUidProcessStateToBatteryConsumerProcessState(uidRunningState); getCpuActiveTimeCounter().setState(batteryConsumerProcessState, elapsedRealtimeMs); + getMobileRadioActiveTimeCounter() + .setState(batteryConsumerProcessState, elapsedRealtimeMs); final MeasuredEnergyStats energyStats = getOrCreateMeasuredEnergyStatsIfSupportedLocked(); if (energyStats != null) { energyStats.setState(batteryConsumerProcessState, elapsedRealtimeMs); } + maybeScheduleExternalStatsSync(prevBatteryConsumerProcessState, + batteryConsumerProcessState); } if (userAwareService != mInForegroundService) { @@ -11208,6 +11258,27 @@ public class BatteryStatsImpl extends BatteryStats { } } + @GuardedBy("mBsi") + private void maybeScheduleExternalStatsSync( + @BatteryConsumer.ProcessState int oldProcessState, + @BatteryConsumer.ProcessState int newProcessState) { + if (oldProcessState == newProcessState) { + return; + } + // Transitions between BACKGROUND and such non-foreground states like cached + // or nonexistent do not warrant doing a sync. If some of the stats for those + // proc states bleed into the PROCESS_STATE_BACKGROUND, that's ok. + if ((oldProcessState == BatteryConsumer.PROCESS_STATE_UNSPECIFIED + && newProcessState == BatteryConsumer.PROCESS_STATE_BACKGROUND) + || (oldProcessState == BatteryConsumer.PROCESS_STATE_BACKGROUND + && newProcessState == BatteryConsumer.PROCESS_STATE_UNSPECIFIED)) { + return; + } + + mBsi.mExternalSync.scheduleSyncDueToProcessStateChange( + mBsi.mConstants.PROC_STATE_CHANGE_COLLECTION_DELAY_MS); + } + /** Whether to consider Uid to be in the background for background timebase purposes. */ public boolean isInBackground() { // Note that PROCESS_STATE_CACHED and Uid.PROCESS_STATE_NONEXISTENT is @@ -12805,7 +12876,8 @@ public class BatteryStatsImpl extends BatteryStats { .calcGlobalPowerWithoutControllerDataMah(globalTimeMs); } distributeEnergyToUidsLocked(MeasuredEnergyStats.POWER_BUCKET_WIFI, - consumedChargeUC, uidEstimatedConsumptionMah, totalEstimatedConsumptionMah); + consumedChargeUC, uidEstimatedConsumptionMah, totalEstimatedConsumptionMah, + elapsedRealtimeMs); } } } @@ -12963,7 +13035,7 @@ public class BatteryStatsImpl extends BatteryStats { final long appPackets = entry.rxPackets + entry.txPackets; final long appRadioTimeUs = (totalAppRadioTimeUs * appPackets) / totalPackets; - u.noteMobileRadioActiveTimeLocked(appRadioTimeUs); + u.noteMobileRadioActiveTimeLocked(appRadioTimeUs, elapsedRealtimeMs); // Distribute measured mobile radio charge consumption based on app radio // active time @@ -13042,7 +13114,7 @@ public class BatteryStatsImpl extends BatteryStats { distributeEnergyToUidsLocked(MeasuredEnergyStats.POWER_BUCKET_MOBILE_RADIO, consumedChargeUC, uidEstimatedConsumptionMah, - totalEstimatedConsumptionMah); + totalEstimatedConsumptionMah, elapsedRealtimeMs); } mNetworkStatsPool.release(delta); @@ -13330,7 +13402,8 @@ public class BatteryStatsImpl extends BatteryStats { = mBluetoothPowerCalculator.calculatePowerMah(rxTimeMs, txTimeMs, idleTimeMs); totalEstimatedMah = Math.max(totalEstimatedMah, controllerMaMs / MILLISECONDS_IN_HOUR); distributeEnergyToUidsLocked(MeasuredEnergyStats.POWER_BUCKET_BLUETOOTH, - consumedChargeUC, uidEstimatedConsumptionMah, totalEstimatedMah); + consumedChargeUC, uidEstimatedConsumptionMah, totalEstimatedMah, + elapsedRealtimeMs); } mLastBluetoothActivityInfo.set(info); @@ -13433,8 +13506,10 @@ public class BatteryStatsImpl extends BatteryStats { } if (totalCpuChargeUC <= 0) return; + final long timestampMs = mClock.elapsedRealtime(); + mGlobalMeasuredEnergyStats.updateStandardBucket(MeasuredEnergyStats.POWER_BUCKET_CPU, - totalCpuChargeUC, mClock.elapsedRealtime()); + totalCpuChargeUC, timestampMs); // Calculate the measured microcoulombs/calculated milliamp-hour charge ratio for each // cluster to normalize each uid's estimated power usage against actual power usage for @@ -13483,7 +13558,7 @@ public class BatteryStatsImpl extends BatteryStats { } uid.addChargeToStandardBucketLocked(uidCpuChargeUC, - MeasuredEnergyStats.POWER_BUCKET_CPU); + MeasuredEnergyStats.POWER_BUCKET_CPU, timestampMs); } } @@ -13583,7 +13658,7 @@ public class BatteryStatsImpl extends BatteryStats { fgTimeUsArray.put(uid.getUid(), (double) fgTimeUs); } distributeEnergyToUidsLocked(MeasuredEnergyStats.POWER_BUCKET_SCREEN_ON, - totalScreenOnChargeUC, fgTimeUsArray, 0); + totalScreenOnChargeUC, fgTimeUsArray, 0, elapsedRealtimeMs); } /** @@ -13627,7 +13702,7 @@ public class BatteryStatsImpl extends BatteryStats { gnssTimeUsArray.put(uid.getUid(), (double) gnssTimeUs); } distributeEnergyToUidsLocked(MeasuredEnergyStats.POWER_BUCKET_GNSS, chargeUC, - gnssTimeUsArray, 0); + gnssTimeUsArray, 0, elapsedRealtimeMs); } /** @@ -13699,7 +13774,7 @@ public class BatteryStatsImpl extends BatteryStats { @SuppressWarnings("GuardedBy") // errorprone false positive on u.addChargeToStandardBucketLocked private void distributeEnergyToUidsLocked(@StandardPowerBucket int bucket, long totalConsumedChargeUC, SparseDoubleArray ratioNumerators, - double minRatioDenominator) { + double minRatioDenominator, long timestampMs) { // If the sum of all app usage was greater than the total, use that instead: double sumRatioNumerators = 0; @@ -13714,7 +13789,7 @@ public class BatteryStatsImpl extends BatteryStats { final double ratioNumerator = ratioNumerators.valueAt(i); final long uidActualUC = (long) (totalConsumedChargeUC * ratioNumerator / ratioDenominator + 0.5); - uid.addChargeToStandardBucketLocked(uidActualUC, bucket); + uid.addChargeToStandardBucketLocked(uidActualUC, bucket, timestampMs); } } @@ -14433,7 +14508,7 @@ public class BatteryStatsImpl extends BatteryStats { if (childUid != null) { final long delta = childUid.cpuActiveCounter.update(cpuActiveTimesMs, elapsedRealtimeMs); - u.getCpuActiveTimeCounter().addCount(delta); + u.getCpuActiveTimeCounter().increment(delta, elapsedRealtimeMs); } } }); @@ -15627,7 +15702,6 @@ public class BatteryStatsImpl extends BatteryStats { for (int procState = 0; procState < BatteryConsumer.PROCESS_STATE_COUNT; procState++) { procStateNames[procState] = BatteryConsumer.processStateToString(procState); } - procStateNames[BatteryConsumer.PROCESS_STATE_ANY] = "untracked"; return procStateNames; } @@ -15651,6 +15725,8 @@ public class BatteryStatsImpl extends BatteryStats { = "external_stats_collection_rate_limit_ms"; public static final String KEY_BATTERY_LEVEL_COLLECTION_DELAY_MS = "battery_level_collection_delay_ms"; + public static final String KEY_PROC_STATE_CHANGE_COLLECTION_DELAY_MS = + "procstate_change_collection_delay_ms"; public static final String KEY_MAX_HISTORY_FILES = "max_history_files"; public static final String KEY_MAX_HISTORY_BUFFER_KB = "max_history_buffer_kb"; public static final String KEY_BATTERY_CHARGED_DELAY_MS = @@ -15661,6 +15737,7 @@ public class BatteryStatsImpl extends BatteryStats { private static final long DEFAULT_UID_REMOVE_DELAY_MS = 5L * 60L * 1000L; private static final long DEFAULT_EXTERNAL_STATS_COLLECTION_RATE_LIMIT_MS = 600_000; private static final long DEFAULT_BATTERY_LEVEL_COLLECTION_DELAY_MS = 300_000; + private static final long DEFAULT_PROC_STATE_CHANGE_COLLECTION_DELAY_MS = 60_000; private static final int DEFAULT_MAX_HISTORY_FILES = 32; private static final int DEFAULT_MAX_HISTORY_BUFFER_KB = 128; /*Kilo Bytes*/ private static final int DEFAULT_MAX_HISTORY_FILES_LOW_RAM_DEVICE = 64; @@ -15676,6 +15753,8 @@ public class BatteryStatsImpl extends BatteryStats { = DEFAULT_EXTERNAL_STATS_COLLECTION_RATE_LIMIT_MS; public long BATTERY_LEVEL_COLLECTION_DELAY_MS = DEFAULT_BATTERY_LEVEL_COLLECTION_DELAY_MS; + public long PROC_STATE_CHANGE_COLLECTION_DELAY_MS = + DEFAULT_PROC_STATE_CHANGE_COLLECTION_DELAY_MS; public int MAX_HISTORY_FILES; public int MAX_HISTORY_BUFFER; /*Bytes*/ public int BATTERY_CHARGED_DELAY_MS = DEFAULT_BATTERY_CHARGED_DELAY_MS; @@ -15742,6 +15821,9 @@ public class BatteryStatsImpl extends BatteryStats { BATTERY_LEVEL_COLLECTION_DELAY_MS = mParser.getLong( KEY_BATTERY_LEVEL_COLLECTION_DELAY_MS, DEFAULT_BATTERY_LEVEL_COLLECTION_DELAY_MS); + PROC_STATE_CHANGE_COLLECTION_DELAY_MS = mParser.getLong( + KEY_PROC_STATE_CHANGE_COLLECTION_DELAY_MS, + DEFAULT_PROC_STATE_CHANGE_COLLECTION_DELAY_MS); MAX_HISTORY_FILES = mParser.getInt(KEY_MAX_HISTORY_FILES, ActivityManager.isLowRamDeviceStatic() ? @@ -15793,6 +15875,8 @@ public class BatteryStatsImpl extends BatteryStats { pw.println(EXTERNAL_STATS_COLLECTION_RATE_LIMIT_MS); pw.print(KEY_BATTERY_LEVEL_COLLECTION_DELAY_MS); pw.print("="); pw.println(BATTERY_LEVEL_COLLECTION_DELAY_MS); + pw.print(KEY_PROC_STATE_CHANGE_COLLECTION_DELAY_MS); pw.print("="); + pw.println(PROC_STATE_CHANGE_COLLECTION_DELAY_MS); pw.print(KEY_MAX_HISTORY_FILES); pw.print("="); pw.println(MAX_HISTORY_FILES); pw.print(KEY_MAX_HISTORY_BUFFER_KB); pw.print("="); @@ -16476,14 +16560,18 @@ public class BatteryStatsImpl extends BatteryStats { } if (in.readInt() != 0) { - if (u.mNetworkByteActivityCounters == null) { - u.initNetworkActivityLocked(); - } + u.ensureNetworkActivityLocked(); for (int i = 0; i < NUM_NETWORK_ACTIVITY_TYPES; i++) { u.mNetworkByteActivityCounters[i].readSummaryFromParcelLocked(in); u.mNetworkPacketActivityCounters[i].readSummaryFromParcelLocked(in); } - u.mMobileRadioActiveTime.readSummaryFromParcelLocked(in); + if (in.readBoolean()) { + TimeMultiStateCounter counter = new TimeMultiStateCounter( + mOnBatteryTimeBase, in, elapsedRealtimeMs); + if (counter.getStateCount() == BatteryConsumer.PROCESS_STATE_COUNT) { + u.mMobileRadioActiveTime = counter; + } + } u.mMobileRadioActiveCount.readSummaryFromParcelLocked(in); } @@ -17033,7 +17121,12 @@ public class BatteryStatsImpl extends BatteryStats { u.mNetworkByteActivityCounters[i].writeSummaryFromParcelLocked(out); u.mNetworkPacketActivityCounters[i].writeSummaryFromParcelLocked(out); } - u.mMobileRadioActiveTime.writeSummaryFromParcelLocked(out); + if (u.mMobileRadioActiveTime != null) { + out.writeBoolean(true); + u.mMobileRadioActiveTime.writeToParcel(out); + } else { + out.writeBoolean(false); + } u.mMobileRadioActiveCount.writeSummaryFromParcelLocked(out); } diff --git a/core/java/com/android/internal/os/CpuPowerCalculator.java b/core/java/com/android/internal/os/CpuPowerCalculator.java index 175f28ffcda9..ee614cdbdb95 100644 --- a/core/java/com/android/internal/os/CpuPowerCalculator.java +++ b/core/java/com/android/internal/os/CpuPowerCalculator.java @@ -156,11 +156,11 @@ public class CpuPowerCalculator extends PowerCalculator { private void calculateMeasuredPowerPerProcessState(UidBatteryConsumer.Builder app, BatteryStats.Uid u, BatteryConsumer.Key[] keys) { for (BatteryConsumer.Key key : keys) { - // The key for "PROCESS_STATE_ANY" has already been populated with the - // full energy across all states. We don't want to override it with + // The key for PROCESS_STATE_UNSPECIFIED aka PROCESS_STATE_ANY has already been + // populated with the full energy across all states. We don't want to override it with // the energy for "other" states, which excludes the tracked states like // foreground, background etc. - if (key.processState == BatteryConsumer.PROCESS_STATE_ANY) { + if (key.processState == BatteryConsumer.PROCESS_STATE_UNSPECIFIED) { continue; } @@ -184,7 +184,7 @@ public class CpuPowerCalculator extends PowerCalculator { uidProcState++) { @BatteryConsumer.ProcessState int procState = BatteryStats.mapUidProcessStateToBatteryConsumerProcessState(uidProcState); - if (procState == BatteryConsumer.PROCESS_STATE_ANY) { + if (procState == BatteryConsumer.PROCESS_STATE_UNSPECIFIED) { continue; } @@ -199,7 +199,7 @@ public class CpuPowerCalculator extends PowerCalculator { } for (BatteryConsumer.Key key : keys) { - if (key.processState == BatteryConsumer.PROCESS_STATE_ANY) { + if (key.processState == BatteryConsumer.PROCESS_STATE_UNSPECIFIED) { continue; } diff --git a/core/java/com/android/internal/os/LongMultiStateCounter.java b/core/java/com/android/internal/os/LongMultiStateCounter.java index ad8e0ed4c2f5..33a9d547be78 100644 --- a/core/java/com/android/internal/os/LongMultiStateCounter.java +++ b/core/java/com/android/internal/os/LongMultiStateCounter.java @@ -122,6 +122,13 @@ public final class LongMultiStateCounter implements Parcelable { /** * Adds the supplied values to the current accumulated values in the counter. */ + public void incrementValue(long count, long timestampMs) { + native_incrementValue(mNativeObject, count, timestampMs); + } + + /** + * Adds the supplied values to the current accumulated values in the counter. + */ public void addCount(long count) { native_addCount(mNativeObject, count); } @@ -144,6 +151,17 @@ public final class LongMultiStateCounter implements Parcelable { return native_getCount(mNativeObject, state); } + /** + * Returns the total accumulated count across all states. + */ + public long getTotalCount() { + long total = 0; + for (int state = 0; state < mStateCount; state++) { + total += native_getCount(mNativeObject, state); + } + return total; + } + @Override public String toString() { return native_toString(mNativeObject); @@ -190,6 +208,10 @@ public final class LongMultiStateCounter implements Parcelable { private static native long native_updateValue(long nativeObject, long value, long timestampMs); @CriticalNative + private static native void native_incrementValue(long nativeObject, long increment, + long timestampMs); + + @CriticalNative private static native void native_addCount(long nativeObject, long count); @CriticalNative diff --git a/core/java/com/android/internal/os/MobileRadioPowerCalculator.java b/core/java/com/android/internal/os/MobileRadioPowerCalculator.java index eb5993dc2d61..28cc836396b4 100644 --- a/core/java/com/android/internal/os/MobileRadioPowerCalculator.java +++ b/core/java/com/android/internal/os/MobileRadioPowerCalculator.java @@ -34,6 +34,8 @@ public class MobileRadioPowerCalculator extends PowerCalculator { private static final int NUM_SIGNAL_STRENGTH_LEVELS = CellSignalStrength.getNumSignalStrengthLevels(); + private static final BatteryConsumer.Key[] UNINITIALIZED_KEYS = new BatteryConsumer.Key[0]; + private final UsageBasedPowerEstimator mActivePowerEstimator; private final UsageBasedPowerEstimator[] mIdlePowerEstimators = new UsageBasedPowerEstimator[NUM_SIGNAL_STRENGTH_LEVELS]; @@ -89,14 +91,22 @@ public class MobileRadioPowerCalculator extends PowerCalculator { PowerAndDuration total = new PowerAndDuration(); - final double powerPerPacketMah = getMobilePowerPerPacket(batteryStats, rawRealtimeUs, - BatteryStats.STATS_SINCE_CHARGED); final SparseArray<UidBatteryConsumer.Builder> uidBatteryConsumerBuilders = builder.getUidBatteryConsumerBuilders(); + BatteryConsumer.Key[] keys = UNINITIALIZED_KEYS; + for (int i = uidBatteryConsumerBuilders.size() - 1; i >= 0; i--) { final UidBatteryConsumer.Builder app = uidBatteryConsumerBuilders.valueAt(i); final BatteryStats.Uid uid = app.getBatteryStatsUid(); - calculateApp(app, uid, powerPerPacketMah, total, query); + if (keys == UNINITIALIZED_KEYS) { + if (query.isProcessStateDataNeeded()) { + keys = app.getKeys(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO); + } else { + keys = null; + } + } + + calculateApp(app, uid, total, query, keys); } final long consumptionUC = batteryStats.getMobileRadioMeasuredBatteryConsumptionUC(); @@ -121,34 +131,49 @@ public class MobileRadioPowerCalculator extends PowerCalculator { } private void calculateApp(UidBatteryConsumer.Builder app, BatteryStats.Uid u, - double powerPerPacketMah, PowerAndDuration total, - BatteryUsageStatsQuery query) { + PowerAndDuration total, + BatteryUsageStatsQuery query, BatteryConsumer.Key[] keys) { final long radioActiveDurationMs = calculateDuration(u, BatteryStats.STATS_SINCE_CHARGED); total.totalAppDurationMs += radioActiveDurationMs; final long consumptionUC = u.getMobileRadioMeasuredBatteryConsumptionUC(); final int powerModel = getPowerModel(consumptionUC, query); - final double powerMah = calculatePower(u, powerModel, powerPerPacketMah, - radioActiveDurationMs, consumptionUC); + final double powerMah = calculatePower(u, powerModel, radioActiveDurationMs, consumptionUC); total.totalAppPowerMah += powerMah; app.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO, radioActiveDurationMs) .setConsumedPower(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO, powerMah, powerModel); + + if (query.isProcessStateDataNeeded() && keys != null) { + for (BatteryConsumer.Key key: keys) { + final int processState = key.processState; + if (processState == BatteryConsumer.PROCESS_STATE_UNSPECIFIED) { + // Already populated with the total across all process states + continue; + } + + final long durationInStateMs = + u.getMobileRadioActiveTimeInProcessState(processState) / 1000; + final long consumptionInStateUc = + u.getMobileRadioMeasuredBatteryConsumptionUC(processState); + final double powerInStateMah = calculatePower(u, powerModel, durationInStateMs, + consumptionInStateUc); + app.setConsumedPower(key, powerInStateMah, powerModel); + } + } } @Override public void calculate(List<BatterySipper> sippers, BatteryStats batteryStats, long rawRealtimeUs, long rawUptimeUs, int statsType, SparseArray<UserHandle> asUsers) { - final double mobilePowerPerPacket = getMobilePowerPerPacket(batteryStats, rawRealtimeUs, - statsType); PowerAndDuration total = new PowerAndDuration(); for (int i = sippers.size() - 1; i >= 0; i--) { final BatterySipper app = sippers.get(i); if (app.drainType == BatterySipper.DrainType.APP) { final BatteryStats.Uid u = app.uidObj; - calculateApp(app, u, statsType, mobilePowerPerPacket, total); + calculateApp(app, u, statsType, total); } } @@ -172,13 +197,12 @@ public class MobileRadioPowerCalculator extends PowerCalculator { } private void calculateApp(BatterySipper app, BatteryStats.Uid u, int statsType, - double powerPerPacketMah, PowerAndDuration total) { + PowerAndDuration total) { app.mobileActive = calculateDuration(u, statsType); final long consumptionUC = u.getMobileRadioMeasuredBatteryConsumptionUC(); final int powerModel = getPowerModel(consumptionUC); - app.mobileRadioPowerMah = calculatePower(u, powerModel, powerPerPacketMah, app.mobileActive, - consumptionUC); + app.mobileRadioPowerMah = calculatePower(u, powerModel, app.mobileActive, consumptionUC); total.totalAppDurationMs += app.mobileActive; // Add cost of mobile traffic. @@ -205,26 +229,15 @@ public class MobileRadioPowerCalculator extends PowerCalculator { } private double calculatePower(BatteryStats.Uid u, @BatteryConsumer.PowerModel int powerModel, - double powerPerPacketMah, long radioActiveDurationMs, long measuredChargeUC) { + long radioActiveDurationMs, long measuredChargeUC) { if (powerModel == BatteryConsumer.POWER_MODEL_MEASURED_ENERGY) { return uCtoMah(measuredChargeUC); } if (radioActiveDurationMs > 0) { - // We are tracking when the radio is up, so can use the active time to - // determine power use. return calcPowerFromRadioActiveDurationMah(radioActiveDurationMs); - } else { - // We are not tracking when the radio is up, so must approximate power use - // based on the number of packets. - final long mobileRxPackets = u.getNetworkActivityPackets( - BatteryStats.NETWORK_MOBILE_RX_DATA, - BatteryStats.STATS_SINCE_CHARGED); - final long mobileTxPackets = u.getNetworkActivityPackets( - BatteryStats.NETWORK_MOBILE_TX_DATA, - BatteryStats.STATS_SINCE_CHARGED); - return (mobileRxPackets + mobileTxPackets) * powerPerPacketMah; } + return 0; } private void calculateRemaining(PowerAndDuration total, @@ -299,21 +312,4 @@ public class MobileRadioPowerCalculator extends PowerCalculator { public double calcScanTimePowerMah(long scanningTimeMs) { return mScanPowerEstimator.calculatePower(scanningTimeMs); } - - /** - * Return estimated power (in mAh) of sending or receiving a packet with the mobile radio. - */ - private double getMobilePowerPerPacket(BatteryStats stats, long rawRealtimeUs, int statsType) { - final long radioDataUptimeMs = - stats.getMobileRadioActiveTime(rawRealtimeUs, statsType) / 1000; - final double mobilePower = calcPowerFromRadioActiveDurationMah(radioDataUptimeMs); - - final long mobileRx = stats.getNetworkActivityPackets(BatteryStats.NETWORK_MOBILE_RX_DATA, - statsType); - final long mobileTx = stats.getNetworkActivityPackets(BatteryStats.NETWORK_MOBILE_TX_DATA, - statsType); - final long mobilePackets = mobileRx + mobileTx; - - return mobilePackets != 0 ? mobilePower / mobilePackets : 0; - } } diff --git a/core/java/com/android/internal/telephony/ICarrierPrivilegesListener.aidl b/core/java/com/android/internal/telephony/ICarrierPrivilegesListener.aidl new file mode 100644 index 000000000000..6ca8cecba3c8 --- /dev/null +++ b/core/java/com/android/internal/telephony/ICarrierPrivilegesListener.aidl @@ -0,0 +1,22 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.telephony; + +oneway interface ICarrierPrivilegesListener { + void onCarrierPrivilegesChanged( + in List<String> privilegedPackageNames, in int[] privilegedUids); +} diff --git a/core/java/com/android/internal/telephony/ITelephonyRegistry.aidl b/core/java/com/android/internal/telephony/ITelephonyRegistry.aidl index 15d4246e302a..9712d7e38a4b 100644 --- a/core/java/com/android/internal/telephony/ITelephonyRegistry.aidl +++ b/core/java/com/android/internal/telephony/ITelephonyRegistry.aidl @@ -32,6 +32,7 @@ import android.telephony.PreciseDataConnectionState; import android.telephony.ServiceState; import android.telephony.SignalStrength; import android.telephony.emergency.EmergencyNumber; +import com.android.internal.telephony.ICarrierPrivilegesListener; import com.android.internal.telephony.IPhoneStateListener; import com.android.internal.telephony.IOnSubscriptionsChangedListener; @@ -100,4 +101,10 @@ interface ITelephonyRegistry { void notifyAllowedNetworkTypesChanged(in int phoneId, in int subId, in int reason, in long allowedNetworkType); void notifyLinkCapacityEstimateChanged(in int phoneId, in int subId, in List<LinkCapacityEstimate> linkCapacityEstimateList); + + void addCarrierPrivilegesListener( + int phoneId, ICarrierPrivilegesListener callback, String pkg, String featureId); + void removeCarrierPrivilegesListener(ICarrierPrivilegesListener callback, String pkg); + void notifyCarrierPrivilegesChanged( + int phoneId, in List<String> privilegedPackageNames, in int[] privilegedUids); } diff --git a/core/jni/android_view_InputQueue.cpp b/core/jni/android_view_InputQueue.cpp index b910d1664ad1..74bbd7b2cb32 100644 --- a/core/jni/android_view_InputQueue.cpp +++ b/core/jni/android_view_InputQueue.cpp @@ -269,8 +269,7 @@ int register_android_view_InputQueue(JNIEnv* env) return RegisterMethodsOrDie(env, kInputQueuePathName, g_methods, NELEM(g_methods)); } -AInputQueue* android_view_InputQueue_getNativePtr(jobject inputQueue) { - JNIEnv* env = AndroidRuntime::getJNIEnv(); +AInputQueue* android_view_InputQueue_getNativePtr(JNIEnv* env, jobject inputQueue) { jlong ptr = env->CallLongMethod(inputQueue, gInputQueueClassInfo.getNativePtr); return reinterpret_cast<AInputQueue*>(ptr); } diff --git a/core/jni/com_android_internal_os_LongMultiStateCounter.cpp b/core/jni/com_android_internal_os_LongMultiStateCounter.cpp index 45652a79a5c6..69c4f3ddd9c5 100644 --- a/core/jni/com_android_internal_os_LongMultiStateCounter.cpp +++ b/core/jni/com_android_internal_os_LongMultiStateCounter.cpp @@ -84,6 +84,10 @@ static jlong native_updateValue(jlong nativePtr, jlong value, jlong timestamp) { return (jlong)asLongMultiStateCounter(nativePtr)->updateValue((int64_t)value, timestamp); } +static void native_incrementValue(jlong nativePtr, jlong count, jlong timestamp) { + asLongMultiStateCounter(nativePtr)->incrementValue(count, timestamp); +} + static void native_addCount(jlong nativePtr, jlong count) { asLongMultiStateCounter(nativePtr)->addValue(count); } @@ -172,6 +176,8 @@ static const JNINativeMethod g_methods[] = { // @CriticalNative {"native_updateValue", "(JJJ)J", (void *)native_updateValue}, // @CriticalNative + {"native_incrementValue", "(JJJ)V", (void *)native_incrementValue}, + // @CriticalNative {"native_addCount", "(JJ)V", (void *)native_addCount}, // @CriticalNative {"native_reset", "(J)V", (void *)native_reset}, diff --git a/core/jni/include/android_runtime/android_view_InputQueue.h b/core/jni/include/android_runtime/android_view_InputQueue.h index c1b611cf303e..115e2f8605b0 100644 --- a/core/jni/include/android_runtime/android_view_InputQueue.h +++ b/core/jni/include/android_runtime/android_view_InputQueue.h @@ -80,7 +80,7 @@ private: Vector<key_value_pair_t<InputEvent*, bool> > mFinishedEvents; }; -extern AInputQueue* android_view_InputQueue_getNativePtr(jobject inputQueue); +extern AInputQueue* android_view_InputQueue_getNativePtr(JNIEnv* env, jobject inputQueue); } // namespace android diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 4f35f2c841ea..0eb7c376c37c 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -6065,6 +6065,12 @@ <permission android:name="android.permission.LAUNCH_DEVICE_MANAGER_SETUP" android:protectionLevel="signature|role" /> + <!-- @SystemApi Allows an application to update certain device management related system + resources. + @hide --> + <permission android:name="android.permission.UPDATE_DEVICE_MANAGEMENT_RESOURCES" + android:protectionLevel="signature|role" /> + <!-- Attribution for Geofencing service. --> <attribution android:tag="GeofencingService" android:label="@string/geofencing_service"/> <!-- Attribution for Country Detector. --> diff --git a/core/res/res/drawable/ic_add_supervised_user.xml b/core/res/res/drawable/ic_add_supervised_user.xml new file mode 100644 index 000000000000..a49377594a22 --- /dev/null +++ b/core/res/res/drawable/ic_add_supervised_user.xml @@ -0,0 +1,34 @@ +<!-- + ~ Copyright (C) 2020 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="40dp" + android:height="40dp" + android:viewportWidth="20" + android:viewportHeight="20" + android:tint="?android:attr/colorControlNormal"> + + <group + android:scaleX="0.5" + android:scaleY="0.5"> + + <path + android:fillColor="@android:color/white" + android:pathData="M15.625,22.5q-2.375,0 -4.063,-1.688 -1.687,-1.687 -1.687,-4.104 0,-2.375 1.688,-4.062 1.687,-1.688 4.062,-1.688 2.417,0 4.105,1.688 1.687,1.687 1.687,4.062 0,2.417 -1.688,4.105 -1.687,1.687 -4.104,1.687zM15.625,19.708q1.292,0 2.146,-0.875 0.854,-0.875 0.854,-2.125t-0.854,-2.125q-0.854,-0.875 -2.146,-0.875 -1.208,0 -2.104,0.875 -0.896,0.875 -0.896,2.125t0.896,2.125q0.896,0.875 2.104,0.875zM27.875,24.333q-1.792,0 -3.063,-1.27 -1.27,-1.271 -1.27,-3.063 0,-1.792 1.27,-3.063 1.271,-1.27 3.063,-1.27 1.833,0 3.083,1.27 1.25,1.271 1.25,3.063 0,1.792 -1.25,3.063 -1.25,1.27 -3.083,1.27zM17.458,33.667q1.959,-3.75 5.063,-5.063 3.104,-1.312 5.354,-1.312 0.958,0 1.813,0.145 0.854,0.146 1.729,0.396 1.041,-1.541 1.75,-3.583 0.708,-2.042 0.708,-4.25 0,-5.792 -4.041,-9.834Q25.791,6.125 20,6.125t-9.834,4.041Q6.125,14.208 6.125,20q0,2.042 0.563,3.938 0.562,1.895 1.604,3.437 1.625,-0.833 3.52,-1.333 1.896,-0.5 3.813,-0.5 1.208,0 2.333,0.188 1.125,0.187 2.125,0.52 -0.833,0.458 -1.562,1 -0.729,0.542 -1.354,1.125 -0.459,-0.042 -0.813,-0.042h-0.729q-1.375,0 -2.916,0.355 -1.542,0.354 -2.751,0.937 1.5,1.583 3.438,2.645 1.937,1.063 4.062,1.397zM20,36.667q-3.417,0 -6.459,-1.313 -3.041,-1.312 -5.312,-3.583 -2.271,-2.271 -3.583,-5.313Q3.333,23.418 3.333,20q0,-3.458 1.313,-6.479Q5.958,10.5 8.229,8.229t5.313,-3.583Q16.582,3.333 20,3.333q3.458,0 6.479,1.313 3.021,1.312 5.292,3.583t3.584,5.292q1.312,3.021 1.312,6.479 0,3.417 -1.313,6.459 -1.312,3.041 -3.583,5.312 -2.271,2.271 -5.292,3.584 -3.021,1.312 -6.479,1.312z"/> + + </group> + +</vector> + diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index c02981e643db..585c372da5fe 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Laat die program toe om die kitsboodskapdiens te gebruik om oproepe sonder jou ingryping te maak."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"lees foonstatus en identiteit"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Laat die program toe om toegang tot die foonfunksies van die toestel te verkry. Hierdie toestemming laat die program toe om te bepaal wat die foonnommer en toestel-IDs is, of die oproep aan die gang is, en die afgeleë nommer wat deur \'n oproep verbind word."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"lees basiese telefoniestatus en -identiteit"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Gee die program toegang tot die toestel se basiese telefoniekenmerke."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"roeteer oproepe deur die stelsel"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Laat die program toe om sy oproepe deur die stelsel te stuur om die oproepervaring te verbeter."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"sien en beheer oproepe deur die stelsel."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Tik om jou gesigmodel uit te vee en voeg jou gesig dan weer by"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Stel Gesigslot op"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Ontsluit jou foon deur daarna te kyk"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Skakel "<b>"kameratoegang"</b>" in Instellings > Privaatheid aan om Gesigslot te gebruik"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Stel meer maniere op om te ontsluit"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Tik om \'n vingerafdruk by te voeg"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Vingerafdrukslot"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"Berei tans <xliff:g id="APPNAME">%1$s</xliff:g> voor."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Begin programme."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Voltooi herlaai."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Skakel skerm af?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Jy het die aan/af-skakelaar gedruk terwyl jy jou vingerafdruk gestel het.\n\nDit skakel gewoonlik jou skerm af."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Skakel af"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Kanselleer"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Gaan voort met opstelling?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Jy het die aan/af-skakelaar gedruk – dit skakel gewoonlik die skerm af.\n\nProbeer liggies tik terwyl jy jou vingerafdruk opstel."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Skakel skerm af"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Doen opstelling"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Gaan voort met vingerafdrukverifiëring?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Jy het die aan/af-skakelaar gedruk – dit skakel gewoonlik die skerm af.\n\nProbeer liggies tik om jou vingerafdruk te verifieer."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Skakel skerm af"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Gaan voort"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> loop"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Tik om na die speletjie terug te keer"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Kies speletjie"</string> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index be4eeb8c693c..f338166ce87f 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"መተግበሪያው ያለእርስዎ ጣልቃ ገብነት ጥሪዎችን ለማድረግ የአይኤምኤስ አገልግሎቱን እንዲጠቀም ያስችለዋል።"</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"የስልክ ሁኔታና ማንነት አንብብ"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"መተግበሪያው የመሳሪያውን የስልክ ባህሪያት ላይ እንዲደርስ ይፈቅድለታል። ይህ ፈቃድ መተግበሪያው የስልክ ቁጥሩን እና የመሳሪያውን መታወቂያዎች፣ ጥሪ የነቃ እንደሆነ፣ እና በጥሪ የተገናኘውን የሩቅ ቁጥር እንዲወስን ይፈቅድለታል።"</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"መሠረታዊ የቴሌፎኒ ሁኔታ እና ማንነት ያንብቡ"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"መተግበሪያው የመሣሪያውን መሠረታዊ የቴሌፎኒ ባህሪያት እንዲደርስ ይፈቅድለታል።"</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"ጥሪዎችን በስርዓቱ በኩል አዙር"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"መተግበሪያው የጥሪ ተሞክሮን እንዲያሻሽል ጥሪዎቹን በስርዓቱ በኩል እንዲያዞር ያስችለዋል።"</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"በሥርዓቱ በኩል ጥሪዎችን ይመልከቱ እና ይቆጣጠሩ።"</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"የእርስዎ የመልክ ሞዴል ለመሰረዝ መታ ያድርጉ፣ ከዚያ መልክዎን እንደገና ያክሉ"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"በመልክ መክፈትን ያዋቅሩ"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"ስልክዎን በመመልከት ያስከፍቱት"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"በመልክ መክፈትን ለመጠቀም "<b>"የካሜራ መዳረሻ"</b>"ን በቅንብሮች እና ግላዊነት ውስጥ ያብሩ"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"የሚከፍቱባቸው ተጨማሪ መንገዶችን ያቀናብሩ"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"የጣት አሻራን ለማከል መታ ያድርጉ"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"በጣት አሻራ መክፈቻ"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"<xliff:g id="APPNAME">%1$s</xliff:g>ን ማዘጋጀት።"</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"መተግበሪያዎችን በማስጀመር ላይ፡፡"</string> <string name="android_upgrading_complete" msgid="409800058018374746">"አጨራረስ ማስነሻ፡፡"</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"ማያ ገጽ ይጥፋ?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"የጣት አሻራዎን ሲያዋቅሩ የኃይል አዝራሩን ተጫንተውታል። \n\n ይህ አብዛኛው ጊዜ ማያ ገጽዎን ያጠፈዋል።"</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"አጥፋ"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"ይቅር"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"ማዋቀር ይቀጥሉ?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"የማብሪያ/ማጥፊያ ቁልፉን ተጭነዋል — ይህ ብዙውን ጊዜ ማያ ገጹን ያጠፋል።\n\nየጣት አሻራዎን በሚያዋቅሩበት ጊዜ በትንሹ መታ ለማድረግ ይሞክሩ።"</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"ማያ ገጽን አጥፋ"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"ማዋቀር ቀጥል"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"የጣት አሻራዎን ማረጋገጥ ይቀጥሉ?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"የማብሪያ/ማጥፊያ ቁልፉን ተጭነዋል - ይህ ብዙውን ጊዜ ማያ ገጹን ያጠፋል። \n\n የጣት አሻራዎን ለማረጋገጥ በትንሹ መታ ለማድረግ ይሞክሩ።"</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"ማያ ገጽን አጥፋ"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"ቀጥል"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> አሂድ"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"ወደ ጨዋታ ለመመለስ መታ ያድርጉ"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"ጨዋታ ይምረጡ"</string> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 0748af27ed9a..c15f298740c4 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -483,6 +483,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"للسماح للتطبيق باستخدام خدمة الرسائل الفورية لإجراء المكالمات بدون تدخل منك."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"قراءة حالة الهاتف والهوية"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"للسماح للتطبيق بالدخول إلى ميزات الهاتف في الجهاز. ويتيح هذا الإذن للتطبيق تحديد رقم الهاتف ومعرّفات الجهاز، وما إذا كانت هناك مكالمة نشطة والرقم البعيد الذي تم الاتصال به في المكالمة."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"قراءة حالة وهوية الاتصال الهاتفي الأساسيتين"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"يسمح هذا الإذن للتطبيق بالوصول إلى ميزات الاتصال الهاتفي الأساسية للجهاز."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"توجيه المكالمات من خلال النظام"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"يسمح للتطبيق بتوجيه المكالمات من خلال النظام لتحسين تجربة الاتصال."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"رؤية المكالمات والتحكّم فيها من خلال النظام"</string> @@ -634,6 +636,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"انقر لحذف نموذج الوجه ثم أضِف نموذجًا لوجهك مرة أخرى."</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"إعداد ميزة \"فتح الجهاز بالتعرف على الوجه\""</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"يمكنك فتح قفل هاتفك بمجرّد النظر إلى الشاشة."</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"لاستخدام ميزة \"فتح الجهاز بالتعرف على الوجه\"، عليك منح إذن "<b>"الوصول إلى الكاميرا"</b>" في الإعدادات > الخصوصية."</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"إعداد المزيد من الطرق لفتح قفل الجهاز"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"انقر لإضافة بصمة إصبع."</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"فتح الجهاز ببصمة الإصبع"</string> @@ -1356,10 +1359,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"جارٍ تحضير <xliff:g id="APPNAME">%1$s</xliff:g>."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"بدء التطبيقات."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"جارٍ إعادة التشغيل."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"هل تريد إيقاف الشاشة؟"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"أثناء إعداد بصمة الإصبع، ضغطت على زر التشغيل.\n\nيؤدي هذا الإجراء عادةً إلى إيقاف الشاشة."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"إيقاف"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"إلغاء"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"هل تريد مواصلة عملية الإعداد؟"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"ضغطت على زر التشغيل، يؤدي هذا عادةً إلى إيقاف الشاشة.\n\nجرِّب النقر بخفة أثناء إعداد بصمتك."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"إيقاف الشاشة"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"مواصلة عملية الإعداد"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"هل تريد مواصلة تأكيد بصمة إصبعك؟"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"ضغطت على زر التشغيل، يؤدي هذا عادةً إلى إيقاف الشاشة.\n\nجرِّب النقر بخفة لتأكيد بصمة إصبعك."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"إيقاف الشاشة"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"متابعة"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> يعمل"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"انقر للعودة إلى اللعبة"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"اختيار اللعبة"</string> @@ -1727,7 +1734,7 @@ <string name="default_audio_route_category_name" msgid="5241740395748134483">"النظام"</string> <string name="bluetooth_a2dp_audio_route_name" msgid="4214648773120426288">"صوت بلوتوث"</string> <string name="wireless_display_route_description" msgid="8297563323032966831">"عرض شاشة لاسلكي"</string> - <string name="media_route_button_content_description" msgid="2299223698196869956">"إرسال"</string> + <string name="media_route_button_content_description" msgid="2299223698196869956">"البث"</string> <string name="media_route_chooser_title" msgid="6646594924991269208">"الاتصال بجهاز"</string> <string name="media_route_chooser_title_for_remote_display" msgid="3105906508794326446">"بث الشاشة على الجهاز"</string> <string name="media_route_chooser_searching" msgid="6119673534251329535">"جارٍ البحث عن الأجهزة…"</string> diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml index 4cfb88ccf00e..9dbfb2e81e86 100644 --- a/core/res/res/values-as/strings.xml +++ b/core/res/res/values-as/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"আপোনাৰ হস্তক্ষেপৰ অবিহনে আইএমএছ সেৱা ব্যৱহাৰ কৰি কল কৰিবলৈ এপক অনুমতি দিয়ে।"</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"ফ\'নৰ স্থিতি আৰু পৰিচয় পঢ়ক"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"ডিভাইচত থকা ফ\'নৰ সুবিধাসমূহ ব্য়ৱহাৰ কৰিবলৈ এপটোক অনুমতি দিয়ে৷ এই অনুমতিয়ে কোনো কল সক্ৰিয় হৈ থাককেই বা নাথাকক আৰু দূৰবৰ্তী নম্বৰটো কলৰ দ্বাৰা সংযোজিত হওকেই বা নহওক এপটোক ফ\'ন নম্বৰ আৰু ডিভাইচৰ পৰিচয় নিৰ্ধাৰণ কৰিবলৈ অনুমতি দিয়ে৷"</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"প্ৰাথমিক টেলিফ\'নী স্থিতি আৰু পৰিচয় পঢ়ক"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"এপ্টোক ডিভাইচটোৰ প্ৰাথমিক টেলিফ’নী সুবিধাসমূহ এক্সেছ কৰাৰ অনুমতি দিয়ে।"</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"ছিষ্টেমৰ জৰিয়তে কল কৰিব পাৰে"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"কল কৰাৰ অভিজ্ঞতাক উন্নত কৰিবলৈ এপটোক ছিষ্টেমৰ জৰিয়তে কলসমূহ কৰিবলৈ দিয়ে।"</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"ছিষ্টেমৰ জৰিয়তে কলবোৰ চোৱা আৰু নিয়ন্ত্ৰণ কৰা।"</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"আপোনাৰ মুখাৱয়বৰ মডেলটো মচিবলৈ টিপক, তাৰ পাছত পুনৰ আপোনাৰ মুখাৱয়ব যোগ দিয়ক"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"ফেচ আনলক সুবিধাটো ছেট আপ কৰক"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"আপোনাৰ ফ’নটোলৈ চাই সেইটো আনলক কৰক"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"ফেচ আনলক সুবিধাটো ব্যৱহাৰ কৰিবলৈ ছেটিং > গোপনীয়তাত "<b>"কেমেৰাৰ এক্সেছ"</b>" অন কৰক"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"আনলক কৰাৰ অধিক উপায় ছেট আপ কৰক"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"এটা ফিংগাৰপ্ৰিণ্ট যোগ দিবলৈ টিপক"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"ফিংগাৰপ্ৰিন্ট আনলক"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"<xliff:g id="APPNAME">%1$s</xliff:g>সাজু কৰি থকা হৈছে।"</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"আৰম্ভ হৈ থকা এপসমূহ।"</string> <string name="android_upgrading_complete" msgid="409800058018374746">"বুট কাৰ্য সমাপ্ত কৰিছে।"</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"স্ক্ৰীন অফ কৰিবনে?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"আপোনাৰ ফিংগাৰপ্ৰিণ্ট ছেট আপ কৰাৰ সময়ত, আপুনি পাৱাৰ বুটামটো টিপিছে।\n\nএইটোৱে সচৰাচৰ আপোনাৰ স্ক্ৰীনখন অফ কৰে।"</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"অফ কৰক"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"বাতিল কৰক"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"ছেট আপ অব্যাহত ৰাখিবনে?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"আপুনি পাৱাৰ বুটামটো টিপিছে — এইটোৱে সাধাৰণতে স্ক্ৰীনখন অফ কৰে।\n\nআপোনাৰ ফিংগাৰপ্ৰিণ্টটো ছেট আপ কৰাৰ সময়ত লাহেকৈ টিপি চাওক।"</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"স্ক্ৰীন অফ কৰক"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"ছেট আপ অব্যাহত ৰাখক"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"ফিংগাৰপ্ৰিণ্ট সত্যাপন কৰা জাৰি ৰাখিবনে?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"আপুনি পাৱাৰ বুটামটো টিপিছে — এইটোৱে সাধাৰণতে স্ক্ৰীনখন অফ কৰে।\n\nআপোনাৰ ফিংগাৰপ্ৰিণ্টটো সত্যাপন কৰিবলৈ লাহেকৈ টিপি চাওক।"</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"স্ক্ৰীন অফ কৰক"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"অব্যাহত ৰাখক"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> চলি আছে"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"গেইমলৈ উভতি যাওক"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"গেইম বাছনি কৰক"</string> diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml index 136563a3859c..1c9355264d8c 100644 --- a/core/res/res/values-az/strings.xml +++ b/core/res/res/values-az/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Tətbiqə müdaxilə olmadan zəng etmək üçün IMS xidmətindən istifadə etməyə imkan verir."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"telefon statusunu və identifikasiyanı oxuyur"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Tətbiqə cihazın telefon funksiyalarına giriş icazəsi verir. Belə icazəli tətbiq bu telefonun nömrəsini və cihaz İD\'ni, zəngin aktiv olub-olmadığını və zəng edilən nömrəni müəyyən edə bilər."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"əsas telefoniya statusu və identifikasiyasını oxuyun"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Tətbiqə cihazın əsas telefoniya funksiyalarına giriş etmək imkanı verir."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"zəngləri sistem üzərindən yönləndirin"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Tətbiqə, zəng təcrübəsini yaxşılaşdırmaq üçün, zəngləri sistem üzərindən yönləndirməyə icazə verilir."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"zənglərə sistemdə baxın və nəzarət edin."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Üz modelinizi silmək üçün toxunun, sonra yenidən üzünüzü əlavə edin"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Üz ilə kiliddən çıxarmanı ayarlayın"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Telefona baxaraq onu kiliddən çıxarın"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Üz ilə Kiliddən Açma funksiyasını istifadə etmək üçün Ayarlar > Məxfilik bölməsində "<b>"Kameraya girişi"</b>" aktiv edin"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Kiliddən çıxarmağın daha çox yolunu ayarlayın"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Barmaq izi əlavə etmək üçün toxunun"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Barmaq izi ilə kiliddən çıxarma"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"<xliff:g id="APPNAME">%1$s</xliff:g> proqramının hazırlanması."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Tətbiqlər başladılır."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Yükləmə başa çatır."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Ekran deaktiv edilsin?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Barmaq izinizi ayarlayarkən Qidalanma düyməsinə basdınız.\n\nBu, adətən ekranınızı deaktiv edir."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Deaktiv edin"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Ləğv edin"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Ayarlamağa davam edilsin?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Qidalanma düyməsini basdınız — adətən bu, ekranı söndürür.\n\nBarmaq izini ayarlayarkən yüngülcə toxunmağa çalışın."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Ekranı söndürün"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Ayarlamağa davam edin"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Barmaq izini doğrulamağa davam edilsin?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Qidalanma düyməsini basdınız — adətən bu, ekranı söndürür.\n\nBarmaq izini doğrulamaq üçün yüngülcə toxunmağa çalışın."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Ekranı söndürün"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Davam edin"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> çalışır"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Oyuna qayıtmaq üçün klikləyin"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Oyun seçin"</string> diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index 00fc2b5dac5b..92416316cb85 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -474,6 +474,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Dozvoljava aplikaciji da koristi uslugu razmene trenutnih poruka da bi upućivala pozive bez vaše intervencije."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"čitanje statusa i identiteta telefona"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Dozvoljava aplikaciji da pristupa funkcijama telefona na uređaju. Ova dozvola omogućava aplikaciji da utvrdi broj telefona i ID-ove uređaja, zatim da li je poziv aktivan, kao i broj daljinskog uređaja sa kojim je uspostavljen poziv."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"očitavanje osnovnog telefonskog statusa i identiteta"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Omogućava aplikaciji da pristupa osnovnim telefonskim funkcijama uređaja."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"preusmeravanje poziva preko sistema"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Dozvoljava aplikaciji da preusmerava pozive preko sistema da bi poboljšala doživljaj pozivanja."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"pregled i kontrola poziva preko sistema."</string> @@ -625,6 +627,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Dodirnite da biste izbrisali model lica, pa ponovo dodajte svoje lice"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Podesite otključavanje licem"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Otključajte telefon tako što ćete ga pogledati"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Da biste koristili otključavanje licem, uključite "<b>"pristup kameri"</b>" u odeljku Podešavanja > Privatnost"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Podesite još načina za otključavanje"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Dodirnite da biste dodali otisak prsta"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Otključavanje otiskom prsta"</string> @@ -1296,10 +1299,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"Priprema se <xliff:g id="APPNAME">%1$s</xliff:g>."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Pokretanje aplikacija."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Završavanje pokretanja."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Želite da isključite ekran?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Pritisli ste dugme za uključivanje tokom podešavanja otiska prsta.\n\nTako se najčešće isključuje ekran."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Isključi"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Otkaži"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Želite li da nastavite sa podešavanjem?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Pritisnuli ste dugme za uključivanje – time obično isključujete ekran.\n\nProbajte lagano da dodirnete dok podešavate otisak prsta."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Isključi ekran"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Nastavi podešavanje"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Nastavljate verifikaciju otiska prsta?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Pritisnuli ste dugme za uključivanje – time obično isključujete ekran.\n\nProbajte lagano da dodirnete da biste verifikovali otisak prsta."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Isključi ekran"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Nastavi"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"Aplikacija <xliff:g id="APP">%1$s</xliff:g> je pokrenuta"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Dodirnite da biste se vratili u igru"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Odaberite igru"</string> diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index 0157e66b5118..849d53b0ad04 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -404,7 +404,7 @@ <string name="permdesc_persistentActivity" product="tablet" msgid="6055271149187369916">"Дазваляе прыкладанню захоўваць некаторыя пастаянныя часткi ў памяцi. Гэта можа абмежаваць аб\'ём памяці, даступнай для іншых прыкладанняў, i запаволiць працу планшэта."</string> <string name="permdesc_persistentActivity" product="tv" msgid="6800526387664131321">"Дазваляе праграме пастаянна захоўваць некаторыя свае часткі ў памяці прылады. Гэта можа абмежаваць аб\'ём памяці, даступнай для іншых праграм, і запаволіць працу прылады Android TV."</string> <string name="permdesc_persistentActivity" product="default" msgid="1914841924366562051">"Дазваляе прыкладанню захоўваць некаторыя пастаянныя часткi ў памяцi. Гэта можа абмежаваць аб\'ём памяці, даступнай для іншых прыкладанняў, i запаволiць працу тэлефона."</string> - <string name="permlab_foregroundService" msgid="1768855976818467491">"запусціць асноўныя сэрвісы"</string> + <string name="permlab_foregroundService" msgid="1768855976818467491">"запусціць актыўныя сэрвісы"</string> <string name="permdesc_foregroundService" msgid="8720071450020922795">"Дазваляе праграме выкарыстоўваць асноўныя сэрвісы."</string> <string name="permlab_getPackageSize" msgid="375391550792886641">"вымерыць прастору для захоўвання прыкладання"</string> <string name="permdesc_getPackageSize" msgid="742743530909966782">"Дазваляе прыкладанням атрымліваць яго код, дадзеныя і аб\'ём кэш-памяці"</string> @@ -477,6 +477,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Дазваляе праграмам выкарыстоўваць службу IMS, каб рабіць выклікі без вашага ўмяшання."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"чытанне статусу тэлефона і ідэнтыфікацыя"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Дазваляе прыкладанням атрымлiваць доступ да функцый тэлефона на прыладзе. Дзякуючы гэтаму дазволу прыкладанне можа вызначаць iдэнтыфiкатары нумару тэлефона i прылады, незалежна ад таго, цi актыўны выклiк, i аддалены нумар, на якi робiцца выклiк."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"счытваць даныя пра асноўны стан тэлефаніі і ідэнтыфікацыю"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Дазваляе праграме мець доступ да асноўных функцый тэлефаніі на прыладзе."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"перанакіраванне выклікаў праз сістэму"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Дазваляе праграме перанакіроўваць выклікі праз сістэму ў мэтах паляпшэння выклікаў."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"праглядаць выклікі і кіраваць імі праз сістэму."</string> @@ -628,6 +630,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Націсніце, каб выдаліць мадэль твару, пасля дадайце твар яшчэ раз"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Наладзьце распазнаванне твару"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Разблакіруйце свой тэлефон, паглядзеўшы на яго"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Каб выкарыстоўваць распазнаванне твару, уключыце "<b>"доступ да камеры"</b>" праз раздзел \"Налады > Прыватнасць\""</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Наладзьце дадатковыя спосабы разблакіроўкі"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Націсніце, каб дадаць адбітак пальца"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Разблакіраванне адбіткам пальца"</string> @@ -726,8 +729,8 @@ <string name="permdesc_handoverStatus" msgid="3842269451732571070">"Дазваляе праграме атрымліваць інфармацыю аб бягучых перадачах Android Beam"</string> <string name="permlab_removeDrmCertificates" msgid="710576248717404416">"выдаленне сертыфікатаў DRM"</string> <string name="permdesc_removeDrmCertificates" msgid="4068445390318355716">"Дазваляе праграме выдаляць сертыфікаты DRM. Ніколі не павінна патрабавацца для звычайных праграм."</string> - <string name="permlab_bindCarrierMessagingService" msgid="3363450860593096967">"прывязка да службы паведамленняў аператара"</string> - <string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Дазваляе ўладальніку выконваць прывязку да інтэрфейсу верхняга ўзроўню службы паведамленняў аператара. Ніколі не павінна патрабавацца для звычайных праграм."</string> + <string name="permlab_bindCarrierMessagingService" msgid="3363450860593096967">"падключэнне да сэрвісу абмену паведамленнямі аператара"</string> + <string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Дазваляе ўладальніку выконваць падключэнне да базавага інтэрфейсу сэрвісу абмену паведамленнямі аператара. Звычайныя праграмы ніколі не выкарыстоўваюць гэты дазвол."</string> <string name="permlab_bindCarrierServices" msgid="2395596978626237474">"прывязвацца з сэрвісаў аператара"</string> <string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Дазваляе ўладальніку ажыццяўляць прывязку да сэрвісаў аператара. Ніколі не павінна патрабавацца для звычайных праграм."</string> <string name="permlab_access_notification_policy" msgid="5524112842876975537">"атрымліваць доступ да рэжыму «Не турбаваць»"</string> @@ -1316,10 +1319,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"Падрыхтоўка <xliff:g id="APPNAME">%1$s</xliff:g>."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Запуск прыкладанняў."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Завяршэнне загрузкі."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Выключыць экран?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Падчас наладкі адбітка пальца вы націскалі кнопку сілкавання.\n\nЗвычайна гэта дзеянне выключае экран."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Выключыць"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Скасаваць"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Працягнуць наладжванне?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Вы націснулі кнопку сілкавання. Звычайна ў выніку гэтага дзеяння выключаецца экран.\n\nПадчас наладжвання адбітка пальца злёгку дакраніцеся да кнопкі."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Выключыць экран"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Працягнуць наладку"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Працягнуць спраўджанне адбітка пальца?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Вы націснулі кнопку сілкавання. Звычайна ў выніку гэтага дзеяння выключаецца экран.\n\nКаб спраўдзіць адбітак пальца, злёгку дакраніцеся да кнопкі."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Выключыць экран"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Працягнуць"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"Прыкладанне \"<xliff:g id="APP">%1$s</xliff:g>\" запушчанае"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Націсніце, каб вярнуцца да гульні"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Выберыце гульню"</string> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index d75d2e7543d6..dad2f03cbd68 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Разрешава на приложението да използва услугата за незабавни съобщения за извършване на обаждания без намеса от ваша страна."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"четене на състоянието и идентификационните данни на телефона"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Разрешава на приложението достъп до телефонните функции на устройството. Това разрешение позволява на приложението да определя телефонния номер и идентификационния номер на устройството, дали се води разговор и отдалечения номер, до който е установена връзка с обаждането."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"четене на основното телефонно състояние и идентичност"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Разрешава на приложението да осъществява достъп до основните телефонни функции на устройството."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"маршрутизиране на обажданията чрез системата"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Разрешава на приложението да маршрутизира обажданията си чрез системата с цел подобряване на свързаната с тях практическа работа."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"вижда и управлява обажданията чрез системата."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Докоснете, за да изтриете модела на лицето си, след което добавете лицето си отново"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Настройване на отключването с лице"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Отключвайте телефона си, като го погледнете"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"За да използвате функцията „Отключване с лице“, включете "<b>"достъпа до камерата"</b>" от „Настройки > Поверителност“"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Настройване на още начини за отключване на телефона"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Докоснете, за да добавите отпечатък"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Отключване с отпечатък"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"<xliff:g id="APPNAME">%1$s</xliff:g> се подготвя."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Приложенията се стартират."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Зареждането завършва."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Да се изключи ли екранът?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"При настройването на отпечатъка си натиснахте бутона за захранване.\n\nТова действие обикновено изключва екрана."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Изключване"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Отказ"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Искате ли да продължите с настройването?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Натиснахте бутона за включване/изключване – това обикновено изключва екрана.\n\nОпитайте да докоснете леко, докато настройвате отпечатъка си."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Изключване на екрана"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Напред с настройв."</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Напред с потвърждаването на отпечатъка?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Натиснахте бутона за включване/изключване – това обикновено изключва екрана.\n\nОпитайте да докоснете леко, за да потвърдите отпечатъка си."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Изключване на екрана"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Напред"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> се изпълнява"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Докоснете, за да се върнете към играта"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Избиране на игра"</string> diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml index 30809483882d..d560d5c1e107 100644 --- a/core/res/res/values-bn/strings.xml +++ b/core/res/res/values-bn/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"আপনার হস্তক্ষেপ ছাড়াই কল করতে অ্যাপ্লিকেশানটিকে IMS পরিষেবা ব্যবহারের অনুমতি দিন৷"</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"ফোনের স্থিতি এবং পরিচয় পড়ুন"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"অ্যাপ্লিকেশানটিকে ডিভাইসের ফোন বৈশিষ্ট্যগুলিকে অ্যাক্সেস করার অনুমতি দেয়৷ এই অনুমতিটি অ্যাপ্লিকেশানটিকে একটি কল সক্রিয় থাকা অবস্থায় এবং দূরবর্তী নম্বর একটি কল দ্বারা সংযুক্ত থাকাকালীনও ফোন নম্বর এবং ডিভাইসের IDগুলি নির্ধারণ করার অনুমতি দেয়৷"</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"টেলিফোন সংক্রান্ত স্ট্যাটাস ও পরিচয় সংক্রান্ত প্রাথমিক বিষয় পড়ুন"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"অ্যাপটিকে ডিভাইসের টেলিফোন সংক্রান্ত প্রাথমিক ফিচারগুলি অ্যাক্সেস করার অনুমতি দিন।"</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"সিস্টেমের মাধ্যমে কলগুলি রুট করতে দিন"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"কল করার অভিজ্ঞতা উন্নত করার জন্য অ্যাপকে সিস্টেমের মাধ্যমে তার কলগুলি রুট করতে দেয়।"</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"সিস্টেমের মাধ্যমে কল দেখা এবং নিয়ন্ত্রণ করা।"</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"আপনার ফেস মডেল মুছে দেওয়ার জন্য ট্যাপ করুন এবং তারপরে আবার ফেস যোগ করুন"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"\'ফেস আনলক\' সেট আপ করুন"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"আপনার ফোনের দিকে তাকিয়ে এটিকে আনলক করুন"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"\'ফেস আনলক\' ফিচার ব্যবহার করতে \'সেটিংস ও গোপনীয়তা\' বিকল্পে গিয়ে "<b>"ক্যামেরায় অ্যাক্সেস দিন"</b></string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"আনলক করার জন্য বিভিন্ন উপায়ে সেট আপ করুন"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"একটি আঙ্গুলের ছাপ যোগ করতে ট্যাপ করুন"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"ফিঙ্গারপ্রিন্ট আনলক"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"<xliff:g id="APPNAME">%1$s</xliff:g> প্রস্তুত করা হচ্ছে৷"</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"অ্যাপ্লিকেশানগুলি শুরু করা হচ্ছে৷"</string> <string name="android_upgrading_complete" msgid="409800058018374746">"চালু করা সম্পূর্ণ হচ্ছে৷"</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"স্ক্রিন বন্ধ করবেন?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"আপনার আঙ্গুলের ছাপ সেট আপ করার সময়, পাওয়ার বোতাম প্রেস করেছিলেন।\n\nএর ফলে সাধারণত আপনার স্ক্রিন বন্ধ হয়ে যায়।"</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"বন্ধ করুন"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"বাতিল করুন"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"সেট-আপ করা চালিয়ে যাবেন?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"আপনি \'পাওয়ার\' বোতাম প্রেস করেছেন — এর ফলে সাধারণত স্ক্রিন বন্ধ হয়ে যায়।\n\nআঙ্গুলের ছাপ সেট-আপ করার সময় হালকাভাবে ট্যাপ করে দেখুন।"</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"স্ক্রিন বন্ধ করুন"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"সেট-আপ চালিয়ে যান"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"আঙ্গুলের ছাপ যাচাই করা চালিয়ে যাবেন?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"আপনি \'পাওয়ার\' বোতাম প্রেস করেছেন — এর ফলে সাধারণত স্ক্রিন বন্ধ হয়ে যায়।\n\nআঙ্গুলের ছাপ যাচাই করতে হালকাভাবে ট্যাপ করে দেখুন।"</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"স্ক্রিন বন্ধ করুন"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"এগিয়ে যান"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> চলছে"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"গেমে ফিরে আসতে ট্যাপ করুন"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"গেম বেছে নিন"</string> diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml index ea374900ac35..68ccf1546bfc 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -474,6 +474,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Omogućava aplikaciji da koristi IMS uslugu za pozivanje bez vaše intervencije."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"čitanje statusa i identiteta telefona"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Omogućava aplikaciji pristup telefonskim funkcijama uređaja. Ovo odobrenje omogućava aplikaciji određivanje telefonskog i identifikacionog broja uređaja, bez obzira da li je poziv aktivan i da li je uspostavljena veza sa pozivanim brojem."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"očitavanje osnovnog telefonskog statusa i identiteta"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Dozvoljava aplikaciji pristup osnovnim telefonskim funkcijama uređaja."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"usmjeravanje poziva preko sistema"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Dopušta aplikaciji da pozive usmjeri preko sistema radi poboljšanja iskustva pozivanja."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"vidjeti i kontrolirati pozive preko sistema."</string> @@ -625,6 +627,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Dodirnite da izbrišete model lica, a zatim ponovo dodajte lice"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Postavite otključavanje licem"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Otključajte telefon gledajući u njega"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Da koristite otključavanje licem, uključite "<b>"Pristup kameri"</b>" u meniju Postavke > Privatnost"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Postavite više načina otključavanja"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Dodirnite da dodate otisak prsta"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Otključavanje otiskom prsta"</string> @@ -1296,10 +1299,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"Pripremanje aplikacije <xliff:g id="APPNAME">%1$s</xliff:g>."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Pokretanje aplikacija."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Pokretanje pri kraju."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Isključiti ekran?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Prilikom postavljanja otiska prsta, pritisnuli ste dugme za uključivanje.\n\nTime se obično isključuje ekran."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Isključi"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Otkaži"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Nastaviti postavljanje?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Pritisnuli ste dugme za uključivanje. Tako se obično isključuje ekran.\n\nPokušajte ga lagano dodirnuti dok postavljate otisak prsta."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Isključi ekran"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Nastavi postavljanje"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Nastaviti s potvrđivanjem otiska prsta?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Pritisnuli ste dugme za uključivanje. Tako se obično isključuje ekran.\n\nPokušajte ga lagano dodirnuti da potvrdite otisak prsta."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Isključi ekran"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Nastavi"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"Pokrenuta je aplikacija <xliff:g id="APP">%1$s</xliff:g>"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Dodirnite za povratak u igru"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Odaberite igru"</string> @@ -2049,7 +2056,7 @@ <string name="demo_restarting_message" msgid="1160053183701746766">"Vraćanje uređaja na početne postavke…"</string> <string name="suspended_widget_accessibility" msgid="6331451091851326101">"Onemogućen <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="conference_call" msgid="5731633152336490471">"Konferencijski poziv"</string> - <string name="tooltip_popup_title" msgid="7863719020269945722">"Savjet za alat"</string> + <string name="tooltip_popup_title" msgid="7863719020269945722">"Skočni opis"</string> <string name="app_category_game" msgid="4534216074910244790">"Igre"</string> <string name="app_category_audio" msgid="8296029904794676222">"Muzika i zvuk"</string> <string name="app_category_video" msgid="2590183854839565814">"Filmovi i videozapisi"</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 91ba2f0095e7..726bb3f59a1a 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Permet que l\'aplicació utilitzi el servei IMS per fer trucades sense la teva intervenció."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"veure l\'estat i la identitat del telèfon"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Permet que l\'aplicació accedeixi a les funcions de telèfon del dispositiu. Aquest permís permet que l\'aplicació determini el número de telèfon i els identificadors del dispositiu, si hi ha una trucada activa i el número remot connectat amb una trucada."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"llegir la identitat i l\'estat bàsics de telefonia"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Permet que l\'aplicació accedeixi a les funcions de telefonia bàsiques del dispositiu."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"encaminar trucades a través del sistema"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Permet que l\'aplicació encamini les trucades a través del sistema per millorar-ne l\'experiència."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"consulta i controla les trucades a través del sistema."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Toca per suprimir el teu model facial i, a continuació, torna a afegir la teva cara"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Configura Desbloqueig facial"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Mira el telèfon per desbloquejar-lo"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Per utilitzar Desbloqueig facial, activa "<b>"Accés a la càmera"</b>" a Configuració > Privadesa"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Configura més maneres de desbloquejar el dispositiu"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Toca per afegir una empremta digital"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Desbloqueig amb empremta digital"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"S\'està preparant <xliff:g id="APPNAME">%1$s</xliff:g>."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"S\'estan iniciant les aplicacions."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"S\'està finalitzant l\'actualització."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Vols apagar la pantalla?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Mentre configuraves la teva empremta digital has premut el botó d\'engegada.\n\nAixò normalment apaga la pantalla."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Desactiva"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Cancel·la"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Vols continuar amb la configuració?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Has premut el botó d\'engegada, fet que sol apagar la pantalla.\n\nProva de tocar-lo lleugerament en configurar l\'empremta digital."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Apaga la pantalla"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Continua configurant"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Vols continuar verificant l\'empremta?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Has premut el botó d\'engegada, fet que sol apagar la pantalla.\n\nProva de tocar-lo lleugerament per verificar l\'empremta digital."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Apaga la pantalla"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Continua"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> s\'està executant"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Toca per tornar al joc"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Tria el joc"</string> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index c928655ee2b7..abbcc2c45fe8 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -477,6 +477,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Umožňuje aplikaci používat službu zasílání rychlých zpráv k uskutečňování hovorů bez vašeho zásahu."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"čtení stavu a identity telefonu"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Umožňuje aplikaci získat přístup k telefonním funkcím zařízení. Toto oprávnění umožňuje aplikaci zjistit telefonní číslo telefonu, identifikační čísla zařízení, zda zrovna probíhá hovor, a vzdálené číslo, ke kterému je hovor připojen."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"čtení základního stavu a identity související s telefonováním"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Umožňuje aplikaci přístup k základním telefonickým funkcím zařízení."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"směrování volání prostřednictvím systému"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Umožňuje aplikaci směrovat volání prostřednictvím systému za účelem vylepšení funkcí volání."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"zobrazení a ovládání hovorů v systému."</string> @@ -628,6 +630,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Klepnutím svůj model obličeje smažte a potom ho přidejte znovu"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Nastavte odemknutí obličejem"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Telefon odemknete pohledem"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Pokud chcete používat odemknutí obličejem, v Nastavení > Soukromí zapnetě "<b>"přístup k fotoaparátu"</b></string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Nastavte si více způsobů odemykání"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Klepnutím přidáte otisk prstu"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Odemknutí otiskem prstu"</string> @@ -1316,10 +1319,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"Příprava aplikace <xliff:g id="APPNAME">%1$s</xliff:g>."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Spouštění aplikací."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Dokončování inicializace."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Vypnout obrazovku?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Při nastavování otisku prstu jste stiskli vypínač.\n\nTen obvykle vypne obrazovku."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Vypnout"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Zrušit"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Pokračovat v nastavování?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Stiskli jste vypínač – tím se obvykle vypíná obrazovka.\n\nPři nastavování otisku prstu je třeba klepat lehce."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Vypnout obrazovku"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Pokračovat v nastavení"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Pokračovat v ověřování otisku prstu?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Stiskli jste vypínač – tím se obvykle vypíná obrazovka.\n\nZkuste lehkým klepnutím ověřit svůj otisk prstu."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Vypnout obrazovku"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Pokračovat"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"Běží aplikace <xliff:g id="APP">%1$s</xliff:g>"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Klepnutím se vrátíte do hry"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Vyberte hru"</string> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 4c60718557db..57673f44cdcc 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Tillader, at appen kan bruge chat-tjenesten til at foretage opkald, uden du gør noget."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"læse telefonens status og identitet"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Tillader, at appen kan få adgang til telefonfunktionerne på enheden. Med denne tilladelse kan appen fastslå telefonnummeret og enheds-id\'erne, hvorvidt et opkald er aktivt samt det eksterne nummer, der oprettes forbindelse til via et opkald."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"tilgå grundlæggende oplysninger om telefonistatus og -identitet"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Giver appen adgang til enhedens grundlæggende telefonifunktioner."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"dirigere opkald gennem systemet"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Tillader appen at dirigere sine opkald gennem systemet for at forbedre opkaldsoplevelsen."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"se og styre opkald via systemet."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Tryk for at slette din ansigtsmodel, og tilføj derefter dit ansigt igen"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Konfigurer ansigtslås"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Lås din telefon op ved at kigge på den"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Hvis du vil bruge ansigtslåsen, skal du aktivere "<b>"Kameraadgang"</b>" under Indstillinger > Privatliv"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Konfigurer flere måder at låse op på"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Tryk for at tilføje et fingeraftryk"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Oplåsning med fingeraftryk"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"Forbereder <xliff:g id="APPNAME">%1$s</xliff:g>."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Åbner dine apps."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Gennemfører start."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Vil du slukke skærmen?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Ved konfigurationen af dit fingeraftryk trykkede du på afbryderknappen.\n\nDet medfører normalt, at din skærm slukkes."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Sluk"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Annuller"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Vil du fortsætte konfigurationen?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Du har trykket på afbryderknappen, hvilket som regel slukker skærmen.\n\nPrøv at trykke let på knappen, mens du konfigurerer dit fingeraftryk."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Sluk skærm"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Fortsæt"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Vil du bekræfte dit fingeraftryk?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Du har trykket på afbryderknappen, hvilket som regel slukker skærmen.\n\nPrøv at trykke let på knappen for at bekræfte dit fingeraftryk."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Sluk skærm"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Fortsæt"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> er i gang"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Tryk for at vende tilbage til spillet"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Vælg et spil"</string> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 25ba98b60b43..fde9b0c63539 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Ermöglicht der App die Verwendung des IMS-Dienstes zum Tätigen von Anrufen ohne Nutzereingriffe"</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"Telefonstatus und Identität abrufen"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Ermöglicht der App, auf die Telefonfunktionen des Geräts zuzugreifen. Die Berechtigung erlaubt der App, die Telefonnummer und Geräte-IDs zu erfassen, festzustellen, ob gerade ein Gespräch geführt wird, und die Rufnummer verbundener Anrufer zu lesen."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"Grundlegenden Telefoniestatus und Identität lesen"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Ermöglicht der App, auf die grundlegenden Telefoniefunktionen des Geräts zuzugreifen."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"Anrufe über das System durchführen"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Ermöglicht der App, Anrufe über das System durchzuführen, um die Anrufqualität zu verbessern."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"Anrufe durch das System einsehen und verwalten."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Tippe, um dein Gesichtsmodell zu löschen, und füge es dann noch einmal hinzu"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Entsperrung per Gesichtserkennung einrichten"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Entsperre dein Smartphone, indem du es ansiehst"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Wenn du die Entsperrung per Gesichtserkennung verwenden möchtest, aktiviere in den Einstellungen unter „Datenschutz“ die Option "<b>"Kamerazugriff"</b></string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Weitere Möglichkeiten zum Entsperren einrichten"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Tippe, um einen Fingerabdruck hinzuzufügen"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Entsperrung per Fingerabdruck"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"<xliff:g id="APPNAME">%1$s</xliff:g> wird vorbereitet"</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Apps werden gestartet..."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Start wird abgeschlossen..."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Display ausschalten?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Beim Einrichten deines Fingerabdrucks hast du die Ein-/Aus-Taste gedrückt.\n\nDamit wird üblicherweise das Display ausgeschaltet."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Ausschalten"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Abbrechen"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Einrichtung fortsetzen?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Du hast die Ein-/Aus-Taste gedrückt — damit wird der Bildschirm ausgeschaltet.\n\nTippe die Taste leicht an, um deinen Fingerabdruck einzurichten."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Ausschalten"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Weiter einrichten"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Mit der Fingerabdruckprüfung fortfahren?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Du hast die Ein-/Aus-Taste gedrückt — damit wird der Bildschirm ausgeschaltet.\n\nTippe die Taste leicht an, um mit deinem Fingerabdruck deine Identität zu bestätigen."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Ausschalten"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Fortfahren"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> läuft"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Tippe, um zum Spiel zurückzukehren"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Spiel wählen"</string> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 4764e6a4d63f..b0ad4da8246c 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Επιτρέπει στην εφαρμογή τη χρήση της υπηρεσίας IMS για την πραγματοποίηση κλήσεων χωρίς τη δική σας παρέμβαση."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"διαβάζει την κατάσταση και ταυτότητα τηλεφώνου"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Επιτρέπει στην εφαρμογή την πρόσβαση στις λειτουργίες τηλεφώνου της συσκευής. Αυτή η άδεια δίνει τη δυνατότητα στην εφαρμογή να καθορίζει τον αριθμό τηλεφώνου και τα αναγνωριστικά συσκευών, εάν μια κλήση είναι ενεργή, καθώς και τον απομακρυσμένο αριθμό που συνδέεται από μια κλήση."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"ανάγνωση βασικών πληροφοριών κατάστασης και ταυτότητας τηλεφωνίας"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Επιτρέπει στην εφαρμογή να έχει πρόσβαση στις βασικές λειτουργίες τηλεφωνίας της συσκευής."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"δρομολόγηση κλήσεων μέσω του συστήματος"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Επιτρέπει στην εφαρμογή να δρομολογεί τις κλήσεις της μέσω του συστήματος για να βελτιώσει την εμπειρία κλήσης."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"προβολή και έλεγχος κλήσεων μέσω του συστήματος."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Πατήστε για να διαγράψετε το μοντέλο προσώπου και, στη συνέχεια, προσθέστε το πρόσωπό σας ξανά."</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Ρύθμιση της λειτουργίας Ξεκλείδωμα με το πρόσωπο"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Ξεκλειδώστε το τηλέφωνό σας απλώς κοιτώντας το"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Για να χρησιμοποιήσετε τη λειτουργία Ξεκλείδωμα με το πρόσωπο, ενεργοποιήστε την επιλογή "<b>"Πρόσβαση στην κάμερα"</b>" από το μενού Ρυθμίσεις > Απόρρητο"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Ρυθμίστε περισσότερους τρόπους ξεκλειδώματος"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Πατήστε για να προσθέσετε δακτυλικό αποτύπωμα"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Ξεκλείδωμα με δακτυλικό αποτύπωμα"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"Προετοιμασία <xliff:g id="APPNAME">%1$s</xliff:g>."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Έναρξη εφαρμογών."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Ολοκλήρωση εκκίνησης."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Απενεργοποίηση οθόνης;"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Κατά τη ρύθμιση του δακτυλικού σας αποτυπώματος, πατήσατε το κουμπί λειτουργίας.\n\nΑυτό απενεργοποιεί συνήθως την οθόνη."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Απενεργοποίηση"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Ακύρωση"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Συνέχιση ρύθμισης;"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Πατήσατε το κουμπί λειτουργίας. Αυτό συνήθως απενεργοποιεί την οθόνη.\n\nΔοκιμάστε να πατήσετε απαλά κατά τη ρύθμιση του δακτυλικού σας αποτυπώματος."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Απενεργοπ. οθόνης"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Συνέχιση ρύθμισης"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Συνέχιση επαλήθευσης δακτ. αποτυπώματος;"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Πατήσατε το κουμπί λειτουργίας. Αυτό συνήθως απενεργοποιεί την οθόνη.\n\nΔοκιμάστε να πατήστε απαλά για να επαληθεύσετε το δακτυλικό σας αποτύπωμα."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Απενεργοπ. οθόνης"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Συνέχεια"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"Η εφαρμογή <xliff:g id="APP">%1$s</xliff:g> εκτελείται"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Πατήστε για να επιστρέψετε στο παιχνίδι"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Επιλέξτε παιχνίδι"</string> diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index a7647b6019e7..fd68ddd1549a 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Allows the app to use the IMS service to make calls without your intervention."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"read phone status and identity"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Allows the app to access the phone features of the device. This permission allows the app to determine the phone number and device IDs, whether a call is active and the remote number connected by a call."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"read basic telephony status and identity"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Allows the app to access the basic telephony features of the device."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"route calls through the system"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Allows the app to route its calls through the system in order to improve the calling experience."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"see and control calls through the system."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Tap to delete your face model, then add your face again"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Set up Face Unlock"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Unlock your phone by looking at it"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"To use Face Unlock, turn on "<b>"Camera access"</b>" in Settings > Privacy"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Set up more ways to unlock"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Tap to add a fingerprint"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Fingerprint Unlock"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"Preparing <xliff:g id="APPNAME">%1$s</xliff:g>."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Starting apps."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Finishing boot."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Turn off screen?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"While setting up your fingerprint, you pressed the power button.\n\nThis usually turns off your screen."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Turn off"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Cancel"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Continue setup?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"You pressed the power button – this usually turns off the screen.\n\nTry tapping lightly while setting up your fingerprint."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Turn off screen"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Continue setup"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Continue verifying your fingerprint?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"You pressed the power button – this usually turns off the screen.\n\nTry tapping lightly to verify your fingerprint."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Turn off screen"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Continue"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> running"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Tap to return to game"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Choose game"</string> diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml index 8c28433e9d9d..265d2e673049 100644 --- a/core/res/res/values-en-rCA/strings.xml +++ b/core/res/res/values-en-rCA/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Allows the app to use the IMS service to make calls without your intervention."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"read phone status and identity"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Allows the app to access the phone features of the device. This permission allows the app to determine the phone number and device IDs, whether a call is active and the remote number connected by a call."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"read basic telephony status and identity"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Allows the app to access the basic telephony features of the device."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"route calls through the system"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Allows the app to route its calls through the system in order to improve the calling experience."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"see and control calls through the system."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Tap to delete your face model, then add your face again"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Set up Face Unlock"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Unlock your phone by looking at it"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"To use Face Unlock, turn on "<b>"Camera access"</b>" in Settings > Privacy"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Set up more ways to unlock"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Tap to add a fingerprint"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Fingerprint Unlock"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"Preparing <xliff:g id="APPNAME">%1$s</xliff:g>."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Starting apps."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Finishing boot."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Turn off screen?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"While setting up your fingerprint, you pressed the power button.\n\nThis usually turns off your screen."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Turn off"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Cancel"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Continue setup?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"You pressed the power button – this usually turns off the screen.\n\nTry tapping lightly while setting up your fingerprint."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Turn off screen"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Continue setup"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Continue verifying your fingerprint?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"You pressed the power button – this usually turns off the screen.\n\nTry tapping lightly to verify your fingerprint."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Turn off screen"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Continue"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> running"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Tap to return to game"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Choose game"</string> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index 6e2595462ecb..8ee21a3abd43 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Allows the app to use the IMS service to make calls without your intervention."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"read phone status and identity"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Allows the app to access the phone features of the device. This permission allows the app to determine the phone number and device IDs, whether a call is active and the remote number connected by a call."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"read basic telephony status and identity"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Allows the app to access the basic telephony features of the device."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"route calls through the system"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Allows the app to route its calls through the system in order to improve the calling experience."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"see and control calls through the system."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Tap to delete your face model, then add your face again"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Set up Face Unlock"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Unlock your phone by looking at it"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"To use Face Unlock, turn on "<b>"Camera access"</b>" in Settings > Privacy"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Set up more ways to unlock"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Tap to add a fingerprint"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Fingerprint Unlock"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"Preparing <xliff:g id="APPNAME">%1$s</xliff:g>."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Starting apps."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Finishing boot."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Turn off screen?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"While setting up your fingerprint, you pressed the power button.\n\nThis usually turns off your screen."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Turn off"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Cancel"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Continue setup?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"You pressed the power button – this usually turns off the screen.\n\nTry tapping lightly while setting up your fingerprint."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Turn off screen"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Continue setup"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Continue verifying your fingerprint?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"You pressed the power button – this usually turns off the screen.\n\nTry tapping lightly to verify your fingerprint."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Turn off screen"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Continue"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> running"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Tap to return to game"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Choose game"</string> diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index 53031c69ca57..7fada24faaae 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Allows the app to use the IMS service to make calls without your intervention."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"read phone status and identity"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Allows the app to access the phone features of the device. This permission allows the app to determine the phone number and device IDs, whether a call is active and the remote number connected by a call."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"read basic telephony status and identity"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Allows the app to access the basic telephony features of the device."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"route calls through the system"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Allows the app to route its calls through the system in order to improve the calling experience."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"see and control calls through the system."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Tap to delete your face model, then add your face again"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Set up Face Unlock"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Unlock your phone by looking at it"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"To use Face Unlock, turn on "<b>"Camera access"</b>" in Settings > Privacy"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Set up more ways to unlock"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Tap to add a fingerprint"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Fingerprint Unlock"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"Preparing <xliff:g id="APPNAME">%1$s</xliff:g>."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Starting apps."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Finishing boot."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Turn off screen?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"While setting up your fingerprint, you pressed the power button.\n\nThis usually turns off your screen."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Turn off"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Cancel"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Continue setup?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"You pressed the power button – this usually turns off the screen.\n\nTry tapping lightly while setting up your fingerprint."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Turn off screen"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Continue setup"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Continue verifying your fingerprint?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"You pressed the power button – this usually turns off the screen.\n\nTry tapping lightly to verify your fingerprint."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Turn off screen"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Continue"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> running"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Tap to return to game"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Choose game"</string> diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml index 0f0e35a1b550..0eaf8ef7c138 100644 --- a/core/res/res/values-en-rXC/strings.xml +++ b/core/res/res/values-en-rXC/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Allows the app to use the IMS service to make calls without your intervention."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"read phone status and identity"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Allows the app to access the phone features of the device. This permission allows the app to determine the phone number and device IDs, whether a call is active, and the remote number connected by a call."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"read basic telephony status and identity"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Allows the app to access the basic telephony features of the device."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"route calls through the system"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Allows the app to route its calls through the system in order to improve the calling experience."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"see and control calls through the system."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Tap to delete your face model, then add your face again"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Set up Face Unlock"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Unlock your phone by looking at it"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"To use Face Unlock, turn on "<b>"Camera access"</b>" in Settings > Privacy"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Set up more ways to unlock"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Tap to add a fingerprint"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Fingerprint Unlock"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"Preparing <xliff:g id="APPNAME">%1$s</xliff:g>."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Starting apps."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Finishing boot."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Turn off screen?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"While setting up your fingerprint, you pressed the Power button.\n\nThis usually turns off your screen."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Turn off"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Cancel"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Continue setup?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"You pressed the power button — this usually turns off the screen.\n\nTry tapping lightly while setting up your fingerprint."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Turn off screen"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Continue setup"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Continue verifying your fingerprint?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"You pressed the power button — this usually turns off the screen.\n\nTry tapping lightly to verify your fingerprint."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Turn off screen"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Continue"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> running"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Tap to return to game"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Choose game"</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index e7110c9b7e58..93a316ffae83 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -329,17 +329,17 @@ <string name="permgrouplab_notifications" msgid="5472972361980668884">"Notificaciones"</string> <string name="permgroupdesc_notifications" msgid="4608679556801506580">"mostrar notificaciones"</string> <string name="capability_title_canRetrieveWindowContent" msgid="7554282892101587296">"Recuperar el contenido de las ventanas"</string> - <string name="capability_desc_canRetrieveWindowContent" msgid="6195610527625237661">"Inspecciona el contenido de la ventana con la que estés interactuando."</string> + <string name="capability_desc_canRetrieveWindowContent" msgid="6195610527625237661">"Inspeccionará el contenido de la ventana con la que estés interactuando."</string> <string name="capability_title_canRequestTouchExploration" msgid="327598364696316213">"Activar la Exploración táctil"</string> <string name="capability_desc_canRequestTouchExploration" msgid="4394677060796752976">"Los elementos que presiones se dirán en voz alta y podrás explorar la pantalla mediante gestos."</string> <string name="capability_title_canRequestFilterKeyEvents" msgid="2772371671541753254">"Observar el texto que escribes"</string> <string name="capability_desc_canRequestFilterKeyEvents" msgid="2381315802405773092">"Incluye datos personales, como números de tarjeta de crédito y contraseñas."</string> <string name="capability_title_canControlMagnification" msgid="7701572187333415795">"Controlar la ampliación de pantalla"</string> - <string name="capability_desc_canControlMagnification" msgid="2206586716709254805">"Controla el posicionamiento y el nivel de zoom de la pantalla."</string> + <string name="capability_desc_canControlMagnification" msgid="2206586716709254805">"Controlará el posicionamiento y el nivel de zoom de la pantalla."</string> <string name="capability_title_canPerformGestures" msgid="9106545062106728987">"Usar gestos"</string> <string name="capability_desc_canPerformGestures" msgid="6619457251067929726">"Permite presionar, deslizar, pellizcar y usar otros gestos."</string> <string name="capability_title_canCaptureFingerprintGestures" msgid="1189053104594608091">"Gestos del sensor de huellas dactilares"</string> - <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Captura los gestos que se hacen en el sensor de huellas dactilares del dispositivo."</string> + <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Capturará los gestos que se hacen en el sensor de huellas dactilares del dispositivo."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Tomar captura de pantalla"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Puede tomar una captura de la pantalla."</string> <string name="permlab_statusBar" msgid="8798267849526214017">"desactivar o modificar la barra de estado"</string> @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Permite que la aplicación utilice el servicio IMS para hacer llamadas sin tu intervención."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"leer la identidad y el estado del dispositivo"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Permite que la aplicación acceda a las funciones de teléfono del dispositivo. La aplicación puede utilizar este permiso para descubrir identificadores de dispositivos y números de teléfono, para saber si una llamada está activa y para conocer el número remoto con el que se ha establecido conexión mediante una llamada."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"leer identidad y estado de telefonía básica"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Permite que la app acceda a las funciones de telefonía básica del dispositivo."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"Transmite llamadas a través del sistema"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Permite que la app transmita las llamadas a través del sistema para mejorar la experiencia de llamadas."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"Mirar y controlar las llamadas con el sistema"</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Presiona para borrar el modelo de rostro y, luego, vuelve a agregar tu rostro"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Configura Desbloqueo facial"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Desbloquea el teléfono con solo mirarlo"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Para usar Desbloqueo facial, activa el "<b>"Acceso a la cámara"</b>" en Configuración y privacidad"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Configura más formas de desbloquear el dispositivo"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Presiona para agregar una huella dactilar"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Desbloqueo con huellas dactilares"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"Preparando <xliff:g id="APPNAME">%1$s</xliff:g>."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Iniciando aplicaciones"</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Finalizando el inicio"</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"¿Quieres apagar la pantalla?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Al configurar tu huella dactilar, presionaste el botón de encendido.\n\nPor lo general, esta acción apaga la pantalla."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Apagar"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Cancelar"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"¿Continuar con la configuración?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Presionaste el botón de encendido. Por lo general, esta acción apaga la pantalla.\n\nPresiona suavemente mientras configuras tu huella dactilar."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Apagar pantalla"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Continuar config."</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"¿Verificar huella dactilar?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Presionaste el botón de encendido. Por lo general, esta acción apaga la pantalla.\n\nPresiona suavemente para verificar tu huella dactilar."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Apagar pantalla"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Continuar"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> en ejecución"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Presiona para volver al juego"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Elige un juego"</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index a582a0991e9a..22de5d10b7f0 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Permite que la aplicación utilice el servicio IMS para realizar llamadas sin tu intervención."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"consultar la identidad y el estado del teléfono"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Permite que la aplicación acceda a las funciones de teléfono del dispositivo. La aplicación puede utilizar este permiso para descubrir identificadores de dispositivos y números de teléfono, para saber si una llamada está activa y para conocer el número remoto con el que se ha establecido conexión mediante una llamada."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"leer el estado y la identidad básicos de telefonía"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Permite que la aplicación acceda a las funciones de telefonía básicas del dispositivo."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"direccionar llamadas a través del sistema"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Permite a la aplicación direccionar sus llamadas hacia el sistema para mejorar la calidad de estas."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"ver y controlar llamadas a través del sistema."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Toca para eliminar tu modelo facial y luego añade de nuevo tu cara"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Configura Desbloqueo facial"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Desbloquea el teléfono con solo mirarlo"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Para usar Desbloqueo Facial, habilita el "<b>"acceso a la cámara"</b>" en Ajustes y privacidad"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Configura más formas de desbloqueo"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Toca para añadir una huella digital"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Desbloqueo con huella digital"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"Preparando <xliff:g id="APPNAME">%1$s</xliff:g>."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Iniciando aplicaciones"</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Finalizando inicio..."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"¿Apagar pantalla?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Has pulsado el botón de encendido mientras configurabas tu huella digital.\n\nAl hacer esto, se suele apagar la pantalla."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Desactivar"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Cancelar"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"¿Quieres seguir con la configuración?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Has pulsado el botón de encendido, lo que suele apagar la pantalla.\n\nPrueba a apoyar el dedo ligeramente para verificar tu huella digital."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Apagar pantalla"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Seguir configurando"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"¿Seguir verificando tu huella digital?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Has pulsado el botón de encendido, lo que suele apagar la pantalla.\n\nPrueba a apoyar el dedo ligeramente para verificar tu huella digital."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Apagar pantalla"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Continuar"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> en ejecución"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Toca para volver al juego"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Elegir juego"</string> diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index 84912d898acd..334a666ffc10 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Võimaldab rakendusel kasutada IMS-teenust kõnede tegemiseks ilma, et peaksite sekkuma."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"Telefoni oleku ja identiteedi lugemine"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Annab rakendusele juurdepääsu seadme telefonifunktsioonidele. See luba võimaldab rakendusel määrata telefoninumbri ja seadme ID-d ning kontrollida, kas kõne on aktiivne ja kaugnumber on kõne kaudu telefoniga ühendatud."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"Lugeda peamiste telefonifunktsioonide olekut ja kasutajate identiteeti"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Võimaldab rakendusel pääseda juurde seadme peamistele telefonifunktsioonidele."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"kõnede marsruutimine süsteemi kaudu"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Võimaldab rakendusel kõnesid süsteemi kaudu marsruutida, et helistamiskogemust täiustada."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"süsteemi kaudu kõnede vaatamine ja juhtimine."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Puudutage näomudeli kustutamiseks, seejärel lisage oma nägu uuesti"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Näoga avamise seadistamine"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Avage telefon seda vaadates"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Näoga avamise kasutamiseks lülitage menüüs Seaded > Privaatsus sisse "<b>"juurdepääs kaamerale"</b>"."</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Seadistage rohkem viise avamiseks"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Puudutage sõrmejälje lisamiseks"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Sõrmejäljega avamine"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"Rakenduse <xliff:g id="APPNAME">%1$s</xliff:g> ettevalmistamine."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Rakenduste käivitamine."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Käivitamise lõpuleviimine."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Kas lülitada ekraan välja?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Sõrmejälje seadistamisel vajutasite toitenuppu.\n\nSee lülitab ekraanikuva tavaliselt välja."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Lülita välja"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Tühista"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Kas jätkata seadistamist?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Vajutasite toitenuppu – tavaliselt lülitab see ekraani välja.\n\nPuudutage õrnalt ja seadistage oma sõrmejälg."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Lülita ekraan välja"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Jätka seadistamist"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Kas jätkata sõrmejälje kinnitamist?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Vajutasite toitenuppu – tavaliselt lülitab see ekraani välja.\n\nPuudutage õrnalt, et oma sõrmejälg kinnitada."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Lülita ekraan välja"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Jätka"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> töötab"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Puudutage mängu naasmiseks"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Valige mäng"</string> diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index d84bdddd907a..df16b7362996 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Zuk ezer egin beharrik gabe deiak egiteko IMS zerbitzua erabiltzeko baimena ematen die aplikazioei."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"irakurri telefonoaren egoera eta identitatea"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Gailuaren telefono-eginbideak atzitzeko baimena ematen die aplikazioei. Baimen horrek aplikazioari telefono-zenbakia eta gailu IDak zein diren, deirik aktibo dagoen eta deia zer zenbakirekin konektatuta dagoen zehazteko baimena ematen die aplikazioei."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"irakurri oinarrizko egoera telefonikoa eta identitatea"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Gailuaren oinarrizko eginbide telefonikoak atzitzeko baimena ematen dio aplikazioari."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"bideratu deiak sistemaren bidez"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Deiak sistemaren bidez bideratzea baimentzen die aplikazioei, deien zerbitzua ahal bezain ona izan dadin."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"ikusi eta kontrolatu deiak sistemaren bidez."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Sakatu hau aurpegi-eredua ezabatzeko eta, gero, gehitu aurpegia berriro"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Konfiguratu aurpegi bidez desblokeatzeko eginbidea"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Telefonoa desblokeatzeko, begira iezaiozu"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Aurpegi bidez desblokeatzeko aukera erabiltzeko, aktibatu "<b>"kamera atzitzeko baimena"</b>" Ezarpenak > Pribatutasuna atalean"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Konfiguratu telefonoa desblokeatzeko modu gehiago"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Sakatu hau hatz-marka bat gehitzeko"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Hatz-marka bidez desblokeatzea"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"<xliff:g id="APPNAME">%1$s</xliff:g> prestatzen."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Aplikazioak abiarazten."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Bertsio-berritzea amaitzen."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Pantaila itzali nahi duzu?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Hatz-marka konfiguratzean, etengailua sakatu duzu.\n\nNormalean, horren ondorioz pantaila itzali egiten da."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Desaktibatu"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Utzi"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Konfiguratzen jarraitu nahi duzu?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Etengailua sakatu duzu; pantaila itzaltzeko balio du horrek.\n\nUki ezazu arin, hatz-marka konfiguratu bitartean."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Itzali pantaila"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Jarraitu konfiguratzen"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Hatz-marka egiaztatzen jarraitu nahi duzu?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Etengailua sakatu duzu; pantaila itzaltzeko balio du horrek.\n\nUki ezazu arin, hatz-marka egiaztatzeko."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Itzali pantaila"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Egin aurrera"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> abian da"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Sakatu jokora itzultzeko"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Aukeratu joko bat"</string> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 8f1daa217325..e66c7837b408 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"به برنامه اجازه میدهد از سرویس IMS برای برقراری تماسها بدون دخالت شما استفاده کند."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"خواندن وضعیت تلفن و شناسه"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"به برنامه اجازه میدهد به ویژگیهای تلفن دستگاه شما دسترسی پیدا کند. این مجوز به برنامه اجازه میدهد شماره تلفن و شناسههای دستگاه، فعال بودن یک تماس و شماره راه دوری که با یک تماس متصل شده است را مشخص کند."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"خواندن شناسه و وضعیت اصلی ارتباط دوربرد"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"به برنامه اجازه میدهد به ویژگیهای اصلی ارتباط دوربرد دستگاه دسترسی داشته باشد."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"برقرار کردن تماسها ازطریق سیستم"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"به برنامه امکان میدهد برای بهبود تجربه تماس، تماسهایش را ازطریق سیستم برقرار کند."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"دیدن و کنترل تماسها ازطریق سیستم."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"برای حذف مدل چهرهتان ضربه بزنید، سپس چهرهتان را دوباره اضافه کنید"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"راهاندازی «قفلگشایی با چهره»"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"برای باز کردن قفل تلفن خود به آن نگاه کنید"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"برای استفاده از «قفلگشایی با چهره»، "<b>"دسترسی به دوربین"</b>" را در «تنظیمات > حریمخصوصی» روشن کنید"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"راهاندازی روشهای بیشتر برای باز کردن قفل"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"برای افزودن اثر انگشت، ضربه بزنید"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"قفلگشایی با اثر انگشت"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"آمادهسازی <xliff:g id="APPNAME">%1$s</xliff:g>."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"درحال آغاز کردن برنامهها."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"درحال اتمام راهاندازی."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"صفحهنمایش خاموش شود؟"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"هنگام راهاندازی اثر انگشتتان، دکمه روشن/ خاموش را فشار دادید.\n\nاین کار معمولاً صفحهنمایش را خاموش میکند."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"خاموش شود"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"لغو شود"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"راهاندازی ادامه یابد؟"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"دکمه روشن/ خاموش را فشار دادید — این کار معمولاً صفحهنمایش را خاموش میکند.\n\nهنگام راهاندازی اثر انگشت، آرام ضربه بزنید."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"خاموش کردن صفحه"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"ادامه راهاندازی"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"تأیید اثر انگشت را ادامه میدهید؟"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"دکمه روشن/ خاموش را فشار دادید — این کار معمولاً صفحهنمایش را خاموش میکند.\n\nبرای تأیید اثر انگشتتان، آرام ضربه بزنید."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"خاموش کردن صفحه"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"ادامه"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> در حال اجرا"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"برای برگشت به بازی، ضربه بزنید"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"انتخاب بازی"</string> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index b63e72910280..ff17fc1ceb96 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Antaa sovelluksen soittaa puheluita pikaviestipalvelun avulla ilman käyttäjän toimia."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"lue puhelimen tila ja identiteetti"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Antaa sovelluksen käyttää laitteen puhelinominaisuuksia. Sovellus voi määrittää puhelinnumeron ja laitteen tunnuksen, puhelun tilan sekä soitetun numeron."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"lukea tavallisten puheluominaisuuksien tila- ja identiteettitiedot"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Sallii sovellukselle pääsyn laitteen tavallisiin puheluominaisuuksiin."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"ohjata puhelut järjestelmän kautta"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Tämä sallii sovelluksen ohjata puhelut järjestelmän kautta, mikä auttaa parantamaan puhelujen laatua."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"nähdä puhelut ja päättää niistä järjestelmässä"</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Poista kasvomalli napauttamalla ja lisää sitten kasvosi uudelleen"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Ota kasvojentunnistusavaus käyttöön"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Avaa puhelimesi lukitus katsomalla laitetta"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Jos haluat käyttää kasvojentunnistusavausta, valitse Asetukset > Yksityisyys ja laita "<b>"Pääsy kameraan"</b>" päälle"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Ota käyttöön lisää tapoja avata lukitus"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Napauta lisätäksesi sormenjälki"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Sormenjälkiavaus"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"Valmistellaan: <xliff:g id="APPNAME">%1$s</xliff:g>."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Käynnistetään sovelluksia."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Viimeistellään päivitystä."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Sammutetaanko näyttö?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Painoit virtapainiketta ottaessasi sormenjäljen käyttöön.\n\nTämä saa yleensä näytön sammumaan."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Laita pois päältä"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Peru"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Haluatko jatkaa?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Painoit virtapainiketta, mikä yleensä sammuttaa näytön.\n\nKosketa painiketta kevyesti tallentaessasi sormenjälkeä."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Sammuta näyttö"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Jatka käyttöönottoa"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Jatketaanko sormenjäljen vahvistamista?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Painoit virtapainiketta, mikä yleensä sammuttaa näytön.\n\nVahvista sormenjälki koskettamalla painiketta kevyesti."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Sammuta näyttö"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Jatka"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> käynnissä"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Palaa peliin napauttamalla"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Valitse peli"</string> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index cae01af7759d..e367f320ba2b 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Permet à l\'application d\'utiliser le service IMS pour faire des appels sans votre intervention."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"voir l\'état et l\'identité du téléphone"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Permet à l\'application d\'accéder aux fonctionnalités téléphoniques de l\'appareil. Cette autorisation permet à l\'application de déterminer le numéro de téléphone et les identifiants de l\'appareil, si un appel est actif et le numéro distant connecté par un appel."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"Lire l\'état et l\'identité de la téléphonie de base"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Permet à l\'application d\'accéder aux fonctionnalités de téléphonie de base de l\'appareil."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"acheminer les appels dans le système"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Permet à l\'application d\'acheminer ses appels dans le système afin d\'améliorer l\'expérience d\'appel."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"afficher et gérer les appels à l\'aide du système."</string> @@ -622,6 +624,8 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Touchez pour supprimer votre modèle facial, puis ajoutez votre visage de nouveau"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Configurer le déverrouillage par reconnaissance faciale"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Déverrouillez votre téléphone en le regardant"</string> + <!-- no translation found for face_sensor_privacy_enabled (7407126963510598508) --> + <skip /> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Configurer d\'autres méthodes de déverrouillage"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Touchez pour ajouter une empreinte digitale"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Déverrouillage par empreinte digitale"</string> @@ -1276,10 +1280,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"Préparation de <xliff:g id="APPNAME">%1$s</xliff:g> en cours…"</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Lancement des applications…"</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Finalisation de la mise à jour."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Éteindre l\'écran?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Pendant que vous configuriez votre empreinte digitale, vous avez appuyé sur l\'interrupteur.\n\nAppuyer sur ce bouton ferme habituellement l\'écran."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Éteindre"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Annuler"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Poursuivre la configuration?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Vous avez appuyé sur le l\'interrupteur – cette action éteint habituellement l\'écran.\n\nEssayez de toucher légèrement pendant la configuration de votre empreinte digitale."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Éteindre l\'écran"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Poursuivre configu."</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Poursuivre vérifica. empreinte digitale?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Vous avez appuyé sur le l\'interrupteur – cette action éteint habituellement l\'écran.\n\nEssayez de toucher légèrement pour vérifier votre empreinte digitale."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Éteindre l\'écran"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Continuer"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> en cours d\'exécution"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Touchez pour revenir au jeu"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Choisissez un jeu"</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 3955c9f65cdf..e00304ba3d64 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Permet à l\'application d\'utiliser le service IMS pour passer des appels sans votre intervention."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"Voir l\'état et l\'identité du téléphone"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Permet à l\'application d\'accéder aux fonctionnalités téléphoniques de l\'appareil. Cette autorisation permet à l\'application de déterminer le numéro de téléphone et les identifiants de l\'appareil, si un appel est actif et le numéro distant connecté par un appel."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"lire l\'état et l\'identité de téléphonie de base"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Autorise l\'appli à accéder aux fonctionnalités de téléphonie de base de l\'appareil."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"acheminer les appels via le système"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Autorise l\'application à acheminer les appels via le système afin d\'optimiser le confort d\'utilisation."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"voir et contrôler les appels via le système."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Appuyez pour supprimer votre empreinte faciale, puis ajoutez de nouveau votre visage"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Configurer le déverrouillage par reconnaissance faciale"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Déverrouillez votre téléphone en le regardant"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Pour utiliser Face Unlock, activez "<b>"Accès à l\'appareil photo"</b>" dans Paramètres > Confidentialité"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Configurer d\'autres méthodes de déverrouillage"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Appuyez pour ajouter une empreinte digitale"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Déverrouillage par empreinte digitale"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"Préparation de <xliff:g id="APPNAME">%1$s</xliff:g> en cours…"</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Lancement des applications…"</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Finalisation de la mise à jour."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Éteindre l\'écran ?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Vous avez appuyé sur le bouton Marche/Arrêt pendant la configuration de votre empreinte digitale.\n\nCela éteint généralement l\'écran."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Éteindre"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Annuler"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Poursuivre la configuration ?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Vous avez appuyé sur le bouton Marche/Arrêt, ce qui éteint généralement l\'écran.\n\nEssayez d\'appuyer doucement pendant la configuration de votre empreinte digitale."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Éteindre l\'écran"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Poursuivre"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Continuer de valider votre empreinte ?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Vous avez appuyé sur le bouton Marche/Arrêt, ce qui éteint généralement l\'écran.\n\nPour valider votre empreinte digitale, appuyez plus doucement."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Éteindre l\'écran"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Continuer"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> en cours d\'exécution"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Appuyez pour revenir au jeu"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Choisir un jeu"</string> diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml index c07287ae9825..6f9ee8fb76a8 100644 --- a/core/res/res/values-gl/strings.xml +++ b/core/res/res/values-gl/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Permite que a aplicación use o servizo de IMS para facer chamadas sen a túa intervención."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"ler o estado e a identidade do teléfono"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Permite á aplicación acceder ás funcións de teléfono do dispositivo. Con este permiso a aplicación pode determinar o número de teléfono e os ID do dispositivo, se unha chamada está activa e o número remoto conectado mediante unha chamada."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"ler a identidade e o estado das funcións básicas de telefonía"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Permítelle á aplicación acceder ás funcións básicas de telefonía do dispositivo."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"dirixir as chamadas a través do sistema"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Permite á aplicación dirixir as súas chamadas a través do sistema para mellorar a túa experiencia durante as chamadas."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"consultar e controlar as chamadas a través do sistema."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Toca para eliminar o teu modelo facial e despois engade de novo a cara"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Configurar o desbloqueo facial"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Mira o teléfono para desbloquealo"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Para usar o desbloqueo facial, activa "<b>"Acceso á cámara"</b>" en Configuración > Privacidade"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Configura máis maneiras de desbloquear o dispositivo"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Toca para engadir unha impresión dixital"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Desbloqueo mediante impresión dixital"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"Preparando <xliff:g id="APPNAME">%1$s</xliff:g>."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Iniciando aplicacións."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Está finalizando o arranque"</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Queres apagar a pantalla?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Premiches o botón de acendido mentres configurabas a impresión dixital.\n\nAo realizar esta acción, normalmente apágase a pantalla."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Apagar"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Cancelar"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Queres continuar coa configuración?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Premiches o botón de acendido, o que adoita facer que se apague a pantalla.\n\nProba a dar un toque suave namentres configuras a impresión dixital."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Desactivar pantalla"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Seguir configurando"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Queres seguir verificando a impresión?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Premiches o botón de acendido, o que adoita facer que se apague a pantalla.\n\nProba a dar un toque suave para verificar a impresión dixital."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Desactivar pantalla"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Continuar"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> está en execución"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Toca para volver ao xogo"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Escolle un xogo"</string> diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index 55289549aab9..533d3fbacbbb 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"તમારા હસ્તક્ષેપ વગર કૉલ્સ કરવા માટે IMS સેવાનો ઉપયોગ કરવાની એપ્લિકેશનને મંજૂરી આપે છે."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"ફોન સ્થિતિ અને ઓળખ વાંચો"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"એપ્લિકેશનને ફોન સુવિધાઓને ઍક્સેસ કરવાની મંજૂરી આપે છે. આ પરવાનગી એપ્લિકેશનને ફોન નંબર અને ઉપકરણ ID, કૉલ સક્રિય છે અને કોઈ કૉલ દ્વારા કનેક્ટ થયેલ રિમોટ નંબર નિર્ધારિત કરવાની મંજૂરી આપે છે."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"ટેલિફોન માટેનું મૂળભૂત સ્ટેટસ અને ઓળખ વાંચો"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"ડિવાઇસની ટેલિફોન માટેની મૂળભૂત સુવિધાઓ ઍક્સેસ કરવાની મંજૂરી ઍપને આપે છે."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"સિસ્ટમ મારફતે કૉલ બીજે વાળો"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"કૉલિંગ અનુભવ સુધારવા માટે ઍપ્લિકેશનને સિસ્ટમ મારફતે કૉલ બીજે વાળવાની મંજૂરી આપે છે."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"સિસ્ટમ મારફતે કૉલ જુઓ અને નિયંત્રિત કરો."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"તમારા ચહેરાનું મૉડલ ડિલીટ કરવા માટે ટૅપ કરો, પછી તમારો ચહેરો ફરીથી ઉમેરો"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"ફેસ અનલૉક સુવિધાનું સેટઅપ કરો"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"તમારા ફોનની તરફ જોઈને તેને અનલૉક કરો"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"ફેસ અનલૉક સુવિધાનો ઉપયોગ કરવા માટે, સેટિંગ > પ્રાઇવસીમાં જઈને "<b>"કૅમેરા ઍક્સેસ"</b>" ચાલુ કરો"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"અનલૉક કરવાની બીજી રીતોનું સેટઅપ કરો"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"ફિંગરપ્રિન્ટ ઉમેરવા માટે ટૅપ કરો"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"ફિંગરપ્રિન્ટ અનલૉક"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"<xliff:g id="APPNAME">%1$s</xliff:g> તૈયાર કરી રહ્યું છે."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"ઍપ્લિકેશનો શરૂ કરી રહ્યાં છે."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"બૂટ સમાપ્ત કરી રહ્યાં છે."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"સ્ક્રીન બંધ કરીએ?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"તમારી ફિંગરપ્રિન્ટની સેટિંગનું સેટઅપ કરતી વખતે, તમે પાવર બટન દબાવ્યું.\n\nઆનાથી સામાન્ય રીતે તમારી સ્ક્રીન બંધ થઈ જાય છે."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"બંધ કરો"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"રદ કરો"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"શું સેટઅપ કરવાનું ચાલુ રાખીએ?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"તમે પાવર બટન દબાવ્યું છે — જેનાથી સામાન્ય રીતે સ્ક્રીન બંધ થઈ જાય છે.\n\nતમારી ફિંગરપ્રિન્ટનું સેટઅપ કરતી વખતે હળવેથી ટૅપ કરવાનો પ્રયાસ કરો."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"સ્ક્રીન બંધ કરો"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"સેટઅપ આગળ વધારો"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"શું તમારી ફિંગરપ્રિન્ટની ચકાસણી કરીએ?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"તમે પાવર બટન દબાવ્યું છે — જેનાથી સામાન્ય રીતે સ્ક્રીન બંધ થઈ જાય છે.\n\nતમારી ફિંગરપ્રિન્ટની ચકાસણી કરવા માટે, તેને હળવેથી ટૅપ કરવાનો પ્રયાસ કરો."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"સ્ક્રીન બંધ કરો"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"આગળ વધો"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> ચાલુ છે"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"ગેમ પર પાછા આવવા માટે ટૅપ કરો"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"ગેમ પસંદ કરો"</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index cb6de5ccf4e5..84594373bc76 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"आपके हस्तक्षेप के बिना कॉल करने के लिए, ऐप को IMS सेवा का उपयोग करने देती है."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"फ़ोन की स्थिति और पहचान पढ़ें"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"ऐप्स को डिवाइस की फ़ोन सुविधाओं तक पहुंचने देता है. यह अनुमति ऐप्स को फ़ोन नंबर और डिवाइस आईडी, कॉल सक्रिय है या नहीं, और कॉल द्वारा कनेक्ट किया गया दूरस्थ नंबर तय करने देती है."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"टेलिफ़ोनी सुविधाओं की सामान्य स्थिति और उनकी पहचान से जुड़ी जानकारी पढ़ें"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"ऐसा करने पर, इस ऐप्लिकेशन को डिवाइस की सामान्य टेलिफ़ोनी सुविधाएं ऐक्सेस करने की अनुमति मिलती है."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"सिस्टम के माध्यम से कॉल रूट करें"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"कॉल करने के अनुभव को बेहतर बनाने के लिए ऐप्लिकेशन को सिस्टम के माध्यम से उसके कॉल रूट करने देती है."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"सिस्टम के ज़रिए कॉल देखना और नियंत्रित करना."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"अपने चेहरे का मॉडल मिटाने के लिए टैप करें. इसके बाद, अपना चेहरा फिर से रजिस्टर करें"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"फे़स अनलॉक की सुविधा सेट अप करें"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"अपने फ़ोन की तरफ़ देखकर उसे अनलॉक करें"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"फ़ेस अनलॉक की सुविधा का इस्तेमाल करने के लिए, सेटिंग और निजता में जाकर, "<b>"कैमरे का ऐक्सेस"</b>" चालू करें"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"फ़ोन को अनलॉक करने के दूसरे तरीके सेट अप करें"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"फ़िंगरप्रिंट जोड़ने के लिए टैप करें"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"फ़िंगरप्रिंट अनलॉक"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"<xliff:g id="APPNAME">%1$s</xliff:g> तैयार हो रहा है."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"ऐप्स प्रारंभ होने वाले हैं"</string> <string name="android_upgrading_complete" msgid="409800058018374746">"बूट खत्म हो रहा है."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"स्क्रीन बंद करें?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"अपना फ़िंगरप्रिंट सेट अप करते समय, आपने पावर बटन दबाया.\n\nआम तौर पर, इससे स्क्रीन बंद हो जाती है."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"बंद करें"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"अभी नहीं"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"सेट अप जारी रखना है?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"आपने पावर बटन दबाया - आम तौर पर, इससे स्क्रीन बंद हो जाती है.\n\nअपना फ़िंगरप्रिंट सेट अप करते समय, बटन को हल्के से टैप करके देखें."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"स्क्रीन बंद करें"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"सेट अप जारी रखें"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"फ़िंगरप्रिंट की पुष्टि करना जारी रखना है?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"आपने पावर बटन दबाया - आम तौर पर, इससे स्क्रीन बंद हो जाती है.\n\nअपने फ़िंगरप्रिंट की पुष्टि करने के लिए, बटन पर हल्के से टैप करके देखें."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"स्क्रीन बंद करें"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"जारी रखें"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> चल रही है"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"गेम पर वापस जाने के लिए टैप करें"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"गेम चुनें"</string> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index 1dc25176d5ed..69905ecd8554 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -474,6 +474,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Omogućuje aplikaciji upotrebu usluge izravnih poruka za uspostavljanje poziva bez vaše intervencije."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"čitanje statusa i identiteta telefona"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Aplikaciji omogućuje pristup telefonskim značajkama uređaja. Ta dozvola aplikaciji omogućuje utvrđivanje telefonskog broja i ID-ova uređaja, je li poziv aktivan te udaljeni broj koji je povezan pozivom."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"čitanje osnovnih telefonskih statusa i identiteta"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Dopušta aplikacijama pristup osnovnim telefonskim značajkama uređaja."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"preusmjeravati pozive putem sustava"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Omogućuje aplikaciji da preusmjerava pozive putem sustava radi poboljšanja doživljaja."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"vidjeti i kontrolirati pozive putem sustava."</string> @@ -625,6 +627,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Dodirnite da biste izbrisali model lica, a zatim ponovo dodajte svoje lice"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Postavite otključavanje licem"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Otključajte telefon gledajući u njega"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Da biste koristili otključavanje licem, uključite opciju "<b>"Pristup kameri"</b>" u odjeljku Postavke > Privatnost"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Postavite više načina otključavanja"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Dodirnite da biste dodali otisak prsta"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Otključavanje otiskom prsta"</string> @@ -1296,10 +1299,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"Pripremanje aplikacije <xliff:g id="APPNAME">%1$s</xliff:g>."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Pokretanje aplikacija."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Završetak inicijalizacije."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Isključiti zaslon?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Prilikom postavljanja otiska prsta pritisnuli ste tipku za uključivanje/isključivanje.\n\nTom se radnjom obično isključuje zaslon."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Isključi"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Odustani"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Želite li nastaviti s postavljanjem?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Pritisnuli ste tipku za uključivanje/isključivanje, čime se obično isključuje zaslon.\n\nPokušajte lagano dodirnuti dok postavljate svoj otisak prsta."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Isključi zaslon"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Nastavi postavljanje"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Nastaviti s potvrđivanjem otiska prsta?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Pritisnuli ste tipku za uključivanje/isključivanje, čime se obično isključuje zaslon.\n\nPokušajte lagano dodirnuti da biste potvrdili svoj otisak prsta."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Isključi zaslon"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Nastavi"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"Izvodi se <xliff:g id="APP">%1$s</xliff:g>"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Dodirnite za povratak na igru"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Odabir igre"</string> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index 34f99630436f..4f040161709d 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Az alkalmazás az IMS-szolgáltatást használhatja híváskezdeményezéshez az Ön közbeavatkozása nélkül."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"telefonállapot és azonosító olvasása"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Lehetővé teszi az alkalmazás számára, hogy hozzáférjen az eszköz telefonálási funkcióihoz. Az engedéllyel rendelkező alkalmazás meghatározhatja a telefonszámot és eszközazonosítókat, hogy egy hívás aktív-e, valamint híváskor a másik fél telefonszámát."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"alapvető telefonállapot és identitás olvasása"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Lehetővé teszi az alkalmazás számára, hogy hozzáférjen az eszköz alapvető telefonos szolgáltatásaihoz."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"rendszeren keresztüli hívásirányítás"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"A telefonálási élmény javítása érdekében lehetővé teszi az alkalmazás számára a rendszeren keresztüli hívásirányítást."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"Hívások megtekintése és vezérlése a rendszeren keresztül"</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Koppintson arcmodellje törléséhez, majd készítsen újat"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Az Arcalapú feloldás beállítása"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Feloldhatja a zárolást úgy, hogy ránéz a telefonra"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Az Arcalapú feloldás funkció használatához kapcsolja be a "<b>"Hozzáférés a kamerához"</b>" beállítást a Beállítások > Adatvédelem szakaszban."</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"További feloldási módszerek beállítása"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Koppintson ide ujjlenyomat hozzáadásához"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Feloldás ujjlenyomattal"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"A(z) <xliff:g id="APPNAME">%1$s</xliff:g> előkészítése."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Kezdő alkalmazások."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Rendszerindítás befejezése."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Kikapcsolja a képernyőt?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Ujjlenyomata beállítása közben megnyomta a bekapcsológombot.\n\nEz általában kikapcsolja a képernyőt."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Kikapcsolás"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Mégse"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Folytatja a beállítást?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Megnyomta a bekapcsológombot — ezzel általában kikapcsol a képernyő.\n\nPróbáljon finoman rákoppintani az ujjlenyomat beállítása közben."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Kikapcsolom"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Beállítás folytatása"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Folytatja az ujjlenyomat ellenőrzését?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Megnyomta a bekapcsológombot — ezzel általában kikapcsol a képernyő.\n\nPróbáljon finoman rákoppintani az ujjlenyomat ellenőrzéséhez."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Kikapcsolom"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Tovább"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> fut"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Koppintson ide a játékhoz való visszatéréshez"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Játék kiválasztása"</string> diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index 03f9e1d17e2c..141780e3a99d 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Թույլ է տալիս հավելվածին IMS ծառայության միջոցով կատարել զանգեր՝ առանց ձեր միջամտության:"</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"կարդալ հեռախոսի կարգավիճակը և ինքնությունը"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Թույլ է տալիս հավելվածին օգտագործել սարքի հեռախոսային գործիքները: Այս թույլտվությունը հավելվածին հնարավորություն է տալիս որոշել հեռախոսահամարը և սարքի ID-ները, արդյոք զանգը ակտիվ է և միացված զանգի հեռակա հեռախոսահամարը:"</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"Կարդալ հիմնական հեռախոսային գործառույթների կարգավիճակը և նույնականացնող տվյալներ"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Հավելվածին հասանելի է դարձնում սարքի հիմնական հեռախոսային գործառույթները:"</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"զանգերն ուղարկել համակարգի միջոցով"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Հավելվածին թույլ է տալիս իր զանգերն ուղարկել համակարգի միջոցով՝ կապի որակը բարձրացնելու նպատակով։"</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"Զանգերի դիտում և վերահսկում համակարգի միջոցով"</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Հպեք՝ ձեր դեմքի նմուշը ջնջելու համար, այնուհետև նորից ավելացրեք այն:"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Կարգավորեք դեմքով ապակողպումը"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Ապակողպելու համար պարզապես նայեք հեռախոսին"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Դեմքով ապակողպումն օգտագործելու համար անցեք Կարգավորումներ > Գաղտնիություն և տրամադրեք "<b>"տեսախցիկն օգտագործելու թույլտվություն"</b>"։"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Կարգավորեք ապակողպելու այլ եղանակներ"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Հպեք՝ մատնահետք ավելացնելու համար"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Մատնահետքով ապակողպում"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"<xliff:g id="APPNAME">%1$s</xliff:g> հավելվածը պատրաստվում է:"</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Հավելվածները մեկնարկում են:"</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Բեռնումն ավարտվում է:"</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Անջատե՞լ էկրանը"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Մատնահետքը կարգավորելու ժամանակ դուք սեղմել եք սնուցման կոճակը։\n\nՍովորաբար դրա արդյունքում էկրանն անջատվում է։"</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Անջատել"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Չեղարկել"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Շարունակե՞լ կարգավորումը"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Դուք սեղմել եք սնուցման կոճակը։ Սովորաբար դրա արդյունքում էկրանն անջատվում է։\n\nՄատնահետքը ավելացնելու համար թեթևակի հպեք կոճակին։"</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Անջատել էկրանը"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Շարունակել գրանցումը"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Շարունակե՞լ մատնահետքի սկանավորումը"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Դուք սեղմել եք սնուցման կոճակը։ Սովորաբար դրա արդյունքում էկրանն անջատվում է։\n\nՄատնահետքը սկանավորելու համար թեթևակի հպեք կոճակին։"</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Անջատել էկրանը"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Շարունակել"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g>-ն աշխատում է"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Հպեք՝ խաղին վերադառնալու համար"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Ընտրեք խաղ"</string> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index db97591db32b..e1e8ea91a04c 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Memungkinkan aplikasi menggunakan layanan IMS untuk melakukan panggilan tanpa campur tangan Anda."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"baca identitas dan status ponsel"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Memungkinkan aplikasi mengakses fitur telepon perangkat. Izin ini memungkinkan aplikasi menentukan nomor telepon dan ID perangkat, apakah suatu panggilan aktif atau tidak, dan nomor jarak jauh yang terhubung oleh sebuah panggilan."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"membaca identitas dan status telepon dasar"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Memungkinkan aplikasi mengakses fitur telepon dasar perangkat."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"sambungkan panggilan telepon melalui sistem"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Mengizinkan aplikasi menyambungkan panggilan telepon melalui sistem untuk menyempurnakan pengalaman menelepon."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"melihat dan mengontrol panggilan melalui sistem."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Ketuk untuk menghapus model wajah, lalu tambahkan wajah Anda lagi"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Siapkan Face Unlock"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Buka kunci ponsel dengan melihat ke ponsel"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Untuk menggunakan Face Unlock, aktifkan "<b>"Akses kamera"</b>" di Setelan > Privasi"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Siapkan lebih banyak cara untuk membuka kunci"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Ketuk untuk menambahkan sidik jari"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Fingerprint Unlock"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"Menyiapkan <xliff:g id="APPNAME">%1$s</xliff:g>."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Memulai aplikasi."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Menyelesaikan boot."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Nonaktifkan layar?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Saat menyiapkan sidik jari, Anda menekan Tombol daya.\n\nTindakan ini biasanya akan menonaktifkan layar."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Nonaktifkan"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Batal"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Lanjutkan penyiapan?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Anda menekan tombol daya; tindakan ini biasanya akan menonaktifkan layar.\n\nCoba ketuk lembut saat menyiapkan sidik jari Anda."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Nonaktifkan layar"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Lanjutkan penyiapan"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Lanjutkan verifikasi sidik jari?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Anda menekan tombol daya; tindakan ini biasanya akan menonaktifkan layar.\n\nCoba ketuk lembut untuk memverifikasi sidik jari Anda."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Nonaktifkan layar"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Lanjutkan"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> sedang berjalan"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Ketuk untuk kembali ke game"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Pilih game"</string> diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml index d70a66bd6458..0678ab2034a2 100644 --- a/core/res/res/values-is/strings.xml +++ b/core/res/res/values-is/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Leyfir forriti að nota IMS-þjónustu til að hringja án inngrips frá þér."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"lesa stöðu símans og auðkenni"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Leyfir forriti að fá aðgang að símaeiginleikum tækisins. Þessi heimild gerir forritinu kleift að komast að símanúmeri og auðkennum tækisins, hvort símtal er í gangi og símanúmeri viðmælanda í símtali."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"lesa stöðu og auðkenni grunneiginleika símaþjónustu"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Leyfir forritinu að fá aðgang að grunneiginleikum símaþjónustu tækisins."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"senda símtöl gegnum kerfið"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Heimilar forritinu að senda símtöl sín gegnum kerfið til að bæta gæði símtalsins."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"sjá og stjórna símtölum í gegnum kerfið."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Ýttu til að eyða andlitslíkaninu og skráðu svo andlitið aftur"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Setja upp andlitskenni"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Taktu símann úr lás með því að horfa á hann"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Þú verður að kveikja á "<b>"aðgangi að myndavél"</b>" í „Stillingar > persónuvernd“ til að nota andlitskenni"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Settu upp fleiri leiðir til að taka úr lás"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Ýttu til að bæta við fingrafari"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Fingrafarskenni"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"Undirbýr <xliff:g id="APPNAME">%1$s</xliff:g>."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Ræsir forrit."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Lýkur ræsingu."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Slökkva á skjá?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Þú ýttir á aflrofann þegar þú varst að skrá fingrafarið þitt.\n\nYfirleitt slekkur það á skjánum."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Slökkva"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Hætta við"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Halda uppsetningu áfram?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Þú ýttir á aflrofann. Yfirleitt slekkur það á skjánum.\n\nPrófaðu að ýta laust þegar þú setur upp fingrafarið."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Slökkva á skjá"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Halda uppsetningu áfram"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Halda áfram að staðfesta fingrafarið?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Þú ýttir á aflrofann. Yfirleitt slekkur það á skjánum.\n\nPrófaðu að ýta laust til að staðfesta fingrafarið þitt."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Slökkva á skjá"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Áfram"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> er í gangi"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Ýttu til að fara aftur í leik"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Velja leik"</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 91df4bdb7ad3..a63fbd82c510 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Consente all\'app di utilizzare il servizio IMS per fare chiamate senza il tuo intervento."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"lettura stato e identità telefono"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Consente all\'applicazione di accedere alle funzioni telefoniche del dispositivo. Questa autorizzazione consente all\'applicazione di determinare il numero di telefono e gli ID dei dispositivi, se una chiamata è attiva e il numero remoto connesso da una chiamata."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"lettura di identità e stato telefonia"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Consente all\'app di accedere alle funzionalità di telefonia di base del dispositivo."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"indirizzamento delle chiamate tramite il sistema"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Consente all\'app di indirizzare le proprie chiamate tramite il sistema al fine di migliorare l\'esperienza di chiamata."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"visualizzazione e controllo delle chiamate tramite il sistema."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Tocca per eliminare il tuo modello del volto e poi riaggiungi il tuo volto"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Configura lo sblocco con il volto"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Sblocca il telefono guardandolo"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Per utilizzare lo sblocco con il volto, attiva "<b>"l\'accesso alla fotocamera"</b>" in Impostazioni > Privacy"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Configura altri modi per sbloccare"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Tocca per aggiungere un\'impronta"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Sblocco con l\'impronta"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"<xliff:g id="APPNAME">%1$s</xliff:g> in preparazione."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Avvio app."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Conclusione dell\'avvio."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Vuoi disattivare lo schermo?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Durante la configurazione della tua impronta hai premuto il tasto di accensione.\n\nGeneralmente questa azione comporta la disattivazione dello schermo."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Disattiva"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Annulla"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Vuoi continuare la configurazione?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Hai premuto il tasto di accensione; in genere questa azione disattiva lo schermo.\n\nProva a toccare leggermente il tasto di accensione durante la configurazione della tua impronta."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Disattiva lo schermo"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Continua configuraz."</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Vuoi continuare a verificare l\'impronta?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Hai premuto il tasto di accensione; in genere questa azione disattiva lo schermo.\n\nProva a toccare leggermente il tasto di accensione per verificare la tua impronta."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Disattiva lo schermo"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Continua"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> in esecuzione"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Tocca per tornare al gioco"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Scegli gioco"</string> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index a16c682038be..7a594d821c62 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -477,6 +477,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"מאפשרת לאפליקציה להשתמש בשירות ה-IMS לביצוע שיחות ללא התערבות שלך."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"קריאת הסטטוס והזהות של הטלפון"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"מאפשרת לאפליקציה לגשת לתכונות הטלפון של המכשיר. ההרשאה הזו מתירה לאפליקציה לגלות את מספר הטלפון ואת מזהי המכשיר, אם השיחה פעילה ואת המספר המרוחק המחובר באמצעות שיחה."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"קריאה של זהות וסטטוס טלפוניים בסיסיים"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"ההרשאה מאפשרת לאפליקציה לגשת לתכונות הטלפוניות הבסיסיות של המכשיר."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"ניתוב שיחות דרך המערכת"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"מאפשרת לאפליקציה לנתב את השיחות דרך המערכת כדי לשפר את חוויית השיחה."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"הצגת שיחות ושליטה בהן באמצעות המערכת."</string> @@ -628,6 +630,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"יש להקיש כדי למחוק את התבנית לזיהוי הפנים, ואז להוסיף תבנית חדשה לזיהוי הפנים"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"הגדרת התכונה \'פתיחה ע\"י זיהוי הפנים\'"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"יש להביט בטלפון כדי לבטל את נעילתו"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"כדי להשתמש בתכונה \'פתיחה ע\"י זיהוי הפנים\', יש להפעיל את ה"<b>"גישה למצלמה"</b>" בהגדרות > פרטיות"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"אפשר להגדיר דרכים נוספות לביטול נעילה"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"יש להקיש כדי להוסיף טביעת אצבע"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"ביטול הנעילה בטביעת אצבע"</string> @@ -1316,10 +1319,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"המערכת מכינה את <xliff:g id="APPNAME">%1$s</xliff:g>."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"מתבצעת הפעלה של אפליקציות."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"תהליך האתחול בשלבי סיום."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"לכבות את המסך?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"כשהגדרת את טביעת האצבע, לחצת על לחצן ההפעלה.\n\nלרוב, הפעולה הזו מכבה את המסך."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"כיבוי"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"ביטול"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"להמשיך בהגדרה?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"לחצת על לחצן ההפעלה – בדרך כלל הפעולה הזו מכבה את המסך.\n\nעליך לנסות להקיש בעדינות במהלך ההגדרה של טביעת האצבע שלך."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"כיבוי המסך"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"להמשך ההגדרה"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"להמשיך לאמת את טביעת האצבע שלך?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"לחצת על לחצן ההפעלה – בדרך כלל הפעולה הזו מכבה את המסך.\n\nעליך לנסות להקיש בעדינות כדי לאמת את טביעת האצבע שלך."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"כיבוי המסך"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"המשך"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"האפליקציה <xliff:g id="APP">%1$s</xliff:g> פועלת"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"יש להקיש כדי לחזור למשחק"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"בחירת משחק"</string> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index ff7a868cdb70..241105f1b6fe 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"IMSサービスがユーザー操作なしで電話をかけることをアプリに許可します。"</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"デバイス情報と ID の読み取り"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"デバイスの電話機能へのアクセスをアプリに許可します。これにより、電話番号、デバイスID、通話中かどうか、通話相手の電話番号をアプリから特定できるようになります。"</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"電話の基本的なステータスと ID の読み取り"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"デバイスの基本的な電話機能へのアクセスをアプリに許可します。"</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"システム経由での通話転送"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"通話環境の改善のために、システム経由での通話転送をアプリに許可します。"</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"システム経由の通話の表示と操作。"</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"タップして顔モデルを削除してから、改めて顔を追加してください"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"顔認証の設定"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"スマートフォンに顔を向けるとロックが解除されます"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"顔認証を使用するには、[設定] > [プライバシー] で"<b>"カメラへのアクセス"</b>"を有効にしてください"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"その他のロック解除方法の設定"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"タップすると指紋が追加されます"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"指紋認証"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"<xliff:g id="APPNAME">%1$s</xliff:g>をペア設定しています。"</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"アプリを起動しています。"</string> <string name="android_upgrading_complete" msgid="409800058018374746">"ブートを終了しています。"</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"画面を OFF にしますか?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"指紋の設定中に電源ボタンが押されました。\n\n通常、この操作により画面が OFF になります。"</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"OFF にする"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"キャンセル"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"設定を続行しますか?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"電源ボタンを押しました。通常、この操作で画面が OFF になります。\n\n指紋を設定する場合は電源ボタンに軽く触れてみましょう。"</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"画面を OFF にする"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"設定を続行"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"指紋の確認を続行しますか?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"電源ボタンを押しました。通常、この操作で画面が OFF になります。\n\n指紋を確認するには、電源ボタンに軽く触れてみましょう。"</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"画面を OFF にする"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"続行"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g>を実行中"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"タップするとゲームに戻ります"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"ゲームの選択"</string> diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml index dbc7bf59dae0..2137e0feee53 100644 --- a/core/res/res/values-ka/strings.xml +++ b/core/res/res/values-ka/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"აპს შეეძლება, გამოიყენოს IMS სერვისი ზარების თქვენი ჩარევის გარეშე განსახორციელებლად."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"ტელეფონის სტატუსისა და იდენტობის წაკითხვა"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"აპს შეეძლება ჰქონდეს წვდომა მოწყობილობის სატელეფონო ფუნქციებზე. აპმა მსგავსი უფლებით შეძლებს დაადგინოს ტელეფონის ნომერი, მისი სერიული გამოცემა, აქტიური ზარი, დაკავშირებული ნომერი და მსგავსი."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"წაიკითხეთ ტელეფონის ძირითადი სტატუსი და აიდი"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"აპს აძლევს მოწყობილობის ძირითად სატელეფონო ფუნქციებზე წვდომას."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"ზარების სისტემის მეშვეობით მარშრუტიზაცია"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"დარეკვის ხარისხის გაუმჯობესების მიზნით, აპს ზარების სისტემის მეშვეობით მარშრუტიზაციის საშუალებას აძლევს."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"ზარების ნახვა და გაკონტროლება სისტემის მეშვეობით."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"შეეხეთ თქვენი სახის მოდელის წასაშლელად, შემდეგ დაამატეთ სახე ხელახლა"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"სახით განბლოკვის პარამეტრების დაყენება"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"განბლოკეთ თქვენი ტელეფონი შეხედვით"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"იმისთვის, რომ სახით განბლოკვით ისარგებლოთ, ჩართეთ "<b>"კამერაზე წვდომა"</b>" პარამეტრებსა და კონფიდენციალურობაში"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"დააყენეთ განბლოკვის სხვა ხერხები"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"შეეხეთ თითის ანაბეჭდის დასამატებლად"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"თითის ანაბეჭდით განბლოკვა"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"ემზადება <xliff:g id="APPNAME">%1$s</xliff:g>."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"აპების ჩართვა"</string> <string name="android_upgrading_complete" msgid="409800058018374746">"ჩატვირთვის დასასრული."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"გამოირთოს ეკრანი?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"თითის ანაბეჭდის დაყენებისას ჩართვის ღილაკს დააჭირეთ.\n\nეს, ჩვეულებრივ, თქვენს ეკრანს გამორთავს."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"გამორთვა"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"გაუქმება"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"გსურთ დაყენების გაგრძელება?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"თქვენ დააჭირეთ ჩართვის ღილაკს — ჩვეულებრივ, ის ეკრანს გამორთავს.\n\nთქვენი თითის ანაბეჭდის დაყენებისას ცადეთ მსუბუქად შეხება."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"ეკრანის გამორთვა"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"დაყენების გაგრძელება"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"გსურთ ანაბეჭდის დადასტურების გაგრძელება?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"თქვენ დააჭირეთ ჩართვის ღილაკს — ჩვეულებრივ, ის ეკრანს გამორთავს.\n\nთქვენი თითის ანაბეჭდის დასადასტურებლად ცადეთ მსუბუქად შეხება."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"ეკრანის გამორთვა"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"გაგრძელება"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> გაშვებულია"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"შეეხეთ თამაშში დასაბრუნებლად"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"აირჩიეთ თამაში"</string> diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml index c1d421fc4e85..3042c643f4ab 100644 --- a/core/res/res/values-kk/strings.xml +++ b/core/res/res/values-kk/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Сіздің қатысуыңызсыз қоңыраулар соғу үшін қолданбаға IMS қызметін пайдалануға рұқсат етеді."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"телефон күйін оқу немесе анықтау"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Қолданбаға құрылғыдағы телефон функцияларына кіру мүмкіндігін береді. Бұл рұқсат қолданбаға телефон нөмірі, құрылғы жеке анықтағышы, қоңырау белсенділігі және сол қоңырауға байланысты қашықтағы нөмірді анықтау мүмкіндігін береді."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"негізгі телефония күйі мен сәйкестендіру деректерін оқу"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Қолданбаға құрылғының негізгі телефония функцияларын пайдалануға рұқсат береді."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"қоңырауларды жүйе арқылы бағыттау"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Қоңырау шалу тәжірибесін жақсарту үшін қолданба қоңырауларды жүйе арқылы бағыттай алады."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"жүйе арқылы қоңырауларды көру және басқару."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Бет үлгісін жою үшін түртіңіз, содан соң жаңа бет үлгісін қосыңыз."</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Бет тану функциясын реттеу"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Телефоныңызға қарап, оның құлпын ашыңыз."</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Face Unlock функциясын пайдалану үшін \"Параметрлер > Құпиялылық\" бөлімінен "<b>"Камераны пайдалану рұқсатын"</b>" қосыңыз."</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Құлыпты ашудың басқа тәсілдерін реттеу"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Саусақ ізін қосу үшін түртіңіз."</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Құлыпты саусақ ізімен ашу"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"<xliff:g id="APPNAME">%1$s</xliff:g> дайындалуда."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Қолданбалар іске қосылуда."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Қосуды аяқтауда."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Экранды өшіру керек пе?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Саусақ ізіңізді орнату кезінде қуат түймесін басып қалдыңыз.\n\nБұл әрекет әдетте экранды өшіреді."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Өшіру"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Бас тарту"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Реттеуді жалғастырасыз ба?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Қуат түймесін бастыңыз. Бұл әдетте экранды өшіреді.\n\nСаусақ ізін реттеу үшін, оны жайлап түртіп көріңіз."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Экранды өшіру"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Реттеуді жалғастыру"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Саусақ ізін растауды жалғастырасыз ба?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Қуат түймесін бастыңыз. Бұл әдетте экранды өшіреді.\n\nСаусақ ізін растау үшін, оны жайлап түртіп көріңіз."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Экранды өшіру"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Жалғастыру"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> қосылған"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Ойынды жалғастыру үшін түртіңіз"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Ойынды таңдаңыз"</string> diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml index 2889ac3c1b8f..81fbca5fe604 100644 --- a/core/res/res/values-km/strings.xml +++ b/core/res/res/values-km/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"អនុញ្ញាតឲ្យកម្មវិធីនេះប្រើសេវាកម្ម IMS ដើម្បីធ្វើការហៅដោយគ្មានការអន្តរាគមន៍ពីអ្នក។"</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"អានស្ថានភាព និងអត្តសញ្ញាណទូរស័ព្ទ"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"ឲ្យកម្មវិធីចូលដំណើរការលក្ខណៈទូរស័ព្ទនៃឧបករណ៍។ សិទ្ធិនេះឲ្យកម្មវិធីកំណត់លេខទូរស័ព្ទ និងលេខសម្គាល់ឧបករណ៍ ថាតើការហៅសកម្ម និងលេខពីចម្ងាយបានភ្ជាប់ដោយការហៅ។"</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"អានអត្តសញ្ញាណ និងស្ថានភាពទូរសព្ទគោល"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"អនុញ្ញាតឱ្យកម្មវិធីចូលប្រើមុខងារទូរសព្ទគោលរបស់ឧបករណ៍។"</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"បញ្ជូនការហៅទូរសព្ទតាមរយៈប្រព័ន្ធ"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"អនុញ្ញាតឲ្យកម្មវិធីនេះបញ្ជូនការហៅទូរសព្ទរបស់វាតាមរយៈប្រព័ន្ធ ដើម្បីធ្វើឲ្យការហៅទូរសព្ទប្រសើរជាងមុន។"</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"មើល និងគ្រប់គ្រងការហៅទូរសព្ទតាមរយៈប្រព័ន្ធ។"</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"ចុចដើម្បីលុបគំរូមុខរបស់អ្នក រួចបញ្ចូលមុខរបស់អ្នកម្ដងទៀត"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"រៀបចំការដោះសោតាមទម្រង់មុខ"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"ដោះសោទូរសព្ទរបស់អ្នកដោយសម្លឹងមើលវា"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"ដើម្បីប្រើមុខងារដោះសោតាមទម្រង់មុខ សូមបើក"<b>"ការចូលប្រើកាមេរ៉ា"</b>"នៅក្នុងការកំណត់ > ឯកជនភាព"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"រៀបចំវិធីច្រើនទៀតដើម្បីដោះសោ"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"ចុចដើម្បីបញ្ចូលស្នាមម្រាមដៃ"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"ការដោះសោដោយប្រើស្នាមម្រាមដៃ"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"កំពុងរៀបចំ <xliff:g id="APPNAME">%1$s</xliff:g>។"</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"ចាប់ផ្ដើមកម្មវិធី។"</string> <string name="android_upgrading_complete" msgid="409800058018374746">"បញ្ចប់ការចាប់ផ្ដើម។"</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"បិទអេក្រង់ឬ?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"នៅពេលរៀបចំស្នាមម្រាមដៃរបស់អ្នក អ្នកបានចុចប៊ូតុងថាមពល។\n\nជាធម្មតា ការធ្វើបែបនេះបិទអេក្រង់របស់អ្នក។"</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"បិទ"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"បោះបង់"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"បន្តរៀបចំឬ?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"អ្នកបានចុចប៊ូតុងថាមពល — ជាធម្មតាការធ្វើបែបនេះនឹងបិទអេក្រង់។\n\nសាកល្បងចុចថ្នមៗ ខណៈពេលកំពុងរៀបចំស្នាមម្រាមដៃរបស់អ្នក។"</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"បិទអេក្រង់"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"បន្តរៀបចំ"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"បន្តផ្ទៀងផ្ទាត់ស្នាមម្រាមដៃរបស់អ្នកឬ?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"អ្នកបានចុចប៊ូតុងថាមពល — ជាធម្មតាការធ្វើបែបនេះនឹងបិទអេក្រង់។\n\nសាកល្បងចុចថ្នមៗ ដើម្បីផ្ទៀងផ្ទាត់ស្នាមម្រាមដៃរបស់អ្នក។"</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"បិទអេក្រង់"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"បន្ត"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> កំពុងដំណើរការ"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"ចុចដើម្បីត្រឡប់ទៅហ្គេមវិញ"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"ជ្រើសរើសហ្គេម"</string> diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml index cc9771a23586..569f6a535349 100644 --- a/core/res/res/values-kn/strings.xml +++ b/core/res/res/values-kn/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"ನಿಮ್ಮ ಮಧ್ಯಸ್ಥಿಕೆ ಇಲ್ಲದೆಯೇ ಕರೆಗಳನ್ನು ಮಾಡಲು IMS ಸೇವೆಯನ್ನು ಬಳಸಲು ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಅನುಮತಿಸುತ್ತದೆ."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"ಫೋನ್ ಸ್ಥಿತಿ ಮತ್ತು ಗುರುತಿಸುವಿಕೆಯನ್ನು ಓದಿ"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"ಸಾಧನದ ಫೋನ್ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಪ್ರವೇಶಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಈ ಅನುಮತಿಯು ಫೋನ್ ಸಂಖ್ಯೆ ಮತ್ತು ಸಾಧನದ ID ಗಳನ್ನು ನಿರ್ಧರಿಸಲು, ಕರೆಯು ಸಕ್ರಿಯವಾಗಿದೆಯೇ ಮತ್ತು ಕರೆಯ ಮೂಲಕ ರಿಮೋಟ್ ಸಂಖ್ಯೆಯು ಸಂಪರ್ಕಗೊಂಡಿವೆಯೇ ಎಂಬುದನ್ನೂ ನಿರ್ಧರಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ಕಲ್ಪಿಸುತ್ತದೆ."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"ಮೂಲ ಟೆಲಿಫೋನ್ ಸ್ಥಿತಿ ಮತ್ತು ಗುರುತನ್ನು ಓದಿ"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"ಸಾಧನದ ಮೂಲ ಟೆಲಿಫೋನ್ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಪ್ರವೇಶಿಸಲು ಆ್ಯಪ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"ಕರೆಗಳನ್ನು ಸಿಸ್ಟಂ ಮೂಲಕ ರವಾನಿಸಿ"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"ಕರೆಯ ಅನುಭವವನ್ನು ಸುಧಾರಿಸಲು ಅಪ್ಲಿಕೇಶನ್ನ ಕರೆಗಳನ್ನು ಸಿಸ್ಟಂ ಮೂಲಕ ರವಾನಿಸಲು ಅನುಮತಿಸುತ್ತದೆ."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"ಸಿಸ್ಟಂ ಮೂಲಕ ಕರೆಗಳನ್ನು ವೀಕ್ಷಿಸಿ ಮತ್ತು ನಿಯಂತ್ರಿಸಿ."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"ನಿಮ್ಮ ಫೇಸ್ ಮಾಡೆಲ್ ಅನ್ನು ಅಳಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ, ನಂತರ ನಿಮ್ಮ ಫೇಸ್ ಮಾಡೆಲ್ ಅನ್ನು ಪುನಃ ಸೇರಿಸಿ"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"ಫೇಸ್ ಅನ್ಲಾಕ್ ಅನ್ನು ಸೆಟಪ್ ಮಾಡಿ"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"ಫೋನ್ ಅನ್ನು ನೋಡುವ ಮೂಲಕ ಅನ್ಲಾಕ್ ಮಾಡಿ"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"ಫೇಸ್ ಅನ್ಲಾಕ್ ಬಳಸಲು, ಸೆಟ್ಟಿಂಗ್ಗಳು > ಗೌಪ್ಯತೆ ಎಂಬಲ್ಲಿ "<b>"ಕ್ಯಾಮರಾ ಪ್ರವೇಶವನ್ನು"</b>" ಆನ್ ಮಾಡಿ"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"ಅನ್ಲಾಕ್ ಮಾಡಲು ಹೆಚ್ಚಿನ ಮಾರ್ಗಗಳನ್ನು ಹೊಂದಿಸಿ"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"ಫಿಂಗರ್ ಪ್ರಿಂಟ್ ಸೇರಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಅನ್ಲಾಕ್"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"<xliff:g id="APPNAME">%1$s</xliff:g> ಸಿದ್ಧಪಡಿಸಲಾಗುತ್ತಿದೆ."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಪ್ರಾರಂಭಿಸಲಾಗುತ್ತಿದೆ."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"ಬೂಟ್ ಪೂರ್ಣಗೊಳಿಸಲಾಗುತ್ತಿದೆ."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"ಸ್ಕ್ರೀನ್ ಆಫ್ ಮಾಡಬೇಕೇ?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"ಫಿಂಗರ್ ಪ್ರಿಂಟ್ ಅನ್ನು ಸೆಟ್ಟಪ್ ಮಾಡುವಾಗ ನೀವು ಪವರ್ ಬಟನ್ಅನ್ನು ಒತ್ತಿದ್ದೀರಿ \n\nಸಾಮಾನ್ಯವಾಗಿ ಇದರಿಂದ ನಿಮ್ಮ ಸ್ಕ್ರೀನ್ ಆಫ್ ಆಗುತ್ತದೆ."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"ಆಫ್ ಮಾಡಿ"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"ರದ್ದುಗೊಳಿಸಿ"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"ಸೆಟಪ್ ಮುಂದುವರಿಸಬೇಕೆ?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"ನೀವು ಪವರ್ ಬಟನ್ ಒತ್ತಿದ್ದೀರಿ — ಇದು ಸಾಮಾನ್ಯವಾಗಿ ಸ್ಕ್ರೀನ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ.\n\nನಿಮ್ಮ ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಅನ್ನು ಹೊಂದಿಸುವಾಗ ಲಘುವಾಗಿ ಟ್ಯಾಪ್ ಮಾಡಲು ಪ್ರಯತ್ನಿಸಿ."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"ಸ್ಕ್ರೀನ್ ಆಫ್ ಮಾಡಿ"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"ಸೆಟಪ್ ಮುಂದುವರಿಸಿ"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಪರಿಶೀಲನೆ ಮುಂದುವರಿಸುವುದೇ?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"ನೀವು ಪವರ್ ಬಟನ್ ಒತ್ತಿದ್ದೀರಿ — ಇದು ಸಾಮಾನ್ಯವಾಗಿ ಸ್ಕ್ರೀನ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ.\n\nನಿಮ್ಮ ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಅನ್ನು ಪರಿಶೀಲಿಸಲು ಲಘುವಾಗಿ ಟ್ಯಾಪ್ ಮಾಡಲು ಪ್ರಯತ್ನಿಸಿ."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"ಸ್ಕ್ರೀನ್ ಆಫ್ ಮಾಡಿ"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"ಮುಂದುವರಿಸಿ"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> ರನ್ ಆಗುತ್ತಿದೆ"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"ಆಟಕ್ಕೆ ಹಿಂತಿರುಗಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"ಆಟವನ್ನು ಆಯ್ಕೆ ಮಾಡಿ"</string> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index aacc58bf0c26..01d040fa41a8 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"앱이 IMS 서비스를 사용하여 자동으로 전화를 걸 수 있도록 허용합니다."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"휴대전화 상태 및 ID 읽기"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"앱이 기기의 휴대전화 기능에 접근할 수 있도록 허용합니다. 이 권한을 사용하면 앱이 전화번호 및 기기의 ID, 활성 통화인지 여부, 통화가 연결된 원격 번호 등을 확인할 수 있습니다."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"기본 전화 상태 및 ID 읽기"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"앱이 기기의 기본 전화 기능에 액세스할 수 있도록 허용합니다."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"시스템을 통해 통화 연결"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"통화 환경을 개선하기 위해 앱이 시스템을 통해 통화를 연결하도록 허용합니다."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"시스템을 통해 통화 확인 및 제어"</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"탭하여 얼굴 모델을 삭제한 후 다시 얼굴을 추가하세요"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"얼굴 인식 잠금 해제 설정"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"휴대전화의 화면을 응시하여 잠금 해제할 수 있습니다."</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"얼굴 인식 잠금 해제를 사용하려면 설정 > 개인 정보 보호에서 "<b>"카메라 액세스"</b>"를 사용 설정하세요."</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"다른 잠금 해제 방법 설정"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"지문을 추가하려면 탭하세요."</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"지문 잠금 해제"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"<xliff:g id="APPNAME">%1$s</xliff:g> 준비 중..."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"앱을 시작하는 중입니다."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"부팅 완료"</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"화면을 끄시겠습니까?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"지문을 설정하는 중에 전원 버튼이 눌렸습니다.\n\n이렇게 하면 보통 화면이 꺼집니다."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"끄기"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"취소"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"설정을 계속하시겠어요?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"전원 버튼을 눌렀습니다. 이러면 보통 화면이 꺼집니다.\n\n지문 설정 중에 가볍게 탭하세요."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"화면 끄기"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"설정 계속"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"지문 인증을 계속할까요?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"전원 버튼을 눌렀습니다. 이러면 보통 화면이 꺼집니다.\n\n지문을 인식하려면 화면을 가볍게 탭하세요."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"화면 끄기"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"계속"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> 실행 중"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"게임으로 돌아가려면 탭하세요."</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"게임 선택"</string> diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index 5399b4c4b733..e15377344230 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Колдонмого сизди катыштырбай туруп, IMS кызматынын жардамы менен, чалууларды жасоо мүмкүнчүлүгүн берет."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"телефондун абалын жана аныктыгын окуу"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Колдонмого түзмөктүн чалуу мүмкүнчүлүктөрүнө жетки алуу уруксатын берет. Бул уруксат колдонмого, телефондун номурун, түзмөктүн ID-син, чалуунун абалын жана байланышта чыккан номурду аныктоого жол берет."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"негизги телефония статусун окуу жана аныктоо"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Колдонмого түзмөктүн негизги телефония функцияларын колдонууга мүмкүнчүлүк берет."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"чалууларды тутум аркылуу өткөрүү"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Чалуунун сапатын жакшыртуу максатында колдонмого чалууларын тутум аркылуу өткөрүүгө уруксат берет."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"тутум аркылуу чалууларды көрүп, көзөмөлдөө."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Жүзүңүздүн үлгүсүн өчүрүү үчүн басып, жаңы үлгүнү кошуңуз"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Жүзүнөн таанып ачууну жөндөө"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Телефонуңузду карап туруп эле кулпусун ачып алыңыз"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Жүзүнөн таанып ачуу функциясын колдонуу үчүн Жөндөөлөр > Купуялык бөлүмүнө өтүп, "<b>"Камераны колдонууну"</b>" күйгүзүңүз"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Кулпусун ачуунун көбүрөөк жолдорун жөндөңүз"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Манжа изин кошуу үчүн басыңыз"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Кулпуланган түзмөктү манжа изи менен ачуу"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"<xliff:g id="APPNAME">%1$s</xliff:g> даярдалууда."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Колдонмолорду иштетип баштоо"</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Жүктөлүүдө"</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Экран өчүрүлсүнбү?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Манжаңыздын изин жөндөп жатканда күйгүзүү/өчүрүү баскычын басып алдыңыз.\n\nБул адатта экранды өчүрөт."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Өчүрүү"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Жок"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Жөндөөнү улантасызбы?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Кубат баскычын бастыңыз — адатта, бул экранды өчүрөт.\n\nМанжаңыздын изин жөндөп жатканда аны акырын басып көрүңүз."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Экранды өчүрүү"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Жөндөөнү улантуу"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Манжаңыздын изин ырастоону улантасызбы?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Кубат баскычын бастыңыз — адатта, бул экранды өчүрөт.\n\nМанжаңыздын изин ырастоо үчүн аны акырын басып көрүңүз."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Экранды өчүрүү"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Улантуу"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> иштеп жатат"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Оюнга кайтуу үчүн таптаңыз"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Оюн тандоо"</string> diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml index 88de60dd445c..b3cb5afea989 100644 --- a/core/res/res/values-lo/strings.xml +++ b/core/res/res/values-lo/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"ອະນຸຍາດໃຫ້ແອັບໃຊ້ການບໍລິການ IMS ເພື່ອໂທໂດຍບໍ່ມີການຊ່ວຍເຫຼືອຂອງທ່ານ."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"ອ່ານສະຖານະ ແລະຂໍ້ມູນລະບຸໂຕຕົນຂອງໂທລະສັບ"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"ອະນຸຍາດໃຫ້ແອັບຯ ເຂົ້າເຖິງຄວາມສາມາດການໂທລະສັບຂອງອຸປະກອນ. ການກຳນົດສິດນີ້ເຮັດໃຫ້ແອັບຯສາມາດກວດສອບເບີໂທລະສັບ ແລະ ID ຂອງອຸປະກອນ, ບໍ່ວ່າການໂທຈະຍັງດຳເນີນຢູ່ ແລະເບີປາຍທາງເຊື່ອມຕໍ່ຢູ່ຫຼືບໍ່ກໍຕາມ."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"ອ່ານສະຖານະໂທລະສັບພື້ນຖານ ແລະ ຕົວຕົນ"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"ອະນຸຍາດໃຫ້ແອັບເຂົ້າເຖິງຄຸນສົມບັດໂທລະສັບພື້ນຖານຂອງອຸປະກອນໄດ້."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"route calls through the system"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Allows the app to route its calls through the system in order to improve the calling experience."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"ເຫັນ ແລະ ຄວບຄຸມການໂທຜ່ານລະບົບ."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"ແຕະເພື່ອລຶບຮູບແບບໃບໜ້າຂອງທ່ານ, ຈາກນັ້ນເພີ່ມໃບໜ້າຂອງທ່ານໃສ່ໃໝ່"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"ຕັ້ງຄ່າການປົດລັອກດ້ວຍໜ້າ"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"ປົດລັອກໂທລະສັບຂອງທ່ານໂດຍການເບິ່ງມັນ"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"ເພື່ອໃຊ້ການປົດລັອກດ້ວຍໜ້າ, ກະລຸນາເປີດໃຊ້ "<b>"ສິດເຂົ້າເຖິງກ້ອງຖ່າຍຮູບ"</b>" ໃນການຕັ້ງຄ່າ > ຄວາມເປັນສ່ວນຕົວ"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"ຕັ້ງຄ່າວິທີເພີ່ມເຕີມເພື່ອປົດລັອກ"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"ແຕະເພື່ອເພີ່ມລາຍນິ້ວມື"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"ປົດລັອກດ້ວຍລາຍນິ້ວມື"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"ກຳລັງກຽມ <xliff:g id="APPNAME">%1$s</xliff:g>."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"ກຳລັງເປີດແອັບຯ."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"ກຳລັງສຳເລັດການເປີດລະບົບ."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"ປິດໜ້າຈໍໄວ້ບໍ?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"ໃນລະຫວ່າງການຕັ້ງຄ່າລາຍນິ້ວມືຂອງທ່ານ, ທ່ານກົດປຸ່ມເປີດປິດ.\n\nໂດຍປົກກະຕິນີ້ຈະເປັນການປິດໜ້າຈໍຂອງທ່ານ."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"ປິດໄວ້"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"ຍົກເລີກ"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"ສືບຕໍ່ການຕັ້ງຄ່າບໍ?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"ທ່ານກົດປຸ່ມເປີດປິດ, ປົກກະຕິນີ້ຈະປິດໜ້າຈໍ.\n\nລອງແຕະຄ່ອຍໆໃນລະຫວ່າງຕັ້ງຄ່າລາຍນິ້ວມືຂອງທ່ານ."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"ປິດໜ້າຈໍ"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"ສືບຕໍ່ການຕັ້ງຄ່າ"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"ສືບຕໍ່ການຢັ້ງຢືນລາຍນິ້ວມືຂອງທ່ານບໍ?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"ທ່ານກົດປຸ່ມເປີດປິດ, ປົກກະຕິນີ້ຈະເປັນການປິດໜ້າຈໍ.\n\nໃຫ້ລອງແຕະຄ່ອຍໆເພື່ອຢັ້ງຢືນລາຍນິ້ວມືຂອງທ່ານ."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"ປິດໜ້າຈໍ"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"ສືບຕໍ່"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> ກຳລັງເຮັດວຽກ"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Tap to return to game"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Choose game"</string> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 180e1022c8ed..70f0f424cb7a 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -477,6 +477,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Programai leidžiama naudoti IMS paslaugą, kad būtų galima atlikti skambučius be jūsų įsikišimo."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"skaityti telefono būseną ir tapatybę"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Leidžiama programai pasiekti telefono funkcijas įrenginyje. Šis leidimas suteikia teisę programai nustatyti telefono numerį ir įrenginio ID, tai, ar skambutis aktyvus, ir skambučiu prijungtą nuotolinį numerį."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"skaityti pagrindinę telefonijos būsenos ir tapatybės informaciją"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Programai leidžiama pasiekti pagrindines įrenginio telefonijos funkcijas."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"nukreipti skambučius per sistemą"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Programai leidžiama nukreipti jos skambučius per sistemą siekiant pagerinti skambinimo paslaugas."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"matyti ir valdyti skambučius per sistemą."</string> @@ -628,6 +630,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Palieskite, kad ištrintumėte veido modelį, tada iš naujo pridėkite veidą"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Atrakinimo pagal veidą nustatymas"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Atrakinkite telefoną pažiūrėję į jį"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Jei norite naudoti atrakinimą pagal veidą, įjunkite parinktį "<b>"Prieiga prie fotoaparato"</b>" skiltyje „Nustatymai“ > „Privatumas“"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Daugiau atrakinimo metodų nustatymas"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Palieskite, kad pridėtumėte kontrolinį kodą"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Atrakinimas kontroliniu kodu"</string> @@ -1316,10 +1319,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"Ruošiama „<xliff:g id="APPNAME">%1$s</xliff:g>“."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Paleidžiamos programos."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Užbaigiamas paleidimas."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Išjungti ekraną?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Nustatydami kontrolinį kodą paspaudėte maitinimo mygtuką.\n\nĮprastai juo išjungiamas ekranas."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Išjungti"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Atšaukti"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Tęsti sąranką?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Paspaudėte maitinimo mygtuką, taip paprastai išjungiamas ekranas.\n\nNustatydami kontrolinį kodą, pabandykite jį švelniai paliesti."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Išjungti ekraną"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Tęsti sąranką"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Tęsti kontrolinio kodo patvirtinimą?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Paspaudėte maitinimo mygtuką, taip paprastai išjungiamas ekranas.\n\nNorėdami patvirtinti kontrolinį kodą, pabandykite jį švelniai paliesti."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Išjungti ekraną"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Tęsti"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"Vykdoma „<xliff:g id="APP">%1$s</xliff:g>“"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Palieskite, kad grįžtumėte į žaidimą"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Pasirinkite žaidimą"</string> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index 8f3e989a31ce..1df77747f878 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -221,7 +221,7 @@ <string name="turn_on_radio" msgid="2961717788170634233">"Ieslēgt bezvadu tīklu"</string> <string name="turn_off_radio" msgid="7222573978109933360">"Izslēgt bezvadu tīklu"</string> <string name="screen_lock" msgid="2072642720826409809">"Bloķēt ekrānu"</string> - <string name="power_off" msgid="4111692782492232778">"Strāvas padeve ir izslēgta."</string> + <string name="power_off" msgid="4111692782492232778">"Izslēgt tālruni"</string> <string name="silent_mode_silent" msgid="5079789070221150912">"Zvanītājs izslēgts"</string> <string name="silent_mode_vibrate" msgid="8821830448369552678">"Zvanītājs vibrācijas režīmā"</string> <string name="silent_mode_ring" msgid="6039011004781526678">"Zvanītājs ieslēgts"</string> @@ -245,7 +245,7 @@ <string name="global_actions" product="tv" msgid="3871763739487450369">"Android TV opcijas"</string> <string name="global_actions" product="default" msgid="6410072189971495460">"Tālruņa opcijas"</string> <string name="global_action_lock" msgid="6949357274257655383">"Ekrāna bloķētājs"</string> - <string name="global_action_power_off" msgid="4404936470711393203">"Strāvas padeve izslēgta."</string> + <string name="global_action_power_off" msgid="4404936470711393203">"Izslēgt strāvas padevi"</string> <string name="global_action_power_options" msgid="1185286119330160073">"Barošana"</string> <string name="global_action_restart" msgid="4678451019561687074">"Restartēt"</string> <string name="global_action_emergency" msgid="1387617624177105088">"Ārkārtas situācija"</string> @@ -474,6 +474,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Ļauj lietotnei izmantot tūlītējās ziņojumapmaiņas pakalpojumu, lai veiktu zvanus bez jūsu ziņas."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"lasīt tālruņa statusu un identitāti"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Ļauj lietotnei piekļūt ierīces tālruņa funkcijām. Ar šo atļauju lietotne var noteikt tālruņa numuru un ierīču ID, zvana statusu un attālo numuru, ar ko ir izveidots savienojums, veicot zvanu."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"lasīt telefonijas statusa un identitātes pamatinformāciju"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Lietotnei tiek atļauta piekļuve telefonijas pamatfunkcijām ierīcē."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"maršrutēt zvanus sistēmā"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Ļauj lietotnei maršrutēt tās zvanus sistēmā, lai uzlabotu zvanīšanas pieredzi."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"skatīt un kontrolēt zvanus sistēmā."</string> @@ -625,6 +627,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Pieskarieties, lai izdzēstu sejas modeli, un pēc tam vēlreiz pievienojiet seju"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Autorizācijas pēc sejas iestatīšana"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Atbloķējiet tālruni, skatoties uz to"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Lai izmantotu autorizāciju pēc sejas, sadaļā Iestatījumi > Konfidencialitāte ieslēdziet opciju "<b>"Piekļuve kamerai"</b>"."</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Citi atbloķēšanas veidi"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Pieskarieties, lai pievienotu pirksta nospiedumu"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Autorizācija ar pirksta nospiedumu"</string> @@ -1296,10 +1299,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"Notiek lietotnes <xliff:g id="APPNAME">%1$s</xliff:g> sagatavošana."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Notiek lietotņu palaišana."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Tiek pabeigta sāknēšana."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Vai izslēgt ekrānu?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Iestatot pirksta nospiedumu, jūs nospiedāt barošanas pogu.\n\nTādējādi parasti tiek izslēgts ekrāns."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Izslēgt"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Atcelt"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Vai turpināt iestatīšanu?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Jūs nospiedāt barošanas pogu — tādējādi parasti tiek izslēgts ekrāns.\n\nMēģiniet viegli pieskarties, iestatot pirksta nospiedumu."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Izslēgt ekrānu"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Turpināt iestatīšanu"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Vai apstiprināt pirksta nospiedumu?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Jūs nospiedāt barošanas pogu — tādējādi parasti tiek izslēgts ekrāns.\n\nMēģiniet viegli pieskarties, lai apstiprinātu pirksta nospiedumu."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Izslēgt ekrānu"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Turpināt"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> darbojas"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Pieskarieties, lai atgrieztos spēlē"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Spēles izvēlēšanās"</string> diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml index 9717112d2b81..cc86005f4698 100644 --- a/core/res/res/values-mk/strings.xml +++ b/core/res/res/values-mk/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Дозволува апликацијата да ја користи услугата IMS за повици без ваша интервенција."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"прочитај ги статусот и идентитетот на телефонот"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Овозможува апликацијата да пристапи кон карактеристиките на телефонот на уредот. Оваа дозвола овозможува апликацијата да ги утврди телефонскиот број и ID на уредот, дали повикот е активен и далечинскиот број поврзан со повикот."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"читање основен телефонски статус и идентитет"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Дозволете апликацијава да пристапи до основните телефонски функции на уредот."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"пренасочи повици преку системот"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Дозволете ѝ на апликацијата да ги пренасочи повиците преку системот за да го подобри искуството при јавувањето."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"гледање и контролирање повици преку системот."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Допрете за да го избришете вашиот модел на лице, а потоа повторно додајте го лицето"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Поставете „Отклучување со лик“"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Отклучете го телефонот со гледање во него"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"За да користите „Отклучување со лик“, вклучете "<b>"Пристап до камерата"</b>" во „Поставки > Приватност“"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Поставете уште начини за отклучување"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Допрете за да додадете отпечаток"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Отклучување со отпечаток на прст"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"Се подготвува <xliff:g id="APPNAME">%1$s</xliff:g>."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Се стартуваат апликациите."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Подигањето завршува."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Да се исклучи екранот?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Додека го поставувавте вашиот отпечаток, го притиснавте копчето за вклучување.\n\nОва обично го исклучува екранот."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Исклучи"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Откажи"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Дали да продолжи поставувањето?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Го притиснавте копчето за вклучување — така обично се исклучува екранот.\n\nДопрете лесно додека го поставувате отпечатокот."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Исклучи го екранот"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Продолжи"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Да продолжи потврдувањето на отпечаток?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Го притиснавте копчето за вклучување — така обично се исклучува екранот.\n\nДопрете лесно за да го потврдите отпечатокот."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Исклучи го екранот"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Продолжи"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> работи"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Допрете за да се вратите во играта"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Избор на игра"</string> diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml index 12eb2a2e0ddd..251770422101 100644 --- a/core/res/res/values-ml/strings.xml +++ b/core/res/res/values-ml/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"നിങ്ങളുടെ ഇടപെടൽ ഇല്ലാതെ കോളുകൾ ചെയ്യാൻ IMS സേവനം ഉപയോഗിക്കുന്നതിന് ആപ്പിനെ അനുവദിക്കുന്നു."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"ഫോൺ നിലയും ഐഡന്റിറ്റിയും റീഡുചെയ്യുക"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"ഉപകരണത്തിന്റെ ഫോൺ സവിശേഷതകൾ ആക്സസ്സുചെയ്യാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. ഈ അനുമതി ഫോൺ നമ്പർ, ഉപകരണ ഐഡികൾ, ഒരു കോൾ സജീവമാണോയെന്നത്, ഒരു കോൾ കണക്റ്റുചെയ്ത വിദൂര നമ്പർ എന്നിവ നിർണ്ണയിക്കാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"ടെലിഫോണിന്റെ അടിസ്ഥാന നിലയും ഐഡന്റിറ്റിയും വായിക്കാൻ"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"ഉപകരണത്തിലെ ടെലിഫോൺ സംബന്ധമായ അടിസ്ഥാന ഫീച്ചറുകൾ ആക്സസ് ചെയ്യാൻ ആപ്പിനെ അനുവദിക്കുന്നു."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"കോളുകൾ സിസ്റ്റത്തിലൂടെ വിടുക"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"കോളിംഗ് അനുഭവം മെച്ചപ്പെടുത്തുന്നതിനായി തങ്ങളുടെ കോളുകൾ സിസ്റ്റത്തിലേയ്ക്ക് വഴിതിരിച്ചുവിടാൻ ആപ്പുകളെ അനുവദിക്കുന്നു."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"സിസ്റ്റത്തിലൂടെ കോളുകൾ കാണുകയും നിയന്ത്രിക്കുകയും ചെയ്യുക."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"നിങ്ങളുടെ മുഖ മോഡൽ ഇല്ലാതാക്കാൻ ടാപ്പ് ചെയ്യുക, തുടർന്ന് അത് വീണ്ടും ചേർക്കുക"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"ഫെയ്സ് അൺലോക്ക് സജ്ജീകരിക്കുക"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"ഫോണിലേക്ക് നോക്കി അത് അൺലോക്ക് ചെയ്യുക"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"ഫെയ്സ് അൺലോക്ക് ഉപയോഗിക്കാൻ, ക്രമീകരണം > സ്വകാര്യത എന്നതിൽ "<b>"ക്യാമറാ ആക്സസ്"</b>" ഓണാക്കുക"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"അൺലോക്ക് ചെയ്യുന്നതിനുള്ള കൂടുതൽ വഴികൾ സജ്ജീകരിക്കുക"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"ഫിംഗർപ്രിന്റ് ചേർക്കാൻ ടാപ്പ് ചെയ്യുക"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"ഫിംഗർപ്രിന്റ് അൺലോക്ക്"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"<xliff:g id="APPNAME">%1$s</xliff:g> തയ്യാറാക്കുന്നു."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"അപ്ലിക്കേഷനുകൾ ആരംഭിക്കുന്നു."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"ബൂട്ട് ചെയ്യൽ പൂർത്തിയാകുന്നു."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"സ്ക്രീൻ ഓഫാക്കണോ?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"ഫിംഗർപ്രിന്റ് സജ്ജീകരിച്ച് കൊണ്ടിരുന്നപ്പോൾ നിങ്ങൾ പവർ ബട്ടൺ അമർത്തി.\n\nഇത് സാധാരണയായി സ്ക്രീൻ ഓഫാകുന്നതിന് കാരണമാകും."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"ഓഫാക്കുക"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"റദ്ദാക്കുക"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"സജ്ജീകരണം തുടരണോ?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"നിങ്ങൾ പവർ ബട്ടൺ അമർത്തി — സാധാരണയായി ഇത് സ്ക്രീൻ ഓഫാകുന്നതിന് കാരണമാകും.\n\nനിങ്ങളുടെ ഫിംഗർപ്രിന്റ് സജ്ജീകരിക്കുമ്പോൾ മൃദുവായി ടാപ്പ് ചെയ്ത് നോക്കുക."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"സ്ക്രീൻ ഓഫാക്കുക"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"സജ്ജീകരണം തുടരുക"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"ഫിംഗർപ്രിന്റ് പരിശോധിച്ചുറപ്പിക്കൽ തുടരണോ?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"നിങ്ങൾ പവർ ബട്ടൺ അമർത്തി — സാധാരണയായി ഇത് സ്ക്രീൻ ഓഫാകുന്നതിന് കാരണമാകും.\n\nനിങ്ങളുടെ ഫിംഗർപ്രിന്റ് പരിശോധിച്ചുറപ്പിക്കാൻ മൃദുവായി ടാപ്പ് ചെയ്ത് നോക്കുക."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"സ്ക്രീൻ ഓഫാക്കുക"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"തുടരുക"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> പ്രവർത്തിക്കുന്നു"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"ഗെയിമിലേക്ക് മടങ്ങാൻ ടാപ്പ് ചെയ്യുക"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"ഗെയിം തിരഞ്ഞെടുക്കുക"</string> diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml index 68fdb072cfea..6be8243e8347 100644 --- a/core/res/res/values-mn/strings.xml +++ b/core/res/res/values-mn/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Апп нь дуудлага хийхдээ таны оролцоогүйгээр IMS үйлчилгээг ашиглах боломжтой."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"утасны статус ба таниулбарыг унших"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Апп нь төхөөрөмжийн утасны функцд хандах боломжтой. Энэ зөвшөөрөл нь апп-д утасны дугаар болон төхөөрөмжийн ID-г, дуудлага идэвхтэй эсэх, холын дугаар дуудлагаар холбогдсон байгаа эсэхийг тогтоох боломжийг олгоно,"</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"утасны үндсэн статус болон таних мэдээллийг уншуулна уу"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Аппад төхөөрөмжийн утасны үндсэн онцлогт хандах боломжийг олгоно."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"системээр дамжуулах дуудлага"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Дуудлагыг сайжруулахын тулд дуудлагаа системээр дамжуулах зөвшөөрлийг апп-д олгодог."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"систем дэх дуудлагыг харах болон хянах."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Нүүрний загвараа устгахын тулд товшоод, дараа нь царайгаа дахин нэмнэ үү"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Царайгаар түгжээ тайлахыг тохируулах"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Утас руугаа харж түгжээг нь тайлна уу"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Царайгаар түгжээ тайлахыг ашиглахын тулд Тохиргоо > Нууцлал хэсэгт "<b>" Камерын хандалтыг "</b>" асаана уу"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Түгжээ тайлах илүү олон арга тохируулна уу"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Хурууны хээ нэмэхийн тулд товшино уу"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Хурууны хээгээр түгжээ тайлах"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"Бэлдэж байна <xliff:g id="APPNAME">%1$s</xliff:g>."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Апп-г эхлүүлж байна."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Эхлэлийг дуусгаж байна."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Дэлгэцийг унтраах уу?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Та хурууны хээгээ тохируулж байх үед Асаах/унтраах товчийг дарсан байна.\n\nЭнэ нь ихэвчлэн таны дэлгэцийг унтраана."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Унтраах"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Цуцлах"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Тохируулгыг үргэлжлүүлэх үү?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Та асаах/унтраах товчийг дарсан байна — энэ нь ихэвчлэн дэлгэцийг унтраадаг.\n\nХурууны хээгээ тохируулж байх үедээ зөөлөн товшиж үзнэ үү."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Дэлгэцийг унтраах"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Тохируулгыг үргэлжлүүлэх"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Хурууны хээгээ үргэлжлүүлэн баталгаажуулах уу?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Та асаах/унтраах товчийг дарсан байна — энэ нь ихэвчлэн дэлгэцийг унтраадаг.\n\nХурууны хээгээ баталгаажуулахын тулд зөөлөн товшиж үзнэ үү."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Дэлгэцийг унтраах"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Үргэлжлүүлэх"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> ажиллаж байна"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Тоглоом руу буцахын тулд товших"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Тоглоом сонгох"</string> diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml index bf9143d87ec0..69279ee78263 100644 --- a/core/res/res/values-mr/strings.xml +++ b/core/res/res/values-mr/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"आपल्या हस्तक्षेपाशिवाय अॅपला कॉल करण्यासाठी IMS सेवा वापरण्याची अनुमती देते."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"फोन स्थिती आणि ओळख वाचा"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"डिव्हाइस च्या फोन वैशिष्ट्यांवर अॅक्सेस करण्यास ॲपला अनुमती देते. ही परवानगी कॉल ॲक्टिव्हेट असला किंवा नसला तरीही, फोन नंबर आणि डिव्हाइस आयडी आणि कॉलद्वारे कनेक्ट केलेला रिमोट नंबर निर्धारित करण्यासाठी ॲपला अनुमती देते."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"टेलिफोनी सुविधांशी संबंधित मूलभूत स्टेटस आणि ओळखीशी संबंधित माहिती वाचा"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"यामुळे ॲपला डिव्हाइसची मूलभूत टेलिफोनी वैशिष्ट्ये अॅक्सेस करण्याची अनुमती मिळते."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"प्रणालीच्या माध्यमातून कॉल रूट करा"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"कॉल करण्याचा अनुभव सुधारण्यासाठी ॲपला त्याचे कॉल प्रणालीच्या माध्यमातून रूट करू देते."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"सिस्टम वापरून कॉल पहा आणि नियंत्रण ठेवा."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"फेस मॉडेल हटवण्यासाठी टॅप करा, त्यानंतर तुमचा चेहरा पुन्हा जोडा"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"फेस अनलॉक सेट करा"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"तुमच्या फोनकडे पाहून तो अनलॉक करा"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"फेस अनलॉक वापरण्यासाठी, सेटिंग्ज > गोपनीयता येथे "<b>"कॅमेरा अॅक्सेस"</b>" सुरू करा"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"अनलॉक करण्याच्या आणखी पद्धती सेट करा"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"फिंगरप्रिंट जोडण्यासाठी टॅप करा"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"फिंगरप्रिंट अनलॉक"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"<xliff:g id="APPNAME">%1$s</xliff:g> तयार करत आहे."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"अॅप्स सुरू करत आहे."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"बूट समाप्त होत आहे."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"स्क्रीन बंद करायची आहे का?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"तुम्ही तुमची फिंगरप्रिंट सेट करत असताना पॉवर बटण दाबले.\n\nयामुळे सहसा तुमची स्क्रीन बंद होते."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"बंद करा"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"रद्द करा"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"सेट करणे पुढे सुरू ठेवायचे का?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"तुम्ही पॉवर बटण दाबले — हे सहसा स्क्रीन बंद करते.\n\nतुमचे फिंगरप्रिंट सेट करताना हलके टॅप करून पहा."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"स्क्रीन बंद करा"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"सेट करणे सुरू ठेवा"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"फिंगरप्रिंट पडताळणी सुरू ठेवायची का?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"तुम्ही पॉवर बटण दाबले — हे सहसा स्क्रीन बंद करते.\n\nतुमच्या फिंगरप्रिंटची पडताळणी करण्यासाठी हलके टॅप करून पहा."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"स्क्रीन बंद करा"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"पुढे सुरू ठेवा"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"रन होणारे <xliff:g id="APP">%1$s</xliff:g>"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"गेमवर परत जाण्यासाठी टॅप करा"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"गेम निवडा"</string> diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml index 05395c91fea7..27aac1ac2a74 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Membenarkan apl menggunakan perkhidmatan IMS untuk membuat panggilan tanpa campur tangan anda."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"baca status dan identiti telefon"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Membenarkan apl mengakses ciri telefon pada peranti. Kebenaran ini membolehkan apl menentukan nombor telefon dan ID peranti, sama ada panggilan aktif dan nombor jauh yang dihubungkan dengan panggilan."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"membaca status telefoni asas dan identiti"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Membenarkan apl mengakses ciri telefoni asas peranti."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"halakan panggilan menerusi sistem"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Membenarkan apl menghalakan panggilan menerusi sistem untuk meningkatkan pengalaman panggilan."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"lihat dan kawal panggilan melalui sistem."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Ketik untuk memadamkan model wajah anda, kemudian tambahkan wajah anda semula"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Sediakan Buka Kunci Wajah"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Buka kunci telefon anda dengan melihat telefon anda"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Untuk menggunakan Buka Kunci Wajah, hidupkan "<b>"akses Kamera"</b>" dalam Tetapan > Privasi"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Sediakan lebih banyak cara untuk membuka kunci"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Ketik untuk menambahkan cap jari"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Buka Kunci Cap Jari"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"Menyediakan <xliff:g id="APPNAME">%1$s</xliff:g>."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Memulakan apl."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"But akhir."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Matikan skrin?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Semasa menyediakan cap jari anda, anda menekan butang Kuasa.\n\nTindakan ini biasanya mematikan skrin anda."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Matikan"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Batal"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Teruskan persediaan?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Anda menekan butang kuasa — tindakan ini biasanya mematikan skrin.\n\nCuba ketik dengan perlahan semasa menetapkan cap jari anda."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Matikan skrin"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Teruskan persediaan"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Terus mengesahkan cap jari anda?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Anda menekan butang kuasa — tindakan ini biasanya mematikan skrin.\n\nCuba ketik dengan perlahan untuk mengesahkan cap jari anda."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Matikan skrin"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Teruskan"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> dijalankan"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Ketik untuk kembali ke permainan"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Pilih permainan"</string> diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml index 4f97ef9b4da0..eefbe153d6ba 100644 --- a/core/res/res/values-my/strings.xml +++ b/core/res/res/values-my/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"သင့်ရဲ့ဝင်ရောက်စွက်ဖက်မှုမပါဘဲ IMS ဝန်ဆောင်မှုကိုအသုံးပြုပြီး ဖုန်းခေါ်ဆိုနိုင်ရန် အပ်ဖ်ကို ခွင့်ပြုထားပါ။"</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"ဖုန်းရဲ့ အခြေအနေ နှင့် အမှတ်သညာအား ဖတ်ခြင်း"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"အပလီကေးရှင်းအား ဖုန်းရဲ့ စွမ်းဆောင်ချက်များအား သုံးခွင့်ပြုပါ။ အပလီကေးရှင်းအနေဖြင့် ဖုန်းနံပါတ်၊ စက်နံပါတ်၊ ဖုန်းခေါ်နေမှု ရှိမရှိနှင့် တဖက်မှ ဖုန်းနံပါတ် များအား သိရှိနိုင်ပါသည်"</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"အခြေခံတယ်လီဖုန်းအခြေအနေနှင့် အထောက်အထားကို ဖတ်ခြင်း"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"စက်၏ အခြေခံတယ်လီဖုန်းဝန်ဆောင်မှုများသုံးရန် အက်ပ်ကို ခွင့်ပြုသည်။"</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"ခေါ်ဆိုမှုများကို စနစ်မှတစ်ဆင့် ဖြတ်သန်းခွင့်ပြုပါ"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"ခေါ်ဆိုမှု အတွေ့အကြုံ ပိုမိုကောင်းမွန်လာစေရန်အတွက် အက်ပ်၏ ခေါ်ဆိုမှုအား စနစ်မှတစ်ဆင့် ဖြတ်သန်းရန် ခွင့်ပြုပါသည်။"</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"စနစ်မှတစ်ဆင့် ခေါ်ဆိုမှုများကို ကြည့်ရှုထိန်းချုပ်ပါ။"</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"သင်၏မျက်နှာနမူနာကို ဖျက်ရန် တို့ပါ။ ထို့နောက် သင့်မျက်နှာကို ထပ်ထည့်ပါ"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"မျက်နှာပြ လော့ခ်ဖွင့်ခြင်းကို ထည့်သွင်းပါ"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"သင့်ဖုန်းကိုကြည့်၍ သော့ဖွင့်ပါ"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"မျက်နှာပြ လော့ခ်ဖွင့်ခြင်းကို သုံးရန် "<b>"ကင်မရာ သုံးခွင့်"</b>" ကို ‘ဆက်တင်များ > ကန့်သတ်ဆက်တင်’ တွင်ဖွင့်ပါ"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"သော့ဖွင့်ရန် နောက်ထပ်နည်းလမ်းများကို စနစ်ထည့်သွင်းပါ"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"လက်ဗွေထည့်ရန် တို့ပါ"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"လက်ဗွေသုံး လော့ခ်ဖွင့်ခြင်း"</string> @@ -1172,8 +1175,8 @@ <string name="delete" msgid="1514113991712129054">"ဖျက်ရန်"</string> <string name="copyUrl" msgid="6229645005987260230">"URLအား ကူးခြင်း"</string> <string name="selectTextMode" msgid="3225108910999318778">"စာသား ရွေးရန်"</string> - <string name="undo" msgid="3175318090002654673">"တစ်ဆင့်နောက်ပြန်ရန်"</string> - <string name="redo" msgid="7231448494008532233">"ထပ်လုပ်ပါ"</string> + <string name="undo" msgid="3175318090002654673">"နောက်ပြန်ရန်"</string> + <string name="redo" msgid="7231448494008532233">"ပြန်လုပ်ရန်"</string> <string name="autofill" msgid="511224882647795296">"အော်တိုဖြည့်"</string> <string name="textSelectionCABTitle" msgid="5151441579532476940">"စာတိုရွေးချယ်မှု"</string> <string name="addToDictionary" msgid="8041821113480950096">"အဘိဓာန်ထဲ ထည့်ပါ"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"<xliff:g id="APPNAME">%1$s</xliff:g> အားပြင်ဆင်နေသည်။"</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"အက်ပ်များကို စတင်နေ"</string> <string name="android_upgrading_complete" msgid="409800058018374746">"လုပ်ငန်းစနစ်ထည့်သွင်း၍ ပြန်လည်စတင်ရန် ပြီးပါပြီ"</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"ဖန်သားပြင်ကို ပိတ်မလား။"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"သင့်လက်ဗွေကို စနစ်ထည့်သွင်းနေစဉ် ဖွင့်ပိတ်ခလုတ်ကို ဖိထားပါ။\n\n၎င်းက အများအားဖြင့် သင့်ဖန်သားပြင်ကို ပိတ်ပါသည်။"</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"ပိတ်ရန်"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"မလုပ်တော့"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"ဆက်လက်၍ စနစ်ထည့်သွင်းလိုပါသလား။"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"ဖွင့်ပိတ်ခလုတ်ကို သင်နှိပ်ခဲ့သည် — ၎င်းက ပုံမှန်အားဖြင့် စခရင်ကို ပိတ်စေသည်။\n\nသင့်လက်ဗွေကို ထည့်သွင်းသောအခါ ဖွဖွတို့ကြည့်ပါ။"</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"စခရင် ပိတ်ရန်"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"စနစ်ဆက်ထည့်သွင်းရန်"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"သင့်လက်ဗွေကို ဆက်၍ အတည်ပြုမလား။"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"ဖွင့်ပိတ်ခလုတ်ကို သင်နှိပ်ခဲ့သည် — ၎င်းက ပုံမှန်အားဖြင့် စခရင်ကို ပိတ်စေသည်။\n\nသင့်လက်ဗွေကို အတည်ပြုရန် ဖွဖွတို့ကြည့်ပါ။"</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"စခရင် ပိတ်ရန်"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"ရှေ့ဆက်ရန်"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> က အလုပ်လုပ်နေသည်"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"ဂိမ်းသို့ ပြန်သွားရန် တို့ပါ"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"ဂိမ်းကို ရွေးခြင်း"</string> @@ -1549,7 +1556,7 @@ <string name="sync_too_many_deletes" msgid="6999440774578705300">"ပယ်ဖျက်မည့်ကန့်သတ်နှုန်းကျော်လွန်သည်"</string> <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"<xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>၊ account <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> အတွက် စုစုပေါင်း <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> အရာဖျက်ထားပါသည်။ သင်ဘာလုပ်ချင်ပါလဲ?"</string> <string name="sync_really_delete" msgid="5657871730315579051">"ဤအရာများကိုဖျက်ပါ"</string> - <string name="sync_undo_deletes" msgid="5786033331266418896">"ဖျက်ပီးသည်များကို ပယ်ဖျက်ရန်"</string> + <string name="sync_undo_deletes" msgid="5786033331266418896">"အားလုံးကို မဖျက်တော့ရန်"</string> <string name="sync_do_nothing" msgid="4528734662446469646">"လက်ရှိ ဘာမှမလုပ်ရန်"</string> <string name="choose_account_label" msgid="5557833752759831548">"အကောင့် တစ်ခု ရွေးပါ"</string> <string name="add_account_label" msgid="4067610644298737417">"အကောင့်တစ်ခုထည့်ရန်"</string> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index ccf5e97ddfde..4d8d2b0534e4 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Lar appen bruke nettprattjenesten til å ringe uten at du gjør noe."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"lese telefonstatus og -identitet"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Lar appen bruke enhetens telefonfunksjoner. Med denne tillatelsen kan appen finne telefonnummer og enhets-ID-er, registrere om en samtale pågår, og se det eksterne nummeret det opprettes en forbindelse med via oppringing."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"lese grunnleggende telefonstatus og identitet"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Gir appen tilgang til de grunnleggende telefonfunksjonene på enheten."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"send anrop gjennom systemet"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Lar appen sende anrop gjennom systemet for å forbedre anropsopplevelsen."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"se og kontrollere anrop i systemet."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Trykk for å slette ansiktsmodellen din, og legg deretter til ansiktet på nytt"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Konfigurer ansiktslås"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Lås opp telefonen ved å se på den"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"For å bruke ansiktslås, slå på "<b>"Kameratilgang"</b>" i Innstillinger > Personvern"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Konfigurer flere måter å låse opp på"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Trykk for å legge til et fingeravtrykk"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Opplåsing med fingeravtrykk"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"Forbereder <xliff:g id="APPNAME">%1$s</xliff:g>."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Starter apper."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Ferdigstiller oppstart."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Vil du slå av skjermen?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Da du konfigurerte fingeravtrykket, trykket du på av/på-knappen.\n\nDette slår vanligvis av skjermen."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Slå av"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Avbryt"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Vil du fortsette konfigureringen?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Du har trykket på av/på-knappen – dette slår vanligvis av skjermen.\n\nPrøv å trykke lett mens du konfigurerer fingeravtrykket ditt."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Slå av skjermen"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Fortsett konfig."</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Fortsett bekreftelse av fingeravtrykket?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Du har trykket på av/på-knappen – dette slår vanligvis av skjermen.\n\nPrøv å trykke lett for å bekrefte fingeravtrykket ditt."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Slå av skjermen"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Fortsett"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> kjører"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Trykk for å gå tilbake til spillet"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Velg et spill"</string> diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index 99e3375bac63..12c4464843eb 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"तपाईँको हस्तक्षेप बिना नै कल गर्न IMS सेवा प्रयोग गर्न एपलाई अनुमति दिन्छ।"</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"फोन स्थिति र पहिचान पढ्नुहोस्"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"उपकरणको फोन विशेषताहरूको पहुँच गर्न एपलाई अनुमति दिन्छ। यस अनुमतिले फोन नम्बर र उपकरणको IDs, कल सक्षम छ कि छैन र कलद्वारा जोडिएको टाढाको नम्बर निर्धारण गर्न अनुमति दिन्छ।"</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"टेलिफोन सेवाका आधारभूत स्थिति र त्यसको पहिचानसम्बन्धी जानकारी रिड गर्ने"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"तपाईंले यो अनुमति दिनुभयो भने यो एपले यस डिभाइसको टेलिफोन सेवाका आधारभूत सुविधाहरू प्रयोग गर्न सक्छ।"</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"प्रणाली मार्फत कल गर्न दिनुहोस्"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"कल गर्दाको अनुभवलाई सुधार्न यस एपलाई प्रणाली मार्फत कलहरू गर्न अनुमति दिन्छ।"</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"प्रणालीमार्फत कलहरू हेर्नुका साथै तिनीहरूलाई नियन्त्रण गर्नुहोस्।"</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"आफ्नो फेस मोडेल मेटाउन ट्याप गर्नुहोस् अनि आफ्नो अनुहार फेरि दर्ता गर्नुहोस्"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"फेस अनलक सेटअप गर्नुहोस्"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"फोनमा हेरेकै भरमा फोन अनलक गर्नुहोस्"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"फेस अनलक प्रयोग गर्न \"सेटिङ तथा गोपनीयता\" मा गई "<b>"क्यामेरा प्रयोग गर्ने अनुमति"</b>" दिनुहोस्"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"अनलक गर्ने अन्य तरिकाहरू सेटअप गर्नुहोस्"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"फिंगरप्रिन्ट हाल्न ट्याप गर्नुहोस्"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"फिंगरप्रिन्ट अनलक"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"<xliff:g id="APPNAME">%1$s</xliff:g> तयारी गर्दै।"</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"सुरुवात एपहरू।"</string> <string name="android_upgrading_complete" msgid="409800058018374746">"बुट पुरा हुँदै।"</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"स्क्रिन अफ गर्ने हो?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"आफ्नो फिंगरप्रिन्ट सेटअप गर्दा तपाईंले पावर बटन थिच्नुभयो।\n\nयसो गर्दा सामान्यतया तपाईंको स्क्रिन अफ हुन्छ।"</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"अफ गर्नुहोस्"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"रद्द गर्नुहोस्"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"सेटअप गर्ने प्रक्रिया जारी राख्ने हो?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"तपाईंले पावर बटन थिच्नुभयो — सामान्यतया स्क्रिन अफ गर्न यो बटन थिच्ने गरिन्छ।\n\nफिंगरप्रिन्ट सेटअप भइन्जेल हल्का तरिकाले यो बटन ट्याप गर्नुहोस्।"</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"स्क्रिन अफ गर्नुहोस्"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"सेटअप जारी राख्नुस्"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"फिंगरप्रिन्ट पुष्टि गर्ने क्रम जारी राख्ने हो?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"तपाईंले पावर बटन थिच्नुभयो — सामान्यतया स्क्रिन अफ गर्न यो बटन थिच्ने गरिन्छ।\n\nतपाईं आफ्नो फिंगरप्रिन्ट पुष्टि गर्न चाहनुहुन्छ भने हल्का तरिकाले यो बटन ट्याप गरी हेर्नुहोस्।"</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"स्क्रिन अफ गर्नुहोस्"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"जारी राख्नुहोस्"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> चलिरहेको छ"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"खेलमा फर्कन ट्याप गर्नुहोस्"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"खेल छनौट गर्नुहोस्"</string> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index a1b45bfc3521..858ca009df05 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Hiermee kan de app de IMS-service gebruiken om te bellen zonder je tussenkomst."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"telefoonstatus en -identiteit lezen"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Hiermee kan de app toegang krijgen tot de telefoonfuncties van het apparaat, Met deze rechten kan de app het telefoonnummer en de apparaat-ID\'s bepalen, of een gesprek actief is, en het andere telefoonnummer waarmee wordt gebeld."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"basistelefoonstatus en -identiteit lezen"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Hiermee geef je de app toegang tot de basistelefoonfuncties van het apparaat."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"gesprekken doorschakelen via het systeem"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Hiermee kan de app de bijbehorende gesprekken doorschakelen via het systeem om de belfunctionaliteit te verbeteren."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"gesprekken via het systeem bekijken en beheren"</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Tik om je gezichtsmodel te verwijderen en voeg je gezicht opnieuw toe"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Ontgrendelen via gezichtsherkenning instellen"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Ontgrendel je telefoon door ernaar te kijken"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Als je Ontgrendelen via gezichtsherkenning wilt gebruiken, zet je "<b>"Cameratoegang"</b>" aan via Instellingen > Privacy"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Stel meer manieren in om te ontgrendelen"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Tik om een vingerafdruk toe te voegen"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Ontgrendelen met vingerafdruk"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"<xliff:g id="APPNAME">%1$s</xliff:g> voorbereiden."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Apps starten."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Opstarten afronden."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Scherm uitzetten?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Toen je je vingerafdruk instelde, heb je op de aan/uit-knop gedrukt.\n\nDaarmee wordt het scherm meestal uitgezet."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Uitzetten"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Annuleren"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Doorgaan met instellen?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Je hebt op de aan/uit-knop gedrukt. Zo zet je meestal het scherm uit.\n\nRaak de knop voorzichtig aan terwijl je je vingerafdruk instelt."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Scherm uitzetten"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Doorgaan met instellen"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Doorgaan met verificatie van je vingerafdruk?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Je hebt op de aan/uit-knop gedrukt. Zo zet je meestal het scherm uit.\n\nRaak de knop voorzichtig aan om je vingerafdruk te verifiëren."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Scherm uitzetten"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Doorgaan"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> wordt uitgevoerd"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Tik om terug te keren naar de game"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Game kiezen"</string> diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml index afe04419927e..52015c29027f 100644 --- a/core/res/res/values-or/strings.xml +++ b/core/res/res/values-or/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"ଆପଣଙ୍କ ହସ୍ତକ୍ଷେପ ବିନା କଲ୍ କରିପାରିବା ପାଇଁ ଆପ୍କୁ IMS ସେବା ବ୍ୟବହାର କରିବାକୁ ଦିଏ।"</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"ଫୋନ୍ ସ୍ଥିତି ଓ ପରିଚୟ ପଢ଼ନ୍ତୁ"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"ଆପ୍କୁ ଡିଭାଇସ୍ର ଫୋନ୍ ବୈଶିଷ୍ଟ୍ୟ ଆକ୍ସେସ୍ କରିବାକୁ ଅନୁମତି ଦେଇଥାଏ। ଏହି ଅନୁମତି ଆପ୍କୁ ଫୋନ୍ ନମ୍ବର୍ ଓ ଡିଭାଇସ୍ IDଗୁଡ଼ିକୁ ନିର୍ଦ୍ଧାରଣ କରିବାକୁ ଅନୁମତି ଦେଇଥାଏ, କଲ୍ ସକ୍ରିୟ ଥିଲେ ବି ଏବଂ କଲ୍ ଦ୍ୱାରା ସଂଯୋଗ ଥିବା ରିମୋଟ୍ ନମ୍ବର୍କୁ ମଧ୍ୟ।"</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"ବେସିକ ଟେଲିଫୋନି ସ୍ଥିତି ଏବଂ ପରିଚୟ ପଢ଼ନ୍ତୁ"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"ଡିଭାଇସର ବେସିକ ଟେଲିଫୋନି ଫିଚରଗୁଡ଼ିକୁ ଆକ୍ସେସ କରିବା ପାଇଁ ଏହା ଆପକୁ ଅନୁମତି ଦିଏ।"</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"ସିଷ୍ଟମ୍ ଜରିଆରେ କଲ୍ର ମାର୍ଗ ବଦଳାଇପାରେ"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"କଲ୍ କରିବାର ଅନୁଭୂତି ବଢ଼ାଇବାକୁ ସିଷ୍ଟମ୍ ଜରିଆରେ ଆପର କଲ୍ଗୁଡ଼ିକୁ ରୁଟ୍ କରିବାକୁ ଏହାକୁ ଅନୁମତି ଦେଇଥାଏ।"</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"ସିଷ୍ଟମ୍ ମାଧ୍ୟମରେ କଲ୍ଗୁଡ଼ିକୁ ଦେଖିଥାଏ ଏବଂ ନିୟନ୍ତ୍ରଣ କରିଥାଏ।"</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"ଆପଣଙ୍କ ଫେସ୍ ମଡେଲକୁ ଡିଲିଟ୍ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ, ତା\'ପରେ ପୁଣି ଆପଣଙ୍କ ଫେସ୍ ଯୋଗ କରନ୍ତୁ"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"ଫେସ୍ ଅନଲକ୍ ସେଟ୍ ଅପ୍ କରନ୍ତୁ"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"ଫୋନକୁ ଦେଖି ଏହାକୁ ଅନଲକ୍ କରନ୍ତୁ"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"ଫେସ ଅନଲକ ବ୍ୟବହାର କରିବା ପାଇଁ, ସେଟିଂସ ଏବଂ ଗୋପନୀୟତାରେ "<b>"କ୍ୟାମେରା ଆକ୍ସେସ"</b>"କୁ ଚାଲୁ କରନ୍ତୁ"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"ଅନଲକ୍ କରିବା ପାଇଁ ଆହୁରି ଅଧିକ ଉପାୟ ସେଟ୍ ଅପ୍ କରନ୍ତୁ"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"ଏକ ଟିପଚିହ୍ନ ଯୋଗ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"ଫିଙ୍ଗରପ୍ରିଣ୍ଟ ଅନଲକ୍"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"<xliff:g id="APPNAME">%1$s</xliff:g> ପ୍ରସ୍ତୁତ କରାଯାଉଛି।"</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"ଆପ୍ ଆରମ୍ଭ କରାଯାଉଛି।"</string> <string name="android_upgrading_complete" msgid="409800058018374746">"ବୁଟ୍ ସମାପ୍ତ କରୁଛି।"</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"ସ୍କ୍ରିନ୍ ବନ୍ଦ କରିବେ?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"ଆପଣଙ୍କ ଟିପଚିହ୍ନ ସେଟ୍ ଅପ୍ କରିବା ସମୟରେ, ଆପଣ ପାୱାର ବଟନ୍ ଦବାଇଛନ୍ତି।\n\nଏହା ସାଧାରଣତଃ ଆପଣଙ୍କ ସ୍କ୍ରିନକୁ ବନ୍ଦ କରେ।"</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"ବନ୍ଦ କରନ୍ତୁ"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"ବାତିଲ୍ କରନ୍ତୁ"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"ସେଟଅପ କରିବା ଜାରି ରଖିବେ?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"ଆପଣ ପାୱାର ବଟନ ଦବାଇଛନ୍ତି — ଏହା ସାଧାରଣତଃ ଆପଣଙ୍କ ସ୍କ୍ରିନକୁ ବନ୍ଦ କରିଥାଏ।\n\nଆପଣଙ୍କ ଟିପଚିହ୍ନ ସେଟ ଅପ କରିବା ସମୟରେ ଧୀରେ ଟାପ କରିବାକୁ ଚେଷ୍ଟା କରନ୍ତୁ।"</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"ସ୍କ୍ରିନ ବନ୍ଦ କରନ୍ତୁ"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"ସେଟଅପ କରିବା ଜାରି ରଖ"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"ଆପଣଙ୍କ ଟିପଚିହ୍ନ ଯାଞ୍ଚ କରିବା ଜାରି ରଖିବେ?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"ଆପଣ ପାୱାର ବଟନ ଦବାଇଛନ୍ତି — ଏହା ସାଧାରଣତଃ ଆପଣଙ୍କ ସ୍କ୍ରିନକୁ ବନ୍ଦ କରିଥାଏ।\n\nଆପଣଙ୍କ ଟିପଚିହ୍ନ ଯାଞ୍ଚ କରିବା ପାଇଁ ଧୀରେ ଟାପ କରିବାକୁ ଚେଷ୍ଟା କରନ୍ତୁ।"</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"ସ୍କ୍ରିନ ବନ୍ଦ କରନ୍ତୁ"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"ଜାରି ରଖନ୍ତୁ"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> ଚାଲୁଛି"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"ଗେମ୍କୁ ଫେରିଆସିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"ଗେମ୍ ଚୟନ କରନ୍ତୁ"</string> diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml index 1877ebecf597..6826a2d73cd7 100644 --- a/core/res/res/values-pa/strings.xml +++ b/core/res/res/values-pa/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"ਐਪ ਨੂੰ ਤੁਹਾਡੇ ਦਖ਼ਲ ਤੋਂ ਬਿਨਾਂ ਕਾਲਾਂ ਕਰਨ ਲਈ IMS ਸੇਵਾ ਵਰਤਣ ਦੀ ਆਗਿਆ ਦਿੰਦੀ ਹੈ।"</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"ਫ਼ੋਨ ਸਥਿਤੀ ਅਤੇ ਪਛਾਣ ਪੜ੍ਹੋ"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"ਐਪ ਨੂੰ ਡੀਵਾਈਸ ਦੀਆਂ ਫ਼ੋਨ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਤੱਕ ਪਹੁੰਚ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਹ ਇਜਾਜ਼ਤ ਐਪ ਨੂੰ ਫ਼ੋਨ ਨੰਬਰ ਅਤੇ ਡੀਵਾਈਸ ਆਈ.ਡੀ. ਨਿਰਧਾਰਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦੀ ਹੈ, ਇੱਕ ਕਾਲ ਕਿਰਿਆਸ਼ੀਲ ਹੈ ਜਾਂ ਨਹੀਂ ਅਤੇ ਰਿਮੋਟ ਨੰਬਰ ਇੱਕ ਕਾਲ ਨਾਲ ਕਨੈਕਟ ਹੈ ਜਾਂ ਨਹੀਂ।"</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"ਮੂਲ ਟੈਲੀਫ਼ੋਨੀ ਸਥਿਤੀ ਅਤੇ ਪਛਾਣ ਨੂੰ ਪੜ੍ਹੋ"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"ਐਪ ਨੂੰ ਡੀਵਾਈਸ \'ਤੇ ਮੂਲ ਟੈਲੀਫ਼ੋਨੀ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦਿੰਦੀ ਹੈ।"</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"ਸਿਸਟਮ ਰਾਹੀਂ ਕਾਲਾਂ ਰੂਟ ਕਰੋ"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"ਕਾਲ ਕਰਨ ਦੇ ਅਨੁਭਵ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਲਈ ਐਪ ਨੂੰ ਇਸਦੀਆਂ ਕਾਲਾਂ ਨੂੰ ਸਿਸਟਮ ਰਾਹੀਂ ਰੂਟ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿੰਦੀ ਹੈ।"</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"ਸਿਸਟਮ ਰਾਹੀਂ ਕਾਲਾਂ ਦੇਖੋ ਅਤੇ ਕੰਟਰੋਲ ਕਰੋ।"</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"ਆਪਣੇ ਚਿਹਰੇ ਦਾ ਮਾਡਲ ਮਿਟਾਉਣ ਲਈ ਟੈਪ ਕਰੋ, ਫਿਰ ਆਪਣਾ ਚਿਹਰਾ ਦੁਬਾਰਾ ਸ਼ਾਮਲ ਕਰੋ"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"ਫ਼ੇਸ ਅਣਲਾਕ ਦਾ ਸੈੱਟਅੱਪ ਕਰੋ"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"ਆਪਣੇ ਫ਼ੋਨ ਵੱਲ ਦੇਖ ਕੇ ਇਸਨੂੰ ਅਣਲਾਕ ਕਰੋ"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"ਫ਼ੇਸ ਅਣਲਾਕ ਨੂੰ ਵਰਤਣ ਲਈ, ਸੈਟਿੰਗਾਂ > ਪਰਦੇਦਾਰੀ ਵਿੱਚ ਜਾ ਕੇ "<b>"ਕੈਮਰਾ ਪਹੁੰਚ"</b>" ਨੂੰ ਚਾਲੂ ਕਰੋ"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"ਅਣਲਾਕ ਕਰਨ ਦੇ ਹੋਰ ਤਰੀਕਿਆਂ ਦਾ ਸੈੱਟਅੱਪ ਕਰੋ"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਸ਼ਾਮਲ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਅਣਲਾਕ"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"<xliff:g id="APPNAME">%1$s</xliff:g> ਤਿਆਰ ਕਰ ਰਿਹਾ ਹੈ।"</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"ਐਪਸ ਚਾਲੂ ਕਰ ਰਿਹਾ ਹੈ।"</string> <string name="android_upgrading_complete" msgid="409800058018374746">"ਬੂਟ ਪੂਰਾ ਕਰ ਰਿਹਾ ਹੈ।"</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"ਕੀ ਸਕ੍ਰੀਨ ਬੰਦ ਕਰਨੀ ਹੈ?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"ਆਪਣੇ ਫਿੰਗਰਪ੍ਰਿੰਟ ਦਾ ਸੈੱਟਅੱਪ ਕਰਨ ਵੇਲੇ, ਤੁਸੀਂ ਪਾਵਰ ਬਟਨ ਨੂੰ ਦਬਾਇਆ ਹੈ।\n\nਇਹ ਆਮ ਤੌਰ \'ਤੇ ਤੁਹਾਡੀ ਸਕ੍ਰੀਨ ਨੂੰ ਬੰਦ ਕਰ ਦਿੰਦਾ ਹੈ।"</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"ਬੰਦ ਕਰੋ"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"ਰੱਦ ਕਰੋ"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"ਕੀ ਸੈੱਟਅੱਪ ਜਾਰੀ ਰੱਖਣਾ ਹੈ?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"ਤੁਸੀਂ ਪਾਵਰ ਬਟਨ ਨੂੰ ਦਬਾਇਆ ਹੈ — ਇਹ ਆਮ ਤੌਰ \'ਤੇ ਸਕ੍ਰੀਨ ਨੂੰ ਬੰਦ ਕਰ ਦਿੰਦਾ ਹੈ।\n\nਆਪਣੇ ਫਿੰਗਰਪ੍ਰਿੰਟ ਦਾ ਸੈੱਟਅੱਪ ਕਰਦੇ ਸਮੇਂ ਹਲਕਾ ਜਿਹਾ ਟੈਪ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"ਸਕ੍ਰੀਨ ਬੰਦ ਕਰੋ"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"ਸੈੱਟਅੱਪ ਜਾਰੀ ਰੱਖੋ"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"ਕੀ ਆਪਣੇ ਫਿੰਗਰਪ੍ਰਿੰਟ ਦੀ ਪੁਸ਼ਟੀ ਕਰਨਾ ਜਾਰੀ ਰੱਖਣਾ ਹੈ?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"ਤੁਸੀਂ ਪਾਵਰ ਬਟਨ ਨੂੰ ਦਬਾਇਆ ਹੈ — ਇਹ ਆਮ ਤੌਰ \'ਤੇ ਸਕ੍ਰੀਨ ਨੂੰ ਬੰਦ ਕਰ ਦਿੰਦਾ ਹੈ।\n\nਆਪਣੇ ਫਿੰਗਰਪ੍ਰਿੰਟ ਦੀ ਪੁਸ਼ਟੀ ਕਰਨ ਲਈ ਹਲਕਾ ਜਿਹਾ ਟੈਪ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"ਸਕ੍ਰੀਨ ਬੰਦ ਕਰੋ"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"ਜਾਰੀ ਰੱਖੋ"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> ਚੱਲ ਰਿਹਾ ਹੈ"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"ਗੇਮ \'ਤੇ ਵਾਪਸ ਜਾਣ ਲਈ ਟੈਪ ਕਰੋ"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"ਗੇਮ ਚੁਣੋ"</string> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index 6f2198ecd74c..e16d2afcb190 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -477,6 +477,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Zezwala aplikacji na korzystanie z usługi komunikatora, by nawiązywać połączenia bez Twojego udziału."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"odczytywanie stanu i informacji o telefonie"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Pozwala aplikacji na dostęp do funkcji telefonicznych urządzenia. Aplikacja z tym uprawnieniem może odczytać numer telefonu i identyfikator urządzenia, sprawdzić, czy połączenie jest aktywne, oraz poznać numer, z którym jest nawiązane połączenie."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"odczyt podstawowych informacji na temat stanu usług telefonicznych i tożsamości"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Zezwól na dostęp aplikacji do podstawowych funkcji telefonicznych na urządzeniu."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"przekazywanie połączeń przez system"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Zezwala aplikacji na przekazywanie połączeń przez system, by poprawić ich jakość."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"przeglądanie i kontrolowanie połączeń w systemie."</string> @@ -628,6 +630,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Kliknij, aby usunąć model twarzy, a następnie ponownie dodaj skan twarzy"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Skonfiguruj rozpoznawanie twarzy"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Popatrz na ekran telefonu, aby go odblokować"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Aby używać rozpoznawania twarzy, włącz "<b>"dostęp do aparatu"</b>" w Ustawieniach i prywatności"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Skonfiguruj więcej sposobów odblokowywania"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Kliknij, aby dodać odcisk palca"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Odblokowywanie odciskiem palca"</string> @@ -1316,10 +1319,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"Przygotowuję aplikację <xliff:g id="APPNAME">%1$s</xliff:g>."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Uruchamianie aplikacji."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Kończenie uruchamiania."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Wyłączyć ekran?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Podczas konfigurowania odcisku palca naciśnięto przycisk zasilania.\n\nZwykle powoduje to wyłączenie ekranu."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Wyłącz"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Anuluj"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Kontynuować konfigurowanie?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Naciśnięto przycisk zasilania — zwykle powoduje to wyłączenie ekranu.\n\nKlikaj delikatnie podczas konfigurowania odcisku palca."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Wyłącz ekran"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Konfiguruj dalej"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Kontynuować weryfikację odcisku palca?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Naciśnięto przycisk zasilania — zwykle powoduje to wyłączenie ekranu.\n\nKliknij delikatnie, aby zweryfikować odcisk palca."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Wyłącz ekran"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Dalej"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"Działa <xliff:g id="APP">%1$s</xliff:g>"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Kliknij, by wrócić do gry"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Wybierz grę"</string> diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index 8e7cc3dd6a9a..52d7992d456c 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Permite que o app use o serviço de mensagens instantâneas para fazer chamadas sem sua intervenção."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"ler status e identidade do telefone"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Permite que o app acesse os recursos de telefonia do dispositivo. Esta permissão autoriza o app a determinar o número de telefone e IDs de dispositivo, quando uma chamada está ativa, e o número remoto conectado a uma chamada."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"ler status e identidade básicos de telefonia"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Permite que o app acesse os recursos básicos de telefonia do dispositivo."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"encaminhar chamadas pelo sistema"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Permite que o app encaminhe suas chamadas por meio do sistema para melhorar a experiência com chamadas."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"ver e controlar chamadas pelo sistema."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Toque para excluir seu modelo de rosto e crie um novo"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Configurar o Desbloqueio facial"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Desbloqueie o smartphone olhando para ele"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Para usar o Desbloqueio facial, ative o "<b>"acesso à câmera"</b>" em Configurações > Privacidade"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Configure mais formas de desbloquear a tela"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Toque para adicionar uma impressão digital"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Desbloqueio por impressão digital"</string> @@ -1208,7 +1211,7 @@ <string name="whichOpenLinksWith" msgid="1120936181362907258">"Abrir links com"</string> <string name="whichOpenLinksWithApp" msgid="6917864367861910086">"Abrir links com <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> <string name="whichOpenHostLinksWithApp" msgid="2401668560768463004">"Abrir links do domínio <xliff:g id="HOST">%1$s</xliff:g> usando <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> - <string name="whichGiveAccessToApplicationLabel" msgid="7805857277166106236">"Conceder acesso"</string> + <string name="whichGiveAccessToApplicationLabel" msgid="7805857277166106236">"Permitir acesso"</string> <string name="whichEditApplication" msgid="6191568491456092812">"Editar com"</string> <string name="whichEditApplicationNamed" msgid="8096494987978521514">"Editar com %1$s"</string> <string name="whichEditApplicationLabel" msgid="1463288652070140285">"Editar"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"Preparando <xliff:g id="APPNAME">%1$s</xliff:g>."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Iniciando apps."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Concluindo a inicialização."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Desligar a tela?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Durante a configuração da sua impressão digital, você pressionou o botão liga/desliga.\n\nNormalmente, essa ação desliga a tela."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Desligar"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Cancelar"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Continuar a configuração?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Você pressionou o botão liga/desliga. Normalmente, essa ação desliga a tela.\n\nToque levemente na tela durante a configuração da impressão digital."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Desligar a tela"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Continuar configuração"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Continuar a verificação da digital?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Você pressionou o botão liga/desliga. Normalmente, essa ação desliga a tela.\n\nToque levemente na tela para verificar sua impressão digital."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Desligar a tela"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Continuar"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> em execução"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Toque para voltar ao jogo"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Escolha o jogo"</string> @@ -2110,12 +2117,12 @@ <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Esta notificação foi rebaixada a Silenciosa. Toque para enviar seu feedback."</string> <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Esta notificação foi classificada com maior prioridade. Toque para enviar seu feedback."</string> <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Esta notificação foi classificada com menor prioridade. Toque para enviar seu feedback."</string> - <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Notificações aprimoradas"</string> - <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"As ações e respostas sugeridas agora são fornecidas pelas notificações aprimoradas. As Notificações adaptáveis do Android não estão mais disponíveis."</string> + <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Notificações avançadas"</string> + <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"As ações e respostas sugeridas agora são fornecidas pelas notificações avançadas. As Notificações adaptáveis do Android não estão mais disponíveis."</string> <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string> <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Desativar"</string> <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Saiba mais"</string> - <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"No Android 12, as notificações aprimoradas substituíram as notificações adaptáveis. Esse recurso exibe ações e respostas sugeridas, além de organizar suas notificações.\n\nAs notificações aprimoradas podem acessar o conteúdo das notificações, incluindo informações pessoais como nomes de contatos e mensagens. Elas também podem dispensar ou responder às notificações, como atender chamadas telefônicas e controlar o Não perturbe."</string> + <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"No Android 12, as notificações avançadas substituíram as notificações adaptáveis. Esse recurso exibe ações e respostas sugeridas, além de organizar suas notificações.\n\nAs notificações avançadas podem acessar o conteúdo das notificações, incluindo informações pessoais como nomes de contatos e mensagens. Elas também podem dispensar ou responder às notificações, como atender chamadas telefônicas e controlar o Não perturbe."</string> <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notificação de informação do modo rotina"</string> <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"A bateria pode acabar antes da recarga normal"</string> <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"A Economia de bateria foi ativada para aumentar a duração da carga"</string> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index bf8ff8e81a8c..2ea9f39046d1 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Permite que a app utilize o serviço IMS para fazer chamadas sem a sua intervenção."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"ler o estado e a identidade do telemóvel"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Permite que a app aceda às funcionalidades de telefone do dispositivo. Esta autorização permite que a app determine o número de telefone e IDs do dispositivo, se alguma chamada está ativa e qual o número remoto ligado por uma chamada."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"ler o estado e a identidade de telefonia básicos"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Permite à app aceder às funcionalidades básicas de telefonia do dispositivo."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"encaminhar chamadas através do sistema"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Permite que a app encaminhe as respetivas chamadas através do sistema de modo a melhorar a experiência da chamada."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"ver e controlar chamadas através do sistema."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Toque para eliminar o seu modelo de rosto e, em seguida, adicione o seu rosto novamente"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Configure o Desbloqueio facial"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Desbloqueie o telemóvel ao olhar para ele"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Para utilizar o Desbloqueio facial, ative o "<b>"Acesso à câmara"</b>" em Definições > Privacidade"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Configure mais formas de desbloquear"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Toque para adicionar uma impressão digital"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Desbloqueio por impressão digital"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"A preparar o <xliff:g id="APPNAME">%1$s</xliff:g>."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"A iniciar aplicações"</string> <string name="android_upgrading_complete" msgid="409800058018374746">"A concluir o arranque."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Pretende desligar o ecrã?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Quando configurou a sua impressão digital, premiu o botão ligar/desligar.\n\nGeralmente, esta ação desativa o seu ecrã."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Desligar"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Cancelar"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Continuar a configuração?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Premiu o botão ligar/desligar. Geralmente, esta ação desliga o ecrã.\n\nExperimente tocar levemente ao configurar a sua impressão digital."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Desligar ecrã"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Continuar configur."</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Continuar a validar a impressão digital?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Premiu o botão ligar/desligar. Geralmente, esta ação desliga o ecrã.\n\nExperimente tocar levemente para validar a sua impressão digital."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Desligar ecrã"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Continuar"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> em execução"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Toque para regressar ao jogo."</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Selecionar jogo"</string> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index 8e7cc3dd6a9a..52d7992d456c 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Permite que o app use o serviço de mensagens instantâneas para fazer chamadas sem sua intervenção."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"ler status e identidade do telefone"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Permite que o app acesse os recursos de telefonia do dispositivo. Esta permissão autoriza o app a determinar o número de telefone e IDs de dispositivo, quando uma chamada está ativa, e o número remoto conectado a uma chamada."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"ler status e identidade básicos de telefonia"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Permite que o app acesse os recursos básicos de telefonia do dispositivo."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"encaminhar chamadas pelo sistema"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Permite que o app encaminhe suas chamadas por meio do sistema para melhorar a experiência com chamadas."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"ver e controlar chamadas pelo sistema."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Toque para excluir seu modelo de rosto e crie um novo"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Configurar o Desbloqueio facial"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Desbloqueie o smartphone olhando para ele"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Para usar o Desbloqueio facial, ative o "<b>"acesso à câmera"</b>" em Configurações > Privacidade"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Configure mais formas de desbloquear a tela"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Toque para adicionar uma impressão digital"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Desbloqueio por impressão digital"</string> @@ -1208,7 +1211,7 @@ <string name="whichOpenLinksWith" msgid="1120936181362907258">"Abrir links com"</string> <string name="whichOpenLinksWithApp" msgid="6917864367861910086">"Abrir links com <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> <string name="whichOpenHostLinksWithApp" msgid="2401668560768463004">"Abrir links do domínio <xliff:g id="HOST">%1$s</xliff:g> usando <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> - <string name="whichGiveAccessToApplicationLabel" msgid="7805857277166106236">"Conceder acesso"</string> + <string name="whichGiveAccessToApplicationLabel" msgid="7805857277166106236">"Permitir acesso"</string> <string name="whichEditApplication" msgid="6191568491456092812">"Editar com"</string> <string name="whichEditApplicationNamed" msgid="8096494987978521514">"Editar com %1$s"</string> <string name="whichEditApplicationLabel" msgid="1463288652070140285">"Editar"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"Preparando <xliff:g id="APPNAME">%1$s</xliff:g>."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Iniciando apps."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Concluindo a inicialização."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Desligar a tela?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Durante a configuração da sua impressão digital, você pressionou o botão liga/desliga.\n\nNormalmente, essa ação desliga a tela."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Desligar"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Cancelar"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Continuar a configuração?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Você pressionou o botão liga/desliga. Normalmente, essa ação desliga a tela.\n\nToque levemente na tela durante a configuração da impressão digital."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Desligar a tela"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Continuar configuração"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Continuar a verificação da digital?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Você pressionou o botão liga/desliga. Normalmente, essa ação desliga a tela.\n\nToque levemente na tela para verificar sua impressão digital."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Desligar a tela"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Continuar"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> em execução"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Toque para voltar ao jogo"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Escolha o jogo"</string> @@ -2110,12 +2117,12 @@ <string name="notification_feedback_indicator_silenced" msgid="3799442124723177262">"Esta notificação foi rebaixada a Silenciosa. Toque para enviar seu feedback."</string> <string name="notification_feedback_indicator_promoted" msgid="9030204303764698640">"Esta notificação foi classificada com maior prioridade. Toque para enviar seu feedback."</string> <string name="notification_feedback_indicator_demoted" msgid="8880309924296450875">"Esta notificação foi classificada com menor prioridade. Toque para enviar seu feedback."</string> - <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Notificações aprimoradas"</string> - <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"As ações e respostas sugeridas agora são fornecidas pelas notificações aprimoradas. As Notificações adaptáveis do Android não estão mais disponíveis."</string> + <string name="nas_upgrade_notification_title" msgid="8436359459300146555">"Notificações avançadas"</string> + <string name="nas_upgrade_notification_content" msgid="5157550369837103337">"As ações e respostas sugeridas agora são fornecidas pelas notificações avançadas. As Notificações adaptáveis do Android não estão mais disponíveis."</string> <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string> <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Desativar"</string> <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Saiba mais"</string> - <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"No Android 12, as notificações aprimoradas substituíram as notificações adaptáveis. Esse recurso exibe ações e respostas sugeridas, além de organizar suas notificações.\n\nAs notificações aprimoradas podem acessar o conteúdo das notificações, incluindo informações pessoais como nomes de contatos e mensagens. Elas também podem dispensar ou responder às notificações, como atender chamadas telefônicas e controlar o Não perturbe."</string> + <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"No Android 12, as notificações avançadas substituíram as notificações adaptáveis. Esse recurso exibe ações e respostas sugeridas, além de organizar suas notificações.\n\nAs notificações avançadas podem acessar o conteúdo das notificações, incluindo informações pessoais como nomes de contatos e mensagens. Elas também podem dispensar ou responder às notificações, como atender chamadas telefônicas e controlar o Não perturbe."</string> <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notificação de informação do modo rotina"</string> <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"A bateria pode acabar antes da recarga normal"</string> <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"A Economia de bateria foi ativada para aumentar a duração da carga"</string> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 8f05f9f7c68d..ac5eca7f80b1 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -474,6 +474,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Permite aplicației să folosească serviciul IMS pentru apeluri, fără intervenția dvs."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"citește starea și identitatea telefonului"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Permite aplicației să acceseze funcțiile de telefon ale dispozitivului. Cu această permisiune aplicația stabilește numărul de telefon și ID-urile de dispozitiv, dacă un apel este activ, precum și numărul de la distanță conectat printr-un apel."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"să citească informații de bază, precum activitatea și starea telefonului"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Permite ca aplicația să acceseze funcțiile de telefonie de bază ale dispozitivului."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"să direcționeze apelurile prin intermediul sistemului"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Permiteți aplicației să direcționeze apelurile prin intermediul sistemului pentru a îmbunătăți calitatea apelurilor."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"Vedeți și controlați apelurile prin intermediul sistemului."</string> @@ -625,6 +627,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Atingeți pentru a șterge modelul facial, apoi adăugați din nou fața"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Configurați Deblocarea facială"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Deblocați-vă telefonul uitându-vă la acesta"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Pentru a folosi Deblocarea facială, activați "<b>"Accesul la cameră"</b>" în Setări și confidențialitate"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Configurați mai multe moduri de deblocare"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Atingeți ca să adăugați o amprentă"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Deblocare cu amprenta"</string> @@ -1296,10 +1299,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"Se pregătește <xliff:g id="APPNAME">%1$s</xliff:g>."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Se pornesc aplicațiile."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Se finalizează pornirea."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Dezactivați ecranul?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Ați apăsat butonul de pornire în timpul configurării amprentei.\n\nDe obicei, această acțiune dezactivează ecranul."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Dezactivați"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Anulați"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Continuați configurarea?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Ați apăsat butonul de pornire. De obicei, această acțiune dezactivează ecranul.\n\nAtingeți ușor când vă configurați amprenta."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Dezactivați ecranul"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Continuați configurarea"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Continuați cu verificarea amprentei?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Ați apăsat butonul de pornire. De obicei, această acțiune dezactivează ecranul.\n\nAtingeți ușor pentru verificarea amprentei."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Dezactivați ecranul"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Continuați"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"Rulează <xliff:g id="APP">%1$s</xliff:g>"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Atingeți pentru a reveni la joc"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Alegeți jocul"</string> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index 927ec93b7683..618283273b61 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -477,6 +477,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Позволяет приложению совершать звонки с помощью службы IMS без вашего вмешательства."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"Получение данных о статусе телефона"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Приложение получит доступ к функциям телефона на устройстве. Кроме того, оно сможет определять номера телефонов и серийные номера моделей, состояние активности вызова, а также удаленные номера, с которыми установлено соединение."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"Считывание статуса и идентификационной информации телефонии"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Приложение получит доступ к основным функциям телефонии на устройстве."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"перенаправлять звонки в системе"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Приложение сможет перенаправлять звонки в системе с целью улучшения качества связи."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"Управление вызовами через систему"</string> @@ -628,6 +630,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Нажмите, чтобы удалить модель лица, а затем добавьте ее снова."</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Настройка фейсконтроля"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Вы сможете разблокировать телефон, просто посмотрев на него."</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Чтобы использовать фейсконтроль, разрешите "<b>"доступ к камере"</b>". Для этого перейдите в настройки и нажмите \"Конфиденциальность\"."</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Настройте другие способы разблокировки"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Нажмите, чтобы добавить отпечаток пальца."</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Разблокировка по отпечатку пальца"</string> @@ -1316,10 +1319,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"Подготовка приложения \"<xliff:g id="APPNAME">%1$s</xliff:g>\"..."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Запуск приложений."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Окончание загрузки..."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Отключить экран?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Во время настройки отпечатка пальца вы нажали кнопку питания.\n\nОбычно это действие приводит к отключению экрана."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Отключить"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Отмена"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Продолжить настройку?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Вы нажали кнопку питания. Обычно это приводит к отключению экрана.\n\nПри добавлении отпечатка пальца слегка прикоснитесь к кнопке."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Отключить экран"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Продолжить настройку"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Продолжить сканирование отпечатка?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Вы нажали кнопку питания. Обычно это приводит к отключению экрана.\n\nЧтобы отсканировать отпечаток пальца, слегка прикоснитесь к кнопке."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Отключить экран"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Продолжить"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"Приложение <xliff:g id="APP">%1$s</xliff:g> запущено"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Нажмите, чтобы вернуться в игру."</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Выберите игру"</string> diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml index c63708fbc459..c5e76c8afb7f 100644 --- a/core/res/res/values-si/strings.xml +++ b/core/res/res/values-si/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"ඔබේ මැදිහත්වීමකින් තොරව ඇමතුම් සිදු කිරීමට IMS සේවාව භාවිතයට යෙදුමට ඉඩ දෙන්න."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"දුරකථනයේ තත්වය සහ අනන්යතාවය කියවීම"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"උපාංගයේ දුරකථන විශේෂාංග වෙත ප්රවේශයට යෙදුමට ඉඩ දෙයි. ඇමතුම සක්රිය වුවත්, සහ ඇමතුමකින් දුරස්ථ අංකය සම්බන්ධ වුවත් දුරකථන අංකය සහ උපාංග ID හඳුනා ගැනීමට මෙම අවසරය යෙදුමට ඉඩ දෙයි."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"මූලික දුරකථන තත්ත්වය සහ අනන්යතාව කියවන්න"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"උපාංගයේ මූලික දුරකථන විශේෂාංග වෙත ප්රවේශ වීමට යෙදුමට ඉඩ දෙයි."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"පද්ධතිය හරහා ඇමතුම් මාර්ගගත කරන්න"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"ඇමතුම් අත්දැකීම වැඩිදියුණු කිරීම සඳහා යෙදුමට පද්ධතිය හරහා එහි ඇමතුම් මාර්ගගත කිරීමට ඉඩ දෙයි."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"පද්ධතිය හරහා ඇමතුම් බලන්න සහ පාලනය කරන්න."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"ඔබගේ මුහුණත ආකෘතිය මැකීමට තට්ටු කරන්න, අනතුරුව ඔබගේ මුහුණ නැවත එක් කරන්න"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"මුහුණෙන් අගුළු හැරීම පිහිටුවන්න"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"ඔබගේ දුරකථනය දෙස බැලීමෙන් එහි අගුලු හරින්න"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"මුහුණෙන් අගුලු හැරීම භාවිත කිරීමට, සැකසීම් > පෞද්ගලිකත්වය තුළ "<b>"කැමරා ප්රවේශය"</b>" ක්රියාත්මක කරන්න"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"අගුලු හැරීමට තවත් ක්රම සකසන්න"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"ඇඟිලි සලකුණක් එක් කිරීමට තට්ටු කරන්න"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"ඇඟිලි සලකුණු අගුළු හැරීම"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"<xliff:g id="APPNAME">%1$s</xliff:g> සූදානම් කරමින්."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"යෙදුම් ආරම්භ කරමින්."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"ඇරඹුම අවසාන කරමින්."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"තිරය ක්රියාවිරහිත කරන්නද?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"ඔබගේ ඇඟිලි සලකුණ පිහිටුවන අතරතුර ඔබ බල බොත්තම එබුවේය.\n\nමෙය සාමාන්යයෙන් ඔබගේ තිරය ක්රියාවිරහිත කරයි."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"ක්රියාවිරහිත කරන්න"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"අවලංගු කරන්න"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"පිහිටුවීම දිගටම කරන්නද?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"ඔබ බල බොත්තම එබුවේය — සාමාන්යයෙන් මෙය තිරය ක්රියාවිරහිත කරයි.\n\nඔබගේ ඇඟිලි සලකුණ පිහිටුවන අතරතුර සැහැල්ලුවෙන් තට්ටු කිරීමට උත්සාහ කරන්න."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"තිරය අක්රිය කරන්න"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"පිහිටුවීම දිගටම කර."</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"ඔබගේ ඇඟිලි සලකුණ සත්යාපනය දිගටම කරන්නද?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"ඔබ බල බොත්තම එබුවේය — සාමාන්යයෙන් මෙය තිරය ක්රියාවිරහිත කරයි.\n\nඔබගේ ඇඟිලි සලකුණ සත්යාපනය කිරීමට සැහැල්ලුවෙන් තට්ටු කිරීමට උත්සාහ කරන්න."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"තිරය අක්රිය කරන්න"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"ඉදිරියට යන්න"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> ධාවනය වෙමින්"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"ක්රීඩාව වෙත ආපසු යාමට තට්ටු කරන්න"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"ක්රීඩාව තෝරන්න"</string> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index 66451763c07f..dfd34e7ce7b2 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -477,6 +477,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Umožňuje aplikácii používať službu okamžitých správ (IMS) na volanie bez intervencie používateľa."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"čítať stav a identitu telefónu"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Umožňuje aplikácii pristupovať k telefónnym funkciám zariadenia. Aplikácia s týmto povolením môže určiť telefónne číslo a ID zariadenia, či práve prebieha hovor, a vzdialené číslo, s ktorým je prostredníctvom hovoru nadviazané spojenie."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"čítanie základného stavu a identity súvisiacich s telefonovaním"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Umožňuje aplikácii prístup k základným telefonickým funkciám zariadenia."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"presmerovanie hovorov cez systém"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Umožňuje aplikácii presmerovať hovory cez systém na účely zlepšenia kvality hovorov."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"zobrazenie a kontrola hovorov prostredníctvom systému."</string> @@ -628,6 +630,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Klepnutím odstráňte model tváre a potom znova pridajte svoju tvár"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Nastavte odomknutie tvárou"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Odomykajte telefón tak, že sa naň pozriete"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Ak chcete používať odomknutie tvárou, v sekcii Nastavenia > Ochrana súkromia zapnite "<b>"prístup ku kamere"</b></string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Nastavte viac spôsobov odomknutia"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Klepnutím pridajte odtlačok prsta"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Odomknutie odtlačkom prsta"</string> @@ -1316,10 +1319,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"Pripravuje sa aplikácia <xliff:g id="APPNAME">%1$s</xliff:g>."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Prebieha spúšťanie aplikácií."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Prebieha dokončovanie spúšťania."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Chcete vypnúť obrazovku?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Pri nastavovaní odtlačku prsta ste stlačili vypínač.\n\nObrazovka sa tým zvyčajne vypne."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Vypnúť"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Zrušiť"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Chcete pokračovať v nastavovaní?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Stlačili ste vypínač. Obvykle tým vypnete obrazovku.\n\nPri nastavovaní odtlačku prsta skúste klepnúť jemne."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Vypnúť obrazovku"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Pokračovať v nastav."</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Pokračovať v overovaní odtlačku prsta?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Stlačili ste vypínač. Obvykle tým vypnete obrazovku.\n\nAk chcete overiť odtlačok prsta, skúste klepnúť jemne."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Vypnúť obrazovku"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Pokračovať"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"Spustená aplikácia: <xliff:g id="APP">%1$s</xliff:g>"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Klepnutím prejdete späť do hry"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Vyberte hru"</string> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index 935b1e88752d..931fc5b3bcfb 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -477,6 +477,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Aplikaciji dovoljuje uporabo storitev IMS za opravljanje klicev brez vašega posredovanja."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"branje stanja in identitete telefona"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Aplikaciji omogoča dostop do funkcij telefona v napravi. S tem dovoljenjem lahko aplikacija določi telefonsko številko in ID-je naprave, določi lahko tudi, ali je klic aktiven, in oddaljeno številko, s katero je klic povezan."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"branje stanja osnovne telefonije in identitete"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Aplikaciji omogoča dostop do osnovnih funkcij telefonije v napravi."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"Usmeri klice prek sistema"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Dovoli, da aplikacija usmeri klice prek sistema, da se tako izboljša izkušnja klicanja."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"ogled in nadzor klicev prek sistema."</string> @@ -628,6 +630,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Dotaknite se, da izbrišete model obraza, in nato znova dodajte obraz."</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Nastavitev odklepanja z obrazom"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Odklenite telefon tako, da ga pogledate."</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Če želite uporabljati odklepanje z obrazom, v meniju »Nastavitve« > »Zasebnost« vklopite možnost "<b>"Dostop do fotoaparata"</b>"."</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Nastavite več načinov odklepanja"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Dotaknite se, da dodate prstni odtis."</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Odklepanje s prstnim odtisom"</string> @@ -1316,10 +1319,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"Pripravljanje aplikacije <xliff:g id="APPNAME">%1$s</xliff:g>."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Zagon aplikacij."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Dokončevanje zagona."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Želite izklopiti zaslon?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Pri nastavljanju prstnega odtisa ste pritisnili gumb za vklop.\n\nS tem običajno izklopite zaslon."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Izklopi"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Prekliči"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Ali želite nadaljevati nastavitev?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Pritisnili ste gumb za vklop, s čimer običajno izklopite zaslon.\n\nPoskusite se narahlo dotakniti med nastavljanjem prstnega odtisa."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Izklopi zaslon"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Nadaljuj nastavitev"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Želite nadaljevati preverjanje prstnega odtisa?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Pritisnili ste gumb za vklop, s čimer običajno izklopite zaslon.\n\nZa preverjanje prstnega odtisa se poskusite narahlo dotakniti."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Izklopi zaslon"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Nadaljuj"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> se izvaja"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Dotaknite se za vrnitev v igro"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Izberite igro"</string> diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml index 7bd3a53cdd68..937332b12027 100644 --- a/core/res/res/values-sq/strings.xml +++ b/core/res/res/values-sq/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Lejon aplikacionin të përdorë shërbimin IMS për të kryer telefonata pa ndërhyrjen tënde."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"lexo statusin e telefonit dhe identitetin"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Lejon aplikacionin të hyjë në funksionet telefonike të pajisjes. Kjo leje i mundëson aplikacionit të përcaktojë numrin e telefonit dhe ID-të e pajisjes, nëse një telefonatë është aktive apo nëse numri në distancë është i lidhur me një telefonatë."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"lexo statusin dhe identitetin telefonik bazë"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Lejo që aplikacioni të ketë qasje në veçoritë telefonike bazë në pajisje."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"kalon telefonatat përmes sistemit"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Lejon që aplikacioni të kalojë telefonatat përmes sistemit për të përmirësuar përvojën e telefonatës."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"Shiko dhe kontrollo telefonatat nëpërmjet sistemit."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Trokit për të fshirë modelin tënd të fytyrës, pastaj shtoje përsëri fytyrën tënde"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Konfiguro \"Shkyçjen me fytyrë\""</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Shkyçe telefonin duke parë tek ai"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Për të përdorur \"Shkyçjen me fytyrë\", aktivizo "<b>"Qasjen te kamera"</b>" te \"Cilësimet\" > \"Privatësia\""</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Konfiguri më shumë mënyra për të shkyçur"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Trokit për të shtuar një gjurmë gishti"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Shkyçja me gjurmën e gishtit"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"Po përgatit <xliff:g id="APPNAME">%1$s</xliff:g>."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Aplikacionet e fillimit."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Po përfundon nisjen."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Të fiket ekrani?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Gjatë konfigurimit të gjurmës së gishtit tënd, ke shtypur butonin e \"Energjisë\".\n\nKjo zakonisht fik ekranin tënd."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Fik"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Anulo"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Të vazhdohet konfigurimi?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Shtype butonin e energjisë — zakonisht, kjo e fik ekranin.\n\nProvo të trokasësh lehtë ndërkohë që konfiguron gjurmën e gishtit."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Fik ekranin"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Vazhdo konfigurimin"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Të vazhdohet verifikimi i gjurmës?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Shtype butonin e energjisë — zakonisht, kjo e fik ekranin.\n\nProvo të trokasësh lehtë për të verifikuar gjurmën e gishtit."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Fik ekranin"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Vazhdo"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> është në punë"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Trokit për t\'u kthyer te loja"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Zgjidh një lojë"</string> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index 97b233c0af75..72fd908fc7ae 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -474,6 +474,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Дозвољава апликацији да користи услугу размене тренутних порука да би упућивала позиве без ваше интервенције."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"читање статуса и идентитета телефона"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Дозвољава апликацији да приступа функцијама телефона на уређају. Ова дозвола омогућава апликацији да утврди број телефона и ИД-ове уређаја, затим да ли је позив активан, као и број даљинског уређаја са којим је успостављен позив."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"очитавање основног телефонског статуса и идентитета"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Омогућава апликацији да приступа основним телефонским функцијама уређаја."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"преусмеравање позива преко система"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Дозвољава апликацији да преусмерава позиве преко система да би побољшала доживљај позивања."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"преглед и контрола позива преко система."</string> @@ -625,6 +627,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Додирните да бисте избрисали модел лица, па поново додајте своје лице"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Подесите откључавање лицем"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Откључајте телефон тако што ћете га погледати"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Да бисте користили откључавање лицем, укључите "<b>"приступ камери"</b>" у одељку Подешавања > Приватност"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Подесите још начина за откључавање"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Додирните да бисте додали отисак прста"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Откључавање отиском прста"</string> @@ -1296,10 +1299,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"Припрема се <xliff:g id="APPNAME">%1$s</xliff:g>."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Покретање апликација."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Завршавање покретања."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Желите да искључите екран?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Притисли сте дугме за укључивање током подешавања отиска прста.\n\nТако се најчешће искључује екран."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Искључи"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Откажи"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Желите ли да наставите са подешавањем?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Притиснули сте дугме за укључивање – тиме обично искључујете екран.\n\nПробајте лагано да додирнете док подешавате отисак прста."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Искључи екран"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Настави подешавање"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Настављате верификацију отиска прста?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Притиснули сте дугме за укључивање – тиме обично искључујете екран.\n\nПробајте лагано да додирнете да бисте верификовали отисак прста."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Искључи екран"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Настави"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"Апликација <xliff:g id="APP">%1$s</xliff:g> је покренута"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Додирните да бисте се вратили у игру"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Одаберите игру"</string> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index 740cfb977c5d..e078da0510da 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Tillåter att appen använder tjänsten för snabbmeddelanden för att ringa samtal utan åtgärd från dig."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"läsa telefonens status och identitet"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Tillåter att appen kommer åt enhetens telefonfunktioner. Med den här behörigheten tillåts appen att identifiera mobilens telefonnummer och enhets-ID, om ett samtal pågår och vilket nummer samtalet är kopplat till."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"läsa grundläggande uppgifter om telefonistatus och identitet"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Ger appen åtkomst till grundläggande telefonifunktioner på enheten."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"dirigera samtal via systemet"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Appen tillåts att dirigera samtal via systemet för att förbättra samtalsupplevelsen."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"visa och styra samtal via systemet."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Tryck för att radera ansiktsmodellen och lägg sedan till ansiktet igen"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Konfigurera ansiktslås"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Lås upp telefonen genom att titta på den"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Om du vill använda ansiktslås aktiverar du "<b>"Kameraåtkomst"</b>" i Inställningar > Integritet"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Konfigurera fler sätt att låsa upp"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Tryck för att lägga till ett fingeravtryck"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Fingeravtryckslås"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"<xliff:g id="APPNAME">%1$s</xliff:g> förbereds."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Appar startas."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Uppgraderingen är klar."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Vill du stänga av skärmen?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Du tryckte på strömbrytaren när du skulle konfigurera fingeravtrycket.\n\nDet brukar leda till att skärmen stängs av."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Stäng av"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Avbryt"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Vill du fortsätta med konfigureringen?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Du tryckte på strömbrytaren, vilket vanligtvis stänger av skärmen.\n\nTesta att trycka lätt när du konfigurerar fingeravtrycket."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Stäng av skärmen"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Fortsätt konfigurera"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Vill du verifiera ditt fingeravtryck?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Du tryckte på strömbrytaren, vilket vanligtvis stänger av skärmen.\n\nTesta att trycka lätt för att verifiera ditt fingeravtryck."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Stäng av skärmen"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Fortsätt"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> körs"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Återgå till spelet genom att trycka här"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Välj spel"</string> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index fd1faa080a47..99fd1079476f 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Huruhusu programu kutumia huduma ya IMS kupiga simu bila udhibiti wako."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"kusoma hali na kitambulisho cha simu"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Huruhusu programu kufikia vipengele vya simu vilivyo kwenye kifaa. Idhini hii inaruhusu programu kutambua nambari ya simu na kifaa, kama kuna simu inayopigwa, na nambari ya mbali iliyounganishwa kwenye simu."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"kusoma utambulisho na hali ya msingi ya simu"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Huruhusu programu kufikia vipengele vya msingi vya simu kwenye kifaa."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"elekeza simu kupitia mfumo"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Huruhusu programu kuelekeza simu zake kupitia mfumo ili kuboresha hali ya kupiga simu."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"kuona na kudhibiti simu kupitia mfumo."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Gusa ili ufute muundo wa uso wako, kisha uweke uso wako tena"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Weka mipangilio ya Kufungua kwa Uso"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Fungua simu yako kwa kuiangalia"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Ili utumie kipengele cha kufungua kwa uso, washa kipengele cha "<b>"ufikiaji wa Kamera"</b>" katika Mipangilio na Faragha"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Weka mipangilio ya mbinu zaidi za kufungua"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Gusa ili uweke alama ya kidole"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Kufungua kwa Alama ya Kidole"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"Inaandaa <xliff:g id="APPNAME">%1$s</xliff:g>."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Programu zinaanza"</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Inamaliza kuwasha."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Ungependa kuzima skrini?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Ulipokuwa ukiweka alama ya kidole chako, ulibonyeza Kitufe cha kuwasha/kuzima.\n\nKwa kawaida, hatua hii huzima skrini yako."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Zima"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Ghairi"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Ungependa kuendelea kuweka mipangilio?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Umebonyeza kitufe cha kuwasha/kuzima — kwa kawaida, hali hii huzima skrini.\n\nJaribu kugusa taratibu unapoweka mipangilio ya alama ya kidole chako."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Zima skrini"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Endelea kuweka mipangilio"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Utaendelea kuthibitisha alama ya kidole chako?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Umebonyeza kitufe cha kuwasha/kuzima — kwa kawaida, hali hii huzima skrini.\n\nJaribu kugusa taratibu ili uthibitishe alama ya kidole chako."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Zima skrini"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Endelea"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> inaendelea"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Gusa ili urudi kwenye mchezo"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Chagua mchezo"</string> diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml index 0690c319bbf6..0be25cd879ed 100644 --- a/core/res/res/values-ta/strings.xml +++ b/core/res/res/values-ta/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"உங்கள் குறுக்கீடின்றி IMS சேவையைப் பயன்படுத்தி அழைப்பதற்கு, ஆப்ஸை அனுமதிக்கும்."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"மொபைல் நிலை மற்றும் அடையாளத்தைப் படித்தல்"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"சாதனத்தின் மொபைல் அம்சங்களை அணுகப் ஆப்ஸை அனுமதிக்கிறது. மொபைல் மற்றும் சாதன ஐடிகள், அழைப்பு செயலில் உள்ளதா மற்றும் அழைப்பு மூலம் இணைக்கப்பட்ட தொலைக் கட்டுப்பாட்டு எண் ஆகியவற்றைத் தீர்மானிக்க இந்த அனுமதி ஆப்ஸை அனுமதிக்கிறது."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"அடிப்படையான டெலிஃபோனி நிலையையும் அடையாளத்தையும் படித்தல்"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"சாதனத்திலுள்ள அடிப்படையான டெலிஃபோனி அம்சங்களை அணுக ஆப்ஸை அனுமதிக்கும்."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"சிஸ்டம் மூலம் அழைப்புகளை ரூட் செய்தல்"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"அழைக்கும் அனுபவத்தை மேம்படுத்தும் பொருட்டு, சிஸ்டம் மூலம் தனது அழைப்புகளை ரூட் செய்ய ஆப்ஸை அனுமதிக்கும்."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"சிஸ்டம் மூலமாக அழைப்புகளைப் பார்த்தலும் கட்டுப்படுத்துதலும்."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"முகத் தோற்றப் பதிவைத் தட்டி நீக்கிவிட்டு உங்கள் முகத்தை மீண்டும் சேர்க்கவும்"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"\'முகம் காட்டித் திறத்தல்\' அம்சத்தை அமைத்தல்"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"மொபைலைப் பார்ப்பதன் மூலம் அதை அன்லாக் செய்யலாம்"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"முகம் காட்டித் திறத்தல் அம்சத்தைப் பயன்படுத்த, அமைப்புகள் > தனியுரிமை என்பதற்குச் சென்று "<b>"கேமரா அணுகலை"</b>" இயக்கவும்"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"அன்லாக் செய்ய மேலும் பல வழிகளை அமையுங்கள்"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"கைரேகையைச் சேர்க்கத் தட்டுங்கள்"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"கைரேகை அன்லாக்"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"<xliff:g id="APPNAME">%1$s</xliff:g>ஐத் தயார்செய்கிறது."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"ஆப்ஸ் தொடங்கப்படுகின்றன."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"துவக்குதலை முடிக்கிறது."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"திரையை ஆஃப் செய்யவா?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"கைரேகையை அமைக்கும்போது பவர் பட்டனை அழுத்திவிட்டீர்கள்.\n\nஇது திரையை ஆஃப் செய்துவிடும்."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"ஆஃப் செய்"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"ரத்துசெய்"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"அமைவைத் தொடரவா?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"நீங்கள் பவர் பட்டனை அழுத்தியுள்ளீர்கள் — வழக்கமாக இது திரையை ஆஃப் செய்யும்.\n\nஉங்கள் கைரேகையை அமைக்கும்போது மெதுவாகத் தொடுங்கள்."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"திரையை ஆஃப் செய்"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"அமைவைத் தொடர்க"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"கைரேகைச் சரிபார்ப்பைத் தொடரவா?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"நீங்கள் பவர் பட்டனை அழுத்தியுள்ளீர்கள் — வழக்கமாக இது திரையை ஆஃப் செய்யும்.\n\nஉங்கள் கைரேகையைச் சரிபார்க்க மெதுவாகத் தொடுங்கள்."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"திரையை ஆஃப் செய்"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"தொடர்க"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> இயங்குகிறது"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"கேமிற்குச் செல்ல, தட்டவும்"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"கேமைத் தேர்வுசெய்க"</string> diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index 313ce593c77a..3aa7b045153c 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -422,7 +422,7 @@ <string name="permdesc_writeContacts" product="default" msgid="8304795696237065281">"మీ ఫోన్లో నిల్వ చేసి ఉన్న కాంటాక్ట్లకు సంబంధించిన డేటాను సవరించడానికి యాప్ను అనుమతిస్తుంది. ఈ అనుమతి, కాంటాక్ట్ డేటాను తొలగించడానికి యాప్లను అనుమతిస్తుంది."</string> <string name="permlab_readCallLog" msgid="1739990210293505948">"కాల్ లాగ్ను చదవడం"</string> <string name="permdesc_readCallLog" msgid="8964770895425873433">"ఈ యాప్ మీ కాల్ చరిత్రను చదవగలదు."</string> - <string name="permlab_writeCallLog" msgid="670292975137658895">"కాల్ లాగ్ను వ్రాయడం"</string> + <string name="permlab_writeCallLog" msgid="670292975137658895">"కాల్ లాగ్ను రాయడం"</string> <string name="permdesc_writeCallLog" product="tablet" msgid="2657525794731690397">"ఇన్కమింగ్ మరియు అవుట్గోయింగ్ కాల్స్ల గురించిన డేటాతో సహా మీ టాబ్లెట్ యొక్క కాల్ లాగ్ను సవరించడానికి యాప్ను అనుమతిస్తుంది. హానికరమైన యాప్లు మీ కాల్ లాగ్ను ఎరేజ్ చేయడానికి లేదా సవరించడానికి దీన్ని ఉపయోగించవచ్చు."</string> <string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"ఇన్కమింగ్ మరియు అవుట్గోయింగ్ కాల్స్కు సంబంధించిన డేటాతో సహా మీ Android TV పరికరం కాల్ లాగ్ను సవరించడానికి యాప్ని అనుమతిస్తుంది. హానికరమైన యాప్లు మీ కాల్ లాగ్ను తీసివేయడానికి లేదా సవరించడానికి దీన్ని ఉపయోగించవచ్చు."</string> <string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"ఇన్కమింగ్ మరియు అవుట్గోయింగ్ కాల్స్ల గురించిన డేటాతో సహా మీ ఫోన్ యొక్క కాల్ లాగ్ను సవరించడానికి యాప్ను అనుమతిస్తుంది. హానికరమైన యాప్లు మీ కాల్ లాగ్ను ఎరేజ్ చేయడానికి లేదా సవరించడానికి దీన్ని ఉపయోగించవచ్చు."</string> @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"మీ ప్రమేయం లేకుండా కాల్స్ చేయడం కోసం IMS సేవను ఉపయోగించడానికి యాప్ను అనుమతిస్తుంది."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"ఫోన్ స్టేటస్ మరియు గుర్తింపుని చదవడం"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"పరికరం యొక్క ఫోన్ ఫీచర్లను యాక్సెస్ చేయడానికి యాప్ను అనుమతిస్తుంది. ఈ అనుమతి ఫోన్ నంబర్ మరియు పరికరం IDలను, కాల్ సక్రియంగా ఉందా లేదా అనే విషయాన్ని మరియు కాల్ ద్వారా కనెక్ట్ చేయబడిన రిమోట్ నంబర్ను కనుగొనడానికి యాప్ను అనుమతిస్తుంది."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"ప్రాథమిక టెలిఫోన్ స్టేటస్, గుర్తింపును చదవండి"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"పరికరం తాలూకు ప్రాథమిక టెలిఫోన్ ఫీచర్లను యాక్సెస్ చేయడానికి యాప్ను అనుమతిస్తుంది."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"కాల్స్ను సిస్టమ్ ద్వారా వెళ్లేలా చేయి"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"కాలింగ్ అనుభవాన్ని మెరుగుపరచడం కోసం తన కాల్స్ను సిస్టమ్ ద్వారా వెళ్లేలా చేయడానికి యాప్ను అనుమతిస్తుంది."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"సిస్టమ్ ద్వారా కాల్స్ను చూసి, నియంత్రించండి."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"ఫేస్ మోడల్ను తొలగించడానికి నొక్కండి, ఆపై మీ ముఖాన్ని మళ్లీ జోడించండి"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"ఫేస్ అన్లాక్ను సెటప్ చేయండి"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"మీ ఫోన్ను చూడటం ద్వారా దాన్ని అన్లాక్ చేయండి"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"ఫేస్ అన్లాక్ను ఉపయోగించడానికి, సెట్టింగ్లు > గోప్యతలో "<b>"కెమెరా యాక్సెస్"</b>"ను ఆన్ చేయండి"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"అన్లాక్ చేయడానికి మరిన్ని మార్గాలను సెటప్ చేయండి"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"వేలిముద్రను జోడించడానికి ట్యాప్ చేయండి"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"వేలిముద్ర అన్లాక్"</string> @@ -725,7 +728,7 @@ <string name="permlab_bindCarrierServices" msgid="2395596978626237474">"క్యారియర్ సేవలకు అనుబంధించడం"</string> <string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"క్యారియర్ సేవలకు అనుబంధించడానికి హోల్డర్ను అనుమతిస్తుంది. సాధారణ యాప్లకు ఎప్పటికీ అవసరం ఉండదు."</string> <string name="permlab_access_notification_policy" msgid="5524112842876975537">"అంతరాయం కలిగించవద్దును యాక్సెస్ చేయడం"</string> - <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"అంతరాయం కలిగించవద్దు ఎంపిక కాన్ఫిగరేషన్ చదవడానికి మరియు వ్రాయడానికి యాప్ను అనుమతిస్తుంది."</string> + <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"అంతరాయం కలిగించవద్దు ఎంపిక కాన్ఫిగరేషన్ చదవడానికి మరియు రాయడానికి యాప్ను అనుమతిస్తుంది."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"వీక్షణ అనుమతి వినియోగాన్ని ప్రారంభించండి"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"యాప్నకు అనుమతి వినియోగాన్ని ప్రారంభించడానికి హోల్డర్ను అనుమతిస్తుంది. సాధారణ యాప్లకు ఎప్పటికీ ఇటువంటి అనుమతి అవసరం ఉండదు."</string> <string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"యాప్ ఫీచర్లను చూడటాన్ని ప్రారంభించండి"</string> @@ -1020,7 +1023,7 @@ <string name="autofill_emirate" msgid="2544082046790551168">"ఎమిరేట్"</string> <string name="permlab_readHistoryBookmarks" msgid="9102293913842539697">"మీ వెబ్ బుక్మార్క్లు మరియు చరిత్రను చదవడం"</string> <string name="permdesc_readHistoryBookmarks" msgid="2323799501008967852">"బ్రౌజర్ సందర్శించిన అన్ని URLల చరిత్ర గురించి మరియు అన్ని బ్రౌజర్ బుక్మార్క్ల గురించి చదవడానికి యాప్ను అనుమతిస్తుంది. గమనిక: ఈ అనుమతి మూడవ పక్షం బ్రౌజర్లు లేదా వెబ్ బ్రౌజింగ్ సామర్థ్యాలు గల ఇతర యాప్ల ద్వారా అమలు చేయబడకపోవచ్చు."</string> - <string name="permlab_writeHistoryBookmarks" msgid="6090259925187986937">"వెబ్ బుక్మార్క్లు మరియు చరిత్రను వ్రాయడం"</string> + <string name="permlab_writeHistoryBookmarks" msgid="6090259925187986937">"వెబ్ బుక్మార్క్లు మరియు చరిత్రను రాయడం"</string> <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="573341025292489065">"మీ టాబ్లెట్లో నిల్వ చేయబడిన బ్రౌజర్ హిస్టరీని, బుక్మార్క్లను ఎడిట్ చేయడానికి యాప్ను అనుమతిస్తుంది. ఇది బ్రౌజర్ డేటాను ఎరేజ్ చేయడానికి లేదా ఎడిట్ చేయడానికి యాప్ను అనుమతించవచ్చు. గమనిక: ఈ అనుమతిని థర్డ్ పార్టీ బ్రౌజర్లు లేదా వెబ్ బ్రౌజింగ్ సామర్థ్యాలు గల ఇతర యాప్లు అమలు చేయకపోవచ్చు."</string> <string name="permdesc_writeHistoryBookmarks" product="tv" msgid="88642768580408561">"మీ Android TV పరికరంలో నిల్వ చేసిన బ్రౌజర్ చరిత్ర లేదా బుక్మార్క్లను సవరించడానికి యాప్ని అనుమతిస్తుంది. ఇది బ్రౌజర్ డేటాను తీసివేయడానికి లేదా సవరించడానికి యాప్ని అనుమతించవచ్చు. గమనిక: ఈ అనుమతి మూడవ-పక్ష బ్రౌజర్లు లేదా వెబ్ బ్రౌజింగ్ సామర్థ్యాలు గల ఇతర యాప్ల ద్వారా అమలు కాకపోవచ్చు."</string> <string name="permdesc_writeHistoryBookmarks" product="default" msgid="2245203087160913652">"మీ ఫోన్లో నిల్వ చేయబడిన బ్రౌజర్ చరిత్రను లేదా బుక్మార్క్లను సవరించడానికి యాప్ను అనుమతిస్తుంది. ఇది బ్రౌజర్ డేటాను ఎరేజ్ చేయడానికి లేదా సవరించడానికి యాప్ను అనుమతించవచ్చు. గమనిక: ఈ అనుమతి మూడవ పక్షం బ్రౌజర్లు లేదా వెబ్ బ్రౌజింగ్ సామర్థ్యాలు గల ఇతర యాప్ల ద్వారా అమలు చేయబడకపోవచ్చు."</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"<xliff:g id="APPNAME">%1$s</xliff:g>ని సిద్ధం చేస్తోంది."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"యాప్లను ప్రారంభిస్తోంది."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"బూట్ను ముగిస్తోంది."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"స్క్రీన్ను ఆఫ్ చేయాలా?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"మీ వేలిముద్రను సెటప్ చేస్తున్నప్పుడు, మీరు పవర్ బటన్ను నొక్కారు.\n\nఇది సాధారణంగా మీ స్క్రీన్ను ఆఫ్ చేస్తుంది."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"ఆఫ్ చేయండి"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"రద్దు చేయండి"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"సెటప్ను కొనసాగించాలా?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"మీరు పవర్ బటన్ను నొక్కారు — ఇది సాధారణంగా స్క్రీన్ను ఆఫ్ చేస్తుంది.\n\nమీ వేలిముద్రను సెటప్ చేస్తున్నప్పుడు తేలికగా ట్యాప్ చేయడానికి ట్రై చేయండి."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"స్క్రీన్ను ఆఫ్ చేయి"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"సెటప్ను కొనసాగించు"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"మీ వేలిముద్ర వెరిఫైను కొనసాగించాలా?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"మీరు పవర్ బటన్ను నొక్కారు — ఇది సాధారణంగా స్క్రీన్ను ఆఫ్ చేస్తుంది.\n\nమీ వేలిముద్రను వెరిఫై చేయడానికి తేలికగా ట్యాప్ చేయడం ట్రై చేయండి."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"స్క్రీన్ను ఆఫ్ చేయి"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"కొనసాగించండి"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> అమలవుతోంది"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"గేమ్కి తిరిగి రావడానికి నొక్కండి"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"గేమ్ను ఎంచుకోండి"</string> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index b8d8506febf2..41adb26abfaa 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"อนุญาตให้แอปใช้บริการ IMS เพื่อโทรออกโดยคุณไม่ต้องดำเนินการใดๆ เลย"</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"อ่านสถานะและข้อมูลระบุตัวตนของโทรศัพท์"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"อนุญาตให้แอปพลิเคชันเข้าถึงฟีเจอร์โทรศัพท์ของอุปกรณ์ การอนุญาตนี้ทำให้แอปพลิเคชันสามารถตรวจสอบหมายเลขโทรศัพท์และรหัสอุปกรณ์ ตรวจสอบว่ามีการโทรที่ทำงานอยู่หรือไม่ และตรวจสอบหมายเลขระยะไกลที่เชื่อมต่อด้วยการโทร"</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"อ่านสถานะการใช้โทรศัพท์เบื้องต้นและข้อมูลระบุตัวตน"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"อนุญาตให้แอปเข้าถึงฟีเจอร์พื้นฐานในการใช้โทรศัพท์ของอุปกรณ์นี้"</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"กำหนดเส้นทางการโทรผ่านระบบ"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"อนุญาตให้แอปกำหนดเส้นทางการโทรของแอปผ่านระบบเพื่อปรับปรุงประสบการณ์ในการโทร"</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"ดูและจัดการการติดต่อผ่านระบบ"</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"แตะเพื่อลบรูปแบบใบหน้า แล้วเพิ่มใบหน้าอีกครั้ง"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"ตั้งค่าการปลดล็อกด้วยใบหน้า"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"ปลดล็อกโทรศัพท์โดยมองไปที่โทรศัพท์"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"หากต้องการใช้ปลดล็อกด้วยใบหน้า ให้เปิด"<b>"การเข้าถึงกล้อง"</b>"ในการตั้งค่าและความเป็นส่วนตัว"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"ตั้งค่าการปลดล็อกด้วยวิธีอื่น"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"แตะเพื่อเพิ่มลายนิ้วมือ"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"ปลดล็อกด้วยลายนิ้วมือ"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"กำลังเตรียม <xliff:g id="APPNAME">%1$s</xliff:g>"</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"กำลังเริ่มต้นแอปพลิเคชัน"</string> <string name="android_upgrading_complete" msgid="409800058018374746">"เสร็จสิ้นการบูต"</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"ปิดหน้าจอใช่ไหม"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"ขณะตั้งค่าลายนิ้วมือคุณจะต้องกดปุ่มเปิด/ปิด\n\nซึ่งโดยปกติจะเป็นการปิดหน้าจอด้วย"</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"ปิด"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"ยกเลิก"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"ตั้งค่าต่อไหม"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"คุณกดปุ่มเปิด/ปิดซึ่งโดยปกติจะเป็นการปิดหน้าจอ\n\nลองแตะเบาๆ ขณะตั้งค่าลายนิ้วมือ"</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"ปิดหน้าจอ"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"ตั้งค่าต่อ"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"ยืนยันลายนิ้วมือต่อไหม"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"คุณกดปุ่มเปิด/ปิดซึ่งโดยปกติจะเป็นการปิดหน้าจอ\n\nลองแตะเบาๆ เพื่อยืนยันลายนิ้วมือ"</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"ปิดหน้าจอ"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"ต่อไป"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> กำลังทำงาน"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"แตะเพื่อกลับไปที่เกม"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"เลือกเกม"</string> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index 30350a5ab8a7..7f39769d4e77 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Pinapahintulutan ang app na gamitin ang serbisyo ng IMS upang tumawag nang walang pahintulot mo."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"basahin ang katayuan at pagkakakilanlan ng telepono"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Pinapayagan ang app na i-access ang mga tampok ng telepono ng device. Pinapayagan ng pahintulot na ito ang app na tukuyin ang numero ng telepono at mga ID ng device, kung aktibo man ang isang tawag, at ang malayuang numerong ikinonekta ng isang tawag."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"basahin ang pangunahing status at pagkakakilanlan sa telephony"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Pinapayagan ang app na i-access ang mga pangunahing feature sa telephony ng device."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"iruta ang mga tawag sa pamamagitan ng system"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Pinapayagan ang app na iruta ang mga tawag nito sa pamamagitan ng system upang mapahusay ang karanasan sa pagtawag."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"tingnan at kontrolin ang mga tawag sa pamamagitan ng system."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"I-tap para i-delete ang iyong face model, pagkatapos ay idagdag ulit ang mukha mo"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"I-set up ang Pag-unlock Gamit ang Mukha"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"I-unlock ang iyong telepono sa pamamagitan ng pagtingin dito"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Para magamit ang Pag-unlock Gamit ang Mukha, i-on ang "<b>"Access sa camera"</b>" sa Mga Setting > Privacy"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Mag-set up ng higit pang paraan para mag-unlock"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"I-tap para magdagdag ng fingerprint"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Pag-unlock Gamit ang Fingerprint"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"Ihinahanda ang <xliff:g id="APPNAME">%1$s</xliff:g>."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Sinisimulan ang apps."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Pagtatapos ng pag-boot."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"I-off ang screen?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Habang sine-set up ang iyong fingerprint, pinindot mo ang Power button.\n\nKaraniwan nitong ino-off ang iyong screen."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"I-off"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Kanselahin"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Ituloy ang pag-set up?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Pinindot mo ang power button — karaniwan nitong ino-off ang screen.\n\nSubukang i-tap habang sine-set up ang iyong fingerprint."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"I-off ang screen"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Ituloy ang setup"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Magpatuloy sa pag-verify ng fingerprint?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Pinindot mo ang power button — karaniwan nitong ino-off ang screen.\n\nSubukang i-tap para i-verify ang iyong fingerprint."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"I-off ang screen"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Magpatuloy"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"Tumatakbo ang <xliff:g id="APP">%1$s</xliff:g>"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Mag-tap upang bumalik sa laro"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Pumili ng laro"</string> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index e676c8959aae..bc26fedd0ab9 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Uygulamanın, sizin müdahaleniz olmadan telefon etmek için IMS hizmetini kullanmasına izin verir."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"telefonun durumunu ve kimliğini okuma"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Uygulamaya cihazdaki telefon özelliklerine erişme izni verir. Bu izin, uygulamanın telefon numarasını ve cihaz kimliğini, etkin bir çağrı olup olmadığını ve çağrıda bağlanılan karşı tarafın numarasını öğrenmesine olanak sağlar."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"temel telefon durumunu ve kimliğini okuma"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Uygulamanın, cihazdaki temel telefon özelliklerine erişmesine izin verir."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"aramaları sistem üzerinden yönlendir"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Uygulamanın, çağrı deneyimini iyileştirmek için çağrılarını sistem üzerinden yönlendirmesine olanak tanır."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"aramaları sistemde görüp denetleme."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Yüz modelinizi silmek için dokunup ardından yüzünüzü yeniden ekleyin"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Yüz Tanıma Kilidi\'ni kurma"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Telefonunuza bakarak kilidini açın"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Yüz Tanıma Kilidi\'ni kullanmak için Ayarlar > Gizlilik bölümünden "<b>"Kamera erişimi"</b>"\'ni açın"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Kilidi açmak için daha fazla yöntem ayarlayın"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Parmak izi eklemek için dokunun"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Parmak İzi Kilidi"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"<xliff:g id="APPNAME">%1$s</xliff:g> hazırlanıyor."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Uygulamalar başlatılıyor"</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Açılış tamamlanıyor."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Ekran kapatılsın mı?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Parmak izinizi ayarlarken Güç düğmesine bastınız.\n\nBu hareket genellikle ekranınızın kapanmasına neden olur."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Kapat"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"İptal"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Kuruluma devam edilsin mi?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Güç düğmesine bastınız. Bu düğmeye basıldığında genellikle ekran kapanır.\n\nParmak izinizi tanımlarken hafifçe dokunmayı deneyin."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Ekranı kapat"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Kuruluma devam et"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Parmak izi doğrulamaya devam edilsin mi?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Güç düğmesine bastınız. Bu düğmeye basıldığında genellikle ekran kapanır.\n\nParmak izinizi doğrulamak için hafifçe dokunmayı deneyin."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Ekranı kapat"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Devam"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> çalışıyor"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Oyuna geri dönmek için dokunun"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Oyun seçin"</string> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 18c5600738d1..5ce1407f1737 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -477,6 +477,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Додаток зможе телефонувати за допомогою служби IMS без вашого відома."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"читати статус та ідентифікаційну інформацію телефону"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Дозволяє програмі отримувати доступ до телефонних функцій пристрою. Такий дозвіл дає програмі змогу визначати номер телефону й ідентифікатори пристрою, активність виклику, а також віддалений номер, на який здійснюється виклик."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"зчитувати статус та ідентифікаційну інформацію телефонії"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Дозволяє додатку отримувати доступ до базових функцій телефонії на пристрої."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"маршрутизувати виклики через систему"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Дозволяє додатку маршрутизувати виклики через систему, щоб було зручніше телефонувати."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"Переглядати виклики через систему й керувати ними."</string> @@ -628,6 +630,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Натисніть, щоб видалити свою модель обличчя, а потім знову додайте її"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Налаштування фейсконтролю"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Ви зможете розблоковувати телефон, подивившись на нього"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Щоб використовувати фейсконтроль, увімкніть "<b>"Доступ до камери"</b>" в розділі \"Налаштування\" > \"Конфіденційність\""</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Налаштуйте більше способів розблокування"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Натисніть, щоб додати відбиток пальця"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Розблокування відбитком пальця"</string> @@ -1316,10 +1319,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"Підготовка додатка <xliff:g id="APPNAME">%1$s</xliff:g>."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Запуск програм."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Завершення завантаження."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Вимкнути екран?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Налаштовуючи відбиток пальця, ви натиснули кнопку живлення.\n\nЗазвичай після цього вимикається екран."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Вимкнути"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Скасувати"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Продовжити реєстрацію?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Ви натиснули кнопку живлення – зазвичай після цього вимикається екран.\n\nЩоб зареєструвати відбиток пальця, спробуйте лише злегка торкнутися датчика."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Вимкнути екран"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Додати відбиток"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Продовжити підтвердження відбитка?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Ви натиснули кнопку живлення – зазвичай після цього вимикається екран.\n\nЩоб підтвердити відбиток пальця, спробуйте лише злегка торкнутися датчика."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Вимкнути екран"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Продовжити"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"Працює <xliff:g id="APP">%1$s</xliff:g>"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Торкніться, щоб повернутися в гру"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Виберіть гру"</string> diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml index fdb8ddd0e1fe..7ceaa992d0d1 100644 --- a/core/res/res/values-ur/strings.xml +++ b/core/res/res/values-ur/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"آپ کی مداخلت کے بغیر کالیں کرنے کیلئے ایپ کو IMS سروس استعمال کرنے کی اجازت دیتی ہے۔"</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"فون کے اسٹیٹس اور شناخت کو پڑھیں"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"ایپ کو آلے کی فون والی خصوصیات تک رسائی حاصل کرنے کی اجازت دیتا ہے۔ یہ اجازت ایپ کو فون نمبر اور آلے کے IDs کا تعین کرنے، آیا کوئی کال فعال ہے، اور کال کے ذریعہ مربوط ریموٹ نمبر کا تعین کرنے دیتی ہے۔"</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"بنیادی ٹیلیفونی صورتحال اور شناخت کو پڑھیں"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"اس سے ایپ کو آلے کی بنیادی ٹیلیفونی خصوصیات تک رسائی کی اجازت ملتی ہے۔"</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"سسٹم کے ذریعہ کالز روٹ کریں"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"کالںگ کا تجربہ بہتر بنانے کے لیے سسٹم کے ذریعہ ایپ کو کالز روٹ کرنے کی اجازت دیتا ہے۔"</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"سسٹم کے ذریعے کالز دیکھیں اور کنٹرول کریں۔"</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"اپنے چہرے کا ماڈل حذف کرنے کے لیے تھپتھپائیں پھر اپنا چہرہ دوبارہ شامل کریں"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"فیس اَنلاک سیٹ اپ کریں"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"اپنے فون کی طرف دیکھ کر اسے غیر مقفل کریں"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"فیس اَنلاک کا استعمال کرنے کے لیے، ترتیبات اور رازداری میں "<b>"کیمرے تک رسائی"</b>" کو آن کریں"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"غیر مقفل کرنے کے مزید طریقے سیٹ اپ کریں"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"فنگر پرنٹ شامل کرنے کیلئے تھپتھپائیں"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"فنگر پرنٹ اَن لاک"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"<xliff:g id="APPNAME">%1$s</xliff:g> تیار ہو رہی ہے۔"</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"ایپس شروع ہو رہی ہیں۔"</string> <string name="android_upgrading_complete" msgid="409800058018374746">"بوٹ مکمل ہو رہا ہے۔"</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"اسکرین آف کریں؟"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"اپنی فنگر پرنٹ سیٹ اپ کرنے کے دوران آپ نے پاور بٹن دبایا۔\n\n یہ عام طور پر آپ کی اسکرین کو آف کرتی ہے۔"</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"آف کریں"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"منسوخ کریں"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"سیٹ اپ جاری رکھیں؟"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"آپ نے پاور بٹن دبایا — اس سے عام طور پر اسکرین آف ہو جاتی ہے۔\n\nاپنے فنگر پرنٹ کو سیٹ اپ کرنے کے دوران ہلکا سا تھپتھپانے کی کوشش کریں۔"</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"اسکرین آف کریں"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"سیٹ اپ جاری رکھیں"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"اپنے فنگر پرنٹ کی توثیق کرنا جاری رکھیں؟"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"آپ نے پاور بٹن دبایا — اس سے عام طور پر اسکرین آف ہو جاتی ہے۔\n\nاپنے فنگر پرنٹ کی توثیق کرنے کے لیے ہلکا سا تھپتھپانے کی کوشش کریں۔"</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"اسکرین آف کریں"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"جاری رکھیں"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> چل رہی ہے"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"گیم پر واپس جانے کے لیے تھپتھپائیں"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"گیم کا انتخاب کریں"</string> diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml index 73cc4961bcc2..a40b67f19934 100644 --- a/core/res/res/values-uz/strings.xml +++ b/core/res/res/values-uz/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Ilovaga sizning ishtirokingizsiz qo‘ng‘iroqlarni amalga oshirish uchun IMS xizmatidan foydalanishga ruxsat beradi."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"telefon holati haqidagi ma’lumotlarni olish"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Ilovaga qurilmangizdagi telefon xususiyatlariga kirishga ruxsat beradi. Bu ruxsat ilovaga telefon raqami va qurilma nomlari, qo‘ng‘iroq faol yoki faolsizligi va masofadagi raqam qo‘ng‘rioq orqali bog‘langanligini aniqlashga imkon beradi."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"oddiy telefoniya holatini oʻqish va aniqlash"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Ilovaga qurilmadagi oddiy telefoniya funksiyalaridan foydalanish imkonini beradi."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"chaqiruvlarni tizim orqali yo‘naltirish"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Ilova aloqa sifatini yaxshilash maqsadida chaqiruvlarni tizim orqali yo‘naltirishi mumkin."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"tizim orqali chaqiruvlarni tekshirish va boshqarish."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Yuz modelini oʻchirish uchun bosing va keyin yana yuzni qoʻshing"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Yuz bilan ochishni sozlash"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Telefoningizni yuz tekshiruvi yordamida qulfdan chiqaring"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Yuz bilan ochish uchun Sozlamalar va maxfiylik orqali "<b>"kameraga kirishga ruxsat bering"</b></string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Qulfdan chiqarishning boshqa usullarini sozlang"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Barmoq izi kiritish uchun bosing"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Barmoq izi bilan ochish"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"<xliff:g id="APPNAME">%1$s</xliff:g> tayyorlanmoqda."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Ilovalar ishga tushirilmoqda."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Tizimni yuklashni tugatish."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Ekran oʻchirilsinmi?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Barmoq izini sozlayotganda Quvvat tugmasini bosdingiz.\n\nBunda odatda ekran oʻchib qoladi."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Oʻchirish"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Bekor qilish"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Sozlashni davom ettirasizmi?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Quvvat tugmasini bosdingiz — bu odatda ekranni oʻchiradi.\n\nBarmoq izini qoʻshish vaqtida tugmaga yengilgina tegining."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Ekranni oʻchirish"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Sozlashni davom ettirish"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Barmoq izi tasdiqlashda davom etilsinmi?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Quvvat tugmasini bosdingiz. Bu odatda ekranni oʻchiradi.\n\nBarmoq izingizni tasdiqlash uchun tugmaga yengilgina tegining."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Ekranni oʻchirish"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Davom etish"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> ishlamoqda"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"O‘yinga qaytish uchun bosing"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"O‘yinni tanlang"</string> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index d47b4f484e5c..1731b3b2c4db 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Cho phép ứng dụng sử dụng dịch vụ IMS để thực hiện cuộc gọi mà không có sự can thiệp của bạn."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"đọc trạng thái và nhận dạng của điện thoại"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Cho phép ứng dụng truy cập vào các tính năng điện thoại của thiết bị. Quyền này cho phép ứng dụng xác định số điện thoại và ID thiết bị, cho dù cuộc gọi có hiện hoạt hay không và số từ xa có được kết nối bằng một cuộc gọi hay không."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"đọc danh tính và trạng thái cơ bản của điện thoại"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Cho phép ứng dụng dùng các tính năng cơ bản của điện thoại trên thiết bị."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"định tuyến cuộc gọi thông qua hệ thống"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Cho phép ứng dụng định tuyến cuộc gọi thông qua hệ thống nhằm cải thiện trải nghiệm gọi điện."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"xem và kiểm soát cuộc gọi thông qua hệ thống."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Nhấn để xóa mẫu khuôn mặt, sau đó thêm lại khuôn mặt của bạn"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Thiết lập tính năng Mở khóa bằng khuôn mặt"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Mở khóa điện thoại bằng cách nhìn vào điện thoại"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Để dùng tính năng Mở khoá bằng khuôn mặt, hãy bật tuỳ chọn "<b>"Truy cập máy ảnh"</b>" trong phần Cài đặt > Quyền riêng tư"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Thiết lập thêm những cách mở khóa khác"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Nhấn để thêm vân tay"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Mở khóa bằng vân tay"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"Đang chuẩn bị <xliff:g id="APPNAME">%1$s</xliff:g>."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Khởi động ứng dụng."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Hoàn tất khởi động."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Tắt màn hình?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Trong khi thiết lập vân tay, bạn đã nhấn vào nút Nguồn.\n\nThông thường, thao tác này sẽ tắt màn hình."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Tắt"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Hủy"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Tiếp tục thiết lập?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Bạn đã nhấn nút nguồn – thao tác này thường tắt màn hình.\n\nHãy thử nhấn nhẹ khi thiết lập vân tay của bạn."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Tắt màn hình"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Tiếp tục thiết lập"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Tiếp tục xác minh vân tay của bạn?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Bạn đã nhấn nút nguồn – thao tác này thường tắt màn hình.\n\nHãy thử nhấn nhẹ để xác minh vân tay."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Tắt màn hình"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Tiếp tục"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> đang hoạt động"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Nhấn để quay lại trò chơi"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Chọn trò chơi"</string> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 17ce14b90136..8ce9ab2e4370 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"允许应用自行使用即时通讯服务拨打电话。"</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"读取手机状态和身份"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"允许该应用访问设备的电话功能。此权限可让该应用确定本机号码和设备 ID、是否正处于通话状态以及拨打的号码。"</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"读取基本电话状态和身份信息"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"允许该应用使用设备的基本电话功能。"</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"通过系统转接来电"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"允许该应用通过系统转接来电,以改善通话体验。"</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"查看并控制通过系统拨打的电话。"</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"请点按以删除您的脸部模型,然后再添加您的脸部模型"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"设置人脸解锁"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"脸部对准手机即可将其解锁"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"如需使用人脸解锁功能,请在“设置”>“隐私权”中开启"<b>"摄像头使用权限"</b></string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"设置更多解锁方式"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"点按即可添加指纹"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"指纹解锁"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"正在准备升级<xliff:g id="APPNAME">%1$s</xliff:g>。"</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"正在启动应用。"</string> <string name="android_upgrading_complete" msgid="409800058018374746">"即将完成启动。"</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"要关闭屏幕吗?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"您在设置指纹时按了电源按钮。\n\n此操作通常会关闭屏幕。"</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"关闭"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"取消"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"要继续设置吗?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"您已按电源按钮,这通常会关闭屏幕。\n\n请尝试在设置指纹时轻轻按一下。"</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"关闭屏幕"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"继续设置"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"要继续验证您的指纹吗?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"您已按电源按钮,这通常会关闭屏幕。\n\n请尝试轻轻按一下来验证您的指纹。"</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"关闭屏幕"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"继续"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g>正在运行"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"点按即可返回游戏"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"选择游戏"</string> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index 35a11b2eef96..49850e14d91a 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"允許應用程式自行使用 IMS 服務撥打電話。"</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"讀取手機狀態和識別碼"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"允許應用程式使用裝置的電話功能。這項權限允許應用程式確定手機號碼和裝置編號、是否正在通話中,以及所撥打的對方號碼。"</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"讀取基本電話狀態和身分"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"允許應用程式存取裝置的基本電話功能。"</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"透過系統轉接來電"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"允許應用程式透過系統轉接來電,以改善通話體驗。"</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"透過系統查看和控制通話。"</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"請輕按這裡刪除面部模型,然後再重新新增"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"設定「面孔解鎖」"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"直望手機即可解鎖"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"如要使用「面孔解鎖」,請在 [設定] > [私隱] 開啟"<b>"相機存取權"</b></string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"設定更多解鎖方法"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"輕按即可新增指紋"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"指紋解鎖"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"正在準備 <xliff:g id="APPNAME">%1$s</xliff:g>。"</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"正在啟動應用程式。"</string> <string name="android_upgrading_complete" msgid="409800058018374746">"啟動完成。"</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"要關閉螢幕嗎?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"您在設定指紋時按了開關按鈕。\n\n螢幕通常會因此而關閉。"</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"關閉"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"取消"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"要繼續設定嗎?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"您已按下開關按鈕,這麼做通常會關閉螢幕。\n\n設定指紋時請嘗試輕按開關按鈕。"</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"關閉螢幕"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"繼續設定"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"要繼續驗證指紋嗎?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"您已按下開關按鈕,這麼做通常會關閉螢幕。\n\n嘗試輕按開關按鈕以驗證指紋。"</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"關閉螢幕"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"繼續"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"正在執行 <xliff:g id="APP">%1$s</xliff:g>"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"輕按即可返回遊戲"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"選擇遊戲"</string> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 42f0586a13af..329b5dc15661 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"允許應用程式自動使用 IMS 服務撥打電話。"</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"讀取手機狀態和識別碼"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"允許應用程式使用裝置的電話功能。這項權限可讓應用程式判讀手機號碼和裝置 ID、是否正在通話中,以及所撥打的對方號碼。"</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"讀取基本電話通訊狀態和識別資訊"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"允許應用程式存取裝置的基本電話通訊功能。"</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"透過系統接通來電"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"允許應用程式透過系統接通來電,以改善通話品質。"</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"查看及控管透過系統撥打的電話。"</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"請輕觸這裡刪除臉部模型,然後再重新新增"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"設定人臉解鎖功能"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"看著手機就能解鎖"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"如要使用人臉解鎖功能,請前往「設定」>「隱私權」開啟"<b>"攝影機存取權"</b></string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"設定更多解鎖方式"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"輕觸即可新增指紋"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"指紋解鎖"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"正在準備升級「<xliff:g id="APPNAME">%1$s</xliff:g>」。"</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"正在啟動應用程式。"</string> <string name="android_upgrading_complete" msgid="409800058018374746">"啟動完成。"</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"要關閉螢幕嗎?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"設定指紋時必須按下電源鍵。\n\n這項操作通常會將螢幕關閉。"</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"關閉"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"取消"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"要繼續設定嗎?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"你已按下電源鍵,這麼做通常會關閉螢幕。\n\n設定指紋時請試著減輕觸碰電源鍵的力道。"</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"關閉螢幕"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"繼續設定"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"要繼續驗證指紋嗎?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"你已按下電源鍵,這麼做通常會關閉螢幕。\n\n驗證指紋時,請試著減輕觸碰電源鍵的力道。"</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"關閉螢幕"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"繼續"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> 執行中"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"輕觸即可返回遊戲"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"選擇遊戲"</string> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index 3f7e37d4ea5d..8c7d5ea1a6bc 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -471,6 +471,8 @@ <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Ivumela uhlelo lokusebenza ukuthi lusebenzise isevisi ye-IMS ukuze yenze amakholi ngaphandle kokungenelela kwakho."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"funda isimo sefoni kanye nesazisi"</string> <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Ivumela uhlelo lokusebenza ukufinyelela izici zefoni zedivayisi. Le mvume ivumela uhlelo lokusebenza ukucacisa inombolo yefoni nobunikazi bedivayisi, ukuthi noma ikholi iyasebenza, futhi nenombolo yesilawuli kude zixhunywe ngekholi."</string> + <string name="permlab_readBasicPhoneState" msgid="3214853233263871347">"funda isimo nokuhlonza ucingo okuyisisekelo"</string> + <string name="permdesc_readBasicPhoneState" msgid="828185691675460520">"Ivumela i-app ukufinyelela izakhi zocingo eziyisisekelo zedivayisi."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"yanza imizila yamakholi ngesistimu"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Ivumela uhlelo lokusebenza ukwenza imizila yamakholi ngesistimu ukuze ithuthukise umuzwa wokushaya."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"bona futhi ulawule amakholi ngesistimu."</string> @@ -622,6 +624,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Thepha ukuze usule imodeli yakho yobuso, bese wengeza futhi ubuso"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Setha Ukuvula ngobuso"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Vula ifoni yakho ngokuyibheka"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Ukuze usebenzise Ukuvula ngobuso, vula "<b>"Ukufinyelela kwekhamera"</b>" kokuthi Amasethingi > Ubumfihlo"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Setha izindlela eziningi zokuvula"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Thepha ukuze ungeze izigxivizo zomunwe"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Ukuvula ngesigxivizo somunwe"</string> @@ -1276,10 +1279,14 @@ <string name="android_preparing_apk" msgid="589736917792300956">"Ukulungisela i-<xliff:g id="APPNAME">%1$s</xliff:g>."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Qalisa izinhlelo zokusebenza."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Qedela ukuqala kabusha."</string> - <string name="fp_enrollment_powerbutton_intent_title" msgid="3385634173366119903">"Vala isikrini?"</string> - <string name="fp_enrollment_powerbutton_intent_message" msgid="6582149052513682522">"Lapho usetha izigxivizo zeminwe yakho, ucindezele Inkinobho yamandla.\n\nLokhu kuvame ukuvala isikrini sakho."</string> - <string name="fp_enrollment_powerbutton_intent_positive_button" msgid="5963520983910436791">"Vala"</string> - <string name="fp_enrollment_powerbutton_intent_negative_button" msgid="6465764183480190748">"Khansela"</string> + <string name="fp_power_button_enrollment_title" msgid="3574363228413259548">"Qhubeka nokusetha?"</string> + <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Ucindezele inkinobho yamandla — lokhu kuvame ukuvala isikrini.\n\nZama ukuthepha kancane ngenkathi usetha isigxivizo sakho somunwe."</string> + <string name="fp_power_button_enrollment_positive_button" msgid="2095415838459356833">"Vala isikrini"</string> + <string name="fp_power_button_enrollment_negative_button" msgid="6558436406362486747">"Qhubeka nokusetha"</string> + <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Qhubeka uqinisekise isigxivizo sakho somunwe?"</string> + <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Ucindezele inkinobho yamandla — lokhu kuvame ukuvala isikrini.\n\nZama ukuthepha kancane ukuze uqinisekise isigxivizo sakho somunwe."</string> + <string name="fp_power_button_bp_positive_button" msgid="728945472408552251">"Vala isikrini"</string> + <string name="fp_power_button_bp_negative_button" msgid="3971364246496775178">"Qhubeka"</string> <string name="heavy_weight_notification" msgid="8382784283600329576">"<xliff:g id="APP">%1$s</xliff:g> iyasebenza"</string> <string name="heavy_weight_notification_detail" msgid="6802247239468404078">"Thepha ukuze ubuyele emuva kwigeyimu"</string> <string name="heavy_weight_switcher_title" msgid="3861984210040100886">"Khetha igeyimu"</string> diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 60766459f1cb..8aa92018aa7c 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -3638,6 +3638,9 @@ to re-retrieve all resources (including view layouts, drawables, etc) to correctly handle any configuration change.--> <attr name="configChanges" /> + <!-- Specifies whether the IME supports Handwriting using stylus. Defaults to false. --> + <attr name="supportsStylusHandwriting" format="boolean" /> + </declare-styleable> <!-- This is the subtype of InputMethod. Subtype can describe locales (for example, en_US and diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 4feee41533be..050d20eb9ef5 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -3333,6 +3333,20 @@ and one pSIM) --> <integer name="config_num_physical_slots">1</integer> + <!--The default "usage setting" indicating that the device is either a voice-centric + device (1) or a data-centric device (2). A voice-centric device will require that any cellular + service that it uses provides access to voice capability, and a data-centric device will + likewise require that the network provides access to data services. These settings are + sent to the cellular modem and control the behavior in accordance with 3gpp TS 24.301 sec 4.3 + (and equivalent functionality in other generations of cellular).--> + <integer name="config_default_cellular_usage_setting">1</integer> + + <!--The list of supported cellular usage settings for this device.--> + <integer-array translatable="false" name="config_supported_cellular_usage_settings"> + <item>1</item> <!-- USAGE_SETTING_VOICE_CENTRIC --> + <item>2</item> <!-- USAGE_SETTING_DATA_CENTRIC --> + </integer-array> + <!-- When a radio power off request is received, we will delay completing the request until either IMS moves to the deregistered state or the timeout defined by this configuration elapses. If 0, this feature is disabled and we do not delay radio power off requests.--> @@ -5523,4 +5537,13 @@ </string-array> <integer name="config_chooser_max_targets_per_row">4</integer> + + <!-- Package that provides the supervised user creation flow. This package must include an + activity with an intent filter for {@link UserManager.ACTION_CREATE_SUPERVISED_USER}. + When this resource is defined, an extra button in user settings screen will be shown + with a title defined in @*android:string/supervised_user_creation_label + and an icon defined in @*android:drawable/ic_add_supervised_user. + That button will fire an intent targeted for this package with the mentioned action. + When this resource is empty, that button will not be shown. --> + <string name="config_supervisedUserCreationPackage" translatable="false"></string> </resources> diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index b9c75649b6ff..3d3c86006871 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -3249,6 +3249,7 @@ <public name="canDisplayOnRemoteDevices" /> <public name="supportedTypes" /> <public name="resetEnabledSettingsOnAppDataCleared" /> + <public name="supportsStylusHandwriting" /> </staging-public-group> <staging-public-group type="id" first-id="0x01de0000"> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 769e667a2b25..b16e462192f5 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -5374,6 +5374,8 @@ <string name="user_creation_account_exists">Allow <xliff:g id="app" example="Gmail">%1$s</xliff:g> to create a new User with <xliff:g id="account" example="foobar@gmail.com">%2$s</xliff:g> (a User with this account already exists) ?</string> <!-- Message to user that app is trying to create user for a specified account. [CHAR LIMIT=none] --> <string name="user_creation_adding">Allow <xliff:g id="app" example="Gmail">%1$s</xliff:g> to create a new User with <xliff:g id="account" example="foobar@gmail.com">%2$s</xliff:g> ?</string> + <!-- String label displayed on buttons that trigger the flow for creating supervised users. [CHAR LIMIT=35] --> + <string name="supervised_user_creation_label">Add supervised user</string> <!-- Locale picker strings --> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 55bf24b25b0d..504ad237345a 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -492,6 +492,8 @@ <java-symbol type="string" name="config_deviceSpecificDevicePolicyManagerService" /> <java-symbol type="string" name="config_deviceSpecificAudioService" /> <java-symbol type="integer" name="config_num_physical_slots" /> + <java-symbol type="integer" name="config_default_cellular_usage_setting" /> + <java-symbol type="array" name="config_supported_cellular_usage_settings" /> <java-symbol type="integer" name="config_delay_for_ims_dereg_millis" /> <java-symbol type="array" name="config_integrityRuleProviderPackages" /> <java-symbol type="bool" name="config_useAssistantVolume" /> @@ -4629,4 +4631,6 @@ <java-symbol type="integer" name="config_mashPressVibrateTimeOnPowerButton" /> <java-symbol type="string" name="config_systemGameService" /> + + <java-symbol type="string" name="config_supervisedUserCreationPackage"/> </resources> diff --git a/core/tests/coretests/src/android/view/MotionEventTest.java b/core/tests/coretests/src/android/view/MotionEventTest.java index 78a8f7b3f32e..c4c983d24af9 100644 --- a/core/tests/coretests/src/android/view/MotionEventTest.java +++ b/core/tests/coretests/src/android/view/MotionEventTest.java @@ -16,6 +16,7 @@ package android.view; +import static android.view.InputDevice.SOURCE_CLASS_POINTER; import static android.view.MotionEvent.ACTION_DOWN; import static android.view.MotionEvent.ACTION_POINTER_DOWN; import static android.view.MotionEvent.TOOL_TYPE_FINGER; @@ -214,4 +215,27 @@ public class MotionEventTest { rotInvalid.transform(mat); assertEquals(-1, rotInvalid.getSurfaceRotation()); } + + @Test + public void testUsesPointerSourceByDefault() { + final MotionEvent event = MotionEvent.obtain(0 /* downTime */, 0 /* eventTime */, + ACTION_DOWN, 0 /* x */, 0 /* y */, 0 /* metaState */); + assertTrue(event.isFromSource(SOURCE_CLASS_POINTER)); + } + + @Test + public void testLocationOffsetOnlyAppliedToNonPointerSources() { + final MotionEvent event = MotionEvent.obtain(0 /* downTime */, 0 /* eventTime */, + ACTION_DOWN, 10 /* x */, 20 /* y */, 0 /* metaState */); + event.offsetLocation(40, 50); + + // The offset should be applied since a pointer source is used by default. + assertEquals(50, (int) event.getX()); + assertEquals(70, (int) event.getY()); + + // The offset should not be applied if the source is changed to a non-pointer source. + event.setSource(InputDevice.SOURCE_JOYSTICK); + assertEquals(10, (int) event.getX()); + assertEquals(20, (int) event.getY()); + } } diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsTest.java index 4733f862ebba..69e617aaac19 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsTest.java @@ -83,7 +83,7 @@ public class BatteryUsageStatsTest { final Parcel parcel = Parcel.obtain(); parcel.writeParcelable(outBatteryUsageStats, 0); - assertThat(parcel.dataSize()).isLessThan(5000); + assertThat(parcel.dataSize()).isLessThan(5500); parcel.setDataPosition(0); diff --git a/core/tests/coretests/src/com/android/internal/os/MobileRadioPowerCalculatorTest.java b/core/tests/coretests/src/com/android/internal/os/MobileRadioPowerCalculatorTest.java index 48a1da15d574..8d9d79d0c4d9 100644 --- a/core/tests/coretests/src/com/android/internal/os/MobileRadioPowerCalculatorTest.java +++ b/core/tests/coretests/src/com/android/internal/os/MobileRadioPowerCalculatorTest.java @@ -26,6 +26,8 @@ import static org.mockito.Mockito.when; import android.net.NetworkCapabilities; import android.net.NetworkStats; import android.os.BatteryConsumer; +import android.os.BatteryStats; +import android.os.BatteryUsageStatsQuery; import android.os.Process; import android.os.UidBatteryConsumer; import android.telephony.DataConnectionRealTimeInfo; @@ -37,12 +39,15 @@ import android.telephony.TelephonyManager; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; +import com.google.common.collect.Range; + import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) @SmallTest +@SuppressWarnings("GuardedBy") public class MobileRadioPowerCalculatorTest { private static final double PRECISION = 0.00001; private static final int APP_UID = Process.FIRST_APPLICATION_UID + 42; @@ -55,7 +60,7 @@ public class MobileRadioPowerCalculatorTest { .setAveragePower(PowerProfile.POWER_RADIO_SCANNING, 720.0) .setAveragePower(PowerProfile.POWER_MODEM_CONTROLLER_RX, 1440.0) .setAveragePower(PowerProfile.POWER_MODEM_CONTROLLER_TX, - new double[] {720.0, 1080.0, 1440.0, 1800.0, 2160.0}) + new double[]{720.0, 1080.0, 1440.0, 1800.0, 2160.0}) .initMeasuredEnergyStatsLocked(); @Test @@ -81,7 +86,7 @@ public class MobileRadioPowerCalculatorTest { // Note established network stats.noteNetworkInterfaceForTransports("cellular", - new int[] { NetworkCapabilities.TRANSPORT_CELLULAR }); + new int[]{NetworkCapabilities.TRANSPORT_CELLULAR}); // Note application network activity NetworkStats networkStats = new NetworkStats(10000, 1) @@ -89,7 +94,7 @@ public class MobileRadioPowerCalculatorTest { mStatsRule.setNetworkStats(networkStats); ModemActivityInfo mai = new ModemActivityInfo(10000, 2000, 3000, - new int[] {100, 200, 300, 400, 500}, 600); + new int[]{100, 200, 300, 400, 500}, 600); stats.noteModemControllerActivity(mai, POWER_DATA_UNAVAILABLE, 10000, 10000); mStatsRule.setTime(12_000_000, 12_000_000); @@ -119,6 +124,90 @@ public class MobileRadioPowerCalculatorTest { } @Test + public void testTimerBasedModel_byProcessState() { + BatteryStatsImpl stats = mStatsRule.getBatteryStats(); + BatteryStatsImpl.Uid uid = stats.getUidStatsLocked(APP_UID); + + mStatsRule.setTime(1000, 1000); + uid.setProcessStateForTest( + BatteryStats.Uid.PROCESS_STATE_FOREGROUND, 1000); + + // Scan for a cell + stats.notePhoneStateLocked(ServiceState.STATE_OUT_OF_SERVICE, + TelephonyManager.SIM_STATE_READY, + 2000, 2000); + + // Found a cell + stats.notePhoneStateLocked(ServiceState.STATE_IN_SERVICE, TelephonyManager.SIM_STATE_READY, + 5000, 5000); + + // Note cell signal strength + SignalStrength signalStrength = mock(SignalStrength.class); + when(signalStrength.getLevel()).thenReturn(SignalStrength.SIGNAL_STRENGTH_MODERATE); + stats.notePhoneSignalStrengthLocked(signalStrength, 5000, 5000); + + stats.noteMobileRadioPowerStateLocked(DataConnectionRealTimeInfo.DC_POWER_STATE_HIGH, + 8_000_000_000L, APP_UID, 8000, 8000); + + // Note established network + stats.noteNetworkInterfaceForTransports("cellular", + new int[]{NetworkCapabilities.TRANSPORT_CELLULAR}); + + // Note application network activity + mStatsRule.setNetworkStats(new NetworkStats(10000, 1) + .insertEntry("cellular", APP_UID, 0, 0, 1000, 100, 2000, 20, 100)); + + stats.noteModemControllerActivity(null, POWER_DATA_UNAVAILABLE, 10000, 10000); + + uid.setProcessStateForTest( + BatteryStats.Uid.PROCESS_STATE_BACKGROUND, 11000); + + mStatsRule.setNetworkStats(new NetworkStats(12000, 1) + .insertEntry("cellular", APP_UID, 0, 0, 1000, 250, 2000, 80, 200)); + + stats.noteModemControllerActivity(null, POWER_DATA_UNAVAILABLE, 12000, 12000); + + assertThat(uid.getMobileRadioMeasuredBatteryConsumptionUC()).isAtMost(0); + // 12000-8000 = 4000 ms == 4_000_000 us + assertThat(uid.getMobileRadioActiveTimeInProcessState(BatteryConsumer.PROCESS_STATE_ANY)) + .isEqualTo(4_000_000); + assertThat(uid.getMobileRadioActiveTimeInProcessState( + BatteryConsumer.PROCESS_STATE_FOREGROUND)) + .isEqualTo(3_000_000); + assertThat(uid.getMobileRadioActiveTimeInProcessState( + BatteryConsumer.PROCESS_STATE_BACKGROUND)) + .isEqualTo(1_000_000); + assertThat(uid.getMobileRadioActiveTimeInProcessState( + BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE)) + .isEqualTo(0); + + MobileRadioPowerCalculator calculator = + new MobileRadioPowerCalculator(mStatsRule.getPowerProfile()); + + mStatsRule.apply(new BatteryUsageStatsQuery.Builder() + .powerProfileModeledOnly() + .includePowerModels() + .includeProcessStateData() + .build(), calculator); + + UidBatteryConsumer uidConsumer = mStatsRule.getUidBatteryConsumer(APP_UID); + + final BatteryConsumer.Key foreground = uidConsumer.getKey( + BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO, + BatteryConsumer.PROCESS_STATE_FOREGROUND); + final BatteryConsumer.Key background = uidConsumer.getKey( + BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO, + BatteryConsumer.PROCESS_STATE_BACKGROUND); + final BatteryConsumer.Key fgs = uidConsumer.getKey( + BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO, + BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE); + + assertThat(uidConsumer.getConsumedPower(foreground)).isWithin(PRECISION).of(1.2); + assertThat(uidConsumer.getConsumedPower(background)).isWithin(PRECISION).of(0.4); + assertThat(uidConsumer.getConsumedPower(fgs)).isWithin(PRECISION).of(0); + } + + @Test public void testMeasuredEnergyBasedModel() { BatteryStatsImpl stats = mStatsRule.getBatteryStats(); @@ -141,7 +230,7 @@ public class MobileRadioPowerCalculatorTest { // Note established network stats.noteNetworkInterfaceForTransports("cellular", - new int[] { NetworkCapabilities.TRANSPORT_CELLULAR }); + new int[]{NetworkCapabilities.TRANSPORT_CELLULAR}); // Note application network activity NetworkStats networkStats = new NetworkStats(10000, 1) @@ -149,7 +238,7 @@ public class MobileRadioPowerCalculatorTest { mStatsRule.setNetworkStats(networkStats); ModemActivityInfo mai = new ModemActivityInfo(10000, 2000, 3000, - new int[] {100, 200, 300, 400, 500}, 600); + new int[]{100, 200, 300, 400, 500}, 600); stats.noteModemControllerActivity(mai, 10_000_000, 10000, 10000); mStatsRule.setTime(12_000_000, 12_000_000); @@ -177,4 +266,87 @@ public class MobileRadioPowerCalculatorTest { assertThat(appsConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO)) .isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY); } + + @Test + public void testMeasuredEnergyBasedModel_byProcessState() { + BatteryStatsImpl stats = mStatsRule.getBatteryStats(); + BatteryStatsImpl.Uid uid = stats.getUidStatsLocked(APP_UID); + + mStatsRule.setTime(1000, 1000); + uid.setProcessStateForTest( + BatteryStats.Uid.PROCESS_STATE_FOREGROUND, 1000); + + // Scan for a cell + stats.notePhoneStateLocked(ServiceState.STATE_OUT_OF_SERVICE, + TelephonyManager.SIM_STATE_READY, + 2000, 2000); + + // Found a cell + stats.notePhoneStateLocked(ServiceState.STATE_IN_SERVICE, TelephonyManager.SIM_STATE_READY, + 5000, 5000); + + // Note cell signal strength + SignalStrength signalStrength = mock(SignalStrength.class); + when(signalStrength.getLevel()).thenReturn(SignalStrength.SIGNAL_STRENGTH_MODERATE); + stats.notePhoneSignalStrengthLocked(signalStrength, 5000, 5000); + + stats.noteMobileRadioPowerStateLocked(DataConnectionRealTimeInfo.DC_POWER_STATE_HIGH, + 8_000_000_000L, APP_UID, 8000, 8000); + + // Note established network + stats.noteNetworkInterfaceForTransports("cellular", + new int[]{NetworkCapabilities.TRANSPORT_CELLULAR}); + + // Note application network activity + mStatsRule.setNetworkStats(new NetworkStats(10000, 1) + .insertEntry("cellular", APP_UID, 0, 0, 1000, 100, 2000, 20, 100)); + + stats.noteModemControllerActivity(null, 10_000_000, 10000, 10000); + + uid.setProcessStateForTest( + BatteryStats.Uid.PROCESS_STATE_BACKGROUND, 11000); + + mStatsRule.setNetworkStats(new NetworkStats(12000, 1) + .insertEntry("cellular", APP_UID, 0, 0, 1000, 250, 2000, 80, 200)); + + stats.noteModemControllerActivity(null, 15_000_000, 12000, 12000); + + mStatsRule.setTime(20000, 20000); + + assertThat(uid.getMobileRadioMeasuredBatteryConsumptionUC()) + .isIn(Range.open(20_000_000L, 21_000_000L)); + assertThat(uid.getMobileRadioMeasuredBatteryConsumptionUC( + BatteryConsumer.PROCESS_STATE_FOREGROUND)) + .isIn(Range.open(13_000_000L, 14_000_000L)); + assertThat(uid.getMobileRadioMeasuredBatteryConsumptionUC( + BatteryConsumer.PROCESS_STATE_BACKGROUND)) + .isIn(Range.open(7_000_000L, 8_000_000L)); + assertThat(uid.getMobileRadioMeasuredBatteryConsumptionUC( + BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE)) + .isEqualTo(0); + + MobileRadioPowerCalculator calculator = + new MobileRadioPowerCalculator(mStatsRule.getPowerProfile()); + + mStatsRule.apply(new BatteryUsageStatsQuery.Builder() + .includePowerModels() + .includeProcessStateData() + .build(), calculator); + + UidBatteryConsumer uidConsumer = mStatsRule.getUidBatteryConsumer(APP_UID); + + final BatteryConsumer.Key foreground = uidConsumer.getKey( + BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO, + BatteryConsumer.PROCESS_STATE_FOREGROUND); + final BatteryConsumer.Key background = uidConsumer.getKey( + BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO, + BatteryConsumer.PROCESS_STATE_BACKGROUND); + final BatteryConsumer.Key fgs = uidConsumer.getKey( + BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO, + BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE); + + assertThat(uidConsumer.getConsumedPower(foreground)).isWithin(PRECISION).of(3.62064); + assertThat(uidConsumer.getConsumedPower(background)).isWithin(PRECISION).of(2.08130); + assertThat(uidConsumer.getConsumedPower(fgs)).isWithin(PRECISION).of(0); + } } diff --git a/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java b/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java index e4c83f175a71..4faf349aad7e 100644 --- a/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java +++ b/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java @@ -233,6 +233,11 @@ public class MockBatteryStatsImpl extends BatteryStatsImpl { public Future<?> scheduleSyncDueToBatteryLevelChange(long delayMillis) { return null; } + + @Override + public Future<?> scheduleSyncDueToProcessStateChange(long delayMillis) { + return null; + } } } diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml index 624940bd3823..e61a665307f8 100644 --- a/data/etc/privapp-permissions-platform.xml +++ b/data/etc/privapp-permissions-platform.xml @@ -427,7 +427,6 @@ applications that come with the platform <permission name="android.permission.COMPANION_APPROVE_WIFI_CONNECTIONS" /> <permission name="android.permission.MANAGE_COMPANION_DEVICES" /> <permission name="android.permission.REQUEST_COMPANION_PROFILE_APP_STREAMING" /> - <permission name="android.permission.REQUEST_COMPANION_PROFILE_AUTOMOTIVE_PROJECTION" /> <permission name="android.permission.REQUEST_COMPANION_PROFILE_WATCH" /> <permission name="android.permission.REQUEST_COMPANION_SELF_MANAGED" /> <!-- Permission required for testing registering pull atom callbacks. --> diff --git a/graphics/java/android/graphics/BaseCanvas.java b/graphics/java/android/graphics/BaseCanvas.java index a612265793a3..425a37891afb 100644 --- a/graphics/java/android/graphics/BaseCanvas.java +++ b/graphics/java/android/graphics/BaseCanvas.java @@ -67,7 +67,7 @@ public abstract class BaseCanvas { * @hide */ protected int mDensity = Bitmap.DENSITY_NONE; - private boolean mAllowHwBitmapsInSwMode = false; + private boolean mAllowHwFeaturesInSwMode = false; protected void throwIfCannotDraw(Bitmap bitmap) { if (bitmap.isRecycled()) { @@ -101,14 +101,14 @@ public abstract class BaseCanvas { public void drawArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter, @NonNull Paint paint) { - throwIfHasHwBitmapInSwMode(paint); + throwIfHasHwFeaturesInSwMode(paint); nDrawArc(mNativeCanvasWrapper, left, top, right, bottom, startAngle, sweepAngle, useCenter, paint.getNativeInstance()); } public void drawArc(@NonNull RectF oval, float startAngle, float sweepAngle, boolean useCenter, @NonNull Paint paint) { - throwIfHasHwBitmapInSwMode(paint); + throwIfHasHwFeaturesInSwMode(paint); drawArc(oval.left, oval.top, oval.right, oval.bottom, startAngle, sweepAngle, useCenter, paint); } @@ -119,14 +119,14 @@ public abstract class BaseCanvas { public void drawBitmap(@NonNull Bitmap bitmap, float left, float top, @Nullable Paint paint) { throwIfCannotDraw(bitmap); - throwIfHasHwBitmapInSwMode(paint); + throwIfHasHwFeaturesInSwMode(paint); nDrawBitmap(mNativeCanvasWrapper, bitmap.getNativeInstance(), left, top, paint != null ? paint.getNativeInstance() : 0, mDensity, mScreenDensity, bitmap.mDensity); } public void drawBitmap(@NonNull Bitmap bitmap, @NonNull Matrix matrix, @Nullable Paint paint) { - throwIfHasHwBitmapInSwMode(paint); + throwIfHasHwFeaturesInSwMode(paint); nDrawBitmapMatrix(mNativeCanvasWrapper, bitmap.getNativeInstance(), matrix.ni(), paint != null ? paint.getNativeInstance() : 0); } @@ -137,7 +137,7 @@ public abstract class BaseCanvas { throw new NullPointerException(); } throwIfCannotDraw(bitmap); - throwIfHasHwBitmapInSwMode(paint); + throwIfHasHwFeaturesInSwMode(paint); final long nativePaint = paint == null ? 0 : paint.getNativeInstance(); int left, top, right, bottom; @@ -163,7 +163,7 @@ public abstract class BaseCanvas { throw new NullPointerException(); } throwIfCannotDraw(bitmap); - throwIfHasHwBitmapInSwMode(paint); + throwIfHasHwFeaturesInSwMode(paint); final long nativePaint = paint == null ? 0 : paint.getNativeInstance(); float left, top, right, bottom; @@ -202,7 +202,7 @@ public abstract class BaseCanvas { || (lastScanline + width > length)) { throw new ArrayIndexOutOfBoundsException(); } - throwIfHasHwBitmapInSwMode(paint); + throwIfHasHwFeaturesInSwMode(paint); // quick escape if there's nothing to draw if (width == 0 || height == 0) { return; @@ -226,7 +226,7 @@ public abstract class BaseCanvas { if ((meshWidth | meshHeight | vertOffset | colorOffset) < 0) { throw new ArrayIndexOutOfBoundsException(); } - throwIfHasHwBitmapInSwMode(paint); + throwIfHasHwFeaturesInSwMode(paint); if (meshWidth == 0 || meshHeight == 0) { return; } @@ -243,7 +243,7 @@ public abstract class BaseCanvas { } public void drawCircle(float cx, float cy, float radius, @NonNull Paint paint) { - throwIfHasHwBitmapInSwMode(paint); + throwIfHasHwFeaturesInSwMode(paint); nDrawCircle(mNativeCanvasWrapper, cx, cy, radius, paint.getNativeInstance()); } @@ -275,23 +275,23 @@ public abstract class BaseCanvas { public void drawLine(float startX, float startY, float stopX, float stopY, @NonNull Paint paint) { - throwIfHasHwBitmapInSwMode(paint); + throwIfHasHwFeaturesInSwMode(paint); nDrawLine(mNativeCanvasWrapper, startX, startY, stopX, stopY, paint.getNativeInstance()); } public void drawLines(@Size(multiple = 4) @NonNull float[] pts, int offset, int count, @NonNull Paint paint) { - throwIfHasHwBitmapInSwMode(paint); + throwIfHasHwFeaturesInSwMode(paint); nDrawLines(mNativeCanvasWrapper, pts, offset, count, paint.getNativeInstance()); } public void drawLines(@Size(multiple = 4) @NonNull float[] pts, @NonNull Paint paint) { - throwIfHasHwBitmapInSwMode(paint); + throwIfHasHwFeaturesInSwMode(paint); drawLines(pts, 0, pts.length, paint); } public void drawOval(float left, float top, float right, float bottom, @NonNull Paint paint) { - throwIfHasHwBitmapInSwMode(paint); + throwIfHasHwFeaturesInSwMode(paint); nDrawOval(mNativeCanvasWrapper, left, top, right, bottom, paint.getNativeInstance()); } @@ -299,18 +299,19 @@ public abstract class BaseCanvas { if (oval == null) { throw new NullPointerException(); } - throwIfHasHwBitmapInSwMode(paint); + throwIfHasHwFeaturesInSwMode(paint); drawOval(oval.left, oval.top, oval.right, oval.bottom, paint); } public void drawPaint(@NonNull Paint paint) { + throwIfHasHwFeaturesInSwMode(paint); nDrawPaint(mNativeCanvasWrapper, paint.getNativeInstance()); } public void drawPatch(@NonNull NinePatch patch, @NonNull Rect dst, @Nullable Paint paint) { Bitmap bitmap = patch.getBitmap(); throwIfCannotDraw(bitmap); - throwIfHasHwBitmapInSwMode(paint); + throwIfHasHwFeaturesInSwMode(paint); final long nativePaint = paint == null ? 0 : paint.getNativeInstance(); nDrawNinePatch(mNativeCanvasWrapper, bitmap.getNativeInstance(), patch.mNativeChunk, dst.left, dst.top, dst.right, dst.bottom, nativePaint, @@ -320,7 +321,7 @@ public abstract class BaseCanvas { public void drawPatch(@NonNull NinePatch patch, @NonNull RectF dst, @Nullable Paint paint) { Bitmap bitmap = patch.getBitmap(); throwIfCannotDraw(bitmap); - throwIfHasHwBitmapInSwMode(paint); + throwIfHasHwFeaturesInSwMode(paint); final long nativePaint = paint == null ? 0 : paint.getNativeInstance(); nDrawNinePatch(mNativeCanvasWrapper, bitmap.getNativeInstance(), patch.mNativeChunk, dst.left, dst.top, dst.right, dst.bottom, nativePaint, @@ -328,7 +329,7 @@ public abstract class BaseCanvas { } public void drawPath(@NonNull Path path, @NonNull Paint paint) { - throwIfHasHwBitmapInSwMode(paint); + throwIfHasHwFeaturesInSwMode(paint); if (path.isSimplePath && path.rects != null) { nDrawRegion(mNativeCanvasWrapper, path.rects.mNativeRegion, paint.getNativeInstance()); } else { @@ -337,18 +338,18 @@ public abstract class BaseCanvas { } public void drawPoint(float x, float y, @NonNull Paint paint) { - throwIfHasHwBitmapInSwMode(paint); + throwIfHasHwFeaturesInSwMode(paint); nDrawPoint(mNativeCanvasWrapper, x, y, paint.getNativeInstance()); } public void drawPoints(@Size(multiple = 2) float[] pts, int offset, int count, @NonNull Paint paint) { - throwIfHasHwBitmapInSwMode(paint); + throwIfHasHwFeaturesInSwMode(paint); nDrawPoints(mNativeCanvasWrapper, pts, offset, count, paint.getNativeInstance()); } public void drawPoints(@Size(multiple = 2) @NonNull float[] pts, @NonNull Paint paint) { - throwIfHasHwBitmapInSwMode(paint); + throwIfHasHwFeaturesInSwMode(paint); drawPoints(pts, 0, pts.length, paint); } @@ -359,7 +360,7 @@ public abstract class BaseCanvas { if (index < 0 || index + count > text.length || count * 2 > pos.length) { throw new IndexOutOfBoundsException(); } - throwIfHasHwBitmapInSwMode(paint); + throwIfHasHwFeaturesInSwMode(paint); for (int i = 0; i < count; i++) { drawText(text, index + i, 1, pos[i * 2], pos[i * 2 + 1], paint); } @@ -368,22 +369,22 @@ public abstract class BaseCanvas { @Deprecated public void drawPosText(@NonNull String text, @NonNull @Size(multiple = 2) float[] pos, @NonNull Paint paint) { - throwIfHasHwBitmapInSwMode(paint); + throwIfHasHwFeaturesInSwMode(paint); drawPosText(text.toCharArray(), 0, text.length(), pos, paint); } public void drawRect(float left, float top, float right, float bottom, @NonNull Paint paint) { - throwIfHasHwBitmapInSwMode(paint); + throwIfHasHwFeaturesInSwMode(paint); nDrawRect(mNativeCanvasWrapper, left, top, right, bottom, paint.getNativeInstance()); } public void drawRect(@NonNull Rect r, @NonNull Paint paint) { - throwIfHasHwBitmapInSwMode(paint); + throwIfHasHwFeaturesInSwMode(paint); drawRect(r.left, r.top, r.right, r.bottom, paint); } public void drawRect(@NonNull RectF rect, @NonNull Paint paint) { - throwIfHasHwBitmapInSwMode(paint); + throwIfHasHwFeaturesInSwMode(paint); nDrawRect(mNativeCanvasWrapper, rect.left, rect.top, rect.right, rect.bottom, paint.getNativeInstance()); } @@ -394,13 +395,13 @@ public abstract class BaseCanvas { public void drawRoundRect(float left, float top, float right, float bottom, float rx, float ry, @NonNull Paint paint) { - throwIfHasHwBitmapInSwMode(paint); + throwIfHasHwFeaturesInSwMode(paint); nDrawRoundRect(mNativeCanvasWrapper, left, top, right, bottom, rx, ry, paint.getNativeInstance()); } public void drawRoundRect(@NonNull RectF rect, float rx, float ry, @NonNull Paint paint) { - throwIfHasHwBitmapInSwMode(paint); + throwIfHasHwFeaturesInSwMode(paint); drawRoundRect(rect.left, rect.top, rect.right, rect.bottom, rx, ry, paint); } @@ -410,7 +411,7 @@ public abstract class BaseCanvas { */ public void drawDoubleRoundRect(@NonNull RectF outer, float outerRx, float outerRy, @NonNull RectF inner, float innerRx, float innerRy, @NonNull Paint paint) { - throwIfHasHwBitmapInSwMode(paint); + throwIfHasHwFeaturesInSwMode(paint); float outerLeft = outer.left; float outerTop = outer.top; float outerRight = outer.right; @@ -431,7 +432,7 @@ public abstract class BaseCanvas { */ public void drawDoubleRoundRect(@NonNull RectF outer, @NonNull float[] outerRadii, @NonNull RectF inner, @NonNull float[] innerRadii, @NonNull Paint paint) { - throwIfHasHwBitmapInSwMode(paint); + throwIfHasHwFeaturesInSwMode(paint); if (innerRadii == null || outerRadii == null || innerRadii.length != 8 || outerRadii.length != 8) { throw new IllegalArgumentException("Both inner and outer radii arrays must contain " @@ -509,7 +510,7 @@ public abstract class BaseCanvas { (text.length - index - count)) < 0) { throw new IndexOutOfBoundsException(); } - throwIfHasHwBitmapInSwMode(paint); + throwIfHasHwFeaturesInSwMode(paint); nDrawText(mNativeCanvasWrapper, text, index, count, x, y, paint.mBidiFlags, paint.getNativeInstance()); } @@ -519,7 +520,7 @@ public abstract class BaseCanvas { if ((start | end | (end - start) | (text.length() - end)) < 0) { throw new IndexOutOfBoundsException(); } - throwIfHasHwBitmapInSwMode(paint); + throwIfHasHwFeaturesInSwMode(paint); if (text instanceof String || text instanceof SpannedString || text instanceof SpannableString) { nDrawText(mNativeCanvasWrapper, text.toString(), start, end, x, y, @@ -537,7 +538,7 @@ public abstract class BaseCanvas { } public void drawText(@NonNull String text, float x, float y, @NonNull Paint paint) { - throwIfHasHwBitmapInSwMode(paint); + throwIfHasHwFeaturesInSwMode(paint); nDrawText(mNativeCanvasWrapper, text, 0, text.length(), x, y, paint.mBidiFlags, paint.getNativeInstance()); } @@ -547,7 +548,7 @@ public abstract class BaseCanvas { if ((start | end | (end - start) | (text.length() - end)) < 0) { throw new IndexOutOfBoundsException(); } - throwIfHasHwBitmapInSwMode(paint); + throwIfHasHwFeaturesInSwMode(paint); nDrawText(mNativeCanvasWrapper, text, start, end, x, y, paint.mBidiFlags, paint.getNativeInstance()); } @@ -557,7 +558,7 @@ public abstract class BaseCanvas { if (index < 0 || index + count > text.length) { throw new ArrayIndexOutOfBoundsException(); } - throwIfHasHwBitmapInSwMode(paint); + throwIfHasHwFeaturesInSwMode(paint); nDrawTextOnPath(mNativeCanvasWrapper, text, index, count, path.readOnlyNI(), hOffset, vOffset, paint.mBidiFlags, paint.getNativeInstance()); @@ -566,7 +567,7 @@ public abstract class BaseCanvas { public void drawTextOnPath(@NonNull String text, @NonNull Path path, float hOffset, float vOffset, @NonNull Paint paint) { if (text.length() > 0) { - throwIfHasHwBitmapInSwMode(paint); + throwIfHasHwFeaturesInSwMode(paint); nDrawTextOnPath(mNativeCanvasWrapper, text, path.readOnlyNI(), hOffset, vOffset, paint.mBidiFlags, paint.getNativeInstance()); } @@ -587,7 +588,7 @@ public abstract class BaseCanvas { throw new IndexOutOfBoundsException(); } - throwIfHasHwBitmapInSwMode(paint); + throwIfHasHwFeaturesInSwMode(paint); nDrawTextRun(mNativeCanvasWrapper, text, index, count, contextIndex, contextCount, x, y, isRtl, paint.getNativeInstance(), 0 /* measured text */); } @@ -606,7 +607,7 @@ public abstract class BaseCanvas { throw new IndexOutOfBoundsException(); } - throwIfHasHwBitmapInSwMode(paint); + throwIfHasHwFeaturesInSwMode(paint); if (text instanceof String || text instanceof SpannedString || text instanceof SpannableString) { nDrawTextRun(mNativeCanvasWrapper, text.toString(), start, end, contextStart, @@ -664,7 +665,7 @@ public abstract class BaseCanvas { if (indices != null) { checkRange(indices.length, indexOffset, indexCount); } - throwIfHasHwBitmapInSwMode(paint); + throwIfHasHwFeaturesInSwMode(paint); nDrawVertices(mNativeCanvasWrapper, mode.nativeInt, vertexCount, verts, vertOffset, texs, texOffset, colors, colorOffset, indices, indexOffset, indexCount, paint.getNativeInstance()); @@ -680,50 +681,52 @@ public abstract class BaseCanvas { /** * @hide */ - public void setHwBitmapsInSwModeEnabled(boolean enabled) { - mAllowHwBitmapsInSwMode = enabled; + public void setHwFeaturesInSwModeEnabled(boolean enabled) { + mAllowHwFeaturesInSwMode = enabled; } /** * @hide */ - public boolean isHwBitmapsInSwModeEnabled() { - return mAllowHwBitmapsInSwMode; + public boolean isHwFeaturesInSwModeEnabled() { + return mAllowHwFeaturesInSwMode; } /** + * If true throw an exception * @hide */ - protected void onHwBitmapInSwMode() { - if (!mAllowHwBitmapsInSwMode) { - throw new IllegalArgumentException( - "Software rendering doesn't support hardware bitmaps"); - } + protected boolean onHwFeatureInSwMode() { + return !mAllowHwFeaturesInSwMode; } private void throwIfHwBitmapInSwMode(Bitmap bitmap) { - if (!isHardwareAccelerated() && bitmap.getConfig() == Bitmap.Config.HARDWARE) { - onHwBitmapInSwMode(); + if (!isHardwareAccelerated() && bitmap.getConfig() == Bitmap.Config.HARDWARE + && onHwFeatureInSwMode()) { + throw new IllegalArgumentException( + "Software rendering doesn't support hardware bitmaps"); } } - private void throwIfHasHwBitmapInSwMode(Paint p) { + private void throwIfHasHwFeaturesInSwMode(Paint p) { if (isHardwareAccelerated() || p == null) { return; } - throwIfHasHwBitmapInSwMode(p.getShader()); + throwIfHasHwFeaturesInSwMode(p.getShader()); } - private void throwIfHasHwBitmapInSwMode(Shader shader) { + private void throwIfHasHwFeaturesInSwMode(Shader shader) { if (shader == null) { return; } if (shader instanceof BitmapShader) { throwIfHwBitmapInSwMode(((BitmapShader) shader).mBitmap); - } - if (shader instanceof ComposeShader) { - throwIfHasHwBitmapInSwMode(((ComposeShader) shader).mShaderA); - throwIfHasHwBitmapInSwMode(((ComposeShader) shader).mShaderB); + } else if (shader instanceof RuntimeShader && onHwFeatureInSwMode()) { + throw new IllegalArgumentException( + "Software rendering doesn't support RuntimeShader"); + } else if (shader instanceof ComposeShader) { + throwIfHasHwFeaturesInSwMode(((ComposeShader) shader).mShaderA); + throwIfHasHwFeaturesInSwMode(((ComposeShader) shader).mShaderB); } } diff --git a/graphics/java/android/graphics/Picture.java b/graphics/java/android/graphics/Picture.java index 390d3d414346..ee4165b8da05 100644 --- a/graphics/java/android/graphics/Picture.java +++ b/graphics/java/android/graphics/Picture.java @@ -124,7 +124,7 @@ public class Picture { public void endRecording() { verifyValid(); if (mRecordingCanvas != null) { - mRequiresHwAcceleration = mRecordingCanvas.mHoldsHwBitmap; + mRequiresHwAcceleration = mRecordingCanvas.mUsesHwFeature; mRecordingCanvas = null; nativeEndRecording(mNativePicture); } @@ -182,8 +182,10 @@ public class Picture { if (mRecordingCanvas != null) { endRecording(); } - if (mRequiresHwAcceleration && !canvas.isHardwareAccelerated()) { - canvas.onHwBitmapInSwMode(); + if (mRequiresHwAcceleration && !canvas.isHardwareAccelerated() + && canvas.onHwFeatureInSwMode()) { + throw new IllegalArgumentException("Software rendering not supported for Pictures that" + + " require hardware acceleration"); } nativeDraw(canvas.getNativeCanvasWrapper(), mNativePicture); } @@ -242,7 +244,7 @@ public class Picture { private static class PictureCanvas extends Canvas { private final Picture mPicture; - boolean mHoldsHwBitmap; + boolean mUsesHwFeature; public PictureCanvas(Picture pict, long nativeCanvas) { super(nativeCanvas); @@ -265,8 +267,9 @@ public class Picture { } @Override - protected void onHwBitmapInSwMode() { - mHoldsHwBitmap = true; + protected boolean onHwFeatureInSwMode() { + mUsesHwFeature = true; + return false; } } } diff --git a/graphics/java/android/graphics/RuntimeShader.java b/graphics/java/android/graphics/RuntimeShader.java index 1ace32277f0a..9ca8e3b46317 100644 --- a/graphics/java/android/graphics/RuntimeShader.java +++ b/graphics/java/android/graphics/RuntimeShader.java @@ -16,13 +16,15 @@ package android.graphics; +import android.annotation.ColorInt; +import android.annotation.ColorLong; import android.annotation.NonNull; import libcore.util.NativeAllocationRegistry; /** - * Shader that calculates pixel output with a program (fragment shader) running on a GPU. - * @hide + * Shader that calculates per-pixel color via a user defined Android Graphics Shading Language + * (AGSL) function. */ public class RuntimeShader extends Shader { @@ -32,7 +34,7 @@ public class RuntimeShader extends Shader { RuntimeShader.class.getClassLoader(), nativeGetFinalizer()); } - private boolean mIsOpaque; + private boolean mForceOpaque; /** * Current native shader builder instance. @@ -42,57 +44,270 @@ public class RuntimeShader extends Shader { /** * Creates a new RuntimeShader. * - * @param sksl The text of SKSL program to run on the GPU. - * @param uniforms Array of parameters passed by the SKSL shader. Array size depends - * on number of uniforms declared by sksl. - * @param isOpaque True if all pixels have alpha 1.0f. + * @param shader The text of AGSL shader program to run. */ - public RuntimeShader(@NonNull String sksl, boolean isOpaque) { + public RuntimeShader(@NonNull String shader) { + this(shader, false); + } + + /** + * Creates a new RuntimeShader. + * + * @param shader The text of AGSL shader program to run. + * @param forceOpaque If true then all pixels produced by the AGSL shader program will have an + * alpha of 1.0f. + */ + public RuntimeShader(@NonNull String shader, boolean forceOpaque) { + // colorspace is required, but the RuntimeShader always produces colors in the destination + // buffer's colorspace regardless of the value specified here. super(ColorSpace.get(ColorSpace.Named.SRGB)); - mIsOpaque = isOpaque; - mNativeInstanceRuntimeShaderBuilder = nativeCreateBuilder(sksl); + if (shader == null) { + throw new NullPointerException("RuntimeShader requires a non-null AGSL string"); + } + mForceOpaque = forceOpaque; + mNativeInstanceRuntimeShaderBuilder = nativeCreateBuilder(shader); NoImagePreloadHolder.sRegistry.registerNativeAllocation( this, mNativeInstanceRuntimeShaderBuilder); } + public boolean isForceOpaque() { + return mForceOpaque; + } + + /** + * Sets the uniform color value corresponding to this shader. If the shader does not have a + * uniform with that name or if the uniform is declared with a type other than vec3 or vec4 and + * corresponding layout(color) annotation then an IllegalArgumentException is thrown. + * + * @param uniformName name matching the color uniform declared in the AGSL shader program + * @param color the provided sRGB color will be transformed into the shader program's output + * colorspace and will be available as a vec4 uniform in the program. + */ + public void setColorUniform(@NonNull String uniformName, @ColorInt int color) { + setUniform(uniformName, Color.valueOf(color).getComponents(), true); + } + + /** + * Sets the uniform color value corresponding to this shader. If the shader does not have a + * uniform with that name or if the uniform is declared with a type other than vec3 or vec4 and + * corresponding layout(color) annotation then an IllegalArgumentException is thrown. + * + * @param uniformName name matching the color uniform declared in the AGSL shader program + * @param color the provided sRGB color will be transformed into the shader program's output + * colorspace and will be available as a vec4 uniform in the program. + */ + public void setColorUniform(@NonNull String uniformName, @ColorLong long color) { + Color exSRGB = Color.valueOf(color).convert(ColorSpace.get(ColorSpace.Named.EXTENDED_SRGB)); + setUniform(uniformName, exSRGB.getComponents(), true); + } + + /** + * Sets the uniform color value corresponding to this shader. If the shader does not have a + * uniform with that name or if the uniform is declared with a type other than vec3 or vec4 and + * corresponding layout(color) annotation then an IllegalArgumentException is thrown. + * + * @param uniformName name matching the color uniform declared in the AGSL shader program + * @param color the provided sRGB color will be transformed into the shader program's output + * colorspace and will be available as a vec4 uniform in the program. + */ + public void setColorUniform(@NonNull String uniformName, @NonNull Color color) { + if (color == null) { + throw new NullPointerException("The color parameter must not be null"); + } + Color exSRGB = color.convert(ColorSpace.get(ColorSpace.Named.EXTENDED_SRGB)); + setUniform(uniformName, exSRGB.getComponents(), true); + } + + /** + * Sets the uniform value corresponding to this shader. If the shader does not have a uniform + * with that name or if the uniform is declared with a type other than a float or float[1] + * then an IllegalArgumentException is thrown. + * + * @param uniformName name matching the uniform declared in the AGSL shader program + */ + public void setFloatUniform(@NonNull String uniformName, float value) { + setFloatUniform(uniformName, value, 0.0f, 0.0f, 0.0f, 1); + } + /** * Sets the uniform value corresponding to this shader. If the shader does not have a uniform - * with that name or if the uniform is declared with a type other than float then an + * with that name or if the uniform is declared with a type other than vec2 or float[2] then an * IllegalArgumentException is thrown. * - * @param uniformName name matching the uniform declared in the SKSL shader - * @param value + * @param uniformName name matching the uniform declared in the AGSL shader program */ - public void setUniform(@NonNull String uniformName, float value) { - setUniform(uniformName, new float[] {value}); + public void setFloatUniform(@NonNull String uniformName, float value1, float value2) { + setFloatUniform(uniformName, value1, value2, 0.0f, 0.0f, 2); + } /** * Sets the uniform value corresponding to this shader. If the shader does not have a uniform - * with that name or if the uniform is declared with a type other than float2/vec2 then an + * with that name or if the uniform is declared with a type other than vec3 or float[3] then an * IllegalArgumentException is thrown. * - * @param uniformName name matching the uniform declared in the SKSL shader - * @param value1 - * @param value2 + * @param uniformName name matching the uniform declared in the AGSL shader program */ - public void setUniform(@NonNull String uniformName, float value1, float value2) { - setUniform(uniformName, new float[] {value1, value2}); + public void setFloatUniform(@NonNull String uniformName, float value1, float value2, + float value3) { + setFloatUniform(uniformName, value1, value2, value3, 0.0f, 3); + + } + + /** + * Sets the uniform value corresponding to this shader. If the shader does not have a uniform + * with that name or if the uniform is declared with a type other than vec4 or float[4] then an + * IllegalArgumentException is thrown. + * + * @param uniformName name matching the uniform declared in the AGSL shader program + */ + public void setFloatUniform(@NonNull String uniformName, float value1, float value2, + float value3, float value4) { + setFloatUniform(uniformName, value1, value2, value3, value4, 4); } /** * Sets the uniform value corresponding to this shader. If the shader does not have a uniform - * with that name or if the uniform is declared with a type other than a vecN/floatN where N is - * the size of the values array then an IllegalArgumentException is thrown. + * with that name or if the uniform is declared with a type other than a float (for N=1), vecN, + * or float[N] where N is the length of the values param then an IllegalArgumentException is + * thrown. * - * @param uniformName name matching the uniform declared in the SKSL shader - * @param values + * @param uniformName name matching the uniform declared in the AGSL shader program */ + public void setFloatUniform(@NonNull String uniformName, @NonNull float[] values) { + setUniform(uniformName, values, false); + } + + /** + * Old method signature used by some callers within the platform code + * @hide + * @deprecated use setFloatUniform instead + */ + @Deprecated public void setUniform(@NonNull String uniformName, float[] values) { + setFloatUniform(uniformName, values); + } + + /** + * Old method signature used by some callers within the platform code + * @hide + * @deprecated use setFloatUniform instead + */ + @Deprecated + public void setUniform(@NonNull String uniformName, float value) { + setFloatUniform(uniformName, value); + } + + /** + * Old method signature used by some callers within the platform code + * @hide + * @deprecated use setFloatUniform instead + */ + @Deprecated + public void setUniform(@NonNull String uniformName, float value1, float value2) { + setFloatUniform(uniformName, value1, value2); + } + + private void setFloatUniform(@NonNull String uniformName, float value1, float value2, + float value3, float value4, int count) { + if (uniformName == null) { + throw new NullPointerException("The uniformName parameter must not be null"); + } + + nativeUpdateUniforms(mNativeInstanceRuntimeShaderBuilder, uniformName, value1, value2, + value3, value4, count); + discardNativeInstance(); + } + + private void setUniform(@NonNull String uniformName, @NonNull float[] values, boolean isColor) { + if (uniformName == null) { + throw new NullPointerException("The uniformName parameter must not be null"); + } + if (values == null) { + throw new NullPointerException("The uniform values parameter must not be null"); + } + + nativeUpdateUniforms(mNativeInstanceRuntimeShaderBuilder, uniformName, values, isColor); + discardNativeInstance(); + } + + /** + * Sets the uniform value corresponding to this shader. If the shader does not have a uniform + * with that name or if the uniform is declared with a type other than an int or int[1] + * then an IllegalArgumentException is thrown. + * + * @param uniformName name matching the uniform declared in the AGSL shader program + */ + public void setIntUniform(@NonNull String uniformName, int value) { + setIntUniform(uniformName, value, 0, 0, 0, 1); + } + + /** + * Sets the uniform value corresponding to this shader. If the shader does not have a uniform + * with that name or if the uniform is declared with a type other than ivec2 or int[2] then an + * IllegalArgumentException is thrown. + * + * @param uniformName name matching the uniform declared in the AGSL shader program + */ + public void setIntUniform(@NonNull String uniformName, int value1, int value2) { + setIntUniform(uniformName, value1, value2, 0, 0, 2); + + } + + /** + * Sets the uniform value corresponding to this shader. If the shader does not have a uniform + * with that name or if the uniform is declared with a type other than ivec3 or int[3] then an + * IllegalArgumentException is thrown. + * + * @param uniformName name matching the uniform declared in the AGSL shader program + */ + public void setIntUniform(@NonNull String uniformName, int value1, int value2, int value3) { + setIntUniform(uniformName, value1, value2, value3, 0, 3); + + } + + /** + * Sets the uniform value corresponding to this shader. If the shader does not have a uniform + * with that name or if the uniform is declared with a type other than ivec4 or int[4] then an + * IllegalArgumentException is thrown. + * + * @param uniformName name matching the uniform declared in the AGSL shader program + */ + public void setIntUniform(@NonNull String uniformName, int value1, int value2, + int value3, int value4) { + setIntUniform(uniformName, value1, value2, value3, value4, 4); + } + + /** + * Sets the uniform value corresponding to this shader. If the shader does not have a uniform + * with that name or if the uniform is declared with a type other than an int (for N=1), ivecN, + * or int[N] where N is the length of the values param then an IllegalArgumentException is + * thrown. + * + * @param uniformName name matching the uniform declared in the AGSL shader program + */ + public void setIntUniform(@NonNull String uniformName, @NonNull int[] values) { + if (uniformName == null) { + throw new NullPointerException("The uniformName parameter must not be null"); + } + if (values == null) { + throw new NullPointerException("The uniform values parameter must not be null"); + } nativeUpdateUniforms(mNativeInstanceRuntimeShaderBuilder, uniformName, values); discardNativeInstance(); } + private void setIntUniform(@NonNull String uniformName, int value1, int value2, int value3, + int value4, int count) { + if (uniformName == null) { + throw new NullPointerException("The uniformName parameter must not be null"); + } + + nativeUpdateUniforms(mNativeInstanceRuntimeShaderBuilder, uniformName, value1, value2, + value3, value4, count); + discardNativeInstance(); + } + /** * Sets the uniform shader that is declares as input to this shader. If the shader does not * have a uniform shader with that name then an IllegalArgumentException is thrown. @@ -101,6 +316,12 @@ public class RuntimeShader extends Shader { * @param shader shader passed into the SKSL shader for sampling */ public void setInputShader(@NonNull String shaderName, @NonNull Shader shader) { + if (shaderName == null) { + throw new NullPointerException("The shaderName parameter must not be null"); + } + if (shader == null) { + throw new NullPointerException("The shader parameter must not be null"); + } nativeUpdateShader( mNativeInstanceRuntimeShaderBuilder, shaderName, shader.getNativeInstance()); discardNativeInstance(); @@ -109,23 +330,28 @@ public class RuntimeShader extends Shader { /** @hide */ @Override protected long createNativeInstance(long nativeMatrix, boolean filterFromPaint) { - return nativeCreateShader(mNativeInstanceRuntimeShaderBuilder, nativeMatrix, mIsOpaque); + return nativeCreateShader(mNativeInstanceRuntimeShaderBuilder, nativeMatrix, mForceOpaque); } - public long getNativeShaderBuilder() { + /** @hide */ + protected long getNativeShaderBuilder() { return mNativeInstanceRuntimeShaderBuilder; } - public boolean isOpaque() { - return mIsOpaque; - } - private static native long nativeGetFinalizer(); - private static native long nativeCreateBuilder(String sksl); + private static native long nativeCreateBuilder(String agsl); private static native long nativeCreateShader( long shaderBuilder, long matrix, boolean isOpaque); private static native void nativeUpdateUniforms( - long shaderBuilder, String uniformName, float[] uniforms); + long shaderBuilder, String uniformName, float[] uniforms, boolean isColor); + private static native void nativeUpdateUniforms( + long shaderBuilder, String uniformName, float value1, float value2, float value3, + float value4, int count); + private static native void nativeUpdateUniforms( + long shaderBuilder, String uniformName, int[] uniforms); + private static native void nativeUpdateUniforms( + long shaderBuilder, String uniformName, int value1, int value2, int value3, + int value4, int count); private static native void nativeUpdateShader( long shaderBuilder, String shaderName, long shader); } diff --git a/libs/hwui/jni/Shader.cpp b/libs/hwui/jni/Shader.cpp index 1b3892032e79..c4366f756a21 100644 --- a/libs/hwui/jni/Shader.cpp +++ b/libs/hwui/jni/Shader.cpp @@ -273,21 +273,99 @@ static inline int ThrowIAEFmt(JNIEnv* env, const char* fmt, ...) { return ret; } -static void RuntimeShader_updateUniforms(JNIEnv* env, jobject, jlong shaderBuilder, - jstring jUniformName, jfloatArray jvalues) { +static bool isIntUniformType(const SkRuntimeEffect::Uniform::Type& type) { + switch (type) { + case SkRuntimeEffect::Uniform::Type::kFloat: + case SkRuntimeEffect::Uniform::Type::kFloat2: + case SkRuntimeEffect::Uniform::Type::kFloat3: + case SkRuntimeEffect::Uniform::Type::kFloat4: + case SkRuntimeEffect::Uniform::Type::kFloat2x2: + case SkRuntimeEffect::Uniform::Type::kFloat3x3: + case SkRuntimeEffect::Uniform::Type::kFloat4x4: + return false; + case SkRuntimeEffect::Uniform::Type::kInt: + case SkRuntimeEffect::Uniform::Type::kInt2: + case SkRuntimeEffect::Uniform::Type::kInt3: + case SkRuntimeEffect::Uniform::Type::kInt4: + return true; + } +} + +static void UpdateFloatUniforms(JNIEnv* env, SkRuntimeShaderBuilder* builder, + const char* uniformName, const float values[], int count, + bool isColor) { + SkRuntimeShaderBuilder::BuilderUniform uniform = builder->uniform(uniformName); + if (uniform.fVar == nullptr) { + ThrowIAEFmt(env, "unable to find uniform named %s", uniformName); + } else if (isColor != ((uniform.fVar->flags & SkRuntimeEffect::Uniform::kColor_Flag) != 0)) { + if (isColor) { + jniThrowExceptionFmt( + env, "java/lang/IllegalArgumentException", + "attempting to set a color uniform using the non-color specific APIs: %s %x", + uniformName, uniform.fVar->flags); + } else { + ThrowIAEFmt(env, + "attempting to set a non-color uniform using the setColorUniform APIs: %s", + uniformName); + } + } else if (isIntUniformType(uniform.fVar->type)) { + ThrowIAEFmt(env, "attempting to set a int uniform using the setUniform APIs: %s", + uniformName); + } else if (!uniform.set<float>(values, count)) { + ThrowIAEFmt(env, "mismatch in byte size for uniform [expected: %zu actual: %zu]", + uniform.fVar->sizeInBytes(), sizeof(float) * count); + } +} + +static void RuntimeShader_updateFloatUniforms(JNIEnv* env, jobject, jlong shaderBuilder, + jstring jUniformName, jfloat value1, jfloat value2, + jfloat value3, jfloat value4, jint count) { + SkRuntimeShaderBuilder* builder = reinterpret_cast<SkRuntimeShaderBuilder*>(shaderBuilder); + ScopedUtfChars name(env, jUniformName); + const float values[4] = {value1, value2, value3, value4}; + UpdateFloatUniforms(env, builder, name.c_str(), values, count, false); +} + +static void RuntimeShader_updateFloatArrayUniforms(JNIEnv* env, jobject, jlong shaderBuilder, + jstring jUniformName, jfloatArray jvalues, + jboolean isColor) { SkRuntimeShaderBuilder* builder = reinterpret_cast<SkRuntimeShaderBuilder*>(shaderBuilder); ScopedUtfChars name(env, jUniformName); AutoJavaFloatArray autoValues(env, jvalues, 0, kRO_JNIAccess); + UpdateFloatUniforms(env, builder, name.c_str(), autoValues.ptr(), autoValues.length(), isColor); +} - SkRuntimeShaderBuilder::BuilderUniform uniform = builder->uniform(name.c_str()); +static void UpdateIntUniforms(JNIEnv* env, SkRuntimeShaderBuilder* builder, const char* uniformName, + const int values[], int count) { + SkRuntimeShaderBuilder::BuilderUniform uniform = builder->uniform(uniformName); if (uniform.fVar == nullptr) { - ThrowIAEFmt(env, "unable to find uniform named %s", name.c_str()); - } else if (!uniform.set<float>(autoValues.ptr(), autoValues.length())) { + ThrowIAEFmt(env, "unable to find uniform named %s", uniformName); + } else if (!isIntUniformType(uniform.fVar->type)) { + ThrowIAEFmt(env, "attempting to set a non-int uniform using the setIntUniform APIs: %s", + uniformName); + } else if (!uniform.set<int>(values, count)) { ThrowIAEFmt(env, "mismatch in byte size for uniform [expected: %zu actual: %zu]", - uniform.fVar->sizeInBytes(), sizeof(float) * autoValues.length()); + uniform.fVar->sizeInBytes(), sizeof(float) * count); } } +static void RuntimeShader_updateIntUniforms(JNIEnv* env, jobject, jlong shaderBuilder, + jstring jUniformName, jint value1, jint value2, + jint value3, jint value4, jint count) { + SkRuntimeShaderBuilder* builder = reinterpret_cast<SkRuntimeShaderBuilder*>(shaderBuilder); + ScopedUtfChars name(env, jUniformName); + const int values[4] = {value1, value2, value3, value4}; + UpdateIntUniforms(env, builder, name.c_str(), values, count); +} + +static void RuntimeShader_updateIntArrayUniforms(JNIEnv* env, jobject, jlong shaderBuilder, + jstring jUniformName, jintArray jvalues) { + SkRuntimeShaderBuilder* builder = reinterpret_cast<SkRuntimeShaderBuilder*>(shaderBuilder); + ScopedUtfChars name(env, jUniformName); + AutoJavaIntArray autoValues(env, jvalues, 0); + UpdateIntUniforms(env, builder, name.c_str(), autoValues.ptr(), autoValues.length()); +} + static void RuntimeShader_updateShader(JNIEnv* env, jobject, jlong shaderBuilder, jstring jUniformName, jlong shaderHandle) { SkRuntimeShaderBuilder* builder = reinterpret_cast<SkRuntimeShaderBuilder*>(shaderBuilder); @@ -338,7 +416,14 @@ static const JNINativeMethod gRuntimeShaderMethods[] = { {"nativeGetFinalizer", "()J", (void*)RuntimeShader_getNativeFinalizer}, {"nativeCreateShader", "(JJZ)J", (void*)RuntimeShader_create}, {"nativeCreateBuilder", "(Ljava/lang/String;)J", (void*)RuntimeShader_createShaderBuilder}, - {"nativeUpdateUniforms", "(JLjava/lang/String;[F)V", (void*)RuntimeShader_updateUniforms}, + {"nativeUpdateUniforms", "(JLjava/lang/String;[FZ)V", + (void*)RuntimeShader_updateFloatArrayUniforms}, + {"nativeUpdateUniforms", "(JLjava/lang/String;FFFFI)V", + (void*)RuntimeShader_updateFloatUniforms}, + {"nativeUpdateUniforms", "(JLjava/lang/String;[I)V", + (void*)RuntimeShader_updateIntArrayUniforms}, + {"nativeUpdateUniforms", "(JLjava/lang/String;IIIII)V", + (void*)RuntimeShader_updateIntUniforms}, {"nativeUpdateShader", "(JLjava/lang/String;J)V", (void*)RuntimeShader_updateShader}, }; diff --git a/media/java/android/media/tv/TvContract.java b/media/java/android/media/tv/TvContract.java index a0f6fb9577c3..9147c123c6f3 100644 --- a/media/java/android/media/tv/TvContract.java +++ b/media/java/android/media/tv/TvContract.java @@ -2720,6 +2720,42 @@ public final class TvContract { */ public static final String COLUMN_GLOBAL_CONTENT_ID = "global_content_id"; + /** + * The flag indicating whether this TV program is scrambled or not. + * + * <p>Use the same coding for scrambled in the underlying broadcast standard + * if {@code free_ca_mode} in EIT is defined there (e.g. ETSI EN 300 468). + * + * <p>Type: INTEGER (boolean) + */ + public static final String COLUMN_SCRAMBLED = "scrambled"; + + /** + * The comma-separated series IDs of this TV program for episodic TV shows. + * + * <p>This is used to indicate the series IDs. + * Programs in the same series share a series ID. + * Use this instead of {@link #COLUMN_SERIES_ID} if more than one series IDs + * are assigned to the TV program. + * + * <p>Can be empty. + * + * <p>Type: TEXT + */ + public static final String COLUMN_MULTI_SERIES_ID = "multi_series_id"; + + /** + * The internal ID used by individual TV input services. + * + * <p>This is internal to the provider that inserted it, and should not be decoded by other + * apps. + * + * <p>Can be empty. + * + * <p>Type: TEXT + */ + public static final String COLUMN_INTERNAL_PROVIDER_ID = "internal_provider_id"; + private Programs() {} /** Canonical genres for TV programs. */ @@ -3052,6 +3088,32 @@ public final class TvContract { public static final String COLUMN_RECORDING_EXPIRE_TIME_UTC_MILLIS = "recording_expire_time_utc_millis"; + /** + * The comma-separated series IDs of this TV program for episodic TV shows. + * + * <p>This is used to indicate the series IDs. + * Programs in the same series share a series ID. + * Use this instead of {@link #COLUMN_SERIES_ID} if more than one series IDs + * are assigned to the TV program. + * + * <p>Can be empty. + * + * <p>Type: TEXT + */ + public static final String COLUMN_MULTI_SERIES_ID = "multi_series_id"; + + /** + * The internal ID used by individual TV input services. + * + * <p>This is internal to the provider that inserted it, and should not be decoded by other + * apps. + * + * <p>Can be empty. + * + * <p>Type: TEXT + */ + public static final String COLUMN_INTERNAL_PROVIDER_ID = "internal_provider_id"; + private RecordedPrograms() {} } diff --git a/native/android/input.cpp b/native/android/input.cpp index 4de2c23e62b8..c06c81ed03ec 100644 --- a/native/android/input.cpp +++ b/native/android/input.cpp @@ -330,6 +330,6 @@ void AInputQueue_finishEvent(AInputQueue* queue, AInputEvent* event, int handled iq->finishEvent(e, handled != 0); } -AInputQueue* AInputQueue_fromJava(jobject inputQueue) { - return android::android_view_InputQueue_getNativePtr(inputQueue); +AInputQueue* AInputQueue_fromJava(JNIEnv* env, jobject inputQueue) { + return android::android_view_InputQueue_getNativePtr(env, inputQueue); } diff --git a/packages/CompanionDeviceManager/res/values-af/strings.xml b/packages/CompanionDeviceManager/res/values-af/strings.xml index 3faed5525946..aec8f89f20e7 100644 --- a/packages/CompanionDeviceManager/res/values-af/strings.xml +++ b/packages/CompanionDeviceManager/res/values-af/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Metgeseltoestel-bestuurder"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Laat <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> toe om jou <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> te bestuur"</string> + <string name="profile_name_watch" msgid="576290739483672360">"horlosie"</string> <string name="chooser_title" msgid="2262294130493605839">"Kies \'n <xliff:g id="PROFILE_NAME">%1$s</xliff:g> om deur <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong> bestuur te word"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"toestel"</string> - <string name="profile_name_watch" msgid="576290739483672360">"horlosie"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Laat <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> toe om jou <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> te bestuur"</string> - <string name="profile_summary" msgid="2059360676631420073">"Hierdie program is nodig om jou <xliff:g id="PROFILE_NAME">%1$s</xliff:g> te bestuur. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Laat toe"</string> <string name="consent_no" msgid="2640796915611404382">"Moenie toelaat nie"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-am/strings.xml b/packages/CompanionDeviceManager/res/values-am/strings.xml index 99466d7d2e1a..235912410580 100644 --- a/packages/CompanionDeviceManager/res/values-am/strings.xml +++ b/packages/CompanionDeviceManager/res/values-am/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"አጃቢ የመሣሪያ አስተዳዳሪ"</string> + <string name="confirmation_title" msgid="8455544820286920304">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> የእርስዎን <xliff:g id="DEVICE_NAME">%2$s</xliff:g> - <strong></strong> እንዲያስተዳደር ይፍቀዱ"</string> + <string name="profile_name_watch" msgid="576290739483672360">"ሰዓት"</string> <string name="chooser_title" msgid="2262294130493605839">"በ<strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong> የሚተዳደር <xliff:g id="PROFILE_NAME">%1$s</xliff:g> ይምረጡ"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"መሣሪያ"</string> - <string name="profile_name_watch" msgid="576290739483672360">"ሰዓት"</string> - <string name="confirmation_title" msgid="8455544820286920304">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> የእርስዎን <xliff:g id="DEVICE_NAME">%2$s</xliff:g> - <strong></strong> እንዲያስተዳደር ይፍቀዱ"</string> - <string name="profile_summary" msgid="2059360676631420073">"የእርስዎን <xliff:g id="PROFILE_NAME">%1$s</xliff:g> ለማስተዳደር ይህ መተግበሪያ ያስፈልጋል <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"ፍቀድ"</string> <string name="consent_no" msgid="2640796915611404382">"አትፍቀድ"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-ar/strings.xml b/packages/CompanionDeviceManager/res/values-ar/strings.xml index c3f1e73d3ad4..5fc3a4fc8633 100644 --- a/packages/CompanionDeviceManager/res/values-ar/strings.xml +++ b/packages/CompanionDeviceManager/res/values-ar/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"تطبيق \"مدير الجهاز المصاحب\""</string> + <string name="confirmation_title" msgid="8455544820286920304">"السماح للتطبيق <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> بإدارة <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"ساعة"</string> <string name="chooser_title" msgid="2262294130493605839">"اختَر <xliff:g id="PROFILE_NAME">%1$s</xliff:g> ليديره تطبيق <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"جهاز"</string> - <string name="profile_name_watch" msgid="576290739483672360">"ساعة"</string> - <string name="confirmation_title" msgid="8455544820286920304">"السماح للتطبيق <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> بإدارة <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"هذا التطبيق مطلوب لإدارة <xliff:g id="PROFILE_NAME">%1$s</xliff:g>. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"السماح"</string> <string name="consent_no" msgid="2640796915611404382">"عدم السماح"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-as/strings.xml b/packages/CompanionDeviceManager/res/values-as/strings.xml index 2a2bc25c7881..743d725621e5 100644 --- a/packages/CompanionDeviceManager/res/values-as/strings.xml +++ b/packages/CompanionDeviceManager/res/values-as/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"কম্পেনিয়ন ডিভাইচ মেনেজাৰ"</string> + <string name="confirmation_title" msgid="8455544820286920304">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong>ক আপোনাৰ <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> পৰিচালনা কৰিবলৈ দিয়ক"</string> + <string name="profile_name_watch" msgid="576290739483672360">"ঘড়ী"</string> <string name="chooser_title" msgid="2262294130493605839">"<strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>এ পৰিচালনা কৰিব লগা এটা <xliff:g id="PROFILE_NAME">%1$s</xliff:g> বাছনি কৰক"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"ডিভাইচ"</string> - <string name="profile_name_watch" msgid="576290739483672360">"ঘড়ী"</string> - <string name="confirmation_title" msgid="8455544820286920304">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong>ক আপোনাৰ <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> পৰিচালনা কৰিবলৈ দিয়ক"</string> - <string name="profile_summary" msgid="2059360676631420073">"আপোনাৰ <xliff:g id="PROFILE_NAME">%1$s</xliff:g> পৰিচালনা কৰিবলৈ এই এপ্টোৰ আৱশ্যক। <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"অনুমতি দিয়ক"</string> <string name="consent_no" msgid="2640796915611404382">"অনুমতি নিদিব"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-az/strings.xml b/packages/CompanionDeviceManager/res/values-az/strings.xml index 2ec13c587166..ca32052d4758 100644 --- a/packages/CompanionDeviceManager/res/values-az/strings.xml +++ b/packages/CompanionDeviceManager/res/values-az/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Kompanyon Cihaz Meneceri"</string> + <string name="confirmation_title" msgid="8455544820286920304">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> tətbiqinə <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> cihazınızı idarə etməsinə icazə verin"</string> + <string name="profile_name_watch" msgid="576290739483672360">"izləyin"</string> <string name="chooser_title" msgid="2262294130493605839">"<strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong> tərəfindən idarə ediləcək <xliff:g id="PROFILE_NAME">%1$s</xliff:g> seçin"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"cihaz"</string> - <string name="profile_name_watch" msgid="576290739483672360">"izləyin"</string> - <string name="confirmation_title" msgid="8455544820286920304">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> tətbiqinə <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> cihazınızı idarə etməsinə icazə verin"</string> - <string name="profile_summary" msgid="2059360676631420073">"Bu tətbiq <xliff:g id="PROFILE_NAME">%1$s</xliff:g> profilinizi idarə etmək üçün lazımdır. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"İcazə verin"</string> <string name="consent_no" msgid="2640796915611404382">"İcazə verməyin"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-b+sr+Latn/strings.xml b/packages/CompanionDeviceManager/res/values-b+sr+Latn/strings.xml index d687b05896c6..d919e6734030 100644 --- a/packages/CompanionDeviceManager/res/values-b+sr+Latn/strings.xml +++ b/packages/CompanionDeviceManager/res/values-b+sr+Latn/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Menadžer pridruženog uređaja"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Dozvolite aplikaciji <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> da upravlja uređajem <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"sat"</string> <string name="chooser_title" msgid="2262294130493605839">"Odaberite profil <xliff:g id="PROFILE_NAME">%1$s</xliff:g> kojim će upravljati aplikacija <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"uređaj"</string> - <string name="profile_name_watch" msgid="576290739483672360">"sat"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Dozvolite aplikaciji <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> da upravlja uređajem <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"Ova aplikacija je potrebna za upravljanje profilom <xliff:g id="PROFILE_NAME">%1$s</xliff:g>. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Dozvoli"</string> <string name="consent_no" msgid="2640796915611404382">"Ne dozvoli"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-be/strings.xml b/packages/CompanionDeviceManager/res/values-be/strings.xml index 2236052f5545..919d7290866f 100644 --- a/packages/CompanionDeviceManager/res/values-be/strings.xml +++ b/packages/CompanionDeviceManager/res/values-be/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Менеджар спадарожнай прылады"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Дазвольце праграме <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> кіраваць прыладай <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"гадзіннік"</string> <string name="chooser_title" msgid="2262294130493605839">"Выберыце прыладу (<xliff:g id="PROFILE_NAME">%1$s</xliff:g>), якой будзе кіраваць праграма <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"прылада"</string> - <string name="profile_name_watch" msgid="576290739483672360">"гадзіннік"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Дазвольце праграме <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> кіраваць прыладай <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"Гэта праграма неабходная для кіравання профілем \"<xliff:g id="PROFILE_NAME">%1$s</xliff:g>\". <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Дазволіць"</string> <string name="consent_no" msgid="2640796915611404382">"Не дазваляць"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-bg/strings.xml b/packages/CompanionDeviceManager/res/values-bg/strings.xml index 996ca9062f80..1e2aa4e8214c 100644 --- a/packages/CompanionDeviceManager/res/values-bg/strings.xml +++ b/packages/CompanionDeviceManager/res/values-bg/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Companion Device Manager"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Разрешаване на <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> да управлява устройството ви <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"часовник"</string> <string name="chooser_title" msgid="2262294130493605839">"Изберете устройство (<xliff:g id="PROFILE_NAME">%1$s</xliff:g>), което да се управлява от <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"устройство"</string> - <string name="profile_name_watch" msgid="576290739483672360">"часовник"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Разрешаване на <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> да управлява устройството ви <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"Това приложение е необходимо за управление на <xliff:g id="PROFILE_NAME">%1$s</xliff:g>. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Разрешаване"</string> <string name="consent_no" msgid="2640796915611404382">"Забраняване"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-bn/strings.xml b/packages/CompanionDeviceManager/res/values-bn/strings.xml index 16d25ce57870..3b537b6e48bf 100644 --- a/packages/CompanionDeviceManager/res/values-bn/strings.xml +++ b/packages/CompanionDeviceManager/res/values-bn/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Companion Device Manager"</string> + <string name="confirmation_title" msgid="8455544820286920304">"আপনার <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> ম্যানেজ করার জন্য <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> -কে অনুমতি দিন"</string> + <string name="profile_name_watch" msgid="576290739483672360">"ঘড়ি"</string> <string name="chooser_title" msgid="2262294130493605839">"<xliff:g id="PROFILE_NAME">%1$s</xliff:g> বেছে নিন যেটি <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong> ম্যানেজ করবে"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"ডিভাইস"</string> - <string name="profile_name_watch" msgid="576290739483672360">"ঘড়ি"</string> - <string name="confirmation_title" msgid="8455544820286920304">"আপনার <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> ম্যানেজ করার জন্য <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> -কে অনুমতি দিন"</string> - <string name="profile_summary" msgid="2059360676631420073">"আপনার <xliff:g id="PROFILE_NAME">%1$s</xliff:g> ম্যানেজ করতে এই অ্যাপটি প্রয়োজন। <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"অনুমতি দিন"</string> <string name="consent_no" msgid="2640796915611404382">"অনুমতি দেবেন না"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-bs/strings.xml b/packages/CompanionDeviceManager/res/values-bs/strings.xml index 10f753c1cf45..b010626ab395 100644 --- a/packages/CompanionDeviceManager/res/values-bs/strings.xml +++ b/packages/CompanionDeviceManager/res/values-bs/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Prateći upravitelj uređaja"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Dozvolite aplikaciji <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> da upravlja uređajem <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"sat"</string> <string name="chooser_title" msgid="2262294130493605839">"Odaberite uređaj <xliff:g id="PROFILE_NAME">%1$s</xliff:g> kojim će upravljati aplikacija <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"uređaj"</string> - <string name="profile_name_watch" msgid="576290739483672360">"sat"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Dozvolite aplikaciji <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> da upravlja uređajem <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"Ova aplikacija je potrebna za upravljanje profilom: <xliff:g id="PROFILE_NAME">%1$s</xliff:g>. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Dozvoli"</string> <string name="consent_no" msgid="2640796915611404382">"Nemoj dozvoliti"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-ca/strings.xml b/packages/CompanionDeviceManager/res/values-ca/strings.xml index e55a033cf800..efd801e59bde 100644 --- a/packages/CompanionDeviceManager/res/values-ca/strings.xml +++ b/packages/CompanionDeviceManager/res/values-ca/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Gestor de dispositius complementaris"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Permet que <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> gestioni el teu <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"rellotge"</string> <string name="chooser_title" msgid="2262294130493605839">"Tria un <xliff:g id="PROFILE_NAME">%1$s</xliff:g> perquè el gestioni <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"dispositiu"</string> - <string name="profile_name_watch" msgid="576290739483672360">"rellotge"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Permet que <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> gestioni el teu <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"Aquesta aplicació es necessita per gestionar el teu <xliff:g id="PROFILE_NAME">%1$s</xliff:g>. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Permet"</string> <string name="consent_no" msgid="2640796915611404382">"No permetis"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-cs/strings.xml b/packages/CompanionDeviceManager/res/values-cs/strings.xml index 48fbda10cfed..bd57213ca02e 100644 --- a/packages/CompanionDeviceManager/res/values-cs/strings.xml +++ b/packages/CompanionDeviceManager/res/values-cs/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Správce doprovodných zařízení"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Povolit aplikaci <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> spravovat <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"hodinky"</string> <string name="chooser_title" msgid="2262294130493605839">"Vyberte zařízení <xliff:g id="PROFILE_NAME">%1$s</xliff:g>, které chcete spravovat pomocí aplikace <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"zařízení"</string> - <string name="profile_name_watch" msgid="576290739483672360">"hodinky"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Povolit aplikaci <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> spravovat <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"Tato aplikace je nutná pro správu profilu <xliff:g id="PROFILE_NAME">%1$s</xliff:g>. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Povolit"</string> <string name="consent_no" msgid="2640796915611404382">"Nepovolovat"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-da/strings.xml b/packages/CompanionDeviceManager/res/values-da/strings.xml index 446c301747df..742845310dea 100644 --- a/packages/CompanionDeviceManager/res/values-da/strings.xml +++ b/packages/CompanionDeviceManager/res/values-da/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Medfølgende enhedsadministrator"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Tillad at <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> kan administrere: <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"ur"</string> <string name="chooser_title" msgid="2262294130493605839">"Vælg den enhed (<xliff:g id="PROFILE_NAME">%1$s</xliff:g>), som skal administreres af <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"enhed"</string> - <string name="profile_name_watch" msgid="576290739483672360">"ur"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Tillad at <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> kan administrere: <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"Du skal bruge denne app for at administrere dit <xliff:g id="PROFILE_NAME">%1$s</xliff:g>. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Tillad"</string> <string name="consent_no" msgid="2640796915611404382">"Tillad ikke"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-de/strings.xml b/packages/CompanionDeviceManager/res/values-de/strings.xml index 33d831d41aec..4c431401c490 100644 --- a/packages/CompanionDeviceManager/res/values-de/strings.xml +++ b/packages/CompanionDeviceManager/res/values-de/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Begleitgerät-Manager"</string> + <string name="confirmation_title" msgid="8455544820286920304">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> erlauben, dein Gerät <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> zu verwalten"</string> + <string name="profile_name_watch" msgid="576290739483672360">"Smartwatch"</string> <string name="chooser_title" msgid="2262294130493605839">"Gerät (<xliff:g id="PROFILE_NAME">%1$s</xliff:g>) auswählen, das von <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong> verwaltet werden soll"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"Gerät"</string> - <string name="profile_name_watch" msgid="576290739483672360">"Smartwatch"</string> - <string name="confirmation_title" msgid="8455544820286920304">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> erlauben, dein Gerät <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> zu verwalten"</string> - <string name="profile_summary" msgid="2059360676631420073">"Diese App wird zur Verwaltung des Profils „<xliff:g id="PROFILE_NAME">%1$s</xliff:g>“ benötigt. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Zulassen"</string> <string name="consent_no" msgid="2640796915611404382">"Nicht zulassen"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-el/strings.xml b/packages/CompanionDeviceManager/res/values-el/strings.xml index 7a78c0669825..07a4fda587a8 100644 --- a/packages/CompanionDeviceManager/res/values-el/strings.xml +++ b/packages/CompanionDeviceManager/res/values-el/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Διαχείριση συνοδευτικής εφαρμογής"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Επιτρέψτε στην εφαρμογή <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> να διαχειρίζεται τη συσκευή <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"ρολόι"</string> <string name="chooser_title" msgid="2262294130493605839">"Επιλέξτε ένα προφίλ <xliff:g id="PROFILE_NAME">%1$s</xliff:g> για διαχείριση από την εφαρμογή <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"συσκευή"</string> - <string name="profile_name_watch" msgid="576290739483672360">"ρολόι"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Επιτρέψτε στην εφαρμογή <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> να διαχειρίζεται τη συσκευή <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"Αυτή η εφαρμογή είναι απαραίτητη για τη διαχείριση του προφίλ σας <xliff:g id="PROFILE_NAME">%1$s</xliff:g>. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Να επιτρέπεται"</string> <string name="consent_no" msgid="2640796915611404382">"Να μην επιτρέπεται"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-en-rAU/strings.xml b/packages/CompanionDeviceManager/res/values-en-rAU/strings.xml index a6ebe658d622..1756d22c129f 100644 --- a/packages/CompanionDeviceManager/res/values-en-rAU/strings.xml +++ b/packages/CompanionDeviceManager/res/values-en-rAU/strings.xml @@ -17,11 +17,19 @@ <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="4470785958457506021">"Companion Device Manager"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Allow <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> to manage your <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"watch"</string> <string name="chooser_title" msgid="2262294130493605839">"Choose a <xliff:g id="PROFILE_NAME">%1$s</xliff:g> to be managed by <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <string name="summary_watch" product="default" msgid="7113724443198337683">"<xliff:g id="APP_NAME">%1$s</xliff:g> will be allowed to interact with your notifications and access your Phone, SMS, Contacts and Calendar permissions."</string> + <string name="summary_watch" product="tablet" msgid="7113724443198337683">"<xliff:g id="APP_NAME">%1$s</xliff:g> will be allowed to interact with your notifications and access your Phone, SMS, Contacts and Calendar permissions."</string> + <string name="title_app_streaming" msgid="4459136600249308574">"Allow <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> to stream applications?"</string> + <string name="summary_app_streaming" product="default" msgid="6105916810614498138">"Let <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> provide <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> remote access to access to applications installed on this phone when connected."</string> + <string name="summary_app_streaming" product="tablet" msgid="2996373715966272792">"Let <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> provide <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> remote access to access to applications installed on this tablet when connected."</string> + <string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Let <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> provide <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> remote access to access to applications installed on this device when connected."</string> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"device"</string> - <string name="profile_name_watch" msgid="576290739483672360">"watch"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Allow <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> to manage your <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"This app is needed to manage your <xliff:g id="PROFILE_NAME">%1$s</xliff:g>. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Allow"</string> <string name="consent_no" msgid="2640796915611404382">"Don\'t allow"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-en-rCA/strings.xml b/packages/CompanionDeviceManager/res/values-en-rCA/strings.xml index a6ebe658d622..1756d22c129f 100644 --- a/packages/CompanionDeviceManager/res/values-en-rCA/strings.xml +++ b/packages/CompanionDeviceManager/res/values-en-rCA/strings.xml @@ -17,11 +17,19 @@ <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="4470785958457506021">"Companion Device Manager"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Allow <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> to manage your <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"watch"</string> <string name="chooser_title" msgid="2262294130493605839">"Choose a <xliff:g id="PROFILE_NAME">%1$s</xliff:g> to be managed by <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <string name="summary_watch" product="default" msgid="7113724443198337683">"<xliff:g id="APP_NAME">%1$s</xliff:g> will be allowed to interact with your notifications and access your Phone, SMS, Contacts and Calendar permissions."</string> + <string name="summary_watch" product="tablet" msgid="7113724443198337683">"<xliff:g id="APP_NAME">%1$s</xliff:g> will be allowed to interact with your notifications and access your Phone, SMS, Contacts and Calendar permissions."</string> + <string name="title_app_streaming" msgid="4459136600249308574">"Allow <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> to stream applications?"</string> + <string name="summary_app_streaming" product="default" msgid="6105916810614498138">"Let <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> provide <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> remote access to access to applications installed on this phone when connected."</string> + <string name="summary_app_streaming" product="tablet" msgid="2996373715966272792">"Let <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> provide <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> remote access to access to applications installed on this tablet when connected."</string> + <string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Let <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> provide <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> remote access to access to applications installed on this device when connected."</string> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"device"</string> - <string name="profile_name_watch" msgid="576290739483672360">"watch"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Allow <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> to manage your <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"This app is needed to manage your <xliff:g id="PROFILE_NAME">%1$s</xliff:g>. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Allow"</string> <string name="consent_no" msgid="2640796915611404382">"Don\'t allow"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-en-rGB/strings.xml b/packages/CompanionDeviceManager/res/values-en-rGB/strings.xml index a6ebe658d622..1756d22c129f 100644 --- a/packages/CompanionDeviceManager/res/values-en-rGB/strings.xml +++ b/packages/CompanionDeviceManager/res/values-en-rGB/strings.xml @@ -17,11 +17,19 @@ <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="4470785958457506021">"Companion Device Manager"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Allow <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> to manage your <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"watch"</string> <string name="chooser_title" msgid="2262294130493605839">"Choose a <xliff:g id="PROFILE_NAME">%1$s</xliff:g> to be managed by <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <string name="summary_watch" product="default" msgid="7113724443198337683">"<xliff:g id="APP_NAME">%1$s</xliff:g> will be allowed to interact with your notifications and access your Phone, SMS, Contacts and Calendar permissions."</string> + <string name="summary_watch" product="tablet" msgid="7113724443198337683">"<xliff:g id="APP_NAME">%1$s</xliff:g> will be allowed to interact with your notifications and access your Phone, SMS, Contacts and Calendar permissions."</string> + <string name="title_app_streaming" msgid="4459136600249308574">"Allow <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> to stream applications?"</string> + <string name="summary_app_streaming" product="default" msgid="6105916810614498138">"Let <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> provide <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> remote access to access to applications installed on this phone when connected."</string> + <string name="summary_app_streaming" product="tablet" msgid="2996373715966272792">"Let <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> provide <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> remote access to access to applications installed on this tablet when connected."</string> + <string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Let <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> provide <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> remote access to access to applications installed on this device when connected."</string> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"device"</string> - <string name="profile_name_watch" msgid="576290739483672360">"watch"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Allow <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> to manage your <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"This app is needed to manage your <xliff:g id="PROFILE_NAME">%1$s</xliff:g>. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Allow"</string> <string name="consent_no" msgid="2640796915611404382">"Don\'t allow"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-en-rIN/strings.xml b/packages/CompanionDeviceManager/res/values-en-rIN/strings.xml index a6ebe658d622..1756d22c129f 100644 --- a/packages/CompanionDeviceManager/res/values-en-rIN/strings.xml +++ b/packages/CompanionDeviceManager/res/values-en-rIN/strings.xml @@ -17,11 +17,19 @@ <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="4470785958457506021">"Companion Device Manager"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Allow <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> to manage your <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"watch"</string> <string name="chooser_title" msgid="2262294130493605839">"Choose a <xliff:g id="PROFILE_NAME">%1$s</xliff:g> to be managed by <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <string name="summary_watch" product="default" msgid="7113724443198337683">"<xliff:g id="APP_NAME">%1$s</xliff:g> will be allowed to interact with your notifications and access your Phone, SMS, Contacts and Calendar permissions."</string> + <string name="summary_watch" product="tablet" msgid="7113724443198337683">"<xliff:g id="APP_NAME">%1$s</xliff:g> will be allowed to interact with your notifications and access your Phone, SMS, Contacts and Calendar permissions."</string> + <string name="title_app_streaming" msgid="4459136600249308574">"Allow <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> to stream applications?"</string> + <string name="summary_app_streaming" product="default" msgid="6105916810614498138">"Let <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> provide <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> remote access to access to applications installed on this phone when connected."</string> + <string name="summary_app_streaming" product="tablet" msgid="2996373715966272792">"Let <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> provide <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> remote access to access to applications installed on this tablet when connected."</string> + <string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Let <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> provide <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> remote access to access to applications installed on this device when connected."</string> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"device"</string> - <string name="profile_name_watch" msgid="576290739483672360">"watch"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Allow <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> to manage your <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"This app is needed to manage your <xliff:g id="PROFILE_NAME">%1$s</xliff:g>. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Allow"</string> <string name="consent_no" msgid="2640796915611404382">"Don\'t allow"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-en-rXC/strings.xml b/packages/CompanionDeviceManager/res/values-en-rXC/strings.xml index 6cc56a4f44e7..efda04ec0d3a 100644 --- a/packages/CompanionDeviceManager/res/values-en-rXC/strings.xml +++ b/packages/CompanionDeviceManager/res/values-en-rXC/strings.xml @@ -17,11 +17,19 @@ <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="4470785958457506021">"Companion Device Manager"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Allow <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> to manage your <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"watch"</string> <string name="chooser_title" msgid="2262294130493605839">"Choose a <xliff:g id="PROFILE_NAME">%1$s</xliff:g> to be managed by <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <string name="summary_watch" product="default" msgid="7113724443198337683">"<xliff:g id="APP_NAME">%1$s</xliff:g> will be allowed to interact with your notifications and access your Phone, SMS, Contacts and Calendar permissions."</string> + <string name="summary_watch" product="tablet" msgid="7113724443198337683">"<xliff:g id="APP_NAME">%1$s</xliff:g> will be allowed to interact with your notifications and access your Phone, SMS, Contacts and Calendar permissions."</string> + <string name="title_app_streaming" msgid="4459136600249308574">"Allow <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> to stream applications?"</string> + <string name="summary_app_streaming" product="default" msgid="6105916810614498138">"Let <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> to provide <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> remote access to access to applications installed on this phone when connected."</string> + <string name="summary_app_streaming" product="tablet" msgid="2996373715966272792">"Let <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> to provide <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> remote access to access to applications installed on this tablet when connected."</string> + <string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Let <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> to provide <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> remote access to access to applications installed on this device when connected."</string> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"device"</string> - <string name="profile_name_watch" msgid="576290739483672360">"watch"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Allow <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> to manage your <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"This app is needed to manage your <xliff:g id="PROFILE_NAME">%1$s</xliff:g>. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Allow"</string> <string name="consent_no" msgid="2640796915611404382">"Don’t allow"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-es-rUS/strings.xml b/packages/CompanionDeviceManager/res/values-es-rUS/strings.xml index dc1315916159..9bbc1b8a8831 100644 --- a/packages/CompanionDeviceManager/res/values-es-rUS/strings.xml +++ b/packages/CompanionDeviceManager/res/values-es-rUS/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Administrador de dispositivo complementario"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Permite que <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> administre tu <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"reloj"</string> <string name="chooser_title" msgid="2262294130493605839">"Elige un <xliff:g id="PROFILE_NAME">%1$s</xliff:g> para que <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong> lo administre"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"dispositivo"</string> - <string name="profile_name_watch" msgid="576290739483672360">"reloj"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Permite que <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> administre tu <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"Esta app es necesaria para administrar tu <xliff:g id="PROFILE_NAME">%1$s</xliff:g>. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Permitir"</string> <string name="consent_no" msgid="2640796915611404382">"No permitir"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-es/strings.xml b/packages/CompanionDeviceManager/res/values-es/strings.xml index 7e37c1d33522..daece565a14e 100644 --- a/packages/CompanionDeviceManager/res/values-es/strings.xml +++ b/packages/CompanionDeviceManager/res/values-es/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Gestor de dispositivos complementario"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Permitir que <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> gestione tu <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"reloj"</string> <string name="chooser_title" msgid="2262294130493605839">"Elige un <xliff:g id="PROFILE_NAME">%1$s</xliff:g> para gestionarlo con <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"dispositivo"</string> - <string name="profile_name_watch" msgid="576290739483672360">"reloj"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Permitir que <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> gestione tu <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"Se necesita esta aplicación para gestionar tu <xliff:g id="PROFILE_NAME">%1$s</xliff:g>. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Permitir"</string> <string name="consent_no" msgid="2640796915611404382">"No permitir"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-et/strings.xml b/packages/CompanionDeviceManager/res/values-et/strings.xml index 399556de789b..ffaa0c0709fb 100644 --- a/packages/CompanionDeviceManager/res/values-et/strings.xml +++ b/packages/CompanionDeviceManager/res/values-et/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Kaasseadme haldur"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Lubage rakendusel <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> hallata teie seadet <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"käekell"</string> <string name="chooser_title" msgid="2262294130493605839">"Valige seade <xliff:g id="PROFILE_NAME">%1$s</xliff:g>, mida haldab rakendus <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"seade"</string> - <string name="profile_name_watch" msgid="576290739483672360">"käekell"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Lubage rakendusel <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> hallata teie seadet <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"Seda rakendust on vaja teie profiili <xliff:g id="PROFILE_NAME">%1$s</xliff:g> haldamiseks. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Luba"</string> <string name="consent_no" msgid="2640796915611404382">"Ära luba"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-eu/strings.xml b/packages/CompanionDeviceManager/res/values-eu/strings.xml index 764505e52959..5bf6677de7eb 100644 --- a/packages/CompanionDeviceManager/res/values-eu/strings.xml +++ b/packages/CompanionDeviceManager/res/values-eu/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Gailu osagarriaren kudeatzailea"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Eman <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> kudeatzeko baimena <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> aplikazioari"</string> + <string name="profile_name_watch" msgid="576290739483672360">"erlojua"</string> <string name="chooser_title" msgid="2262294130493605839">"Aukeratu <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong> aplikazioak kudeatu beharreko <xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"gailua"</string> - <string name="profile_name_watch" msgid="576290739483672360">"erlojua"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Eman <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> kudeatzeko baimena <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> aplikazioari"</string> - <string name="profile_summary" msgid="2059360676631420073">"Aplikazioa <xliff:g id="PROFILE_NAME">%1$s</xliff:g> kudeatzeko beharrezkoa da. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Eman baimena"</string> <string name="consent_no" msgid="2640796915611404382">"Ez eman baimenik"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-fa/strings.xml b/packages/CompanionDeviceManager/res/values-fa/strings.xml index 07d04aa1ecc9..1ede28cebfc6 100644 --- a/packages/CompanionDeviceManager/res/values-fa/strings.xml +++ b/packages/CompanionDeviceManager/res/values-fa/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"مدیر دستگاه مرتبط"</string> + <string name="confirmation_title" msgid="8455544820286920304">"مجاز کردن <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> برای مدیریت کردن <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"ساعت"</string> <string name="chooser_title" msgid="2262294130493605839">"انتخاب <xliff:g id="PROFILE_NAME">%1$s</xliff:g> برای مدیریت کردن با <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"دستگاه"</string> - <string name="profile_name_watch" msgid="576290739483672360">"ساعت"</string> - <string name="confirmation_title" msgid="8455544820286920304">"مجاز کردن <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> برای مدیریت کردن <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"این برنامه برای مدیریت <xliff:g id="PROFILE_NAME">%1$s</xliff:g> شما لازم است. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"مجاز بودن"</string> <string name="consent_no" msgid="2640796915611404382">"مجاز نبودن"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-fi/strings.xml b/packages/CompanionDeviceManager/res/values-fi/strings.xml index 528d16c2e425..ac948dfdc059 100644 --- a/packages/CompanionDeviceManager/res/values-fi/strings.xml +++ b/packages/CompanionDeviceManager/res/values-fi/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Companion Device Manager"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Salli, että <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> voi hallinnoida tätä laitettasi: <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"kello"</string> <string name="chooser_title" msgid="2262294130493605839">"Valitse <xliff:g id="PROFILE_NAME">%1$s</xliff:g>, jota <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong> hallinnoi"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"laite"</string> - <string name="profile_name_watch" msgid="576290739483672360">"kello"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Salli, että <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> voi hallinnoida tätä laitettasi: <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"Profiilin (<xliff:g id="PROFILE_NAME">%1$s</xliff:g>) ylläpitoon tarvitaan tätä sovellusta. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Salli"</string> <string name="consent_no" msgid="2640796915611404382">"Älä salli"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-fr-rCA/strings.xml b/packages/CompanionDeviceManager/res/values-fr-rCA/strings.xml index 1dcd3375c1cf..19f97f0c5887 100644 --- a/packages/CompanionDeviceManager/res/values-fr-rCA/strings.xml +++ b/packages/CompanionDeviceManager/res/values-fr-rCA/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Gestionnaire d\'appareil compagnon"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Autoriser <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> à gérer votre <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"montre"</string> <string name="chooser_title" msgid="2262294130493605839">"Choisissez un <xliff:g id="PROFILE_NAME">%1$s</xliff:g> qui sera géré par <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"appareil"</string> - <string name="profile_name_watch" msgid="576290739483672360">"montre"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Autoriser <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> à gérer votre <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"Cette application est nécessaire pour gérer votre <xliff:g id="PROFILE_NAME">%1$s</xliff:g>. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Autoriser"</string> <string name="consent_no" msgid="2640796915611404382">"Ne pas autoriser"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-fr/strings.xml b/packages/CompanionDeviceManager/res/values-fr/strings.xml index ba2fc8ea9424..8a7ae1ad807f 100644 --- a/packages/CompanionDeviceManager/res/values-fr/strings.xml +++ b/packages/CompanionDeviceManager/res/values-fr/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Gestionnaire d\'appareils associés"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Autoriser <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> à gérer votre <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"montre"</string> <string name="chooser_title" msgid="2262294130493605839">"Sélectionner le/la <xliff:g id="PROFILE_NAME">%1$s</xliff:g> qui sera géré(e) par <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"appareil"</string> - <string name="profile_name_watch" msgid="576290739483672360">"montre"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Autoriser <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> à gérer votre <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"Cette appli est nécessaire pour gérer votre <xliff:g id="PROFILE_NAME">%1$s</xliff:g>. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Autoriser"</string> <string name="consent_no" msgid="2640796915611404382">"Ne pas autoriser"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-gl/strings.xml b/packages/CompanionDeviceManager/res/values-gl/strings.xml index 5f9a8d786739..052c2073068e 100644 --- a/packages/CompanionDeviceManager/res/values-gl/strings.xml +++ b/packages/CompanionDeviceManager/res/values-gl/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Xestor de dispositivos complementarios"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Permitir que <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> xestione o teu dispositivo (<strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>)"</string> + <string name="profile_name_watch" msgid="576290739483672360">"reloxo"</string> <string name="chooser_title" msgid="2262294130493605839">"Escolle un perfil (<xliff:g id="PROFILE_NAME">%1$s</xliff:g>) para que o xestione a aplicación <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"dispositivo"</string> - <string name="profile_name_watch" msgid="576290739483672360">"reloxo"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Permitir que <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> xestione o teu dispositivo (<strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>)"</string> - <string name="profile_summary" msgid="2059360676631420073">"Esta aplicación é necesaria para xestionar o teu perfil (<xliff:g id="PROFILE_NAME">%1$s</xliff:g>). <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Permitir"</string> <string name="consent_no" msgid="2640796915611404382">"Non permitir"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-gu/strings.xml b/packages/CompanionDeviceManager/res/values-gu/strings.xml index 71cf012f24b3..279de1622612 100644 --- a/packages/CompanionDeviceManager/res/values-gu/strings.xml +++ b/packages/CompanionDeviceManager/res/values-gu/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"કમ્પેનિયન ડિવાઇસ મેનેજર"</string> + <string name="confirmation_title" msgid="8455544820286920304">"તમારા <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>ને મેનેજ કરવા માટે <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong>ને મંજૂર કરો"</string> + <string name="profile_name_watch" msgid="576290739483672360">"સ્માર્ટવૉચ"</string> <string name="chooser_title" msgid="2262294130493605839">"<strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong> દ્વારા મેનેજ કરવા માટે કોઈ <xliff:g id="PROFILE_NAME">%1$s</xliff:g> પસંદ કરો"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"ડિવાઇસ"</string> - <string name="profile_name_watch" msgid="576290739483672360">"સ્માર્ટવૉચ"</string> - <string name="confirmation_title" msgid="8455544820286920304">"તમારા <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>ને મેનેજ કરવા માટે <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong>ને મંજૂર કરો"</string> - <string name="profile_summary" msgid="2059360676631420073">"તમારી <xliff:g id="PROFILE_NAME">%1$s</xliff:g> મેનેજ કરવા માટે આ ઍપ જરૂરી છે. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"મંજૂરી આપો"</string> <string name="consent_no" msgid="2640796915611404382">"મંજૂરી આપશો નહીં"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-hi/strings.xml b/packages/CompanionDeviceManager/res/values-hi/strings.xml index d4dd1cb4f1b1..77048290af65 100644 --- a/packages/CompanionDeviceManager/res/values-hi/strings.xml +++ b/packages/CompanionDeviceManager/res/values-hi/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"सहयोगी डिवाइस मैनेजर"</string> + <string name="confirmation_title" msgid="8455544820286920304">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> को, अपनी <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> मैनेज करने की अनुमति दें"</string> + <string name="profile_name_watch" msgid="576290739483672360">"स्मार्टवॉच"</string> <string name="chooser_title" msgid="2262294130493605839">"कोई <xliff:g id="PROFILE_NAME">%1$s</xliff:g> चुनें, ताकि उसे <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong> की मदद से प्रबंधित किया जा सके"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"डिवाइस"</string> - <string name="profile_name_watch" msgid="576290739483672360">"स्मार्टवॉच"</string> - <string name="confirmation_title" msgid="8455544820286920304">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> को, अपनी <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> मैनेज करने की अनुमति दें"</string> - <string name="profile_summary" msgid="2059360676631420073">"<xliff:g id="PROFILE_NAME">%1$s</xliff:g> को मैनेज करने के लिए, यह ऐप्लिकेशन ज़रूरी है. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"अनुमति दें"</string> <string name="consent_no" msgid="2640796915611404382">"अनुमति न दें"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-hr/strings.xml b/packages/CompanionDeviceManager/res/values-hr/strings.xml index 87c5ae2670e9..e7db2badbdc1 100644 --- a/packages/CompanionDeviceManager/res/values-hr/strings.xml +++ b/packages/CompanionDeviceManager/res/values-hr/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Companion Device Manager"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Dopustite aplikaciji <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> da upravlja vašim <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"satom"</string> <string name="chooser_title" msgid="2262294130493605839">"Odaberite profil <xliff:g id="PROFILE_NAME">%1$s</xliff:g> kojim će upravljati aplikacija <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"uređaj"</string> - <string name="profile_name_watch" msgid="576290739483672360">"satom"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Dopustite aplikaciji <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> da upravlja vašim <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"Ta je aplikacija potrebna za upravljanje vašim profilom <xliff:g id="PROFILE_NAME">%1$s</xliff:g>. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Dopusti"</string> <string name="consent_no" msgid="2640796915611404382">"Nemoj dopustiti"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-hu/strings.xml b/packages/CompanionDeviceManager/res/values-hu/strings.xml index c7ceb384ed16..56f02a5808ab 100644 --- a/packages/CompanionDeviceManager/res/values-hu/strings.xml +++ b/packages/CompanionDeviceManager/res/values-hu/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Társeszközök kezelője"</string> + <string name="confirmation_title" msgid="8455544820286920304">"A(z) <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> engedélyezése a(z) <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> kezelésére"</string> + <string name="profile_name_watch" msgid="576290739483672360">"óra"</string> <string name="chooser_title" msgid="2262294130493605839">"A(z) <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong> alkalmazással kezelni kívánt <xliff:g id="PROFILE_NAME">%1$s</xliff:g> kiválasztása"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"eszköz"</string> - <string name="profile_name_watch" msgid="576290739483672360">"óra"</string> - <string name="confirmation_title" msgid="8455544820286920304">"A(z) <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> engedélyezése a(z) <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> kezelésére"</string> - <string name="profile_summary" msgid="2059360676631420073">"Szükség van erre az alkalmazásra a következő kezeléséhez: <xliff:g id="PROFILE_NAME">%1$s</xliff:g>. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Engedélyezés"</string> <string name="consent_no" msgid="2640796915611404382">"Tiltás"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-hy/strings.xml b/packages/CompanionDeviceManager/res/values-hy/strings.xml index 26f7990d7b66..cf22fbcf12a2 100644 --- a/packages/CompanionDeviceManager/res/values-hy/strings.xml +++ b/packages/CompanionDeviceManager/res/values-hy/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Companion Device Manager"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Թույլատրեք <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> հավելվածին կառավարել ձեր <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> սարքը"</string> + <string name="profile_name_watch" msgid="576290739483672360">"ժամացույց"</string> <string name="chooser_title" msgid="2262294130493605839">"Ընտրեք <xliff:g id="PROFILE_NAME">%1$s</xliff:g>ը, որը պետք է կառավարվի <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong> հավելվածի կողմից"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"սարք"</string> - <string name="profile_name_watch" msgid="576290739483672360">"ժամացույց"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Թույլատրեք <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> հավելվածին կառավարել ձեր <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> սարքը"</string> - <string name="profile_summary" msgid="2059360676631420073">"Այս հավելվածն անհրաժեշտ է <xliff:g id="PROFILE_NAME">%1$s</xliff:g> սարքը կամ պրոֆիլը կառավարելու համար։ <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Թույլատրել"</string> <string name="consent_no" msgid="2640796915611404382">"Չթույլատրել"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-in/strings.xml b/packages/CompanionDeviceManager/res/values-in/strings.xml index b0618d409527..41f1d096a01a 100644 --- a/packages/CompanionDeviceManager/res/values-in/strings.xml +++ b/packages/CompanionDeviceManager/res/values-in/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Pengelola Perangkat Pendamping"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Izinkan <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> untuk mengelola <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"smartwatch"</string> <string name="chooser_title" msgid="2262294130493605839">"Pilih <xliff:g id="PROFILE_NAME">%1$s</xliff:g> untuk dikelola oleh <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"perangkat"</string> - <string name="profile_name_watch" msgid="576290739483672360">"smartwatch"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Izinkan <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> untuk mengelola <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"Aplikasi ini diperlukan untuk mengelola <xliff:g id="PROFILE_NAME">%1$s</xliff:g>. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Izinkan"</string> <string name="consent_no" msgid="2640796915611404382">"Jangan izinkan"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-is/strings.xml b/packages/CompanionDeviceManager/res/values-is/strings.xml index b7d7c6abf749..5376912c6479 100644 --- a/packages/CompanionDeviceManager/res/values-is/strings.xml +++ b/packages/CompanionDeviceManager/res/values-is/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Stjórnun fylgdartækja"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Veita <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> stjórn á: <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"úr"</string> <string name="chooser_title" msgid="2262294130493605839">"Velja <xliff:g id="PROFILE_NAME">%1$s</xliff:g> sem <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong> á að stjórna"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"tæki"</string> - <string name="profile_name_watch" msgid="576290739483672360">"úr"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Veita <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> stjórn á: <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"Þetta forrit er nauðsynlegt til að hafa umsjón með <xliff:g id="PROFILE_NAME">%1$s</xliff:g>. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Leyfa"</string> <string name="consent_no" msgid="2640796915611404382">"Ekki leyfa"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-it/strings.xml b/packages/CompanionDeviceManager/res/values-it/strings.xml index ce003e7d7645..af9e8ca38a10 100644 --- a/packages/CompanionDeviceManager/res/values-it/strings.xml +++ b/packages/CompanionDeviceManager/res/values-it/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Gestione dispositivi companion"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Consenti all\'app <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> di gestire <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"orologio"</string> <string name="chooser_title" msgid="2262294130493605839">"Scegli un <xliff:g id="PROFILE_NAME">%1$s</xliff:g> che sia gestito da <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"dispositivo"</string> - <string name="profile_name_watch" msgid="576290739483672360">"orologio"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Consenti all\'app <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> di gestire <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"Questa app è necessaria per gestire il tuo <xliff:g id="PROFILE_NAME">%1$s</xliff:g>. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Consenti"</string> <string name="consent_no" msgid="2640796915611404382">"Non consentire"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-iw/strings.xml b/packages/CompanionDeviceManager/res/values-iw/strings.xml index 54c523c92f4b..68ca9d94e1fb 100644 --- a/packages/CompanionDeviceManager/res/values-iw/strings.xml +++ b/packages/CompanionDeviceManager/res/values-iw/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"ניהול מכשיר מותאם"</string> + <string name="confirmation_title" msgid="8455544820286920304">"אישור לאפליקציה <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> לנהל את <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"שעון"</string> <string name="chooser_title" msgid="2262294130493605839">"בחירת <xliff:g id="PROFILE_NAME">%1$s</xliff:g> לניהול באמצעות <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"מכשיר"</string> - <string name="profile_name_watch" msgid="576290739483672360">"שעון"</string> - <string name="confirmation_title" msgid="8455544820286920304">"אישור לאפליקציה <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> לנהל את <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"האפליקציה הזו נחוצה כדי לנהל את ה<xliff:g id="PROFILE_NAME">%1$s</xliff:g>. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"יש אישור"</string> <string name="consent_no" msgid="2640796915611404382">"אין אישור"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-ja/strings.xml b/packages/CompanionDeviceManager/res/values-ja/strings.xml index f92fafe54fde..c10a1e1f5226 100644 --- a/packages/CompanionDeviceManager/res/values-ja/strings.xml +++ b/packages/CompanionDeviceManager/res/values-ja/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"コンパニオン デバイス マネージャ"</string> + <string name="confirmation_title" msgid="8455544820286920304">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> に <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> の管理を許可する"</string> + <string name="profile_name_watch" msgid="576290739483672360">"ウォッチ"</string> <string name="chooser_title" msgid="2262294130493605839">"<strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong> の管理対象となる<xliff:g id="PROFILE_NAME">%1$s</xliff:g>の選択"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"デバイス"</string> - <string name="profile_name_watch" msgid="576290739483672360">"ウォッチ"</string> - <string name="confirmation_title" msgid="8455544820286920304">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> に <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> の管理を許可する"</string> - <string name="profile_summary" msgid="2059360676631420073">"このアプリは <xliff:g id="PROFILE_NAME">%1$s</xliff:g> の管理に必要です。<xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"許可"</string> <string name="consent_no" msgid="2640796915611404382">"許可しない"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-ka/strings.xml b/packages/CompanionDeviceManager/res/values-ka/strings.xml index 34efdd2223ac..637248170fe7 100644 --- a/packages/CompanionDeviceManager/res/values-ka/strings.xml +++ b/packages/CompanionDeviceManager/res/values-ka/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"კომპანიონი მოწყობილობების მენეჯერი"</string> + <string name="confirmation_title" msgid="8455544820286920304">"ნება დართეთ <strong><xliff:g id="APP_NAME">%1$s</xliff:g>-ს</strong>, რომ მართოს თქვენი <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"საათი"</string> <string name="chooser_title" msgid="2262294130493605839">"აირჩიეთ <xliff:g id="PROFILE_NAME">%1$s</xliff:g>, რომელიც უნდა მართოს <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>-მა"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"მოწყობილობა"</string> - <string name="profile_name_watch" msgid="576290739483672360">"საათი"</string> - <string name="confirmation_title" msgid="8455544820286920304">"ნება დართეთ <strong><xliff:g id="APP_NAME">%1$s</xliff:g>-ს</strong>, რომ მართოს თქვენი <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"ეს აპი საჭიროა თქვენი <xliff:g id="PROFILE_NAME">%1$s</xliff:g>-ს სამართავად. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"დაშვება"</string> <string name="consent_no" msgid="2640796915611404382">"არ დაიშვას"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-kk/strings.xml b/packages/CompanionDeviceManager/res/values-kk/strings.xml index 3c7f697b984f..6ac9c04732a5 100644 --- a/packages/CompanionDeviceManager/res/values-kk/strings.xml +++ b/packages/CompanionDeviceManager/res/values-kk/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Companion Device Manager"</string> + <string name="confirmation_title" msgid="8455544820286920304">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> қолданбасына <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> құрылғысын басқаруға рұқсат беру"</string> + <string name="profile_name_watch" msgid="576290739483672360">"сағат"</string> <string name="chooser_title" msgid="2262294130493605839">"<strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong> арқылы басқарылатын <xliff:g id="PROFILE_NAME">%1$s</xliff:g> құрылғысын таңдаңыз"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"құрылғы"</string> - <string name="profile_name_watch" msgid="576290739483672360">"сағат"</string> - <string name="confirmation_title" msgid="8455544820286920304">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> қолданбасына <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> құрылғысын басқаруға рұқсат беру"</string> - <string name="profile_summary" msgid="2059360676631420073">"Бұл қолданба <xliff:g id="PROFILE_NAME">%1$s</xliff:g> профиліңізді басқару үшін қажет. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Рұқсат беру"</string> <string name="consent_no" msgid="2640796915611404382">"Рұқсат бермеу"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-km/strings.xml b/packages/CompanionDeviceManager/res/values-km/strings.xml index 74ccd84956ea..db2634f9ec79 100644 --- a/packages/CompanionDeviceManager/res/values-km/strings.xml +++ b/packages/CompanionDeviceManager/res/values-km/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"កម្មវិធីគ្រប់គ្រងឧបករណ៍ដៃគូ"</string> + <string name="confirmation_title" msgid="8455544820286920304">"អនុញ្ញាតឱ្យ <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> គ្រប់គ្រង <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> របស់អ្នក"</string> + <string name="profile_name_watch" msgid="576290739483672360">"នាឡិកា"</string> <string name="chooser_title" msgid="2262294130493605839">"ជ្រើសរើស <xliff:g id="PROFILE_NAME">%1$s</xliff:g> ដើម្បីឱ្យស្ថិតក្រោមការគ្រប់គ្រងរបស់ <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"ឧបករណ៍"</string> - <string name="profile_name_watch" msgid="576290739483672360">"នាឡិកា"</string> - <string name="confirmation_title" msgid="8455544820286920304">"អនុញ្ញាតឱ្យ <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> គ្រប់គ្រង <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> របស់អ្នក"</string> - <string name="profile_summary" msgid="2059360676631420073">"ត្រូវការកម្មវិធីនេះ ដើម្បីគ្រប់គ្រង <xliff:g id="PROFILE_NAME">%1$s</xliff:g> របស់អ្នក។ <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"អនុញ្ញាត"</string> <string name="consent_no" msgid="2640796915611404382">"កុំអនុញ្ញាត"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-kn/strings.xml b/packages/CompanionDeviceManager/res/values-kn/strings.xml index 2a82d1fd6bac..e6413dac75d2 100644 --- a/packages/CompanionDeviceManager/res/values-kn/strings.xml +++ b/packages/CompanionDeviceManager/res/values-kn/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"ಕಂಪ್ಯಾನಿಯನ್ ಸಾಧನ ನಿರ್ವಾಹಕರು"</string> + <string name="confirmation_title" msgid="8455544820286920304">"ನಿಮ್ಮ <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> ಅನ್ನು ನಿರ್ವಹಿಸಲು <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> ಅನ್ನು ಅನುಮತಿಸಿ"</string> + <string name="profile_name_watch" msgid="576290739483672360">"ವೀಕ್ಷಿಸಿ"</string> <string name="chooser_title" msgid="2262294130493605839">"<strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong> ಮೂಲಕ ನಿರ್ವಹಿಸಬೇಕಾದ <xliff:g id="PROFILE_NAME">%1$s</xliff:g> ಅನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"ಸಾಧನ"</string> - <string name="profile_name_watch" msgid="576290739483672360">"ವೀಕ್ಷಿಸಿ"</string> - <string name="confirmation_title" msgid="8455544820286920304">"ನಿಮ್ಮ <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> ಅನ್ನು ನಿರ್ವಹಿಸಲು <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> ಅನ್ನು ಅನುಮತಿಸಿ"</string> - <string name="profile_summary" msgid="2059360676631420073">"ನಿಮ್ಮ <xliff:g id="PROFILE_NAME">%1$s</xliff:g>. ಅನ್ನು ನಿರ್ವಹಿಸಲು ಈ ಆ್ಯಪ್ನ ಅಗತ್ಯವಿದೆ. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"ಅನುಮತಿಸಿ"</string> <string name="consent_no" msgid="2640796915611404382">"ಅನುಮತಿಸಬೇಡಿ"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-ko/strings.xml b/packages/CompanionDeviceManager/res/values-ko/strings.xml index 6ca01bff5364..02459d51cfbc 100644 --- a/packages/CompanionDeviceManager/res/values-ko/strings.xml +++ b/packages/CompanionDeviceManager/res/values-ko/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"부속 기기 관리자"</string> + <string name="confirmation_title" msgid="8455544820286920304">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong>에서 <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> 기기를 관리하도록 허용"</string> + <string name="profile_name_watch" msgid="576290739483672360">"시계"</string> <string name="chooser_title" msgid="2262294130493605839">"<strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>에서 관리할 <xliff:g id="PROFILE_NAME">%1$s</xliff:g>을(를) 선택"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"기기"</string> - <string name="profile_name_watch" msgid="576290739483672360">"시계"</string> - <string name="confirmation_title" msgid="8455544820286920304">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong>에서 <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> 기기를 관리하도록 허용"</string> - <string name="profile_summary" msgid="2059360676631420073">"이 앱은 <xliff:g id="PROFILE_NAME">%1$s</xliff:g> 프로필을 관리하는 데 필요합니다. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"허용"</string> <string name="consent_no" msgid="2640796915611404382">"허용 안함"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-ky/strings.xml b/packages/CompanionDeviceManager/res/values-ky/strings.xml index 18d38a832e0b..ea4230add677 100644 --- a/packages/CompanionDeviceManager/res/values-ky/strings.xml +++ b/packages/CompanionDeviceManager/res/values-ky/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Companion Device Manager"</string> + <string name="confirmation_title" msgid="8455544820286920304">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> колдонмосуна <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> түзмөгүңүздү башкарууга уруксат бериңиз"</string> + <string name="profile_name_watch" msgid="576290739483672360">"саат"</string> <string name="chooser_title" msgid="2262294130493605839">"<xliff:g id="PROFILE_NAME">%1$s</xliff:g> <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong> тарабынан башкарылсын"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"түзмөк"</string> - <string name="profile_name_watch" msgid="576290739483672360">"саат"</string> - <string name="confirmation_title" msgid="8455544820286920304">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> колдонмосуна <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> түзмөгүңүздү башкарууга уруксат бериңиз"</string> - <string name="profile_summary" msgid="2059360676631420073">"Бул колдонмо <xliff:g id="PROFILE_NAME">%1$s</xliff:g> профилиңизди башкаруу үчүн керек. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Уруксат берүү"</string> <string name="consent_no" msgid="2640796915611404382">"Уруксат берилбесин"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-lo/strings.xml b/packages/CompanionDeviceManager/res/values-lo/strings.xml index a1eb71342446..b6c6289cd029 100644 --- a/packages/CompanionDeviceManager/res/values-lo/strings.xml +++ b/packages/CompanionDeviceManager/res/values-lo/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"ຕົວຈັດການອຸປະກອນປະກອບ"</string> + <string name="confirmation_title" msgid="8455544820286920304">"ອະນຸຍາດໃຫ້ <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> ຈັດການ <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> ຂອງທ່ານໄດ້"</string> + <string name="profile_name_watch" msgid="576290739483672360">"ໂມງ"</string> <string name="chooser_title" msgid="2262294130493605839">"ເລືອກ <xliff:g id="PROFILE_NAME">%1$s</xliff:g> ເພື່ອໃຫ້ຖືກຈັດການໂດຍ <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"ອຸປະກອນ"</string> - <string name="profile_name_watch" msgid="576290739483672360">"ໂມງ"</string> - <string name="confirmation_title" msgid="8455544820286920304">"ອະນຸຍາດໃຫ້ <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> ຈັດການ <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> ຂອງທ່ານໄດ້"</string> - <string name="profile_summary" msgid="2059360676631420073">"ຕ້ອງໃຊ້ແອັບນີ້ເພື່ອຈັດການ <xliff:g id="PROFILE_NAME">%1$s</xliff:g> ຂອງທ່ານ. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"ອະນຸຍາດ"</string> <string name="consent_no" msgid="2640796915611404382">"ບໍ່ອະນຸຍາດ"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-lt/strings.xml b/packages/CompanionDeviceManager/res/values-lt/strings.xml index 65f371d3d312..e5ff48025338 100644 --- a/packages/CompanionDeviceManager/res/values-lt/strings.xml +++ b/packages/CompanionDeviceManager/res/values-lt/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Companion Device Manager"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Leisti <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> tvarkyti <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"laikrodį"</string> <string name="chooser_title" msgid="2262294130493605839">"Jūsų <xliff:g id="PROFILE_NAME">%1$s</xliff:g>, kurį valdys <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong> (pasirinkite)"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"įrenginys"</string> - <string name="profile_name_watch" msgid="576290739483672360">"laikrodį"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Leisti <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> tvarkyti <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"Ši programa reikalinga norint tvarkyti jūsų <xliff:g id="PROFILE_NAME">%1$s</xliff:g>. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Leisti"</string> <string name="consent_no" msgid="2640796915611404382">"Neleisti"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-lv/strings.xml b/packages/CompanionDeviceManager/res/values-lv/strings.xml index b18bfe4a4243..d5212401e27e 100644 --- a/packages/CompanionDeviceManager/res/values-lv/strings.xml +++ b/packages/CompanionDeviceManager/res/values-lv/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Palīgierīču pārzinis"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Atļauja lietotnei <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> pārvaldīt ierīci <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"pulkstenis"</string> <string name="chooser_title" msgid="2262294130493605839">"Profila (<xliff:g id="PROFILE_NAME">%1$s</xliff:g>) izvēle, ko pārvaldīt lietotnē <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"ierīce"</string> - <string name="profile_name_watch" msgid="576290739483672360">"pulkstenis"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Atļauja lietotnei <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> pārvaldīt ierīci <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"Šī lietotne ir nepieciešama jūsu profila (<xliff:g id="PROFILE_NAME">%1$s</xliff:g>) pārvaldībai. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Atļaut"</string> <string name="consent_no" msgid="2640796915611404382">"Neatļaut"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-mk/strings.xml b/packages/CompanionDeviceManager/res/values-mk/strings.xml index 9d745c413b39..e6131e607f3b 100644 --- a/packages/CompanionDeviceManager/res/values-mk/strings.xml +++ b/packages/CompanionDeviceManager/res/values-mk/strings.xml @@ -17,11 +17,19 @@ <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="4470785958457506021">"Companion Device Manager"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Дозволете <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> да управува со вашиот <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"часовник"</string> <string name="chooser_title" msgid="2262294130493605839">"Изберете <xliff:g id="PROFILE_NAME">%1$s</xliff:g> со којшто ќе управува <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <string name="summary_watch" product="default" msgid="7113724443198337683">"<xliff:g id="APP_NAME">%1$s</xliff:g> ќе може да остварува интеракција со известувањата и да пристапува до дозволите за телефонот, SMS, контактите и календарот."</string> + <string name="summary_watch" product="tablet" msgid="7113724443198337683">"<xliff:g id="APP_NAME">%1$s</xliff:g> ќе може да остварува интеракција со известувањата и да пристапува до дозволите за телефонот, SMS, контактите и календарот."</string> + <string name="title_app_streaming" msgid="4459136600249308574">"Да се дозволи <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> да стримува апликации?"</string> + <string name="summary_app_streaming" product="default" msgid="6105916810614498138">"Дозволете <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> да обезбеди далечински пристап на <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> за да пристапува до апликации инсталирани на телефонов кога ќе се поврзе."</string> + <string name="summary_app_streaming" product="tablet" msgid="2996373715966272792">"Дозволете <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> да обезбеди далечински пристап на <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> за да пристапува до апликации инсталирани на таблетов кога ќе се поврзе."</string> + <string name="summary_app_streaming" product="device" msgid="7614171699434639963">"Дозволете <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> да обезбеди далечински пристап на <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> за да пристапува до апликации инсталирани на уредов кога ќе се поврзе."</string> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"уред"</string> - <string name="profile_name_watch" msgid="576290739483672360">"часовник"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Дозволете <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> да управува со вашиот <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"Апликацијава е потребна за управување со вашиот <xliff:g id="PROFILE_NAME">%1$s</xliff:g>. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Дозволи"</string> <string name="consent_no" msgid="2640796915611404382">"Не дозволувај"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-ml/strings.xml b/packages/CompanionDeviceManager/res/values-ml/strings.xml index 28c88da9e4af..639909a3f260 100644 --- a/packages/CompanionDeviceManager/res/values-ml/strings.xml +++ b/packages/CompanionDeviceManager/res/values-ml/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"കമ്പാനിയൻ ഉപകരണ മാനേജർ"</string> + <string name="confirmation_title" msgid="8455544820286920304">"നിങ്ങളുടെ <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> മാനേജ് ചെയ്യാൻ, <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> എന്നതിനെ അനുവദിക്കുക"</string> + <string name="profile_name_watch" msgid="576290739483672360">"വാച്ച്"</string> <string name="chooser_title" msgid="2262294130493605839">"<strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong> ഉപയോഗിച്ച് മാനേജ് ചെയ്യുന്നതിന് ഒരു <xliff:g id="PROFILE_NAME">%1$s</xliff:g> തിരഞ്ഞെടുക്കുക"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"ഉപകരണം"</string> - <string name="profile_name_watch" msgid="576290739483672360">"വാച്ച്"</string> - <string name="confirmation_title" msgid="8455544820286920304">"നിങ്ങളുടെ <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> മാനേജ് ചെയ്യാൻ, <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> എന്നതിനെ അനുവദിക്കുക"</string> - <string name="profile_summary" msgid="2059360676631420073">"നിങ്ങളുടെ <xliff:g id="PROFILE_NAME">%1$s</xliff:g> മാനേജ് ചെയ്യാൻ ഈ ആപ്പ് ആവശ്യമാണ്. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"അനുവദിക്കുക"</string> <string name="consent_no" msgid="2640796915611404382">"അനുവദിക്കരുത്"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-mn/strings.xml b/packages/CompanionDeviceManager/res/values-mn/strings.xml index 11e61d910ee4..adbe62d041c5 100644 --- a/packages/CompanionDeviceManager/res/values-mn/strings.xml +++ b/packages/CompanionDeviceManager/res/values-mn/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Companion Device Manager"</string> + <string name="confirmation_title" msgid="8455544820286920304">"<strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>-г удирдахын тулд <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong>-г зөвшөөрнө үү"</string> + <string name="profile_name_watch" msgid="576290739483672360">"цаг"</string> <string name="chooser_title" msgid="2262294130493605839">"<strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>-н удирдах<xliff:g id="PROFILE_NAME">%1$s</xliff:g>-г сонгоно уу"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"төхөөрөмж"</string> - <string name="profile_name_watch" msgid="576290739483672360">"цаг"</string> - <string name="confirmation_title" msgid="8455544820286920304">"<strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>-г удирдахын тулд <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong>-г зөвшөөрнө үү"</string> - <string name="profile_summary" msgid="2059360676631420073">"Энэ апп таны <xliff:g id="PROFILE_NAME">%1$s</xliff:g>-г удирдахад шаардлагатай. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Зөвшөөрөх"</string> <string name="consent_no" msgid="2640796915611404382">"Бүү зөвшөөр"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-mr/strings.xml b/packages/CompanionDeviceManager/res/values-mr/strings.xml index c73ed283c768..fce058399702 100644 --- a/packages/CompanionDeviceManager/res/values-mr/strings.xml +++ b/packages/CompanionDeviceManager/res/values-mr/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"सहयोगी डिव्हाइस व्यवस्थापक"</string> + <string name="confirmation_title" msgid="8455544820286920304">"तुमचे <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> व्यवस्थापित करण्यासाठी <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> ला अनुमती द्या"</string> + <string name="profile_name_watch" msgid="576290739483672360">"वॉच"</string> <string name="chooser_title" msgid="2262294130493605839">"<strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong> द्वारे व्यवस्थापित करण्यासाठी <xliff:g id="PROFILE_NAME">%1$s</xliff:g> निवडा"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"डिव्हाइस"</string> - <string name="profile_name_watch" msgid="576290739483672360">"वॉच"</string> - <string name="confirmation_title" msgid="8455544820286920304">"तुमचे <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> व्यवस्थापित करण्यासाठी <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> ला अनुमती द्या"</string> - <string name="profile_summary" msgid="2059360676631420073">"तुमची <xliff:g id="PROFILE_NAME">%1$s</xliff:g> प्रोफाइल व्यवस्थापित करण्यासाठी हे ॲप आवश्यक आहे. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"अनुमती द्या"</string> <string name="consent_no" msgid="2640796915611404382">"अनुमती देऊ नका"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-ms/strings.xml b/packages/CompanionDeviceManager/res/values-ms/strings.xml index d2aebb45f49e..5c4ec781132f 100644 --- a/packages/CompanionDeviceManager/res/values-ms/strings.xml +++ b/packages/CompanionDeviceManager/res/values-ms/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Pengurus Peranti Rakan"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Benarkan <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> untuk mengurus <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> anda"</string> + <string name="profile_name_watch" msgid="576290739483672360">"jam tangan"</string> <string name="chooser_title" msgid="2262294130493605839">"Pilih <xliff:g id="PROFILE_NAME">%1$s</xliff:g> untuk diurus oleh <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"peranti"</string> - <string name="profile_name_watch" msgid="576290739483672360">"jam tangan"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Benarkan <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> untuk mengurus <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> anda"</string> - <string name="profile_summary" msgid="2059360676631420073">"Apl ini diperlukan untuk mengurus <xliff:g id="PROFILE_NAME">%1$s</xliff:g> anda. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Benarkan"</string> <string name="consent_no" msgid="2640796915611404382">"Jangan benarkan"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-my/strings.xml b/packages/CompanionDeviceManager/res/values-my/strings.xml index 45c9d8b240fa..f3e572e0e542 100644 --- a/packages/CompanionDeviceManager/res/values-my/strings.xml +++ b/packages/CompanionDeviceManager/res/values-my/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"တွဲဖက်ကိရိယာ မန်နေဂျာ"</string> + <string name="confirmation_title" msgid="8455544820286920304">"သင်၏ <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> ကို စီမံခန့်ခွဲရန် <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> ကို ခွင့်ပြုပါ"</string> + <string name="profile_name_watch" msgid="576290739483672360">"နာရီ"</string> <string name="chooser_title" msgid="2262294130493605839">"<strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong> က စီမံခန့်ခွဲရန် <xliff:g id="PROFILE_NAME">%1$s</xliff:g> ကို ရွေးချယ်ပါ"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"စက်"</string> - <string name="profile_name_watch" msgid="576290739483672360">"နာရီ"</string> - <string name="confirmation_title" msgid="8455544820286920304">"သင်၏ <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> ကို စီမံခန့်ခွဲရန် <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> ကို ခွင့်ပြုပါ"</string> - <string name="profile_summary" msgid="2059360676631420073">"သင်၏ <xliff:g id="PROFILE_NAME">%1$s</xliff:g> ကို စီမံခန့်ခွဲရန် ဤအက်ပ်ကိုလိုအပ်သည်။ <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"ခွင့်ပြုရန်"</string> <string name="consent_no" msgid="2640796915611404382">"ခွင့်မပြုပါ"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-nb/strings.xml b/packages/CompanionDeviceManager/res/values-nb/strings.xml index af1ffe94cd36..d3eb7e595c8d 100644 --- a/packages/CompanionDeviceManager/res/values-nb/strings.xml +++ b/packages/CompanionDeviceManager/res/values-nb/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Companion Device Manager"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Tillat at <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> administrerer <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"klokke"</string> <string name="chooser_title" msgid="2262294130493605839">"Velg <xliff:g id="PROFILE_NAME">%1$s</xliff:g> som skal administreres av <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"enhet"</string> - <string name="profile_name_watch" msgid="576290739483672360">"klokke"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Tillat at <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> administrerer <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"Denne appen kreves for å administrere <xliff:g id="PROFILE_NAME">%1$s</xliff:g>. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Tillat"</string> <string name="consent_no" msgid="2640796915611404382">"Ikke tillat"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-ne/strings.xml b/packages/CompanionDeviceManager/res/values-ne/strings.xml index b29f94ce1b05..9bcf69b07fcc 100644 --- a/packages/CompanionDeviceManager/res/values-ne/strings.xml +++ b/packages/CompanionDeviceManager/res/values-ne/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"सहयोगी डिभाइसको प्रबन्धक"</string> + <string name="confirmation_title" msgid="8455544820286920304">"आफ्नो <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> लाई <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> व्यवस्थापन गर्ने अनुमति दिनुहोस्"</string> + <string name="profile_name_watch" msgid="576290739483672360">"घडी"</string> <string name="chooser_title" msgid="2262294130493605839">"आफूले <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong> प्रयोग गरी व्यवस्थापन गर्न चाहेको <xliff:g id="PROFILE_NAME">%1$s</xliff:g> चयन गर्नुहोस्"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"यन्त्र"</string> - <string name="profile_name_watch" msgid="576290739483672360">"घडी"</string> - <string name="confirmation_title" msgid="8455544820286920304">"आफ्नो <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> लाई <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> व्यवस्थापन गर्ने अनुमति दिनुहोस्"</string> - <string name="profile_summary" msgid="2059360676631420073">"तपाईंको <xliff:g id="PROFILE_NAME">%1$s</xliff:g> व्यवस्थापन गर्न यो एपलाई अनुमति दिनु पर्ने हुन्छ। <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"अनुमति दिनुहोस्"</string> <string name="consent_no" msgid="2640796915611404382">"अनुमति नदिनुहोस्"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-nl/strings.xml b/packages/CompanionDeviceManager/res/values-nl/strings.xml index a56fb9a62ce7..9ee09db08385 100644 --- a/packages/CompanionDeviceManager/res/values-nl/strings.xml +++ b/packages/CompanionDeviceManager/res/values-nl/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Companion Device Manager"</string> + <string name="confirmation_title" msgid="8455544820286920304">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> toestaan je <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> te beheren"</string> + <string name="profile_name_watch" msgid="576290739483672360">"horloge"</string> <string name="chooser_title" msgid="2262294130493605839">"Een <xliff:g id="PROFILE_NAME">%1$s</xliff:g> kiezen om te beheren met <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"apparaat"</string> - <string name="profile_name_watch" msgid="576290739483672360">"horloge"</string> - <string name="confirmation_title" msgid="8455544820286920304">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> toestaan je <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> te beheren"</string> - <string name="profile_summary" msgid="2059360676631420073">"Deze app is vereist om je <xliff:g id="PROFILE_NAME">%1$s</xliff:g> te beheren. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Toestaan"</string> <string name="consent_no" msgid="2640796915611404382">"Niet toestaan"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-or/strings.xml b/packages/CompanionDeviceManager/res/values-or/strings.xml index 8e43213a9e43..e08ec28eeab5 100644 --- a/packages/CompanionDeviceManager/res/values-or/strings.xml +++ b/packages/CompanionDeviceManager/res/values-or/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"ସହଯୋଗୀ ଡିଭାଇସ୍ ପରିଚାଳକ"</string> + <string name="confirmation_title" msgid="8455544820286920304">"ଆପଣଙ୍କ <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>କୁ ପରିଚାଳନା କରିବା ପାଇଁ <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong>କୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string> + <string name="profile_name_watch" msgid="576290739483672360">"ୱାଚ୍"</string> <string name="chooser_title" msgid="2262294130493605839">"<strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong> ଦ୍ୱାରା ପରିଚାଳିତ ହେବା ପାଇଁ ଏକ <xliff:g id="PROFILE_NAME">%1$s</xliff:g>କୁ ବାଛନ୍ତୁ"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"ଡିଭାଇସ୍"</string> - <string name="profile_name_watch" msgid="576290739483672360">"ୱାଚ୍"</string> - <string name="confirmation_title" msgid="8455544820286920304">"ଆପଣଙ୍କ <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>କୁ ପରିଚାଳନା କରିବା ପାଇଁ <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong>କୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string> - <string name="profile_summary" msgid="2059360676631420073">"ଆପଣଙ୍କ <xliff:g id="PROFILE_NAME">%1$s</xliff:g>କୁ ପରିଚାଳନା କରିବା ପାଇଁ ଏହି ଆପ୍ ଆବଶ୍ୟକ। <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"ଅନୁମତି ଦିଅନ୍ତୁ"</string> <string name="consent_no" msgid="2640796915611404382">"ଅନୁମତି ଦିଅନ୍ତୁ ନାହିଁ"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-pa/strings.xml b/packages/CompanionDeviceManager/res/values-pa/strings.xml index 54f4f8c42302..e317a464f72a 100644 --- a/packages/CompanionDeviceManager/res/values-pa/strings.xml +++ b/packages/CompanionDeviceManager/res/values-pa/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"ਸੰਬੰਧੀ ਡੀਵਾਈਸ ਪ੍ਰਬੰਧਕ"</string> + <string name="confirmation_title" msgid="8455544820286920304">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> ਨੂੰ ਤੁਹਾਡੇ <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ"</string> + <string name="profile_name_watch" msgid="576290739483672360">"ਸਮਾਰਟ-ਵਾਚ"</string> <string name="chooser_title" msgid="2262294130493605839">"<strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong> ਵੱਲੋਂ ਪ੍ਰਬੰਧਿਤ ਕੀਤੇ ਜਾਣ ਲਈ <xliff:g id="PROFILE_NAME">%1$s</xliff:g> ਚੁਣੋ"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"ਡੀਵਾਈਸ"</string> - <string name="profile_name_watch" msgid="576290739483672360">"ਸਮਾਰਟ-ਵਾਚ"</string> - <string name="confirmation_title" msgid="8455544820286920304">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> ਨੂੰ ਤੁਹਾਡੇ <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ"</string> - <string name="profile_summary" msgid="2059360676631420073">"ਤੁਹਾਡੇ <xliff:g id="PROFILE_NAME">%1$s</xliff:g> ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਨ ਲਈ ਇਹ ਐਪ ਲੋੜੀਂਦੀ ਹੈ। <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"ਇਜਾਜ਼ਤ ਦਿਓ"</string> <string name="consent_no" msgid="2640796915611404382">"ਇਜਾਜ਼ਤ ਨਾ ਦਿਓ"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-pl/strings.xml b/packages/CompanionDeviceManager/res/values-pl/strings.xml index a989baa4e36c..6cb7cc68d72e 100644 --- a/packages/CompanionDeviceManager/res/values-pl/strings.xml +++ b/packages/CompanionDeviceManager/res/values-pl/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Menedżer urządzeń towarzyszących"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Zezwól na zarządzanie urządzeniem <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> przez aplikację <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"zegarek"</string> <string name="chooser_title" msgid="2262294130493605839">"Wybierz profil <xliff:g id="PROFILE_NAME">%1$s</xliff:g>, którym ma zarządzać aplikacja <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"urządzenie"</string> - <string name="profile_name_watch" msgid="576290739483672360">"zegarek"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Zezwól na zarządzanie urządzeniem <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> przez aplikację <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"Ta aplikacja jest niezbędna do zarządzania profilem <xliff:g id="PROFILE_NAME">%1$s</xliff:g>. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Zezwól"</string> <string name="consent_no" msgid="2640796915611404382">"Nie zezwalaj"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-pt-rBR/strings.xml b/packages/CompanionDeviceManager/res/values-pt-rBR/strings.xml index d2724c0a8127..4306286937d7 100644 --- a/packages/CompanionDeviceManager/res/values-pt-rBR/strings.xml +++ b/packages/CompanionDeviceManager/res/values-pt-rBR/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Gerenciador de dispositivos complementar"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Permitir que o app <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> gerencie seu <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"relógio"</string> <string name="chooser_title" msgid="2262294130493605839">"Escolha um <xliff:g id="PROFILE_NAME">%1$s</xliff:g> para ser gerenciado pelo app <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"dispositivo"</string> - <string name="profile_name_watch" msgid="576290739483672360">"relógio"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Permitir que o app <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> gerencie seu <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"Esse app é necessário para gerenciar seu <xliff:g id="PROFILE_NAME">%1$s</xliff:g>. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Permitir"</string> <string name="consent_no" msgid="2640796915611404382">"Não permitir"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-pt-rPT/strings.xml b/packages/CompanionDeviceManager/res/values-pt-rPT/strings.xml index 2f5a53b2e2a7..8f05d49c7cbb 100644 --- a/packages/CompanionDeviceManager/res/values-pt-rPT/strings.xml +++ b/packages/CompanionDeviceManager/res/values-pt-rPT/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Gestor de dispositivos associados"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Permita que a app <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> faça a gestão do seu <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"relógio"</string> <string name="chooser_title" msgid="2262294130493605839">"Escolha um <xliff:g id="PROFILE_NAME">%1$s</xliff:g> para ser gerido pela app <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"dispositivo"</string> - <string name="profile_name_watch" msgid="576290739483672360">"relógio"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Permita que a app <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> faça a gestão do seu <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"Esta app é necessária para gerir o seu <xliff:g id="PROFILE_NAME">%1$s</xliff:g>. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Permitir"</string> <string name="consent_no" msgid="2640796915611404382">"Não permitir"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-pt/strings.xml b/packages/CompanionDeviceManager/res/values-pt/strings.xml index d2724c0a8127..4306286937d7 100644 --- a/packages/CompanionDeviceManager/res/values-pt/strings.xml +++ b/packages/CompanionDeviceManager/res/values-pt/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Gerenciador de dispositivos complementar"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Permitir que o app <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> gerencie seu <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"relógio"</string> <string name="chooser_title" msgid="2262294130493605839">"Escolha um <xliff:g id="PROFILE_NAME">%1$s</xliff:g> para ser gerenciado pelo app <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"dispositivo"</string> - <string name="profile_name_watch" msgid="576290739483672360">"relógio"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Permitir que o app <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> gerencie seu <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"Esse app é necessário para gerenciar seu <xliff:g id="PROFILE_NAME">%1$s</xliff:g>. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Permitir"</string> <string name="consent_no" msgid="2640796915611404382">"Não permitir"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-ro/strings.xml b/packages/CompanionDeviceManager/res/values-ro/strings.xml index 4df74de2a441..43a4de7b1cb5 100644 --- a/packages/CompanionDeviceManager/res/values-ro/strings.xml +++ b/packages/CompanionDeviceManager/res/values-ro/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Manager de dispozitiv Companion"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Permiteți ca <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> să vă gestioneze dispozitivul <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"ceas"</string> <string name="chooser_title" msgid="2262294130493605839">"Alegeți un profil <xliff:g id="PROFILE_NAME">%1$s</xliff:g> pe care să îl gestioneze <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"dispozitiv"</string> - <string name="profile_name_watch" msgid="576290739483672360">"ceas"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Permiteți ca <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> să vă gestioneze dispozitivul <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"Această aplicație este necesară pentru a gestiona <xliff:g id="PROFILE_NAME">%1$s</xliff:g>. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Permiteți"</string> <string name="consent_no" msgid="2640796915611404382">"Nu permiteți"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-ru/strings.xml b/packages/CompanionDeviceManager/res/values-ru/strings.xml index ea372d51658b..6d5c0de9e012 100644 --- a/packages/CompanionDeviceManager/res/values-ru/strings.xml +++ b/packages/CompanionDeviceManager/res/values-ru/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Управление подключенными устройствами"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Разрешите приложению <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> управлять этим устройством: <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"часы"</string> <string name="chooser_title" msgid="2262294130493605839">"Выберите устройство (<xliff:g id="PROFILE_NAME">%1$s</xliff:g>), которым будет управлять приложение <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"устройство"</string> - <string name="profile_name_watch" msgid="576290739483672360">"часы"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Разрешите приложению <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> управлять этим устройством: <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"Это приложение необходимо для управления вашим профилем \"<xliff:g id="PROFILE_NAME">%1$s</xliff:g>\". <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Разрешить"</string> <string name="consent_no" msgid="2640796915611404382">"Запретить"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-si/strings.xml b/packages/CompanionDeviceManager/res/values-si/strings.xml index a5c2c8842830..b4e28d8cdb65 100644 --- a/packages/CompanionDeviceManager/res/values-si/strings.xml +++ b/packages/CompanionDeviceManager/res/values-si/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"සහායක උපාංග කළමනාකරු"</string> + <string name="confirmation_title" msgid="8455544820286920304">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> හට ඔබගේ <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> කළමනාකරණය කිරීමට ඉඩ දෙන්න"</string> + <string name="profile_name_watch" msgid="576290739483672360">"ඔරලෝසුව"</string> <string name="chooser_title" msgid="2262294130493605839">"<strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong> මගින් කළමනාකරණය කරනු ලැබීමට <xliff:g id="PROFILE_NAME">%1$s</xliff:g>ක් තෝරන්න"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"උපාංගය"</string> - <string name="profile_name_watch" msgid="576290739483672360">"ඔරලෝසුව"</string> - <string name="confirmation_title" msgid="8455544820286920304">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> හට ඔබගේ <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> කළමනාකරණය කිරීමට ඉඩ දෙන්න"</string> - <string name="profile_summary" msgid="2059360676631420073">"මෙම යෙදුමට ඔබගේ <xliff:g id="PROFILE_NAME">%1$s</xliff:g> කළමනාකරණය කිරීමට අවශ්යයි. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"ඉඩ දෙන්න"</string> <string name="consent_no" msgid="2640796915611404382">"ඉඩ නොදෙන්න"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-sk/strings.xml b/packages/CompanionDeviceManager/res/values-sk/strings.xml index a9bf77f809e5..4f86f08e83f9 100644 --- a/packages/CompanionDeviceManager/res/values-sk/strings.xml +++ b/packages/CompanionDeviceManager/res/values-sk/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Správca sprievodných zariadení"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Povoliť aplikácii <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> spravovať zariadenie <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"hodinky"</string> <string name="chooser_title" msgid="2262294130493605839">"Vyberte profil <xliff:g id="PROFILE_NAME">%1$s</xliff:g>, ktorý bude spravovať aplikácia <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"zariadenie"</string> - <string name="profile_name_watch" msgid="576290739483672360">"hodinky"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Povoliť aplikácii <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> spravovať zariadenie <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"Táto aplikácia sa vyžaduje na správu profilu <xliff:g id="PROFILE_NAME">%1$s</xliff:g>. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Povoliť"</string> <string name="consent_no" msgid="2640796915611404382">"Nepovoliť"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-sl/strings.xml b/packages/CompanionDeviceManager/res/values-sl/strings.xml index 4eb8f5029fcd..a54af21d3586 100644 --- a/packages/CompanionDeviceManager/res/values-sl/strings.xml +++ b/packages/CompanionDeviceManager/res/values-sl/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Upravitelj spremljevalnih naprav"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Aplikaciji <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> dovolite upravljanje naprave <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"ura"</string> <string name="chooser_title" msgid="2262294130493605839">"Izbira naprave <xliff:g id="PROFILE_NAME">%1$s</xliff:g>, ki jo bo upravljala aplikacija <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"naprava"</string> - <string name="profile_name_watch" msgid="576290739483672360">"ura"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Aplikaciji <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> dovolite upravljanje naprave <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"Ta aplikacija je potrebna za upravljanje profila »<xliff:g id="PROFILE_NAME">%1$s</xliff:g>«. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Dovoli"</string> <string name="consent_no" msgid="2640796915611404382">"Ne dovoli"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-sq/strings.xml b/packages/CompanionDeviceManager/res/values-sq/strings.xml index 34357b478a17..d3f97df1bff0 100644 --- a/packages/CompanionDeviceManager/res/values-sq/strings.xml +++ b/packages/CompanionDeviceManager/res/values-sq/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Menaxheri i pajisjes shoqëruese"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Lejo që <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> të menaxhojë pajisjen tënde <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"ora inteligjente"</string> <string name="chooser_title" msgid="2262294130493605839">"Zgjidh një profil <xliff:g id="PROFILE_NAME">%1$s</xliff:g> që do të menaxhohet nga <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"pajisja"</string> - <string name="profile_name_watch" msgid="576290739483672360">"ora inteligjente"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Lejo që <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> të menaxhojë pajisjen tënde <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"Ky aplikacion nevojitet për të menaxhuar profilin tënd <xliff:g id="PROFILE_NAME">%1$s</xliff:g>. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Lejo"</string> <string name="consent_no" msgid="2640796915611404382">"Mos lejo"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-sr/strings.xml b/packages/CompanionDeviceManager/res/values-sr/strings.xml index 37af18534712..db8f291d6874 100644 --- a/packages/CompanionDeviceManager/res/values-sr/strings.xml +++ b/packages/CompanionDeviceManager/res/values-sr/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Менаџер придруженог уређаја"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Дозволите апликацији <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> да управља уређајем <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"сат"</string> <string name="chooser_title" msgid="2262294130493605839">"Одаберите профил <xliff:g id="PROFILE_NAME">%1$s</xliff:g> којим ће управљати апликација <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"уређај"</string> - <string name="profile_name_watch" msgid="576290739483672360">"сат"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Дозволите апликацији <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> да управља уређајем <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"Ова апликација је потребна за управљање профилом <xliff:g id="PROFILE_NAME">%1$s</xliff:g>. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Дозволи"</string> <string name="consent_no" msgid="2640796915611404382">"Не дозволи"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-sv/strings.xml b/packages/CompanionDeviceManager/res/values-sv/strings.xml index f78fadf8d864..733b2f799d29 100644 --- a/packages/CompanionDeviceManager/res/values-sv/strings.xml +++ b/packages/CompanionDeviceManager/res/values-sv/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Companion Device Manager"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Tillåt att <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> hanterar din <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"klocka"</string> <string name="chooser_title" msgid="2262294130493605839">"Välj en <xliff:g id="PROFILE_NAME">%1$s</xliff:g> för hantering av <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"enhet"</string> - <string name="profile_name_watch" msgid="576290739483672360">"klocka"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Tillåt att <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> hanterar din <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"Appen behövs för att hantera <xliff:g id="PROFILE_NAME">%1$s</xliff:g>. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Tillåt"</string> <string name="consent_no" msgid="2640796915611404382">"Tillåt inte"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-sw/strings.xml b/packages/CompanionDeviceManager/res/values-sw/strings.xml index 495c44111290..02db2569f9eb 100644 --- a/packages/CompanionDeviceManager/res/values-sw/strings.xml +++ b/packages/CompanionDeviceManager/res/values-sw/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Kidhibiti cha Vifaa Visaidizi"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Ruhusu <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> idhibiti <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> yako"</string> + <string name="profile_name_watch" msgid="576290739483672360">"saa"</string> <string name="chooser_title" msgid="2262294130493605839">"Chagua <xliff:g id="PROFILE_NAME">%1$s</xliff:g> ili idhibitiwe na <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"kifaa"</string> - <string name="profile_name_watch" msgid="576290739483672360">"saa"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Ruhusu <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> idhibiti <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> yako"</string> - <string name="profile_summary" msgid="2059360676631420073">"Programu hii inahitajika ili udhibiti wasifu wako wa <xliff:g id="PROFILE_NAME">%1$s</xliff:g>. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Ruhusu"</string> <string name="consent_no" msgid="2640796915611404382">"Usiruhusu"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-ta/strings.xml b/packages/CompanionDeviceManager/res/values-ta/strings.xml index 20845bd69562..3e998c8a1983 100644 --- a/packages/CompanionDeviceManager/res/values-ta/strings.xml +++ b/packages/CompanionDeviceManager/res/values-ta/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"கம்பேனியன் சாதன நிர்வாகி"</string> + <string name="confirmation_title" msgid="8455544820286920304">"உங்கள் <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> ஐ நிர்வகிக்க <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> ஆப்ஸை அனுமதியுங்கள்"</string> + <string name="profile_name_watch" msgid="576290739483672360">"வாட்ச்"</string> <string name="chooser_title" msgid="2262294130493605839">"<strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong> ஆப்ஸ் நிர்வகிக்கக்கூடிய <xliff:g id="PROFILE_NAME">%1$s</xliff:g> ஐத் தேர்ந்தெடுங்கள்"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"சாதனம்"</string> - <string name="profile_name_watch" msgid="576290739483672360">"வாட்ச்"</string> - <string name="confirmation_title" msgid="8455544820286920304">"உங்கள் <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> ஐ நிர்வகிக்க <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> ஆப்ஸை அனுமதியுங்கள்"</string> - <string name="profile_summary" msgid="2059360676631420073">"உங்கள் <xliff:g id="PROFILE_NAME">%1$s</xliff:g> சுயவிவரத்தை நிர்வகிக்க இந்த ஆப்ஸ் தேவைப்படுகிறது. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"அனுமதி"</string> <string name="consent_no" msgid="2640796915611404382">"அனுமதிக்க வேண்டாம்"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-te/strings.xml b/packages/CompanionDeviceManager/res/values-te/strings.xml index c855cf2a8501..8c5312695c89 100644 --- a/packages/CompanionDeviceManager/res/values-te/strings.xml +++ b/packages/CompanionDeviceManager/res/values-te/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"సహచర పరికర మేనేజర్"</string> + <string name="confirmation_title" msgid="8455544820286920304">"మీ <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>ను మేనేజ్ చేయడానికి <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong>ను అనుమతించండి;"</string> + <string name="profile_name_watch" msgid="576290739483672360">"వాచ్"</string> <string name="chooser_title" msgid="2262294130493605839">"<strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong> ద్వారా మేనేజ్ చేయబడటానికి ఒక <xliff:g id="PROFILE_NAME">%1$s</xliff:g>ను ఎంచుకోండి"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"పరికరం"</string> - <string name="profile_name_watch" msgid="576290739483672360">"వాచ్"</string> - <string name="confirmation_title" msgid="8455544820286920304">"మీ <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>ను మేనేజ్ చేయడానికి <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong>ను అనుమతించండి;"</string> - <string name="profile_summary" msgid="2059360676631420073">"మీ <xliff:g id="PROFILE_NAME">%1$s</xliff:g>ను మేనేజ్ చేయడానికి ఈ యాప్ అవసరం. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"అనుమతించు"</string> <string name="consent_no" msgid="2640796915611404382">"అనుమతించవద్దు"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-th/strings.xml b/packages/CompanionDeviceManager/res/values-th/strings.xml index d78ada26cd8a..504731e9cb05 100644 --- a/packages/CompanionDeviceManager/res/values-th/strings.xml +++ b/packages/CompanionDeviceManager/res/values-th/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Companion Device Manager"</string> + <string name="confirmation_title" msgid="8455544820286920304">"อนุญาตให้ <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> จัดการ <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> ของคุณ"</string> + <string name="profile_name_watch" msgid="576290739483672360">"นาฬิกา"</string> <string name="chooser_title" msgid="2262294130493605839">"เลือก<xliff:g id="PROFILE_NAME">%1$s</xliff:g>ที่จะให้มีการจัดการโดย <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"อุปกรณ์"</string> - <string name="profile_name_watch" msgid="576290739483672360">"นาฬิกา"</string> - <string name="confirmation_title" msgid="8455544820286920304">"อนุญาตให้ <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> จัดการ <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> ของคุณ"</string> - <string name="profile_summary" msgid="2059360676631420073">"ต้องใช้แอปนี้ในการจัดการ<xliff:g id="PROFILE_NAME">%1$s</xliff:g>ของคุณ <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"อนุญาต"</string> <string name="consent_no" msgid="2640796915611404382">"ไม่อนุญาต"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-tl/strings.xml b/packages/CompanionDeviceManager/res/values-tl/strings.xml index 03165b43ab0f..30d5e5719f1d 100644 --- a/packages/CompanionDeviceManager/res/values-tl/strings.xml +++ b/packages/CompanionDeviceManager/res/values-tl/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Kasamang Device Manager"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Payagan ang <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> na pamahalaan ang iyong <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"relo"</string> <string name="chooser_title" msgid="2262294130493605839">"Pumili ng <xliff:g id="PROFILE_NAME">%1$s</xliff:g> para pamahalaan ng <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"device"</string> - <string name="profile_name_watch" msgid="576290739483672360">"relo"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Payagan ang <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> na pamahalaan ang iyong <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"Kinakailangan ang app na ito para pamahalaan ang iyong <xliff:g id="PROFILE_NAME">%1$s</xliff:g>. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Payagan"</string> <string name="consent_no" msgid="2640796915611404382">"Huwag payagan"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-tr/strings.xml b/packages/CompanionDeviceManager/res/values-tr/strings.xml index b2c1cf2fa832..1b1d71d36fb7 100644 --- a/packages/CompanionDeviceManager/res/values-tr/strings.xml +++ b/packages/CompanionDeviceManager/res/values-tr/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Companion Device Manager"</string> + <string name="confirmation_title" msgid="8455544820286920304">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> uygulaması <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> cihazınızı yönetebilsin mi?"</string> + <string name="profile_name_watch" msgid="576290739483672360">"saat"</string> <string name="chooser_title" msgid="2262294130493605839">"<strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong> tarafından yönetilecek bir <xliff:g id="PROFILE_NAME">%1$s</xliff:g> seçin"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"cihaz"</string> - <string name="profile_name_watch" msgid="576290739483672360">"saat"</string> - <string name="confirmation_title" msgid="8455544820286920304">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> uygulaması <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> cihazınızı yönetebilsin mi?"</string> - <string name="profile_summary" msgid="2059360676631420073">"Bu uygulama, <xliff:g id="PROFILE_NAME">%1$s</xliff:g> profilinizin yönetilmesi için gereklidir. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"İzin ver"</string> <string name="consent_no" msgid="2640796915611404382">"İzin verme"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-uk/strings.xml b/packages/CompanionDeviceManager/res/values-uk/strings.xml index 61b78e9a0b18..149841a84ead 100644 --- a/packages/CompanionDeviceManager/res/values-uk/strings.xml +++ b/packages/CompanionDeviceManager/res/values-uk/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Диспетчер супутніх пристроїв"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Дозволити додатку <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> керувати вашим пристроєм <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"годинник"</string> <string name="chooser_title" msgid="2262294130493605839">"Виберіть <xliff:g id="PROFILE_NAME">%1$s</xliff:g>, яким керуватиме додаток <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"пристрій"</string> - <string name="profile_name_watch" msgid="576290739483672360">"годинник"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Дозволити додатку <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> керувати вашим пристроєм <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"Цей додаток потрібен, щоб керувати профілем \"<xliff:g id="PROFILE_NAME">%1$s</xliff:g>\". <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Дозволити"</string> <string name="consent_no" msgid="2640796915611404382">"Не дозволяти"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-ur/strings.xml b/packages/CompanionDeviceManager/res/values-ur/strings.xml index ee7992109a18..b467550324dc 100644 --- a/packages/CompanionDeviceManager/res/values-ur/strings.xml +++ b/packages/CompanionDeviceManager/res/values-ur/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"ساتھی آلہ مینیجر"</string> + <string name="confirmation_title" msgid="8455544820286920304">"اپنے <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> کا نظم کرنے کے لیے <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> کو اجازت دیں"</string> + <string name="profile_name_watch" msgid="576290739483672360">"دیکھیں"</string> <string name="chooser_title" msgid="2262294130493605839">"<strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong> کے ذریعے نظم کئے جانے کیلئے <xliff:g id="PROFILE_NAME">%1$s</xliff:g> کو منتخب کریں"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"آلہ"</string> - <string name="profile_name_watch" msgid="576290739483672360">"دیکھیں"</string> - <string name="confirmation_title" msgid="8455544820286920304">"اپنے <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> کا نظم کرنے کے لیے <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> کو اجازت دیں"</string> - <string name="profile_summary" msgid="2059360676631420073">"اس ایپ کو آپ کے <xliff:g id="PROFILE_NAME">%1$s</xliff:g> کا نظم کرنے کی ضرورت ہے۔ <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"اجازت دیں"</string> <string name="consent_no" msgid="2640796915611404382">"اجازت نہ دیں"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-uz/strings.xml b/packages/CompanionDeviceManager/res/values-uz/strings.xml index 7221b6d24893..8505ca93c442 100644 --- a/packages/CompanionDeviceManager/res/values-uz/strings.xml +++ b/packages/CompanionDeviceManager/res/values-uz/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Companion Device Manager"</string> + <string name="confirmation_title" msgid="8455544820286920304">"<strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> qurilmasini boshqarish uchun <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> ilovasiga ruxsat bering"</string> + <string name="profile_name_watch" msgid="576290739483672360">"soat"</string> <string name="chooser_title" msgid="2262294130493605839">"<strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong> boshqaradigan <xliff:g id="PROFILE_NAME">%1$s</xliff:g> qurilmasini tanlang"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"qurilma"</string> - <string name="profile_name_watch" msgid="576290739483672360">"soat"</string> - <string name="confirmation_title" msgid="8455544820286920304">"<strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> qurilmasini boshqarish uchun <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> ilovasiga ruxsat bering"</string> - <string name="profile_summary" msgid="2059360676631420073">"Bu ilova <xliff:g id="PROFILE_NAME">%1$s</xliff:g> profilini boshqarish uchun kerak. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Ruxsat"</string> <string name="consent_no" msgid="2640796915611404382">"Ruxsat berilmasin"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-vi/strings.xml b/packages/CompanionDeviceManager/res/values-vi/strings.xml index 2819e1df75ba..5dec271a9f71 100644 --- a/packages/CompanionDeviceManager/res/values-vi/strings.xml +++ b/packages/CompanionDeviceManager/res/values-vi/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Companion Device Manager"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Cho phép <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> quản lý <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> của bạn"</string> + <string name="profile_name_watch" msgid="576290739483672360">"đồng hồ"</string> <string name="chooser_title" msgid="2262294130493605839">"Chọn một <xliff:g id="PROFILE_NAME">%1$s</xliff:g> sẽ do <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong> quản lý"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"thiết bị"</string> - <string name="profile_name_watch" msgid="576290739483672360">"đồng hồ"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Cho phép <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> quản lý <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> của bạn"</string> - <string name="profile_summary" msgid="2059360676631420073">"Cần có ứng dụng này để quản lý <xliff:g id="PROFILE_NAME">%1$s</xliff:g> của bạn. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Cho phép"</string> <string name="consent_no" msgid="2640796915611404382">"Không cho phép"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-zh-rCN/strings.xml b/packages/CompanionDeviceManager/res/values-zh-rCN/strings.xml index 1440c401673e..f41406790299 100644 --- a/packages/CompanionDeviceManager/res/values-zh-rCN/strings.xml +++ b/packages/CompanionDeviceManager/res/values-zh-rCN/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"配套设备管理器"</string> + <string name="confirmation_title" msgid="8455544820286920304">"允许<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong>管理您的<strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"手表"</string> <string name="chooser_title" msgid="2262294130493605839">"选择要由<strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>管理的<xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"设备"</string> - <string name="profile_name_watch" msgid="576290739483672360">"手表"</string> - <string name="confirmation_title" msgid="8455544820286920304">"允许<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong>管理您的<strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"需要使用此应用,才能管理您的<xliff:g id="PROFILE_NAME">%1$s</xliff:g>。<xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"允许"</string> <string name="consent_no" msgid="2640796915611404382">"不允许"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-zh-rHK/strings.xml b/packages/CompanionDeviceManager/res/values-zh-rHK/strings.xml index e3f1eb1249f1..37f4bd9aa099 100644 --- a/packages/CompanionDeviceManager/res/values-zh-rHK/strings.xml +++ b/packages/CompanionDeviceManager/res/values-zh-rHK/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"隨附裝置管理工具"</string> + <string name="confirmation_title" msgid="8455544820286920304">"允許 <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> 管理您的<strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"手錶"</string> <string name="chooser_title" msgid="2262294130493605839">"選擇由 <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong> 管理的<xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"裝置"</string> - <string name="profile_name_watch" msgid="576290739483672360">"手錶"</string> - <string name="confirmation_title" msgid="8455544820286920304">"允許 <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> 管理您的<strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"必須使用此應用程式,才能管理<xliff:g id="PROFILE_NAME">%1$s</xliff:g>。<xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"允許"</string> <string name="consent_no" msgid="2640796915611404382">"不允許"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-zh-rTW/strings.xml b/packages/CompanionDeviceManager/res/values-zh-rTW/strings.xml index 9f4041dd0aff..76c837927c57 100644 --- a/packages/CompanionDeviceManager/res/values-zh-rTW/strings.xml +++ b/packages/CompanionDeviceManager/res/values-zh-rTW/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"隨附裝置管理員"</string> + <string name="confirmation_title" msgid="8455544820286920304">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」<strong></strong>管理你的「<xliff:g id="DEVICE_NAME">%2$s</xliff:g>」<strong></strong>"</string> + <string name="profile_name_watch" msgid="576290739483672360">"手錶"</string> <string name="chooser_title" msgid="2262294130493605839">"選擇要讓「<xliff:g id="APP_NAME">%2$s</xliff:g>」<strong></strong>管理的<xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"裝置"</string> - <string name="profile_name_watch" msgid="576290739483672360">"手錶"</string> - <string name="confirmation_title" msgid="8455544820286920304">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」<strong></strong>管理你的「<xliff:g id="DEVICE_NAME">%2$s</xliff:g>」<strong></strong>"</string> - <string name="profile_summary" msgid="2059360676631420073">"需使用這個應用程式,才能管理「<xliff:g id="PROFILE_NAME">%1$s</xliff:g>」。<xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"允許"</string> <string name="consent_no" msgid="2640796915611404382">"不允許"</string> </resources> diff --git a/packages/CompanionDeviceManager/res/values-zu/strings.xml b/packages/CompanionDeviceManager/res/values-zu/strings.xml index dc933ae21599..fdfda007fea4 100644 --- a/packages/CompanionDeviceManager/res/values-zu/strings.xml +++ b/packages/CompanionDeviceManager/res/values-zu/strings.xml @@ -17,11 +17,25 @@ <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="4470785958457506021">"Isiphathi sedivayisi esihambisanayo"</string> + <string name="confirmation_title" msgid="8455544820286920304">"Vumela i-<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> ukuthi iphathe i-<strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> yakho"</string> + <string name="profile_name_watch" msgid="576290739483672360">"buka"</string> <string name="chooser_title" msgid="2262294130493605839">"Khetha i-<xliff:g id="PROFILE_NAME">%1$s</xliff:g> ezophathwa yi-<strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong>"</string> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for summary_watch (7113724443198337683) --> + <skip /> + <!-- no translation found for title_app_streaming (4459136600249308574) --> + <skip /> + <!-- no translation found for summary_app_streaming (6105916810614498138) --> + <skip /> + <!-- no translation found for summary_app_streaming (2996373715966272792) --> + <skip /> + <!-- no translation found for summary_app_streaming (7614171699434639963) --> + <skip /> + <string name="title_automotive_projection" msgid="3296005598978412847"></string> + <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="profile_name_generic" msgid="6851028682723034988">"idivayisi"</string> - <string name="profile_name_watch" msgid="576290739483672360">"buka"</string> - <string name="confirmation_title" msgid="8455544820286920304">"Vumela i-<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> ukuthi iphathe i-<strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> yakho"</string> - <string name="profile_summary" msgid="2059360676631420073">"I-app iyadingeka ukuphatha i-<xliff:g id="PROFILE_NAME">%1$s</xliff:g> yakho. <xliff:g id="PRIVILEGES_DISCPLAIMER">%2$s</xliff:g>"</string> + <string name="summary_generic" msgid="2346762210105903720"></string> <string name="consent_yes" msgid="8344487259618762872">"Vumela"</string> <string name="consent_no" msgid="2640796915611404382">"Ungavumeli"</string> </resources> diff --git a/packages/ConnectivityT/framework-t/Android.bp b/packages/ConnectivityT/framework-t/Android.bp index 931a55b27ddb..0bda923f2389 100644 --- a/packages/ConnectivityT/framework-t/Android.bp +++ b/packages/ConnectivityT/framework-t/Android.bp @@ -114,6 +114,23 @@ filegroup { ], } +// Ethernet related libraries. + +filegroup { + name: "framework-connectivity-ethernet-sources", + srcs: [ + "src/android/net/EthernetManager.java", + "src/android/net/EthernetNetworkSpecifier.java", + "src/android/net/IEthernetManager.aidl", + "src/android/net/IEthernetServiceListener.aidl", + "src/android/net/ITetheredInterfaceCallback.aidl", + ], + path: "src", + visibility: [ + "//visibility:private", + ], +} + // Connectivity-T common libraries. filegroup { @@ -130,6 +147,7 @@ filegroup { filegroup { name: "framework-connectivity-tiramisu-sources", srcs: [ + ":framework-connectivity-ethernet-sources", ":framework-connectivity-ipsec-sources", ":framework-connectivity-netstats-sources", ":framework-connectivity-nsd-sources", diff --git a/core/java/android/net/EthernetManager.java b/packages/ConnectivityT/framework-t/src/android/net/EthernetManager.java index 7cd63ef9cc5a..7cd63ef9cc5a 100644 --- a/core/java/android/net/EthernetManager.java +++ b/packages/ConnectivityT/framework-t/src/android/net/EthernetManager.java diff --git a/core/java/android/net/EthernetNetworkSpecifier.java b/packages/ConnectivityT/framework-t/src/android/net/EthernetNetworkSpecifier.java index 62c576144221..62c576144221 100644 --- a/core/java/android/net/EthernetNetworkSpecifier.java +++ b/packages/ConnectivityT/framework-t/src/android/net/EthernetNetworkSpecifier.java diff --git a/core/java/android/net/IEthernetManager.aidl b/packages/ConnectivityT/framework-t/src/android/net/IEthernetManager.aidl index e058e5a70c71..e058e5a70c71 100644 --- a/core/java/android/net/IEthernetManager.aidl +++ b/packages/ConnectivityT/framework-t/src/android/net/IEthernetManager.aidl diff --git a/core/java/android/net/IEthernetServiceListener.aidl b/packages/ConnectivityT/framework-t/src/android/net/IEthernetServiceListener.aidl index 782fa19d9df7..782fa19d9df7 100644 --- a/core/java/android/net/IEthernetServiceListener.aidl +++ b/packages/ConnectivityT/framework-t/src/android/net/IEthernetServiceListener.aidl diff --git a/core/java/android/net/ITetheredInterfaceCallback.aidl b/packages/ConnectivityT/framework-t/src/android/net/ITetheredInterfaceCallback.aidl index 14aa0237f24a..14aa0237f24a 100644 --- a/core/java/android/net/ITetheredInterfaceCallback.aidl +++ b/packages/ConnectivityT/framework-t/src/android/net/ITetheredInterfaceCallback.aidl diff --git a/packages/ConnectivityT/framework-t/src/android/net/IpSecAlgorithm.java b/packages/ConnectivityT/framework-t/src/android/net/IpSecAlgorithm.java index 840af28b77e7..a84e7a9c6344 100644 --- a/packages/ConnectivityT/framework-t/src/android/net/IpSecAlgorithm.java +++ b/packages/ConnectivityT/framework-t/src/android/net/IpSecAlgorithm.java @@ -23,7 +23,6 @@ import android.os.Parcel; import android.os.Parcelable; import com.android.internal.annotations.VisibleForTesting; -import com.android.internal.util.HexDump; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -469,20 +468,12 @@ public final class IpSecAlgorithm implements Parcelable { } } - // Because encryption keys are sensitive and userdebug builds are used by large user pools - // such as beta testers, we only allow sensitive info such as keys on eng builds. - private static boolean isUnsafeBuild() { - return Build.IS_DEBUGGABLE && Build.IS_ENG; - } - @Override @NonNull public String toString() { return new StringBuilder() .append("{mName=") .append(mName) - .append(", mKey=") - .append(isUnsafeBuild() ? HexDump.toHexString(mKey) : "<hidden>") .append(", mTruncLenBits=") .append(mTruncLenBits) .append("}") diff --git a/packages/ConnectivityT/service/Android.bp b/packages/ConnectivityT/service/Android.bp index 7b8817692b74..97dfb64b33dd 100644 --- a/packages/ConnectivityT/service/Android.bp +++ b/packages/ConnectivityT/service/Android.bp @@ -61,11 +61,25 @@ filegroup { ], } +// Ethernet related libraries. + +filegroup { + name: "services.connectivity-ethernet-sources", + srcs: [ + "src/com/android/server/net/IpConfigStore.java", + ], + path: "src", + visibility: [ + "//frameworks/opt/net/ethernet", + ], +} + // Connectivity-T common libraries. filegroup { name: "services.connectivity-tiramisu-sources", srcs: [ + ":services.connectivity-ethernet-sources", ":services.connectivity-ipsec-sources", ":services.connectivity-netstats-sources", ":services.connectivity-nsd-sources", diff --git a/services/core/java/com/android/server/net/IpConfigStore.java b/packages/ConnectivityT/service/src/com/android/server/net/IpConfigStore.java index d17dbde496ce..3a9a54415537 100644 --- a/services/core/java/com/android/server/net/IpConfigStore.java +++ b/packages/ConnectivityT/service/src/com/android/server/net/IpConfigStore.java @@ -44,6 +44,9 @@ import java.net.InetAddress; import java.util.ArrayList; import java.util.List; +/** + * This class provides an API to store and manage L3 network IP configuration. + */ public class IpConfigStore { private static final String TAG = "IpConfigStore"; private static final boolean DBG = false; @@ -78,6 +81,9 @@ public class IpConfigStore { return writeConfig(out, configKey, config, IPCONFIG_FILE_VERSION); } + /** + * Write the IP configuration with the given parameters to {@link DataOutputStream}. + */ @VisibleForTesting public static boolean writeConfig(DataOutputStream out, String configKey, IpConfiguration config, int version) throws IOException { @@ -154,10 +160,10 @@ public class IpConfigStore { break; case UNASSIGNED: /* Ignore */ - break; - default: - loge("Ignore invalid proxy settings while writing"); - break; + break; + default: + loge("Ignore invalid proxy settings while writing"); + break; } if (written) { @@ -177,7 +183,7 @@ public class IpConfigStore { } /** - * @Deprecated use {@link #writeIpConfigurations(String, ArrayMap)} instead. + * @deprecated use {@link #writeIpConfigurations(String, ArrayMap)} instead. * New method uses string as network identifier which could be interface name or MAC address or * other token. */ @@ -186,22 +192,28 @@ public class IpConfigStore { final SparseArray<IpConfiguration> networks) { mWriter.write(filePath, out -> { out.writeInt(IPCONFIG_FILE_VERSION); - for(int i = 0; i < networks.size(); i++) { + for (int i = 0; i < networks.size(); i++) { writeConfig(out, String.valueOf(networks.keyAt(i)), networks.valueAt(i)); } }); } + /** + * Write the IP configuration associated to the target networks to the destination path. + */ public void writeIpConfigurations(String filePath, ArrayMap<String, IpConfiguration> networks) { mWriter.write(filePath, out -> { out.writeInt(IPCONFIG_FILE_VERSION); - for(int i = 0; i < networks.size(); i++) { + for (int i = 0; i < networks.size(); i++) { writeConfig(out, networks.keyAt(i), networks.valueAt(i)); } }); } + /** + * Read the IP configuration from the destination path to {@link BufferedInputStream}. + */ public static ArrayMap<String, IpConfiguration> readIpConfigurations(String filePath) { BufferedInputStream bufferedInputStream; try { @@ -215,7 +227,7 @@ public class IpConfigStore { return readIpConfigurations(bufferedInputStream); } - /** @Deprecated use {@link #readIpConfigurations(String)} */ + /** @deprecated use {@link #readIpConfigurations(String)} */ @Deprecated public static SparseArray<IpConfiguration> readIpAndProxyConfigurations(String filePath) { BufferedInputStream bufferedInputStream; @@ -230,7 +242,7 @@ public class IpConfigStore { return readIpAndProxyConfigurations(bufferedInputStream); } - /** @Deprecated use {@link #readIpConfigurations(InputStream)} */ + /** @deprecated use {@link #readIpConfigurations(InputStream)} */ @Deprecated public static SparseArray<IpConfiguration> readIpAndProxyConfigurations( InputStream inputStream) { @@ -420,7 +432,7 @@ public class IpConfigStore { if (in != null) { try { in.close(); - } catch (Exception e) {} + } catch (Exception e) { } } } diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml index b25e9a18fc3d..a3f07d8fd1b4 100644 --- a/packages/Shell/AndroidManifest.xml +++ b/packages/Shell/AndroidManifest.xml @@ -207,6 +207,7 @@ <uses-permission android:name="android.permission.MANAGE_DEVICE_ADMINS" /> <uses-permission android:name="android.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS" /> <uses-permission android:name="android.permission.QUERY_ADMIN_POLICY" /> + <uses-permission android:name="android.permission.UPDATE_DEVICE_MANAGEMENT_RESOURCES" /> <uses-permission android:name="android.permission.FORCE_DEVICE_POLICY_MANAGER_LOGS" /> <uses-permission android:name="android.permission.CLEAR_FREEZE_PERIOD" /> <uses-permission android:name="android.permission.MODIFY_QUIET_MODE" /> diff --git a/packages/SystemUI/plugin/bcsmartspace/src/com/android/systemui/plugins/BcSmartspaceDataPlugin.java b/packages/SystemUI/plugin/bcsmartspace/src/com/android/systemui/plugins/BcSmartspaceDataPlugin.java index a16f5cd5d930..da9a92a1f6b4 100644 --- a/packages/SystemUI/plugin/bcsmartspace/src/com/android/systemui/plugins/BcSmartspaceDataPlugin.java +++ b/packages/SystemUI/plugin/bcsmartspace/src/com/android/systemui/plugins/BcSmartspaceDataPlugin.java @@ -20,9 +20,11 @@ import android.app.PendingIntent; import android.app.smartspace.SmartspaceAction; import android.app.smartspace.SmartspaceTarget; import android.app.smartspace.SmartspaceTargetEvent; +import android.content.ActivityNotFoundException; import android.content.Intent; import android.graphics.drawable.Drawable; import android.os.Parcelable; +import android.util.Log; import android.view.View; import android.view.ViewGroup; @@ -39,6 +41,7 @@ import java.util.List; public interface BcSmartspaceDataPlugin extends Plugin { String ACTION = "com.android.systemui.action.PLUGIN_BC_SMARTSPACE_DATA"; int VERSION = 1; + String TAG = "BcSmartspaceDataPlugin"; /** Register a listener to get Smartspace data. */ void registerListener(SmartspaceTargetListener listener); @@ -124,10 +127,14 @@ public interface BcSmartspaceDataPlugin extends Plugin { /** Interface for launching Intents, which can differ on the lockscreen */ interface IntentStarter { default void startFromAction(SmartspaceAction action, View v, boolean showOnLockscreen) { - if (action.getIntent() != null) { - startIntent(v, action.getIntent(), showOnLockscreen); - } else if (action.getPendingIntent() != null) { - startPendingIntent(action.getPendingIntent(), showOnLockscreen); + try { + if (action.getIntent() != null) { + startIntent(v, action.getIntent(), showOnLockscreen); + } else if (action.getPendingIntent() != null) { + startPendingIntent(action.getPendingIntent(), showOnLockscreen); + } + } catch (ActivityNotFoundException e) { + Log.w(TAG, "Could not launch intent for action: " + action, e); } } diff --git a/packages/SystemUI/res/layout/combined_qs_header.xml b/packages/SystemUI/res/layout/combined_qs_header.xml index 1f10e5dfeed8..405863dc9d92 100644 --- a/packages/SystemUI/res/layout/combined_qs_header.xml +++ b/packages/SystemUI/res/layout/combined_qs_header.xml @@ -101,4 +101,16 @@ app:layout_constraintBottom_toBottomOf="parent" /> + <FrameLayout + android:id="@+id/privacy_container" + android:layout_width="wrap_content" + android:layout_height="48dp" + android:gravity="center" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="@id/date" + app:layout_constraintBottom_toBottomOf="@id/date" + > + <include layout="@layout/ongoing_privacy_chip"/> + </FrameLayout> + </androidx.constraintlayout.motion.widget.MotionLayout>
\ No newline at end of file diff --git a/packages/SystemUI/res/xml/combined_qs_header_scene.xml b/packages/SystemUI/res/xml/combined_qs_header_scene.xml index d61e4a95bb68..91607d2f9bea 100644 --- a/packages/SystemUI/res/xml/combined_qs_header_scene.xml +++ b/packages/SystemUI/res/xml/combined_qs_header_scene.xml @@ -23,11 +23,22 @@ app:constraintSetEnd="@id/qs_header_constraint" app:constraintSetStart="@id/qqs_header_constraint"> <KeyFrameSet> + <!-- These positions are to prevent visual movement of @id/date --> <KeyPosition app:keyPositionType="pathRelative" app:percentX="0" - app:framePosition="50" + app:framePosition="49" app:motionTarget="@id/date" /> + <KeyPosition + app:keyPositionType="pathRelative" + app:percentX="1" + app:framePosition="51" + app:motionTarget="@id/date" /> + <KeyAttribute + app:motionTarget="@id/date" + app:framePosition="50" + android:alpha="0" + /> </KeyFrameSet> </Transition> diff --git a/packages/SystemUI/res/xml/qqs_header.xml b/packages/SystemUI/res/xml/qqs_header.xml index 3d7b549fc54b..c5b4c5d776b9 100644 --- a/packages/SystemUI/res/xml/qqs_header.xml +++ b/packages/SystemUI/res/xml/qqs_header.xml @@ -49,6 +49,14 @@ </Constraint> <Constraint + android:id="@+id/statusIcons"> + </Constraint> + + <Constraint + android:id="@+id/batteryRemainingIcon" > + </Constraint> + + <Constraint android:id="@+id/carrier_group"> <CustomAttribute app:attributeName="alpha" @@ -56,6 +64,15 @@ /> </Constraint> - + <Constraint + android:id="@+id/privacy_container"> + <Layout + android:layout_width="wrap_content" + android:layout_height="0dp" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="@id/date" + app:layout_constraintBottom_toBottomOf="@id/date" + /> + </Constraint> </ConstraintSet>
\ No newline at end of file diff --git a/packages/SystemUI/res/xml/qs_header.xml b/packages/SystemUI/res/xml/qs_header.xml index 6a0ab866966c..8248fcdb50fb 100644 --- a/packages/SystemUI/res/xml/qs_header.xml +++ b/packages/SystemUI/res/xml/qs_header.xml @@ -58,5 +58,14 @@ /> </Constraint> - + <Constraint + android:id="@+id/privacy_container"> + <Layout + android:layout_width="wrap_content" + android:layout_height="48dp" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="@id/date" + app:layout_constraintBottom_toBottomOf="@id/date" + /> + </Constraint> </ConstraintSet>
\ No newline at end of file diff --git a/packages/SystemUI/res/xml/split_header.xml b/packages/SystemUI/res/xml/split_header.xml index 44d42a05cd46..03401b3d51d1 100644 --- a/packages/SystemUI/res/xml/split_header.xml +++ b/packages/SystemUI/res/xml/split_header.xml @@ -53,5 +53,29 @@ /> </Constraint> + <Constraint + android:id="@+id/batteryRemainingIcon"> + <Layout + android:layout_width="wrap_content" + android:layout_height="0dp" + app:layout_constraintHeight_min="@dimen/split_shade_header_min_height" + app:layout_constraintStart_toEndOf="@id/statusIcons" + app:layout_constraintEnd_toStartOf="@id/privacy_container" + app:layout_constraintTop_toTopOf="@id/clock" + app:layout_constraintBottom_toBottomOf="parent" + /> + </Constraint> + + <Constraint + android:id="@+id/privacy_container"> + <Layout + android:layout_width="wrap_content" + android:layout_height="0dp" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="@id/date" + app:layout_constraintBottom_toBottomOf="@id/date" + app:layout_constraintStart_toEndOf="@id/batteryRemainingIcon" + /> + </Constraint> </ConstraintSet>
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricView.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricView.java index e35b55841f2f..1496f170dffe 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricView.java @@ -636,7 +636,9 @@ public abstract class AuthBiometricView extends LinearLayout { mIndicatorView.setText(message); mIndicatorView.setTextColor(mTextColorError); mIndicatorView.setVisibility(View.VISIBLE); - mIndicatorView.setSelected(true); + // select to enable marquee unless a screen reader is enabled + mIndicatorView.setSelected(!mAccessibilityManager.isEnabled() + || !mAccessibilityManager.isTouchExplorationEnabled()); mHandler.postDelayed(resetMessageRunnable, mInjector.getDelayAfterError()); Utils.notifyAccessibilityContentChanged(mAccessibilityManager, this); diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimationViewController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimationViewController.java index 07aec6994bd0..73e3aecd8b63 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimationViewController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimationViewController.java @@ -75,7 +75,7 @@ abstract class UdfpsAnimationViewController<T extends UdfpsAnimationView> @Override protected void onViewDetached() { mPanelExpansionStateManager.removeExpansionListener(mPanelExpansionListener); - mDialogManager.registerListener(mDialogListener); + mDialogManager.unregisterListener(mDialogListener); mDumpManger.unregisterDumpable(getDumpTag()); } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt index a801647ba7d2..69bcf2ec8b8d 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt @@ -24,6 +24,7 @@ import android.graphics.Matrix import android.view.RemoteAnimationTarget import android.view.SyncRtSurfaceTransactionApplier import android.view.View +import androidx.annotation.VisibleForTesting import androidx.core.math.MathUtils import com.android.internal.R import com.android.keyguard.KeyguardClockSwitchController @@ -33,6 +34,7 @@ import com.android.systemui.dagger.SysUISingleton import com.android.systemui.flags.FeatureFlags import com.android.systemui.flags.Flags import com.android.systemui.shared.system.smartspace.SmartspaceTransitionController +import com.android.systemui.statusbar.phone.BiometricUnlockController import com.android.systemui.statusbar.policy.KeyguardStateController import dagger.Lazy import javax.inject.Inject @@ -93,7 +95,8 @@ class KeyguardUnlockAnimationController @Inject constructor( keyguardViewMediator: Lazy<KeyguardViewMediator>, private val keyguardViewController: KeyguardViewController, private val smartspaceTransitionController: SmartspaceTransitionController, - private val featureFlags: FeatureFlags + private val featureFlags: FeatureFlags, + private val biometricUnlockController: BiometricUnlockController ) : KeyguardStateController.Callback { /** @@ -107,7 +110,8 @@ class KeyguardUnlockAnimationController @Inject constructor( * If we're unlocking via biometrics, PIN entry, or from clicking a notification, a canned * animation is started in [notifyStartKeyguardExitAnimation]. */ - private var surfaceTransactionApplier: SyncRtSurfaceTransactionApplier? = null + @VisibleForTesting + var surfaceTransactionApplier: SyncRtSurfaceTransactionApplier? = null private var surfaceBehindRemoteAnimationTarget: RemoteAnimationTarget? = null private var surfaceBehindRemoteAnimationStartTime: Long = 0 @@ -134,7 +138,8 @@ class KeyguardUnlockAnimationController @Inject constructor( * Animator that animates in the surface behind the keyguard. This is used to play a canned * animation on the surface, if we're not doing a swipe gesture. */ - private val surfaceBehindEntryAnimator = ValueAnimator.ofFloat(0f, 1f) + @VisibleForTesting + val surfaceBehindEntryAnimator = ValueAnimator.ofFloat(0f, 1f) /** Rounded corner radius to apply to the surface behind the keyguard. */ private var roundedCornerRadius = 0f @@ -222,7 +227,18 @@ class KeyguardUnlockAnimationController @Inject constructor( // to animate it in. Otherwise, the swipe touch events will continue animating it. if (!requestedShowSurfaceBehindKeyguard) { keyguardViewController.hide(startTime, 350) - surfaceBehindEntryAnimator.start() + + // If we're wake and unlocking, we don't want to animate the surface since we're going + // to do the light reveal scrim from the black AOD screen. Make it visible and end the + // remote aimation. + if (biometricUnlockController.isWakeAndUnlock) { + setSurfaceBehindAppearAmount(1f) + keyguardViewMediator.get().onKeyguardExitRemoteAnimationFinished( + false /* cancelled */) + } else { + // Otherwise, animate it in normally. + surfaceBehindEntryAnimator.start() + } } // Finish the keyguard remote animation if the dismiss amount has crossed the threshold. @@ -266,7 +282,7 @@ class KeyguardUnlockAnimationController @Inject constructor( * animations and swipe gestures to animate the surface's entry (and exit, if the swipe is * cancelled). */ - private fun setSurfaceBehindAppearAmount(amount: Float) { + fun setSurfaceBehindAppearAmount(amount: Float) { if (surfaceBehindRemoteAnimationTarget == null) { return } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/PendingDrawnTasksContainer.kt b/packages/SystemUI/src/com/android/systemui/keyguard/PendingDrawnTasksContainer.kt index bccd106db836..a60033cf40fe 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/PendingDrawnTasksContainer.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/PendingDrawnTasksContainer.kt @@ -25,7 +25,7 @@ import java.util.concurrent.atomic.AtomicReference */ class PendingDrawnTasksContainer { - private lateinit var pendingDrawnTasksCount: AtomicInteger + private var pendingDrawnTasksCount: AtomicInteger = AtomicInteger(0) private var completionCallback: AtomicReference<Runnable> = AtomicReference() /** diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaHierarchyManager.kt b/packages/SystemUI/src/com/android/systemui/media/MediaHierarchyManager.kt index fb601e310702..c8cd43287c99 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaHierarchyManager.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaHierarchyManager.kt @@ -21,6 +21,7 @@ import android.animation.AnimatorListenerAdapter import android.animation.ValueAnimator import android.annotation.IntDef import android.content.Context +import android.content.res.Configuration import android.graphics.Rect import android.util.MathUtils import android.view.View @@ -41,6 +42,7 @@ import com.android.systemui.statusbar.phone.KeyguardBypassController import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.statusbar.policy.KeyguardStateController +import com.android.systemui.util.Utils import com.android.systemui.util.animation.UniqueObjectHostView import javax.inject.Inject @@ -186,6 +188,8 @@ class MediaHierarchyManager @Inject constructor( @MediaLocation private var currentAttachmentLocation = -1 + private var inSplitShade = false + /** * Is there any active media in the carousel? */ @@ -390,8 +394,9 @@ class MediaHierarchyManager @Inject constructor( init { updateConfiguration() configurationController.addCallback(object : ConfigurationController.ConfigurationListener { - override fun onDensityOrFontScaleChanged() { + override fun onConfigChanged(newConfig: Configuration?) { updateConfiguration() + updateDesiredLocation(forceNoAnimation = true, forceStateUpdate = true) } }) statusBarStateController.addCallback(object : StatusBarStateController.StateListener { @@ -467,6 +472,7 @@ class MediaHierarchyManager @Inject constructor( private fun updateConfiguration() { distanceForFullShadeTransition = context.resources.getDimensionPixelSize( R.dimen.lockscreen_shade_media_transition_distance) + inSplitShade = Utils.shouldUseSplitNotificationShade(context.resources) } /** @@ -803,7 +809,7 @@ class MediaHierarchyManager @Inject constructor( private fun getQSTransformationProgress(): Float { val currentHost = getHost(desiredLocation) val previousHost = getHost(previousLocation) - if (hasActiveMedia && currentHost?.location == LOCATION_QS) { + if (hasActiveMedia && (currentHost?.location == LOCATION_QS && !inSplitShade)) { if (previousHost?.location == LOCATION_QQS) { if (previousHost.visible || statusbarState != StatusBarState.KEYGUARD) { return qsExpansion @@ -934,7 +940,7 @@ class MediaHierarchyManager @Inject constructor( statusbarState == StatusBarState.FULLSCREEN_USER_SWITCHER)) val allowedOnLockscreen = notifLockscreenUserManager.shouldShowLockscreenNotifications() val location = when { - qsExpansion > 0.0f && !onLockscreen -> LOCATION_QS + (qsExpansion > 0.0f || inSplitShade) && !onLockscreen -> LOCATION_QS qsExpansion > 0.4f && onLockscreen -> LOCATION_QS !hasActiveMedia -> LOCATION_QS onLockscreen && isTransformingToFullShadeAndInQQS() -> LOCATION_QQS diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt index 0fb08e403483..491a1750a93e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt @@ -298,8 +298,8 @@ class LockscreenShadeTransitionController @Inject constructor( nsslController.setTransitionToFullShadeAmount(field) notificationPanelController.setTransitionToFullShadeAmount(field, false /* animate */, 0 /* delay */) - val progress = MathUtils.saturate(dragDownAmount / scrimTransitionDistance) - qS.setTransitionToFullShadeAmount(field, progress) + dragProgress = MathUtils.saturate(dragDownAmount / scrimTransitionDistance) + qS.setTransitionToFullShadeAmount(field, dragProgress) // TODO: appear media also in split shade val mediaAmount = if (useSplitShade) 0f else field mediaHierarchyManager.setTransitionToFullShadeAmount(mediaAmount) @@ -308,6 +308,9 @@ class LockscreenShadeTransitionController @Inject constructor( } } + var dragProgress = 0f + private set + private fun transitionToShadeAmountCommon(dragDownAmount: Float) { val scrimProgress = MathUtils.saturate(dragDownAmount / scrimTransitionDistance) scrimController.setTransitionToFullShadeProgress(scrimProgress) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceController.kt index a44de2ce5699..a4e2d5ec0829 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceController.kt @@ -241,6 +241,10 @@ class LockscreenSmartspaceController @Inject constructor( configurationController.addCallback(configChangeListener) statusBarStateController.addCallback(statusBarStateListener) + plugin.registerSmartspaceEventNotifier { + e -> session?.notifySmartspaceEvent(e) + } + reloadSmartspace() } @@ -266,6 +270,7 @@ class LockscreenSmartspaceController @Inject constructor( statusBarStateController.removeCallback(statusBarStateListener) session = null + plugin?.registerSmartspaceEventNotifier(null) plugin?.onTargetsAvailable(emptyList()) Log.d(TAG, "Ending smartspace session for lockscreen") } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java index e7d5724fa9bf..81871634fbaf 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java @@ -392,7 +392,7 @@ public class KeyguardStatusBarViewController extends ViewController<KeyguardStat } float alphaQsExpansion = 1 - Math.min( - 1, mNotificationPanelViewStateProvider.getQsExpansionFraction() * 2); + 1, mNotificationPanelViewStateProvider.getLockscreenShadeDragProgress() * 2); float newAlpha = Math.min(getKeyguardContentsAlpha(), alphaQsExpansion) * mKeyguardStatusBarAnimateAlpha * (1.0f - mKeyguardHeadsUpShowingAmount); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java index 3b7063e6662f..434671c02035 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java @@ -17,6 +17,7 @@ package com.android.systemui.statusbar.phone; import static android.view.View.GONE; +import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT; import static androidx.constraintlayout.widget.ConstraintSet.END; import static androidx.constraintlayout.widget.ConstraintSet.PARENT_ID; @@ -33,7 +34,6 @@ import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_N import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_QUICK_SETTINGS_EXPANDED; import static com.android.systemui.statusbar.StatusBarState.KEYGUARD; import static com.android.systemui.statusbar.StatusBarState.SHADE; -import static com.android.systemui.statusbar.StatusBarState.SHADE_LOCKED; import static com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout.ROWS_ALL; import static com.android.systemui.statusbar.notification.stack.StackStateAnimator.ANIMATION_DURATION_FOLD_TO_AOD; import static com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManagerKt.STATE_CLOSED; @@ -466,6 +466,9 @@ public class NotificationPanelViewController extends PanelViewController { private boolean mIsFullWidth; private boolean mBlockingExpansionForCurrentTouch; + // TODO (b/204204226): no longer needed once refactor is complete + private final boolean mUseCombinedQSHeaders; + /** * Following variables maintain state of events when input focus transfer may occur. */ @@ -913,6 +916,8 @@ public class NotificationPanelViewController extends PanelViewController { mQsFrameTranslateController = qsFrameTranslateController; updateUserSwitcherFlags(); onFinishInflate(); + + mUseCombinedQSHeaders = featureFlags.isEnabled(Flags.COMBINED_QS_HEADERS); } private void onFinishInflate() { @@ -1142,6 +1147,9 @@ public class NotificationPanelViewController extends PanelViewController { } else { constraintSet.connect(R.id.qs_frame, END, PARENT_ID, END); constraintSet.connect(R.id.notification_stack_scroller, START, PARENT_ID, START); + if (mUseCombinedQSHeaders) { + constraintSet.constrainHeight(R.id.split_shade_status_bar, WRAP_CONTENT); + } } constraintSet.getConstraint(R.id.notification_stack_scroller).layout.mWidth = panelWidth; constraintSet.getConstraint(R.id.qs_frame).layout.mWidth = qsWidth; @@ -1392,7 +1400,6 @@ public class NotificationPanelViewController extends PanelViewController { stackScrollerPadding = mClockPositionResult.stackScrollerPaddingExpanded; } - mSplitShadeHeaderController.setShadeExpandedFraction(getExpandedFraction()); mNotificationStackScrollLayoutController.setIntrinsicPadding(stackScrollerPadding); mKeyguardBottomArea.setAntiBurnInOffsetX(mClockPositionResult.clockX); @@ -2401,7 +2408,6 @@ public class NotificationPanelViewController extends PanelViewController { ? 1f : computeQsExpansionFraction(); mQs.setQsExpansion(adjustedExpansionFraction, getExpandedFraction(), getHeaderTranslation(), squishiness); - mSplitShadeHeaderController.setQsExpandedFraction(qsExpansionFraction); mMediaHierarchyManager.setQsExpansion(qsExpansionFraction); int qsPanelBottomY = calculateQsBottomPosition(qsExpansionFraction); mScrimController.setQsPosition(qsExpansionFraction, qsPanelBottomY); @@ -2415,6 +2421,17 @@ public class NotificationPanelViewController extends PanelViewController { mDepthController.setQsPanelExpansion(qsExpansionFraction); + // updateQsExpansion will get called whenever mTransitionToFullShadeProgress or + // mLockscreenShadeTransitionController.getDragProgress change. + // When in lockscreen, getDragProgress indicates the true expanded fraction of QS + float shadeExpandedFraction = mTransitioningToFullShadeProgress > 0 + ? mLockscreenShadeTransitionController.getDragProgress() + : getExpandedFraction(); + mSplitShadeHeaderController.setShadeExpandedFraction(shadeExpandedFraction); + mSplitShadeHeaderController.setQsExpandedFraction(qsExpansionFraction); + mSplitShadeHeaderController.setShadeExpanded(mQsVisible); + + if (mCommunalViewController != null) { mCommunalViewController.updateQsExpansion(qsExpansionFraction); } @@ -3629,11 +3646,15 @@ public class NotificationPanelViewController extends PanelViewController { return !isFullWidth() || !mShowIconsWhenExpanded; } - public final QS.ScrollListener mScrollListener = scrollY -> { - if (scrollY > 0 && !mQsFullyExpanded) { - if (DEBUG) Log.d(TAG, "Scrolling while not expanded. Forcing expand"); - // If we are scrolling QS, we should be fully expanded. - expandWithQs(); + public final QS.ScrollListener mScrollListener = new QS.ScrollListener() { + @Override + public void onQsPanelScrollChanged(int scrollY) { + mSplitShadeHeaderController.setQsScrollY(scrollY); + if (scrollY > 0 && !mQsFullyExpanded) { + if (DEBUG) Log.d(TAG, "Scrolling while not expanded. Forcing expand"); + // If we are scrolling QS, we should be fully expanded. + expandWithQs(); + } } }; @@ -4684,8 +4705,6 @@ public class NotificationPanelViewController extends PanelViewController { // would reset maybeAnimateBottomAreaAlpha(); updateQsState(); - mSplitShadeHeaderController.setShadeExpanded( - mBarState == SHADE || mBarState == SHADE_LOCKED); } @Override @@ -4715,6 +4734,9 @@ public class NotificationPanelViewController extends PanelViewController { * {@link KeyguardStatusBarViewController} and remove this method. */ boolean shouldHeadsUpBeVisible(); + + /** Return the fraction of the shade that's expanded, when in lockscreen. */ + float getLockscreenShadeDragProgress(); } private final NotificationPanelViewStateProvider mNotificationPanelViewStateProvider = @@ -4733,6 +4755,11 @@ public class NotificationPanelViewController extends PanelViewController { public boolean shouldHeadsUpBeVisible() { return mHeadsUpAppearanceController.shouldBeVisible(); } + + @Override + public float getLockscreenShadeDragProgress() { + return mLockscreenShadeTransitionController.getDragProgress(); + } }; /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SplitShadeHeaderController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SplitShadeHeaderController.kt index 8cf7288c9cd5..a1be5acdac13 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SplitShadeHeaderController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SplitShadeHeaderController.kt @@ -19,17 +19,22 @@ package com.android.systemui.statusbar.phone import android.view.View import androidx.constraintlayout.motion.widget.MotionLayout import com.android.settingslib.Utils +import com.android.systemui.Dumpable import com.android.systemui.R import com.android.systemui.animation.ShadeInterpolation import com.android.systemui.battery.BatteryMeterView import com.android.systemui.battery.BatteryMeterViewController +import com.android.systemui.dump.DumpManager import com.android.systemui.flags.FeatureFlags import com.android.systemui.flags.Flags +import com.android.systemui.qs.ChipVisibilityListener import com.android.systemui.qs.HeaderPrivacyIconsController import com.android.systemui.qs.carrier.QSCarrierGroupController import com.android.systemui.statusbar.phone.dagger.StatusBarComponent.StatusBarScope import com.android.systemui.statusbar.phone.dagger.StatusBarViewModule.SPLIT_SHADE_BATTERY_CONTROLLER import com.android.systemui.statusbar.phone.dagger.StatusBarViewModule.SPLIT_SHADE_HEADER +import java.io.FileDescriptor +import java.io.PrintWriter import javax.inject.Inject import javax.inject.Named @@ -40,12 +45,23 @@ class SplitShadeHeaderController @Inject constructor( private val privacyIconsController: HeaderPrivacyIconsController, qsCarrierGroupControllerBuilder: QSCarrierGroupController.Builder, featureFlags: FeatureFlags, - @Named(SPLIT_SHADE_BATTERY_CONTROLLER) batteryMeterViewController: BatteryMeterViewController -) { + @Named(SPLIT_SHADE_BATTERY_CONTROLLER) batteryMeterViewController: BatteryMeterViewController, + dumpManager: DumpManager +) : Dumpable { companion object { private val HEADER_TRANSITION_ID = R.id.header_transition private val SPLIT_HEADER_TRANSITION_ID = R.id.split_header_transition + private val QQS_HEADER_CONSTRAINT = R.id.qqs_header_constraint + private val QS_HEADER_CONSTRAINT = R.id.qs_header_constraint + private val SPLIT_HEADER_CONSTRAINT = R.id.split_header_constraint + + private fun Int.stateToString() = when (this) { + QQS_HEADER_CONSTRAINT -> "QQS Header" + QS_HEADER_CONSTRAINT -> "QS Header" + SPLIT_HEADER_CONSTRAINT -> "Split Header" + else -> "Unknown state" + } } private val combinedHeaders = featureFlags.isEnabled(Flags.COMBINED_QS_HEADERS) @@ -97,16 +113,37 @@ class SplitShadeHeaderController @Inject constructor( } } + var qsScrollY = 0 + set(value) { + if (field != value) { + field = value + updateScrollY() + } + } + + private val chipVisibilityListener: ChipVisibilityListener = object : ChipVisibilityListener { + override fun onChipVisibilityRefreshed(visible: Boolean) { + if (statusBar is MotionLayout) { + val state = statusBar.getConstraintSet(QQS_HEADER_CONSTRAINT).apply { + setAlpha(R.id.statusIcons, if (visible) 0f else 1f) + setAlpha(R.id.batteryRemainingIcon, if (visible) 0f else 1f) + } + statusBar.updateState(QQS_HEADER_CONSTRAINT, state) + } + } + } + init { if (statusBar is MotionLayout) { val context = statusBar.context val resources = statusBar.resources - statusBar.getConstraintSet(R.id.qqs_header_constraint) + statusBar.getConstraintSet(QQS_HEADER_CONSTRAINT) .load(context, resources.getXml(R.xml.qqs_header)) - statusBar.getConstraintSet(R.id.qs_header_constraint) + statusBar.getConstraintSet(QS_HEADER_CONSTRAINT) .load(context, resources.getXml(R.xml.qs_header)) - statusBar.getConstraintSet(R.id.split_header_constraint) + statusBar.getConstraintSet(SPLIT_HEADER_CONSTRAINT) .load(context, resources.getXml(R.xml.split_header)) + privacyIconsController.chipVisibilityListener = chipVisibilityListener } } @@ -134,10 +171,19 @@ class SplitShadeHeaderController @Inject constructor( qsCarrierGroupController = qsCarrierGroupControllerBuilder .setQSCarrierGroup(statusBar.findViewById(R.id.carrier_group)) .build() + + dumpManager.registerDumpable(this) + updateVisibility() updateConstraints() } + private fun updateScrollY() { + if (!splitShadeMode && combinedHeaders) { + statusBar.scrollY = qsScrollY + } + } + private fun onShadeExpandedChanged() { if (shadeExpanded) { privacyIconsController.startListening() @@ -149,7 +195,7 @@ class SplitShadeHeaderController @Inject constructor( } private fun onSplitShadeModeChanged() { - if (splitShadeMode) { + if (splitShadeMode || combinedHeaders) { privacyIconsController.onParentVisible() } else { privacyIconsController.onParentInvisible() @@ -183,6 +229,7 @@ class SplitShadeHeaderController @Inject constructor( statusBar.setTransition(HEADER_TRANSITION_ID) statusBar.transitionToStart() updatePosition() + updateScrollY() } } @@ -211,4 +258,17 @@ class SplitShadeHeaderController @Inject constructor( iconContainer.addIgnoredSlots(carrierIconSlots) } } + + override fun dump(fd: FileDescriptor, pw: PrintWriter, args: Array<out String>) { + pw.println("visible: $visible") + pw.println("shadeExpanded: $shadeExpanded") + pw.println("shadeExpandedFraction: $shadeExpandedFraction") + pw.println("splitShadeMode: $splitShadeMode") + pw.println("qsExpandedFraction: $qsExpandedFraction") + pw.println("qsScrollY: $qsScrollY") + if (combinedHeaders) { + statusBar as MotionLayout + pw.println("currentState: ${statusBar.currentState.stateToString()}") + } + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardUnlockAnimationControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardUnlockAnimationControllerTest.kt new file mode 100644 index 000000000000..f3043e934c8a --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardUnlockAnimationControllerTest.kt @@ -0,0 +1,134 @@ +package com.android.systemui.keyguard + +import android.app.ActivityManager +import android.app.WindowConfiguration +import android.graphics.Point +import android.graphics.Rect +import android.testing.AndroidTestingRunner +import android.testing.TestableLooper.RunWithLooper +import android.view.RemoteAnimationTarget +import android.view.SurfaceControl +import android.view.SyncRtSurfaceTransactionApplier +import android.view.ViewRootImpl +import androidx.test.filters.SmallTest +import com.android.keyguard.KeyguardViewController +import com.android.systemui.SysuiTestCase +import com.android.systemui.flags.FeatureFlags +import com.android.systemui.shared.system.smartspace.SmartspaceTransitionController +import com.android.systemui.statusbar.phone.BiometricUnlockController +import com.android.systemui.statusbar.policy.KeyguardStateController +import junit.framework.Assert.assertEquals +import junit.framework.Assert.assertTrue +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.ArgumentCaptor.forClass +import org.mockito.Mock +import org.mockito.Mockito.`when` +import org.mockito.Mockito.mock +import org.mockito.Mockito.times +import org.mockito.Mockito.verify +import org.mockito.Mockito.verifyNoMoreInteractions +import org.mockito.MockitoAnnotations + +@RunWith(AndroidTestingRunner::class) +@RunWithLooper +@SmallTest +class KeyguardUnlockAnimationControllerTest : SysuiTestCase() { + private lateinit var keyguardUnlockAnimationController: KeyguardUnlockAnimationController + + @Mock + private lateinit var keyguardViewMediator: KeyguardViewMediator + @Mock + private lateinit var keyguardStateController: KeyguardStateController + @Mock + private lateinit var keyguardViewController: KeyguardViewController + @Mock + private lateinit var smartspaceTransitionController: SmartspaceTransitionController + @Mock + private lateinit var featureFlags: FeatureFlags + @Mock + private lateinit var biometricUnlockController: BiometricUnlockController + @Mock + private lateinit var surfaceTransactionApplier: SyncRtSurfaceTransactionApplier + + private lateinit var remoteAnimationTarget: RemoteAnimationTarget + + @Before + fun setUp() { + MockitoAnnotations.initMocks(this) + keyguardUnlockAnimationController = KeyguardUnlockAnimationController( + context, keyguardStateController, { keyguardViewMediator }, keyguardViewController, + smartspaceTransitionController, featureFlags, biometricUnlockController + ) + + `when`(keyguardViewController.viewRootImpl).thenReturn(mock(ViewRootImpl::class.java)) + + // All of these fields are final, so we can't mock them, but are needed so that the surface + // appear amount setter doesn't short circuit. + remoteAnimationTarget = RemoteAnimationTarget( + 0, 0, null, false, Rect(), Rect(), 0, Point(), Rect(), Rect(), + mock(WindowConfiguration::class.java), false, mock(SurfaceControl::class.java), Rect(), + mock(ActivityManager.RunningTaskInfo::class.java), false) + + // Set the surface applier to our mock so that we can verify the arguments passed to it. + // This applier does not have any side effects within the unlock animation controller, so + // this is a reasonable way to test. + keyguardUnlockAnimationController.surfaceTransactionApplier = surfaceTransactionApplier + } + + /** + * If we're wake and unlocking, we are animating from the black/AOD screen to the app/launcher + * underneath. The LightRevealScrim will animate circularly from the fingerprint reader, + * revealing the app/launcher below. In this case, we want to make sure we are not animating the + * surface, or the user will see the wallpaper briefly as the app animates in. + */ + @Test + fun noSurfaceAnimation_ifWakeAndUnlocking() { + `when`(biometricUnlockController.isWakeAndUnlock).thenReturn(true) + + keyguardUnlockAnimationController.notifyStartKeyguardExitAnimation( + remoteAnimationTarget, + 0 /* startTime */, + false /* requestedShowSurfaceBehindKeyguard */ + ) + + val captor = forClass(SyncRtSurfaceTransactionApplier.SurfaceParams::class.java) + verify(surfaceTransactionApplier, times(1)).scheduleApply(captor.capture()) + + val params = captor.value + + // We expect that we've instantly set the surface behind to alpha = 1f, and have no + // transforms (translate, scale) on its matrix. + assertEquals(params.alpha, 1f) + assertTrue(params.matrix.isIdentity) + + // Also expect we've immediately asked the keyguard view mediator to finish the remote + // animation. + verify(keyguardViewMediator, times(1)).onKeyguardExitRemoteAnimationFinished( + false /* cancelled */) + + verifyNoMoreInteractions(surfaceTransactionApplier) + } + + /** + * If we are not wake and unlocking, we expect the unlock animation to play normally. + */ + @Test + fun surfaceAnimation_ifNotWakeAndUnlocking() { + `when`(biometricUnlockController.isWakeAndUnlock).thenReturn(false) + + keyguardUnlockAnimationController.notifyStartKeyguardExitAnimation( + remoteAnimationTarget, + 0 /* startTime */, + false /* requestedShowSurfaceBehindKeyguard */ + ) + + // Make sure the animator was started. + assertTrue(keyguardUnlockAnimationController.surfaceBehindEntryAnimator.isRunning) + + // Since the animation is running, we should not have finished the remote animation. + verify(keyguardViewMediator, times(0)).onKeyguardExitRemoteAnimationFinished( + false /* cancelled */) + } +}
\ No newline at end of file diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceControllerTest.kt index de627de2e1d0..1961ab269267 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceControllerTest.kt @@ -214,6 +214,8 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() { // THEN the session is created verify(smartspaceManager).createSmartspaceSession(any()) + // THEN an event notifier is registered + verify(plugin).registerSmartspaceEventNotifier(any()) } @Test @@ -241,7 +243,7 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() { } @Test - fun testEmptyListIsEmittedAfterDisconnect() { + fun testEmptyListIsEmittedAndNotifierRemovedAfterDisconnect() { // GIVEN a registered listener on an active session connectSession() clearInvocations(plugin) @@ -250,8 +252,9 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() { controller.stateChangeListener.onViewDetachedFromWindow(smartspaceView as View) controller.disconnect() - // THEN the listener receives an empty list of targets + // THEN the listener receives an empty list of targets and unregisters the notifier verify(plugin).onTargetsAvailable(emptyList()) + verify(plugin).registerSmartspaceEventNotifier(null) } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.java index 8d05e6693e33..37cf7485b8ab 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.java @@ -278,11 +278,11 @@ public class KeyguardStatusBarViewControllerTest extends SysuiTestCase { } @Test - public void updateViewState_qsExpansionOne_viewHidden() { + public void updateViewState_dragProgressOne_viewHidden() { mController.onViewAttached(); updateStateToKeyguard(); - mNotificationPanelViewStateProvider.setQsExpansionFraction(1f); + mNotificationPanelViewStateProvider.setLockscreenShadeDragProgress(1f); mController.updateViewState(); @@ -356,6 +356,7 @@ public class KeyguardStatusBarViewControllerTest extends SysuiTestCase { private float mPanelViewExpandedHeight = 100f; private float mQsExpansionFraction = 0f; private boolean mShouldHeadsUpBeVisible = false; + private float mLockscreenShadeDragProgress = 0f; @Override public float getPanelViewExpandedHeight() { @@ -372,6 +373,11 @@ public class KeyguardStatusBarViewControllerTest extends SysuiTestCase { return mShouldHeadsUpBeVisible; } + @Override + public float getLockscreenShadeDragProgress() { + return mLockscreenShadeDragProgress; + } + public void setPanelViewExpandedHeight(float panelViewExpandedHeight) { this.mPanelViewExpandedHeight = panelViewExpandedHeight; } @@ -383,5 +389,9 @@ public class KeyguardStatusBarViewControllerTest extends SysuiTestCase { public void setShouldHeadsUpBeVisible(boolean shouldHeadsUpBeVisible) { this.mShouldHeadsUpBeVisible = shouldHeadsUpBeVisible; } + + public void setLockscreenShadeDragProgress(float lockscreenShadeDragProgress) { + this.mLockscreenShadeDragProgress = lockscreenShadeDragProgress; + } } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/SplitShadeHeaderControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/SplitShadeHeaderControllerTest.kt index a8544a9a15e4..2b1826eab5aa 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/SplitShadeHeaderControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/SplitShadeHeaderControllerTest.kt @@ -8,6 +8,7 @@ import com.android.systemui.SysuiTestCase import com.android.systemui.animation.ShadeInterpolation import com.android.systemui.battery.BatteryMeterView import com.android.systemui.battery.BatteryMeterViewController +import com.android.systemui.dump.DumpManager import com.android.systemui.flags.FeatureFlags import com.android.systemui.flags.Flags import com.android.systemui.qs.HeaderPrivacyIconsController @@ -37,6 +38,7 @@ class SplitShadeHeaderControllerTest : SysuiTestCase() { @Mock private lateinit var batteryMeterView: BatteryMeterView @Mock private lateinit var batteryMeterViewController: BatteryMeterViewController @Mock private lateinit var privacyIconsController: HeaderPrivacyIconsController + @Mock private lateinit var dumpManager: DumpManager @JvmField @Rule val mockitoRule = MockitoJUnit.rule() var viewVisibility = View.GONE @@ -66,7 +68,8 @@ class SplitShadeHeaderControllerTest : SysuiTestCase() { privacyIconsController, qsCarrierGroupControllerBuilder, featureFlags, - batteryMeterViewController + batteryMeterViewController, + dumpManager ) carrierIconSlots = listOf( context.getString(com.android.internal.R.string.status_bar_mobile)) diff --git a/services/cloudsearch/OWNERS b/services/cloudsearch/OWNERS new file mode 100644 index 000000000000..aa4da3b4bee0 --- /dev/null +++ b/services/cloudsearch/OWNERS @@ -0,0 +1,4 @@ +# Bug component: 758286 + +huiwu@google.com +srazdan@google.com diff --git a/services/companion/java/com/android/server/companion/PermissionsUtils.java b/services/companion/java/com/android/server/companion/PermissionsUtils.java index 3a8ee7398329..b981ff1d43c9 100644 --- a/services/companion/java/com/android/server/companion/PermissionsUtils.java +++ b/services/companion/java/com/android/server/companion/PermissionsUtils.java @@ -84,18 +84,6 @@ final class PermissionsUtils { throw new IllegalArgumentException("Unsupported device profile: " + deviceProfile); } - if (DEVICE_PROFILE_APP_STREAMING.equals(deviceProfile)) { - // TODO: remove, when properly supporting this profile. - throw new UnsupportedOperationException( - "DEVICE_PROFILE_APP_STREAMING is not fully supported yet."); - } - - if (DEVICE_PROFILE_AUTOMOTIVE_PROJECTION.equals(deviceProfile)) { - // TODO: remove, when properly supporting this profile. - throw new UnsupportedOperationException( - "DEVICE_PROFILE_AUTOMOTIVE_PROJECTION is not fully supported yet."); - } - final String permission = DEVICE_PROFILE_TO_PERMISSION.get(deviceProfile); if (context.checkPermission(permission, getCallingPid(), packageUid) != PERMISSION_GRANTED) { diff --git a/services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java b/services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java index a6a87936616b..e98b63ecd4b5 100644 --- a/services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java +++ b/services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java @@ -29,6 +29,7 @@ import android.os.Build; import android.os.UserHandle; import android.window.DisplayWindowPolicyController; +import java.util.HashSet; import java.util.List; @@ -45,6 +46,8 @@ class GenericWindowPolicyController extends DisplayWindowPolicyController { @EnabledSince(targetSdkVersion = Build.VERSION_CODES.TIRAMISU) public static final long ALLOW_SECURE_ACTIVITY_DISPLAY_ON_REMOTE_DEVICE = 201712607L; + @NonNull final HashSet<Integer> mRunningUids = new HashSet<>(); + GenericWindowPolicyController(int windowFlags, int systemWindowFlags) { setInterestedWindowFlags(windowFlags, systemWindowFlags); } @@ -89,6 +92,17 @@ class GenericWindowPolicyController extends DisplayWindowPolicyController { @Override public void onRunningAppsChanged(int[] runningUids) { + mRunningUids.clear(); + for (int i = 0; i < runningUids.length; i++) { + mRunningUids.add(runningUids[i]); + } + } + /** + * Returns true if an app with the given UID has an activity running on the virtual display for + * this controller. + */ + boolean containsUid(int uid) { + return mRunningUids.contains(uid); } } diff --git a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java index 022da4361be4..36edf4fe9787 100644 --- a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java +++ b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java @@ -32,6 +32,7 @@ import android.hardware.input.VirtualTouchEvent; import android.os.Binder; import android.os.IBinder; import android.os.RemoteException; +import android.util.SparseArray; import android.window.DisplayWindowPolicyController; import com.android.internal.annotations.VisibleForTesting; @@ -50,12 +51,18 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub private final Context mContext; private final AssociationInfo mAssociationInfo; private final int mOwnerUid; - private final GenericWindowPolicyController mGenericWindowPolicyController; private final InputController mInputController; @VisibleForTesting final List<Integer> mVirtualDisplayIds = new ArrayList<>(); private final OnDeviceCloseListener mListener; + /** + * A mapping from the virtual display ID to its corresponding + * {@link GenericWindowPolicyController}. + */ + private final SparseArray<GenericWindowPolicyController> mWindowPolicyControllers = + new SparseArray<>(); + VirtualDeviceImpl(Context context, AssociationInfo associationInfo, IBinder token, int ownerUid, OnDeviceCloseListener listener) { this(context, associationInfo, token, ownerUid, /* inputController= */ null, listener); @@ -66,8 +73,6 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub int ownerUid, InputController inputController, OnDeviceCloseListener listener) { mContext = context; mAssociationInfo = associationInfo; - mGenericWindowPolicyController = new GenericWindowPolicyController(FLAG_SECURE, - SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS); mOwnerUid = ownerUid; if (inputController == null) { mInputController = new InputController(mVirtualDeviceLock); @@ -257,7 +262,11 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub "Virtual device already have a virtual display with ID " + displayId); } mVirtualDisplayIds.add(displayId); - return mGenericWindowPolicyController; + final GenericWindowPolicyController dwpc = + new GenericWindowPolicyController(FLAG_SECURE, + SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS); + mWindowPolicyControllers.put(displayId, dwpc); + return dwpc; } void onVirtualDisplayRemovedLocked(int displayId) { @@ -266,12 +275,27 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub "Virtual device doesn't have a virtual display with ID " + displayId); } mVirtualDisplayIds.remove(displayId); + mWindowPolicyControllers.remove(displayId); } int getOwnerUid() { return mOwnerUid; } + /** + * Returns true if an app with the given {@code uid} is currently running on this virtual + * device. + */ + boolean isAppRunningOnVirtualDevice(int uid) { + final int size = mWindowPolicyControllers.size(); + for (int i = 0; i < size; i++) { + if (mWindowPolicyControllers.valueAt(i).containsUid(uid)) { + return true; + } + } + return false; + } + interface OnDeviceCloseListener { void onClose(int associationId); } diff --git a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java index 46e75f75ea9f..0db670e46909 100644 --- a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java +++ b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java @@ -252,7 +252,14 @@ public class VirtualDeviceManagerService extends SystemService { @Override public boolean isAppRunningOnAnyVirtualDevice(int uid) { - // TODO(yukl): Implement this using DWPC.onRunningAppsChanged + synchronized (mVirtualDeviceManagerLock) { + int size = mVirtualDevices.size(); + for (int i = 0; i < size; i++) { + if (mVirtualDevices.valueAt(i).isAppRunningOnVirtualDevice(uid)) { + return true; + } + } + } return false; } } diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java index d7c1cfb7d1ed..811f2f5e5283 100644 --- a/services/core/java/com/android/server/TelephonyRegistry.java +++ b/services/core/java/com/android/server/TelephonyRegistry.java @@ -91,6 +91,7 @@ import android.util.Pair; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.app.IBatteryStats; +import com.android.internal.telephony.ICarrierPrivilegesListener; import com.android.internal.telephony.IOnSubscriptionsChangedListener; import com.android.internal.telephony.IPhoneStateListener; import com.android.internal.telephony.ITelephonyRegistry; @@ -106,6 +107,7 @@ import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -149,6 +151,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { IPhoneStateListener callback; IOnSubscriptionsChangedListener onSubscriptionsChangedListenerCallback; IOnSubscriptionsChangedListener onOpportunisticSubscriptionsChangedListenerCallback; + ICarrierPrivilegesListener carrierPrivilegesListener; int callerUid; int callerPid; @@ -173,6 +176,10 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { return (onOpportunisticSubscriptionsChangedListenerCallback != null); } + boolean matchCarrierPrivilegesListener() { + return carrierPrivilegesListener != null; + } + boolean canReadCallLog() { try { return TelephonyPermissions.checkReadCallLog( @@ -189,8 +196,9 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { + " onSubscriptionsChangedListenererCallback=" + onSubscriptionsChangedListenerCallback + " onOpportunisticSubscriptionsChangedListenererCallback=" - + onOpportunisticSubscriptionsChangedListenerCallback + " subId=" + subId - + " phoneId=" + phoneId + " events=" + eventList + "}"; + + onOpportunisticSubscriptionsChangedListenerCallback + + " carrierPrivilegesListener=" + carrierPrivilegesListener + + " subId=" + subId + " phoneId=" + phoneId + " events=" + eventList + "}"; } } @@ -402,6 +410,10 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { */ private List<Map<Pair<Integer, ApnSetting>, PreciseDataConnectionState>> mPreciseDataConnectionStates; + + /** Per-phoneId snapshot of privileged packages (names + UIDs). */ + private List<Pair<List<String>, int[]>> mCarrierPrivilegeStates; + /** * Support backward compatibility for {@link android.telephony.TelephonyDisplayInfo}. */ @@ -689,6 +701,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { cutListToSize(mBarringInfo, mNumPhones); cutListToSize(mPhysicalChannelConfigs, mNumPhones); cutListToSize(mLinkCapacityEstimateLists, mNumPhones); + cutListToSize(mCarrierPrivilegeStates, mNumPhones); return; } @@ -729,6 +742,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { mAllowedNetworkTypeReason[i] = -1; mAllowedNetworkTypeValue[i] = -1; mLinkCapacityEstimateLists.add(i, INVALID_LCE_LIST); + mCarrierPrivilegeStates.add(i, new Pair<>(Collections.emptyList(), new int[0])); } } @@ -794,6 +808,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { mIsDataEnabled = new boolean[numPhones]; mDataEnabledReason = new int[numPhones]; mLinkCapacityEstimateLists = new ArrayList<>(); + mCarrierPrivilegeStates = new ArrayList<>(); for (int i = 0; i < numPhones; i++) { mCallState[i] = TelephonyManager.CALL_STATE_IDLE; @@ -831,6 +846,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { mAllowedNetworkTypeReason[i] = -1; mAllowedNetworkTypeValue[i] = -1; mLinkCapacityEstimateLists.add(i, INVALID_LCE_LIST); + mCarrierPrivilegeStates.add(i, new Pair<>(Collections.emptyList(), new int[0])); } mAppOps = mContext.getSystemService(AppOpsManager.class); @@ -2766,6 +2782,104 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { } @Override + public void addCarrierPrivilegesListener( + int phoneId, + ICarrierPrivilegesListener callback, + String callingPackage, + String callingFeatureId) { + int callerUserId = UserHandle.getCallingUserId(); + mAppOps.checkPackage(Binder.getCallingUid(), callingPackage); + mContext.enforceCallingOrSelfPermission( + android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, + "addCarrierPrivilegesListener"); + if (VDBG) { + log( + "listen carrier privs: E pkg=" + pii(callingPackage) + " phoneId=" + phoneId + + " uid=" + Binder.getCallingUid() + + " myUserId=" + UserHandle.myUserId() + " callerUserId=" + callerUserId + + " callback=" + callback + + " callback.asBinder=" + callback.asBinder()); + } + if (!validatePhoneId(phoneId)) { + throw new IllegalArgumentException("Invalid slot index: " + phoneId); + } + + synchronized (mRecords) { + Record r = add( + callback.asBinder(), Binder.getCallingUid(), Binder.getCallingPid(), false); + + if (r == null) return; + + r.context = mContext; + r.carrierPrivilegesListener = callback; + r.callingPackage = callingPackage; + r.callingFeatureId = callingFeatureId; + r.callerUid = Binder.getCallingUid(); + r.callerPid = Binder.getCallingPid(); + r.phoneId = phoneId; + r.eventList = new ArraySet<>(); + if (DBG) { + log("listen carrier privs: Register r=" + r); + } + + Pair<List<String>, int[]> state = mCarrierPrivilegeStates.get(phoneId); + try { + r.carrierPrivilegesListener.onCarrierPrivilegesChanged( + Collections.unmodifiableList(state.first), + Arrays.copyOf(state.second, state.second.length)); + } catch (RemoteException ex) { + remove(r.binder); + } + } + } + + @Override + public void removeCarrierPrivilegesListener( + ICarrierPrivilegesListener callback, String callingPackage) { + mAppOps.checkPackage(Binder.getCallingUid(), callingPackage); + mContext.enforceCallingOrSelfPermission( + android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, + "removeCarrierPrivilegesListener"); + remove(callback.asBinder()); + } + + @Override + public void notifyCarrierPrivilegesChanged( + int phoneId, List<String> privilegedPackageNames, int[] privilegedUids) { + if (!checkNotifyPermission("notifyCarrierPrivilegesChanged")) { + return; + } + if (!validatePhoneId(phoneId)) return; + if (VDBG) { + log( + "notifyCarrierPrivilegesChanged: phoneId=" + phoneId + + ", <packages=" + pii(privilegedPackageNames) + + ", uids=" + Arrays.toString(privilegedUids) + ">"); + } + synchronized (mRecords) { + mCarrierPrivilegeStates.set( + phoneId, new Pair<>(privilegedPackageNames, privilegedUids)); + for (Record r : mRecords) { + // Listeners are per-slot, not per-subscription. This is to provide a stable + // view across SIM profile switches. + if (!r.matchCarrierPrivilegesListener() + || !idMatch(r, SubscriptionManager.INVALID_SUBSCRIPTION_ID, phoneId)) { + continue; + } + try { + // Make sure even in-process listeners can't modify the values. + r.carrierPrivilegesListener.onCarrierPrivilegesChanged( + Collections.unmodifiableList(privilegedPackageNames), + Arrays.copyOf(privilegedUids, privilegedUids.length)); + } catch (RemoteException ex) { + mRemoveList.add(r.binder); + } + } + handleRemoveListLocked(); + } + } + + @Override public void dump(FileDescriptor fd, PrintWriter writer, String[] args) { final IndentingPrintWriter pw = new IndentingPrintWriter(writer, " "); @@ -2814,6 +2928,11 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { pw.println("mAllowedNetworkTypeValue=" + mAllowedNetworkTypeValue[i]); pw.println("mPhysicalChannelConfigs=" + mPhysicalChannelConfigs.get(i)); pw.println("mLinkCapacityEstimateList=" + mLinkCapacityEstimateLists.get(i)); + // We need to obfuscate package names, and primitive arrays' native toString is ugly + Pair<List<String>, int[]> carrierPrivilegeState = mCarrierPrivilegeStates.get(i); + pw.println( + "mCarrierPrivilegeState=<packages=" + pii(carrierPrivilegeState.first) + + ", uids=" + Arrays.toString(carrierPrivilegeState.second) + ">"); pw.decreaseIndent(); } @@ -3540,4 +3659,10 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { private static String pii(String packageName) { return Build.IS_DEBUGGABLE ? packageName : "***"; } + + /** Redacts an entire list of package names if necessary. */ + private static String pii(List<String> packageNames) { + if (packageNames.isEmpty() || Build.IS_DEBUGGABLE) return packageNames.toString(); + return "[***, size=" + packageNames.size() + "]"; + } } diff --git a/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java b/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java index 9180ef80ae71..336572f44be3 100644 --- a/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java +++ b/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java @@ -130,6 +130,9 @@ class BatteryExternalStatsWorker implements BatteryStatsImpl.ExternalStatsSync { @GuardedBy("this") private Future<?> mBatteryLevelSync; + @GuardedBy("this") + private Future<?> mProcessStateSync; + // If both mStats and mWorkerLock need to be synchronized, mWorkerLock must be acquired first. private final Object mWorkerLock = new Object(); @@ -316,6 +319,25 @@ class BatteryExternalStatsWorker implements BatteryStatsImpl.ExternalStatsSync { } @Override + public Future<?> scheduleSyncDueToProcessStateChange(long delayMillis) { + synchronized (BatteryExternalStatsWorker.this) { + mProcessStateSync = scheduleDelayedSyncLocked(mProcessStateSync, + () -> scheduleSync("procstate-change", UPDATE_ON_PROC_STATE_CHANGE), + delayMillis); + return mProcessStateSync; + } + } + + public void cancelSyncDueToProcessStateChange() { + synchronized (BatteryExternalStatsWorker.this) { + if (mProcessStateSync != null) { + mProcessStateSync.cancel(false); + mProcessStateSync = null; + } + } + } + + @Override public Future<?> scheduleCleanupDueToRemovedUser(int userId) { synchronized (BatteryExternalStatsWorker.this) { return mExecutorService.schedule(() -> { @@ -434,6 +456,9 @@ class BatteryExternalStatsWorker implements BatteryStatsImpl.ExternalStatsSync { if ((updateFlags & UPDATE_CPU) != 0) { cancelCpuSyncDueToWakelockChange(); } + if ((updateFlags & UPDATE_ON_PROC_STATE_CHANGE) == UPDATE_ON_PROC_STATE_CHANGE) { + cancelSyncDueToProcessStateChange(); + } } try { diff --git a/services/core/java/com/android/server/clipboard/ClipboardService.java b/services/core/java/com/android/server/clipboard/ClipboardService.java index 093ecd57124f..e12034333554 100644 --- a/services/core/java/com/android/server/clipboard/ClipboardService.java +++ b/services/core/java/com/android/server/clipboard/ClipboardService.java @@ -50,6 +50,8 @@ import android.os.Handler; import android.os.HandlerThread; import android.os.IBinder; import android.os.IUserManager; +import android.os.Looper; +import android.os.Message; import android.os.Parcel; import android.os.RemoteCallbackList; import android.os.RemoteException; @@ -74,6 +76,8 @@ import android.widget.Toast; import com.android.internal.R; import com.android.internal.annotations.GuardedBy; +import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.util.FrameworkStatsLog; import com.android.server.LocalServices; import com.android.server.SystemService; import com.android.server.UiThread; @@ -99,6 +103,22 @@ public class ClipboardService extends SystemService { private static final boolean IS_EMULATOR = SystemProperties.getBoolean("ro.boot.qemu", false); + @VisibleForTesting + public static final long DEFAULT_CLIPBOARD_TIMEOUT_MILLIS = 3600000; + + /** + * Device config property for whether clipboard auto clear is enabled on the device + **/ + public static final String PROPERTY_AUTO_CLEAR_ENABLED = + "auto_clear_enabled"; + + /** + * Device config property for time period in milliseconds after which clipboard is auto + * cleared + **/ + public static final String PROPERTY_AUTO_CLEAR_TIMEOUT = + "auto_clear_timeout"; + // DeviceConfig properties private static final String PROPERTY_MAX_CLASSIFICATION_LENGTH = "max_classification_length"; private static final int DEFAULT_MAX_CLASSIFICATION_LENGTH = 400; @@ -312,6 +332,10 @@ public class ClipboardService extends SystemService { * 'intendingUserId' and the uid is called 'intendingUid'. */ private class ClipboardImpl extends IClipboard.Stub { + + private final Handler mClipboardClearHandler = new ClipboardClearHandler( + mWorkerHandler.getLooper()); + @Override public boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException { @@ -352,10 +376,34 @@ public class ClipboardService extends SystemService { } checkDataOwner(clip, intendingUid); synchronized (mLock) { + scheduleAutoClear(userId); setPrimaryClipInternalLocked(clip, intendingUid, sourcePackage); } } + private void scheduleAutoClear(@UserIdInt int userId) { + final long oldIdentity = Binder.clearCallingIdentity(); + try { + if (DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_CLIPBOARD, + PROPERTY_AUTO_CLEAR_ENABLED, false)) { + mClipboardClearHandler.removeEqualMessages(ClipboardClearHandler.MSG_CLEAR, + userId); + Message clearMessage = Message.obtain(mClipboardClearHandler, + ClipboardClearHandler.MSG_CLEAR, userId, 0, userId); + mClipboardClearHandler.sendMessageDelayed(clearMessage, + getTimeoutForAutoClear()); + } + } finally { + Binder.restoreCallingIdentity(oldIdentity); + } + } + + private long getTimeoutForAutoClear() { + return DeviceConfig.getLong(DeviceConfig.NAMESPACE_CLIPBOARD, + PROPERTY_AUTO_CLEAR_TIMEOUT, + DEFAULT_CLIPBOARD_TIMEOUT_MILLIS); + } + @Override public void clearPrimaryClip(String callingPackage, @UserIdInt int userId) { final int intendingUid = getIntendingUid(callingPackage, userId); @@ -365,6 +413,8 @@ public class ClipboardService extends SystemService { return; } synchronized (mLock) { + mClipboardClearHandler.removeEqualMessages(ClipboardClearHandler.MSG_CLEAR, + userId); setPrimaryClipInternalLocked(null, intendingUid, callingPackage); } } @@ -391,6 +441,9 @@ public class ClipboardService extends SystemService { PerUserClipboard clipboard = getClipboardLocked(intendingUserId); showAccessNotificationLocked(pkg, intendingUid, intendingUserId, clipboard); notifyTextClassifierLocked(clipboard, pkg, intendingUid); + if (clipboard.primaryClip != null) { + scheduleAutoClear(userId); + } return clipboard.primaryClip; } } @@ -484,6 +537,32 @@ public class ClipboardService extends SystemService { return null; } } + + private class ClipboardClearHandler extends Handler { + + public static final int MSG_CLEAR = 101; + + ClipboardClearHandler(Looper looper) { + super(looper); + } + + public void handleMessage(@NonNull Message msg) { + switch (msg.what) { + case MSG_CLEAR: + final int userId = msg.arg1; + synchronized (mLock) { + if (getClipboardLocked(userId).primaryClip != null) { + FrameworkStatsLog.write(FrameworkStatsLog.CLIPBOARD_CLEARED, + FrameworkStatsLog.CLIPBOARD_CLEARED__SOURCE__AUTO_CLEAR); + setPrimaryClipInternalLocked(null, Binder.getCallingUid(), null); + } + } + break; + default: + Slog.wtf(TAG, "ClipboardClearHandler received unknown message " + msg.what); + } + } + } }; @GuardedBy("mLock") diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java index e145d03448d0..bf4ef4879c9a 100644 --- a/services/core/java/com/android/server/connectivity/Vpn.java +++ b/services/core/java/com/android/server/connectivity/Vpn.java @@ -1208,11 +1208,8 @@ public class Vpn { for (RouteInfo route : mConfig.routes) { lp.addRoute(route); InetAddress address = route.getDestination().getAddress(); - - if (route.getType() == RouteInfo.RTN_UNICAST) { - allowIPv4 |= address instanceof Inet4Address; - allowIPv6 |= address instanceof Inet6Address; - } + allowIPv4 |= address instanceof Inet4Address; + allowIPv6 |= address instanceof Inet6Address; } } diff --git a/services/core/java/com/android/server/inputmethod/InputMethodBindingController.java b/services/core/java/com/android/server/inputmethod/InputMethodBindingController.java index 3d91feef7043..c5dc23e30822 100644 --- a/services/core/java/com/android/server/inputmethod/InputMethodBindingController.java +++ b/services/core/java/com/android/server/inputmethod/InputMethodBindingController.java @@ -82,6 +82,7 @@ final class InputMethodBindingController { private IBinder mCurToken; private int mCurSeq; private boolean mVisibleBound; + private boolean mSupportsStylusHw; /** * Binding flags for establishing connection to the {@link InputMethodService}. @@ -295,6 +296,10 @@ final class InputMethodBindingController { mService.scheduleNotifyImeUidToAudioService(mCurMethodUid); mService.reRequestCurrentClientSessionLocked(); } + mSupportsStylusHw = mMethodMap.get(mSelectedMethodId).supportsStylusHandwriting(); + if (mSupportsStylusHw) { + // TODO init Handwriting spy. + } } Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER); } diff --git a/services/core/java/com/android/server/notification/PreferencesHelper.java b/services/core/java/com/android/server/notification/PreferencesHelper.java index 7d4877cdc7ee..258ae8c1c849 100644 --- a/services/core/java/com/android/server/notification/PreferencesHelper.java +++ b/services/core/java/com/android/server/notification/PreferencesHelper.java @@ -2151,6 +2151,10 @@ public class PreferencesHelper implements RankingConfig { final PackagePreferences r = mPackagePreferences.valueAt(i); event.writeInt(r.uid); event.addBooleanAnnotation(ANNOTATION_ID_IS_UID, true); + + // collect whether this package's importance info was user-set for later, if needed + // before the migration is enabled, this will simply default to false in all cases. + boolean importanceIsUserSet = false; if (mPermissionHelper.isMigrationEnabled()) { // Even if this package's data is not present, we need to write something; // so default to IMPORTANCE_NONE, since if PM doesn't know about the package @@ -2158,8 +2162,12 @@ public class PreferencesHelper implements RankingConfig { int importance = IMPORTANCE_NONE; Pair<Integer, String> key = new Pair<>(r.uid, r.pkg); if (pkgPermissions != null && pkgsWithPermissionsToHandle.contains(key)) { - importance = pkgPermissions.get(key).first + Pair<Boolean, Boolean> permissionPair = pkgPermissions.get(key); + importance = permissionPair.first ? IMPORTANCE_DEFAULT : IMPORTANCE_NONE; + // cache the second value for writing later + importanceIsUserSet = permissionPair.second; + pkgsWithPermissionsToHandle.remove(key); } event.writeInt(importance); @@ -2168,6 +2176,7 @@ public class PreferencesHelper implements RankingConfig { } event.writeInt(r.visibility); event.writeInt(r.lockedAppFields); + event.writeBoolean(importanceIsUserSet); // optional bool user_set_importance = 5; events.add(event.build()); } } @@ -2189,6 +2198,7 @@ public class PreferencesHelper implements RankingConfig { // builder event.writeInt(DEFAULT_VISIBILITY); event.writeInt(DEFAULT_LOCKED_APP_FIELDS); + event.writeBoolean(pkgPermissions.get(p).second); // user_set_importance field events.add(event.build()); } } diff --git a/services/core/java/com/android/server/pm/ApexManager.java b/services/core/java/com/android/server/pm/ApexManager.java index fb77d101f910..05567480e6bf 100644 --- a/services/core/java/com/android/server/pm/ApexManager.java +++ b/services/core/java/com/android/server/pm/ApexManager.java @@ -34,6 +34,7 @@ import android.content.pm.PackageManager; import android.content.pm.SigningDetails; import android.content.pm.parsing.PackageInfoWithoutStateUtils; import android.content.pm.parsing.ParsingPackageUtils; +import android.content.pm.parsing.component.ParsedApexSystemService; import android.content.pm.parsing.result.ParseResult; import android.content.pm.parsing.result.ParseTypeImpl; import android.os.Binder; @@ -53,6 +54,7 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.Preconditions; +import com.android.modules.utils.build.UnboundedSdkLevel; import com.android.server.pm.parsing.PackageParser2; import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.ParsedPackage; @@ -411,6 +413,11 @@ public abstract class ApexManager { throws PackageManagerException; /** + * Get a map of system services defined in an apex mapped to the jar files they reside in. + */ + public abstract Map<String, String> getApexSystemServices(); + + /** * Dumps various state information to the provided {@link PrintWriter} object. * * @param pw the {@link PrintWriter} object to send information to. @@ -438,6 +445,12 @@ public abstract class ApexManager { private Set<ActiveApexInfo> mActiveApexInfosCache; /** + * Map of all apex system services to the jar files they are contained in. + */ + @GuardedBy("mLock") + private Map<String, String> mApexSystemServices = new ArrayMap<>(); + + /** * Contains the list of {@code packageName}s of apks-in-apex for given * {@code apexModuleName}. See {@link #mPackageNameToApexModuleName} to understand the * difference between {@code packageName} and {@code apexModuleName}. @@ -573,6 +586,32 @@ public abstract class ApexManager { + ai.modulePath); } mAllPackagesCache.add(packageInfo); + for (ParsedApexSystemService service : + parseResult.parsedPackage.getApexSystemServices()) { + String minSdkVersion = service.getMinSdkVersion(); + if (minSdkVersion != null && !UnboundedSdkLevel.isAtLeast(minSdkVersion)) { + Slog.d(TAG, String.format( + "ApexSystemService %s with min_sdk_version=%s is skipped", + service.getName(), service.getMinSdkVersion())); + continue; + } + String maxSdkVersion = service.getMaxSdkVersion(); + if (maxSdkVersion != null && !UnboundedSdkLevel.isAtMost(maxSdkVersion)) { + Slog.d(TAG, String.format( + "ApexSystemService %s with max_sdk_version=%s is skipped", + service.getName(), service.getMaxSdkVersion())); + continue; + } + + String name = service.getName(); + if (mApexSystemServices.containsKey(name)) { + throw new IllegalStateException(String.format( + "Duplicate apex-system-service %s from %s, %s", + name, mApexSystemServices.get(name), service.getJarPath())); + } + + mApexSystemServices.put(name, service.getJarPath()); + } mPackageNameToApexModuleName.put(packageInfo.packageName, ai.moduleName); if (ai.isActive) { if (activePackagesSet.contains(packageInfo.packageName)) { @@ -1092,6 +1131,15 @@ public abstract class ApexManager { } } + @Override + public Map<String, String> getApexSystemServices() { + synchronized (mLock) { + Preconditions.checkState(mApexSystemServices != null, + "APEX packages have not been scanned"); + return mApexSystemServices; + } + } + /** * Dump information about the packages contained in a particular cache * @param packagesCache the cache to print information about. @@ -1370,6 +1418,13 @@ public abstract class ApexManager { } @Override + public Map<String, String> getApexSystemServices() { + // TODO(satayev): we can't really support flattened apex use case, and need to migrate + // the manifest entries into system's manifest asap. + return Collections.emptyMap(); + } + + @Override void dump(PrintWriter pw, String packageName) { // No-op } diff --git a/services/core/java/com/android/server/pm/AppDataHelper.java b/services/core/java/com/android/server/pm/AppDataHelper.java index e99512d3b9fa..bedb8b9f7a18 100644 --- a/services/core/java/com/android/server/pm/AppDataHelper.java +++ b/services/core/java/com/android/server/pm/AppDataHelper.java @@ -74,13 +74,6 @@ final class AppDataHelper { mArtManagerService = mInjector.getArtManagerService(); } - AppDataHelper(PackageManagerService pm, PackageManagerServiceInjector injector) { - mPm = pm; - mInjector = injector; - mInstaller = injector.getInstaller(); - mArtManagerService = injector.getArtManagerService(); - } - /** * Prepare app data for the given app just after it was installed or * upgraded. This method carefully only touches users that it's installed diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java index c8594eba69a6..06cac9d2ec83 100644 --- a/services/core/java/com/android/server/pm/InstallPackageHelper.java +++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java @@ -32,8 +32,6 @@ import static android.content.pm.PackageManager.INSTALL_FAILED_SESSION_INVALID; import static android.content.pm.PackageManager.INSTALL_FAILED_TEST_ONLY; import static android.content.pm.PackageManager.INSTALL_FAILED_UID_CHANGED; import static android.content.pm.PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE; -import static android.content.pm.PackageManager.INSTALL_FAILED_VERSION_DOWNGRADE; -import static android.content.pm.PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES; import static android.content.pm.PackageManager.INSTALL_REASON_DEVICE_RESTORE; import static android.content.pm.PackageManager.INSTALL_REASON_DEVICE_SETUP; import static android.content.pm.PackageManager.INSTALL_SUCCEEDED; @@ -47,7 +45,6 @@ import static android.os.storage.StorageManager.FLAG_STORAGE_CE; import static android.os.storage.StorageManager.FLAG_STORAGE_DE; import static android.os.storage.StorageManager.FLAG_STORAGE_EXTERNAL; -import static com.android.internal.content.NativeLibraryHelper.LIB_DIR_NAME; import static com.android.server.pm.InstructionSets.getAppDexInstructionSets; import static com.android.server.pm.InstructionSets.getDexCodeInstructionSet; import static com.android.server.pm.InstructionSets.getPreferredInstructionSet; @@ -56,6 +53,8 @@ import static com.android.server.pm.PackageManagerService.DEBUG_COMPRESSION; import static com.android.server.pm.PackageManagerService.DEBUG_INSTALL; import static com.android.server.pm.PackageManagerService.DEBUG_PACKAGE_SCANNING; import static com.android.server.pm.PackageManagerService.DEBUG_REMOVE; +import static com.android.server.pm.PackageManagerService.DEBUG_UPGRADE; +import static com.android.server.pm.PackageManagerService.DEBUG_VERIFY; import static com.android.server.pm.PackageManagerService.EMPTY_INT_ARRAY; import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME; import static com.android.server.pm.PackageManagerService.POST_INSTALL; @@ -73,13 +72,16 @@ import static com.android.server.pm.PackageManagerService.SCAN_AS_VENDOR; import static com.android.server.pm.PackageManagerService.SCAN_AS_VIRTUAL_PRELOAD; import static com.android.server.pm.PackageManagerService.SCAN_BOOTING; import static com.android.server.pm.PackageManagerService.SCAN_DONT_KILL_APP; +import static com.android.server.pm.PackageManagerService.SCAN_FIRST_BOOT_OR_UPGRADE; import static com.android.server.pm.PackageManagerService.SCAN_IGNORE_FROZEN; import static com.android.server.pm.PackageManagerService.SCAN_INITIAL; import static com.android.server.pm.PackageManagerService.SCAN_MOVE; import static com.android.server.pm.PackageManagerService.SCAN_NEW_INSTALL; import static com.android.server.pm.PackageManagerService.SCAN_NO_DEX; +import static com.android.server.pm.PackageManagerService.SCAN_REQUIRE_KNOWN; import static com.android.server.pm.PackageManagerService.SCAN_UPDATE_SIGNATURE; import static com.android.server.pm.PackageManagerService.TAG; +import static com.android.server.pm.PackageManagerServiceUtils.comparePackageSignatures; import static com.android.server.pm.PackageManagerServiceUtils.compareSignatures; import static com.android.server.pm.PackageManagerServiceUtils.compressedFileExists; import static com.android.server.pm.PackageManagerServiceUtils.deriveAbiOverride; @@ -89,6 +91,7 @@ import static com.android.server.pm.PackageManagerServiceUtils.verifySignatures; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UserIdInt; +import android.app.AppOpsManager; import android.app.ApplicationPackageManager; import android.app.backup.IBackupManager; import android.content.ContentResolver; @@ -125,7 +128,6 @@ import android.os.Environment; import android.os.Message; import android.os.Process; import android.os.RemoteException; -import android.os.ServiceManager; import android.os.SystemProperties; import android.os.Trace; import android.os.UserHandle; @@ -145,14 +147,15 @@ import android.util.SparseArray; import com.android.internal.annotations.GuardedBy; import com.android.internal.content.F2fsUtils; -import com.android.internal.content.NativeLibraryHelper; import com.android.internal.content.PackageHelper; import com.android.internal.security.VerityUtils; import com.android.internal.util.ArrayUtils; import com.android.internal.util.FrameworkStatsLog; import com.android.server.EventLogTags; -import com.android.server.Watchdog; +import com.android.server.pm.dex.ArtManagerService; +import com.android.server.pm.dex.DexManager; import com.android.server.pm.dex.DexoptOptions; +import com.android.server.pm.dex.ViewCompiler; import com.android.server.pm.parsing.PackageParser2; import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.AndroidPackageUtils; @@ -190,271 +193,45 @@ import java.util.concurrent.ExecutorService; final class InstallPackageHelper { private final PackageManagerService mPm; private final AppDataHelper mAppDataHelper; - private final PackageManagerServiceInjector mInjector; private final BroadcastHelper mBroadcastHelper; private final RemovePackageHelper mRemovePackageHelper; - private final ScanPackageHelper mScanPackageHelper; + private final StorageManager mStorageManager; + private final RollbackManagerInternal mRollbackManager; + private final IncrementalManager mIncrementalManager; + private final ApexManager mApexManager; + private final DexManager mDexManager; + private final ArtManagerService mArtManagerService; + private final AppOpsManager mAppOpsManager; + private final Context mContext; + private final PackageDexOptimizer mPackageDexOptimizer; + private final PackageAbiHelper mPackageAbiHelper; + private final ViewCompiler mViewCompiler; + private final IBackupManager mIBackupManager; // TODO(b/198166813): remove PMS dependency InstallPackageHelper(PackageManagerService pm, AppDataHelper appDataHelper) { mPm = pm; - mInjector = pm.mInjector; mAppDataHelper = appDataHelper; - mBroadcastHelper = new BroadcastHelper(mInjector); + mBroadcastHelper = new BroadcastHelper(pm.mInjector); mRemovePackageHelper = new RemovePackageHelper(pm); - mScanPackageHelper = new ScanPackageHelper(pm); + mStorageManager = pm.mInjector.getSystemService(StorageManager.class); + mRollbackManager = pm.mInjector.getLocalService(RollbackManagerInternal.class); + mIncrementalManager = pm.mInjector.getIncrementalManager(); + mApexManager = pm.mInjector.getApexManager(); + mDexManager = pm.mInjector.getDexManager(); + mArtManagerService = pm.mInjector.getArtManagerService(); + mAppOpsManager = pm.mInjector.getSystemService(AppOpsManager.class); + mContext = pm.mInjector.getContext(); + mPackageDexOptimizer = pm.mInjector.getPackageDexOptimizer(); + mPackageAbiHelper = pm.mInjector.getAbiHelper(); + mViewCompiler = pm.mInjector.getViewCompiler(); + mIBackupManager = pm.mInjector.getIBackupManager(); } InstallPackageHelper(PackageManagerService pm) { this(pm, new AppDataHelper(pm)); } - InstallPackageHelper(PackageManagerService pm, PackageManagerServiceInjector injector) { - mPm = pm; - mInjector = injector; - mAppDataHelper = new AppDataHelper(pm, mInjector); - mBroadcastHelper = new BroadcastHelper(injector); - mRemovePackageHelper = new RemovePackageHelper(pm); - mScanPackageHelper = new ScanPackageHelper(pm); - } - - @GuardedBy("mPm.mLock") - public Map<String, ReconciledPackage> reconcilePackagesLocked( - final ReconcileRequest request, KeySetManagerService ksms, - PackageManagerServiceInjector injector) - throws ReconcileFailure { - final Map<String, ScanResult> scannedPackages = request.mScannedPackages; - - final Map<String, ReconciledPackage> result = new ArrayMap<>(scannedPackages.size()); - - // make a copy of the existing set of packages so we can combine them with incoming packages - final ArrayMap<String, AndroidPackage> combinedPackages = - new ArrayMap<>(request.mAllPackages.size() + scannedPackages.size()); - - combinedPackages.putAll(request.mAllPackages); - - final Map<String, WatchedLongSparseArray<SharedLibraryInfo>> incomingSharedLibraries = - new ArrayMap<>(); - - for (String installPackageName : scannedPackages.keySet()) { - final ScanResult scanResult = scannedPackages.get(installPackageName); - - // add / replace existing with incoming packages - combinedPackages.put(scanResult.mPkgSetting.getPackageName(), - scanResult.mRequest.mParsedPackage); - - // in the first pass, we'll build up the set of incoming shared libraries - final List<SharedLibraryInfo> allowedSharedLibInfos = - SharedLibraryHelper.getAllowedSharedLibInfos(scanResult, - request.mSharedLibrarySource); - if (allowedSharedLibInfos != null) { - for (SharedLibraryInfo info : allowedSharedLibInfos) { - if (!SharedLibraryHelper.addSharedLibraryToPackageVersionMap( - incomingSharedLibraries, info)) { - throw new ReconcileFailure("Shared Library " + info.getName() - + " is being installed twice in this set!"); - } - } - } - - // the following may be null if we're just reconciling on boot (and not during install) - final InstallArgs installArgs = request.mInstallArgs.get(installPackageName); - final PackageInstalledInfo res = request.mInstallResults.get(installPackageName); - final PrepareResult prepareResult = request.mPreparedPackages.get(installPackageName); - final boolean isInstall = installArgs != null; - if (isInstall && (res == null || prepareResult == null)) { - throw new ReconcileFailure("Reconcile arguments are not balanced for " - + installPackageName + "!"); - } - - final DeletePackageAction deletePackageAction; - // we only want to try to delete for non system apps - if (isInstall && prepareResult.mReplace && !prepareResult.mSystem) { - final boolean killApp = (scanResult.mRequest.mScanFlags & SCAN_DONT_KILL_APP) == 0; - final int deleteFlags = PackageManager.DELETE_KEEP_DATA - | (killApp ? 0 : PackageManager.DELETE_DONT_KILL_APP); - deletePackageAction = DeletePackageHelper.mayDeletePackageLocked(res.mRemovedInfo, - prepareResult.mOriginalPs, prepareResult.mDisabledPs, - deleteFlags, null /* all users */); - if (deletePackageAction == null) { - throw new ReconcileFailure( - PackageManager.INSTALL_FAILED_REPLACE_COULDNT_DELETE, - "May not delete " + installPackageName + " to replace"); - } - } else { - deletePackageAction = null; - } - - final int scanFlags = scanResult.mRequest.mScanFlags; - final int parseFlags = scanResult.mRequest.mParseFlags; - final ParsedPackage parsedPackage = scanResult.mRequest.mParsedPackage; - - final PackageSetting disabledPkgSetting = scanResult.mRequest.mDisabledPkgSetting; - final PackageSetting lastStaticSharedLibSetting = - request.mLastStaticSharedLibSettings.get(installPackageName); - final PackageSetting signatureCheckPs = - (prepareResult != null && lastStaticSharedLibSetting != null) - ? lastStaticSharedLibSetting - : scanResult.mPkgSetting; - boolean removeAppKeySetData = false; - boolean sharedUserSignaturesChanged = false; - SigningDetails signingDetails = null; - if (ksms.shouldCheckUpgradeKeySetLocked(signatureCheckPs, scanFlags)) { - if (ksms.checkUpgradeKeySetLocked(signatureCheckPs, parsedPackage)) { - // We just determined the app is signed correctly, so bring - // over the latest parsed certs. - } else { - if ((parseFlags & ParsingPackageUtils.PARSE_IS_SYSTEM_DIR) == 0) { - throw new ReconcileFailure(INSTALL_FAILED_UPDATE_INCOMPATIBLE, - "Package " + parsedPackage.getPackageName() - + " upgrade keys do not match the previously installed" - + " version"); - } else { - String msg = "System package " + parsedPackage.getPackageName() - + " signature changed; retaining data."; - PackageManagerService.reportSettingsProblem(Log.WARN, msg); - } - } - signingDetails = parsedPackage.getSigningDetails(); - } else { - try { - final Settings.VersionInfo versionInfo = - request.mVersionInfos.get(installPackageName); - final boolean compareCompat = isCompatSignatureUpdateNeeded(versionInfo); - final boolean compareRecover = isRecoverSignatureUpdateNeeded(versionInfo); - final boolean isRollback = installArgs != null - && installArgs.mInstallReason == PackageManager.INSTALL_REASON_ROLLBACK; - final boolean compatMatch = verifySignatures(signatureCheckPs, - disabledPkgSetting, parsedPackage.getSigningDetails(), compareCompat, - compareRecover, isRollback); - // The new KeySets will be re-added later in the scanning process. - if (compatMatch) { - removeAppKeySetData = true; - } - // We just determined the app is signed correctly, so bring - // over the latest parsed certs. - signingDetails = parsedPackage.getSigningDetails(); - - // if this is is a sharedUser, check to see if the new package is signed by a - // newer - // signing certificate than the existing one, and if so, copy over the new - // details - if (signatureCheckPs.getSharedUser() != null) { - // Attempt to merge the existing lineage for the shared SigningDetails with - // the lineage of the new package; if the shared SigningDetails are not - // returned this indicates the new package added new signers to the lineage - // and/or changed the capabilities of existing signers in the lineage. - SigningDetails sharedSigningDetails = - signatureCheckPs.getSharedUser().signatures.mSigningDetails; - SigningDetails mergedDetails = sharedSigningDetails.mergeLineageWith( - signingDetails); - if (mergedDetails != sharedSigningDetails) { - signatureCheckPs.getSharedUser().signatures.mSigningDetails = - mergedDetails; - } - if (signatureCheckPs.getSharedUser().signaturesChanged == null) { - signatureCheckPs.getSharedUser().signaturesChanged = Boolean.FALSE; - } - } - } catch (PackageManagerException e) { - if ((parseFlags & ParsingPackageUtils.PARSE_IS_SYSTEM_DIR) == 0) { - throw new ReconcileFailure(e); - } - signingDetails = parsedPackage.getSigningDetails(); - - // If the system app is part of a shared user we allow that shared user to - // change - // signatures as well as part of an OTA. We still need to verify that the - // signatures - // are consistent within the shared user for a given boot, so only allow - // updating - // the signatures on the first package scanned for the shared user (i.e. if the - // signaturesChanged state hasn't been initialized yet in SharedUserSetting). - if (signatureCheckPs.getSharedUser() != null) { - final Signature[] sharedUserSignatures = signatureCheckPs.getSharedUser() - .signatures.mSigningDetails.getSignatures(); - if (signatureCheckPs.getSharedUser().signaturesChanged != null - && compareSignatures(sharedUserSignatures, - parsedPackage.getSigningDetails().getSignatures()) - != PackageManager.SIGNATURE_MATCH) { - if (SystemProperties.getInt("ro.product.first_api_level", 0) <= 29) { - // Mismatched signatures is an error and silently skipping system - // packages will likely break the device in unforeseen ways. - // However, we allow the device to boot anyway because, prior to Q, - // vendors were not expecting the platform to crash in this - // situation. - // This WILL be a hard failure on any new API levels after Q. - throw new ReconcileFailure( - INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES, - "Signature mismatch for shared user: " - + scanResult.mPkgSetting.getSharedUser()); - } else { - // Treat mismatched signatures on system packages using a shared - // UID as - // fatal for the system overall, rather than just failing to install - // whichever package happened to be scanned later. - throw new IllegalStateException( - "Signature mismatch on system package " - + parsedPackage.getPackageName() - + " for shared user " - + scanResult.mPkgSetting.getSharedUser()); - } - } - - sharedUserSignaturesChanged = true; - signatureCheckPs.getSharedUser().signatures.mSigningDetails = - parsedPackage.getSigningDetails(); - signatureCheckPs.getSharedUser().signaturesChanged = Boolean.TRUE; - } - // File a report about this. - String msg = "System package " + parsedPackage.getPackageName() - + " signature changed; retaining data."; - PackageManagerService.reportSettingsProblem(Log.WARN, msg); - } catch (IllegalArgumentException e) { - // should never happen: certs matched when checking, but not when comparing - // old to new for sharedUser - throw new RuntimeException( - "Signing certificates comparison made on incomparable signing details" - + " but somehow passed verifySignatures!", e); - } - } - - result.put(installPackageName, - new ReconciledPackage(request, installArgs, scanResult.mPkgSetting, - res, request.mPreparedPackages.get(installPackageName), scanResult, - deletePackageAction, allowedSharedLibInfos, signingDetails, - sharedUserSignaturesChanged, removeAppKeySetData)); - } - - for (String installPackageName : scannedPackages.keySet()) { - // Check all shared libraries and map to their actual file path. - // We only do this here for apps not on a system dir, because those - // are the only ones that can fail an install due to this. We - // will take care of the system apps by updating all of their - // library paths after the scan is done. Also during the initial - // scan don't update any libs as we do this wholesale after all - // apps are scanned to avoid dependency based scanning. - final ScanResult scanResult = scannedPackages.get(installPackageName); - if ((scanResult.mRequest.mScanFlags & SCAN_BOOTING) != 0 - || (scanResult.mRequest.mParseFlags & ParsingPackageUtils.PARSE_IS_SYSTEM_DIR) - != 0) { - continue; - } - try { - result.get(installPackageName).mCollectedSharedLibraryInfos = - SharedLibraryHelper.collectSharedLibraryInfos( - scanResult.mRequest.mParsedPackage, - combinedPackages, request.mSharedLibrarySource, - incomingSharedLibraries, injector.getCompatibility()); - - } catch (PackageManagerException e) { - throw new ReconcileFailure(e.error, e.getMessage()); - } - } - - return result; - } - /** * Commits the package scan and modifies system state. * <p><em>WARNING:</em> The method may throw an exception in the middle @@ -671,7 +448,7 @@ final class InstallPackageHelper { // Add the new setting to mPackages mPm.mPackages.put(pkg.getPackageName(), pkg); if ((scanFlags & SCAN_AS_APK_IN_APEX) != 0) { - mPm.mApexManager.registerApkInApex(pkg); + mApexManager.registerApkInApex(pkg); } // Add the package's KeySets to the global KeySetManagerService @@ -722,27 +499,6 @@ final class InstallPackageHelper { Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER); } - /** - * If the database version for this type of package (internal storage or - * external storage) is less than the version where package signatures - * were updated, return true. - */ - public boolean isCompatSignatureUpdateNeeded(AndroidPackage pkg) { - return isCompatSignatureUpdateNeeded(mPm.getSettingsVersionForPackage(pkg)); - } - - public static boolean isCompatSignatureUpdateNeeded(Settings.VersionInfo ver) { - return ver.databaseVersion < Settings.DatabaseVersion.SIGNATURE_END_ENTITY; - } - - public boolean isRecoverSignatureUpdateNeeded(AndroidPackage pkg) { - return isRecoverSignatureUpdateNeeded(mPm.getSettingsVersionForPackage(pkg)); - } - - public static boolean isRecoverSignatureUpdateNeeded(Settings.VersionInfo ver) { - return ver.databaseVersion < Settings.DatabaseVersion.SIGNATURE_MALFORMED_RECOVER; - } - public int installExistingPackageAsUser(@Nullable String packageName, @UserIdInt int userId, @PackageManager.InstallFlags int installFlags, @PackageManager.InstallReason int installReason, @@ -755,9 +511,9 @@ final class InstallPackageHelper { } final int callingUid = Binder.getCallingUid(); - if (mPm.mContext.checkCallingOrSelfPermission(android.Manifest.permission.INSTALL_PACKAGES) + if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.INSTALL_PACKAGES) != PackageManager.PERMISSION_GRANTED - && mPm.mContext.checkCallingOrSelfPermission( + && mContext.checkCallingOrSelfPermission( android.Manifest.permission.INSTALL_EXISTING_PACKAGES) != PackageManager.PERMISSION_GRANTED) { throw new SecurityException("Neither user " + callingUid + " nor current process has " @@ -810,7 +566,8 @@ final class InstallPackageHelper { // upgrade app from instant to full; we don't allow app downgrade installed = true; } - mPm.setInstantAppForUser(mInjector, pkgSetting, userId, instantApp, fullApp); + ScanPackageUtils.setInstantAppForUser(mPm.mInjector, pkgSetting, userId, instantApp, + fullApp); } if (installed) { @@ -847,7 +604,7 @@ final class InstallPackageHelper { mPm.restorePermissionsAndUpdateRolesForNewUserInstall(packageName, userId); if (intentSender != null) { - onRestoreComplete(res.mReturnCode, mPm.mContext, intentSender); + onRestoreComplete(res.mReturnCode, mContext, intentSender); } }); restoreAndPostInstall(userId, res, postInstallData); @@ -933,9 +690,7 @@ final class InstallPackageHelper { * Returns whether the restore successfully completed. */ private boolean performBackupManagerRestore(int userId, int token, PackageInstalledInfo res) { - IBackupManager bm = IBackupManager.Stub.asInterface( - ServiceManager.getService(Context.BACKUP_SERVICE)); - if (bm != null) { + if (mIBackupManager != null) { // For backwards compatibility as USER_ALL previously routed directly to USER_SYSTEM // in the BackupManager. USER_ALL is used in compatibility tests. if (userId == UserHandle.USER_ALL) { @@ -946,8 +701,8 @@ final class InstallPackageHelper { } Trace.asyncTraceBegin(TRACE_TAG_PACKAGE_MANAGER, "restore", token); try { - if (bm.isUserReadyForBackup(userId)) { - bm.restoreAtInstallForUser( + if (mIBackupManager.isUserReadyForBackup(userId)) { + mIBackupManager.restoreAtInstallForUser( userId, res.mPkg.getPackageName(), token); } else { Slog.w(TAG, "User " + userId + " is not ready. Restore at install " @@ -973,8 +728,6 @@ final class InstallPackageHelper { */ private boolean performRollbackManagerRestore(int userId, int token, PackageInstalledInfo res, PostInstallData data) { - RollbackManagerInternal rm = mInjector.getLocalService(RollbackManagerInternal.class); - final String packageName = res.mPkg.getPackageName(); final int[] allUsers = mPm.mUserManager.getUserIds(); final int[] installedUsers; @@ -1000,8 +753,8 @@ final class InstallPackageHelper { if (ps != null && doSnapshotOrRestore) { final String seInfo = AndroidPackageUtils.getSeInfo(res.mPkg, ps); - rm.snapshotAndRestoreUserData(packageName, UserHandle.toUserHandles(installedUsers), - appId, ceDataInode, seInfo, token); + mRollbackManager.snapshotAndRestoreUserData(packageName, + UserHandle.toUserHandles(installedUsers), appId, ceDataInode, seInfo, token); return true; } return false; @@ -1093,7 +846,7 @@ final class InstallPackageHelper { + " got: " + apexes.length); } try (PackageParser2 packageParser = mPm.mInjector.getScanningPackageParser()) { - mPm.mApexManager.installPackage(apexes[0], packageParser); + mApexManager.installPackage(apexes[0], packageParser); } } catch (PackageManagerException e) { request.mInstallResult.setError("APEX installation failed", e); @@ -1170,7 +923,7 @@ final class InstallPackageHelper { installResults.put(packageName, request.mInstallResult); installArgs.put(packageName, request.mArgs); try { - final ScanResult result = mScanPackageHelper.scanPackageTracedLI( + final ScanResult result = scanPackageTracedLI( prepareResult.mPackageToScan, prepareResult.mParseFlags, prepareResult.mScanFlags, System.currentTimeMillis(), request.mArgs.mUser, request.mArgs.mAbiOverride); @@ -1213,7 +966,7 @@ final class InstallPackageHelper { Map<String, ReconciledPackage> reconciledPackages; try { Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "reconcilePackages"); - reconciledPackages = reconcilePackagesLocked( + reconciledPackages = ReconcilePackageUtils.reconcilePackages( reconcileRequest, mPm.mSettings.getKeySetManagerService(), mPm.mInjector); } catch (ReconcileFailure e) { @@ -1256,7 +1009,7 @@ final class InstallPackageHelper { .buildVerificationRootHashString(baseCodePath, splitCodePaths); VerificationUtils.broadcastPackageVerified(verificationId, originUri, PackageManager.VERIFICATION_ALLOW, rootHashString, - args.mDataLoaderType, args.getUser(), mPm.mContext); + args.mDataLoaderType, args.getUser(), mContext); } } else { for (ScanResult result : preparedScans.values()) { @@ -1472,9 +1225,11 @@ final class InstallPackageHelper { } else { try { final boolean compareCompat = - isCompatSignatureUpdateNeeded(parsedPackage); + ReconcilePackageUtils.isCompatSignatureUpdateNeeded( + mPm.getSettingsVersionForPackage(parsedPackage)); final boolean compareRecover = - isRecoverSignatureUpdateNeeded(parsedPackage); + ReconcilePackageUtils.isRecoverSignatureUpdateNeeded( + mPm.getSettingsVersionForPackage(parsedPackage)); // We don't care about disabledPkgSetting on install for now. final boolean compatMatch = verifySignatures(signatureCheckPs, null, parsedPackage.getSigningDetails(), compareCompat, compareRecover, @@ -1676,9 +1431,9 @@ final class InstallPackageHelper { final String abiOverride = deriveAbiOverride(args.mAbiOverride); boolean isUpdatedSystemAppInferred = oldPackage != null && oldPackage.isSystem(); final Pair<PackageAbiHelper.Abis, PackageAbiHelper.NativeLibraryPaths> - derivedAbi = mPm.mInjector.getAbiHelper().derivePackageAbi(parsedPackage, + derivedAbi = mPackageAbiHelper.derivePackageAbi(parsedPackage, isUpdatedSystemAppFromExistingSetting || isUpdatedSystemAppInferred, - abiOverride, mPm.mAppLib32InstallDir); + abiOverride, ScanPackageUtils.getAppLib32InstallDir()); derivedAbi.first.applyTo(parsedPackage); derivedAbi.second.applyTo(parsedPackage); } catch (PackageManagerException pme) { @@ -2376,8 +2131,8 @@ final class InstallPackageHelper { // that can be used for all the packages. final String codePath = ps.getPathString(); if (IncrementalManager.isIncrementalPath(codePath) - && mPm.mIncrementalManager != null) { - mPm.mIncrementalManager.registerLoadingProgressCallback(codePath, + && mIncrementalManager != null) { + mIncrementalManager.registerLoadingProgressCallback(codePath, new IncrementalProgressListener(ps.getPackageName(), mPm)); } @@ -2438,17 +2193,16 @@ final class InstallPackageHelper { */ private void executePostCommitSteps(CommitRequest commitRequest) { final ArraySet<IncrementalStorage> incrementalStorages = new ArraySet<>(); - final AppDataHelper appDataHelper = new AppDataHelper(mPm); for (ReconciledPackage reconciledPkg : commitRequest.mReconciledPackages.values()) { final boolean instantApp = ((reconciledPkg.mScanResult.mRequest.mScanFlags & SCAN_AS_INSTANT_APP) != 0); final AndroidPackage pkg = reconciledPkg.mPkgSetting.getPkg(); final String packageName = pkg.getPackageName(); final String codePath = pkg.getPath(); - final boolean onIncremental = mPm.mIncrementalManager != null + final boolean onIncremental = mIncrementalManager != null && isIncrementalPath(codePath); if (onIncremental) { - IncrementalStorage storage = mPm.mIncrementalManager.openStorage(codePath); + IncrementalStorage storage = mIncrementalManager.openStorage(codePath); if (storage == null) { throw new IllegalArgumentException( "Install: null storage for incremental package " + packageName); @@ -2460,28 +2214,28 @@ final class InstallPackageHelper { // Only set previousAppId if the app is migrating out of shared UID previousAppId = reconciledPkg.mScanResult.mPreviousAppId; } - appDataHelper.prepareAppDataPostCommitLIF(pkg, previousAppId); + mAppDataHelper.prepareAppDataPostCommitLIF(pkg, previousAppId); if (reconciledPkg.mPrepareResult.mClearCodeCache) { - appDataHelper.clearAppDataLIF(pkg, UserHandle.USER_ALL, + mAppDataHelper.clearAppDataLIF(pkg, UserHandle.USER_ALL, FLAG_STORAGE_DE | FLAG_STORAGE_CE | FLAG_STORAGE_EXTERNAL | Installer.FLAG_CLEAR_CODE_CACHE_ONLY); } if (reconciledPkg.mPrepareResult.mReplace) { - mPm.getDexManager().notifyPackageUpdated(pkg.getPackageName(), + mDexManager.notifyPackageUpdated(pkg.getPackageName(), pkg.getBaseApkPath(), pkg.getSplitCodePaths()); } // Prepare the application profiles for the new code paths. // This needs to be done before invoking dexopt so that any install-time profile // can be used for optimizations. - mPm.mArtManagerService.prepareAppProfiles( + mArtManagerService.prepareAppProfiles( pkg, mPm.resolveUserIds(reconciledPkg.mInstallArgs.mUser.getIdentifier()), /* updateReferenceProfileContent= */ true); // Compute the compilation reason from the installation scenario. final int compilationReason = - mPm.getDexManager().getCompilationReasonForInstallScenario( + mDexManager.getCompilationReasonForInstallScenario( reconciledPkg.mInstallArgs.mInstallScenario); // Construct the DexoptOptions early to see if we should skip running dexopt. @@ -2529,7 +2283,7 @@ final class InstallPackageHelper { // path moved to SCENARIO_FAST. final boolean performDexopt = (!instantApp || android.provider.Settings.Global.getInt( - mPm.mContext.getContentResolver(), + mContext.getContentResolver(), android.provider.Settings.Global.INSTANT_APP_DEXOPT_ENABLED, 0) != 0) && !pkg.isDebuggable() && (!onIncremental) @@ -2539,7 +2293,7 @@ final class InstallPackageHelper { // Compile the layout resources. if (SystemProperties.getBoolean(PRECOMPILE_LAYOUTS, false)) { Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "compileLayouts"); - mPm.mViewCompiler.compileLayouts(pkg); + mViewCompiler.compileLayouts(pkg); Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER); } @@ -2564,10 +2318,10 @@ final class InstallPackageHelper { realPkgSetting.getPkgState().setUpdatedSystemApp(isUpdatedSystemApp); - mPm.mPackageDexOptimizer.performDexOpt(pkg, realPkgSetting, + mPackageDexOptimizer.performDexOpt(pkg, realPkgSetting, null /* instructionSets */, mPm.getOrCreateCompilerPackageStats(pkg), - mPm.getDexManager().getPackageUseInfoOrDefault(packageName), + mDexManager.getPackageUseInfoOrDefault(packageName), dexoptOptions); Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER); } @@ -2580,7 +2334,8 @@ final class InstallPackageHelper { notifyPackageChangeObserversOnUpdate(reconciledPkg); } - waitForNativeBinariesExtraction(incrementalStorages); + PackageManagerServiceUtils.waitForNativeBinariesExtractionForIncremental( + incrementalStorages); } private void notifyPackageChangeObserversOnUpdate(ReconciledPackage reconciledPkg) { @@ -2599,27 +2354,6 @@ final class InstallPackageHelper { mPm.notifyPackageChangeObservers(pkgChangeEvent); } - private static void waitForNativeBinariesExtraction( - ArraySet<IncrementalStorage> incrementalStorages) { - if (incrementalStorages.isEmpty()) { - return; - } - try { - // Native library extraction may take very long time: each page could potentially - // wait for either 10s or 100ms (adb vs non-adb data loader), and that easily adds - // up to a full watchdog timeout of 1 min, killing the system after that. It doesn't - // make much sense as blocking here doesn't lock up the framework, but only blocks - // the installation session and the following ones. - Watchdog.getInstance().pauseWatchingCurrentThread("native_lib_extract"); - for (int i = 0; i < incrementalStorages.size(); ++i) { - IncrementalStorage storage = incrementalStorages.valueAtUnchecked(i); - storage.waitForNativeBinariesExtraction(); - } - } finally { - Watchdog.getInstance().resumeWatchingCurrentThread("native_lib_extract"); - } - } - public int installLocationPolicy(PackageInfoLite pkgLite, int installFlags) { String packageName = pkgLite.packageName; int installLocation = pkgLite.installLocation; @@ -2705,7 +2439,7 @@ final class InstallPackageHelper { if (!PackageManagerServiceUtils.isDowngradePermitted(installFlags, dataOwnerPkg.isDebuggable())) { try { - checkDowngrade(dataOwnerPkg, pkgLite); + PackageManagerServiceUtils.checkDowngrade(dataOwnerPkg, pkgLite); } catch (PackageManagerException e) { String errorMsg = "Downgrade detected: " + e.getMessage(); Slog.w(TAG, errorMsg); @@ -2722,7 +2456,7 @@ final class InstallPackageHelper { long requiredInstalledVersionCode, int installFlags) { String packageName = pkgLite.packageName; - final PackageInfo activePackage = mPm.mApexManager.getPackageInfo(packageName, + final PackageInfo activePackage = mApexManager.getPackageInfo(packageName, ApexManager.MATCH_ACTIVE_PACKAGE); if (activePackage == null) { String errorMsg = "Attempting to install new APEX package " + packageName; @@ -2755,41 +2489,6 @@ final class InstallPackageHelper { return Pair.create(PackageManager.INSTALL_SUCCEEDED, null); } - /** - * Check and throw if the given before/after packages would be considered a - * downgrade. - */ - private static void checkDowngrade(AndroidPackage before, PackageInfoLite after) - throws PackageManagerException { - if (after.getLongVersionCode() < before.getLongVersionCode()) { - throw new PackageManagerException(INSTALL_FAILED_VERSION_DOWNGRADE, - "Update version code " + after.versionCode + " is older than current " - + before.getLongVersionCode()); - } else if (after.getLongVersionCode() == before.getLongVersionCode()) { - if (after.baseRevisionCode < before.getBaseRevisionCode()) { - throw new PackageManagerException(INSTALL_FAILED_VERSION_DOWNGRADE, - "Update base revision code " + after.baseRevisionCode - + " is older than current " + before.getBaseRevisionCode()); - } - - if (!ArrayUtils.isEmpty(after.splitNames)) { - for (int i = 0; i < after.splitNames.length; i++) { - final String splitName = after.splitNames[i]; - final int j = ArrayUtils.indexOf(before.getSplitNames(), splitName); - if (j != -1) { - if (after.splitRevisionCodes[i] < before.getSplitRevisionCodes()[j]) { - throw new PackageManagerException(INSTALL_FAILED_VERSION_DOWNGRADE, - "Update split " + splitName + " revision code " - + after.splitRevisionCodes[i] - + " is older than current " - + before.getSplitRevisionCodes()[j]); - } - } - } - } - } - } - int getUidForVerifier(VerifierInfo verifierInfo) { synchronized (mPm.mLock) { final AndroidPackage pkg = mPm.mPackages.get(verifierInfo.packageName); @@ -3062,10 +2761,8 @@ final class InstallPackageHelper { // Send broadcast package appeared if external for all users if (res.mPkg.isExternalStorage()) { if (!update) { - final StorageManager storage = mPm.mInjector.getSystemService( - StorageManager.class); VolumeInfo volume = - storage.findVolumeByUuid( + mStorageManager.findVolumeByUuid( StorageManager.convert( res.mPkg.getVolumeUuid()).toString()); int packageExternalStorageType = @@ -3147,7 +2844,7 @@ final class InstallPackageHelper { // There's a race currently where some install events may interleave with an // uninstall. This can lead to package info being null (b/36642664). if (info != null) { - mPm.getDexManager().notifyPackageInstalled(info, userId); + mDexManager.notifyPackageInstalled(info, userId); } } } @@ -3175,7 +2872,7 @@ final class InstallPackageHelper { * @return the current "allow unknown sources" setting */ private int getUnknownSourcesSettings() { - return android.provider.Settings.Secure.getIntForUser(mPm.mContext.getContentResolver(), + return android.provider.Settings.Secure.getIntForUser(mContext.getContentResolver(), android.provider.Settings.Secure.INSTALL_NON_MARKET_APPS, -1, UserHandle.USER_SYSTEM); } @@ -3304,7 +3001,7 @@ final class InstallPackageHelper { mAppDataHelper.clearAppDataLIF(pkg, UserHandle.USER_ALL, FLAG_STORAGE_DE | FLAG_STORAGE_CE | FLAG_STORAGE_EXTERNAL | Installer.FLAG_CLEAR_CODE_CACHE_ONLY); - mPm.getDexManager().notifyPackageUpdated(pkg.getPackageName(), + mDexManager.notifyPackageUpdated(pkg.getPackageName(), pkg.getBaseApkPath(), pkg.getSplitCodePaths()); } return true; @@ -3358,7 +3055,7 @@ final class InstallPackageHelper { packageName); int ret = PackageManagerServiceUtils.decompressFiles(codePath, dstCodePath, packageName); if (ret == PackageManager.INSTALL_SUCCEEDED) { - ret = extractNativeBinaries(dstCodePath, packageName); + ret = PackageManagerServiceUtils.extractNativeBinaries(dstCodePath, packageName); } if (ret == PackageManager.INSTALL_SUCCEEDED) { // NOTE: During boot, we have to delay releasing cblocks for no other reason than @@ -3371,7 +3068,7 @@ final class InstallPackageHelper { } mPm.mReleaseOnSystemReady.add(dstCodePath); } else { - final ContentResolver resolver = mPm.mContext.getContentResolver(); + final ContentResolver resolver = mContext.getContentResolver(); F2fsUtils.releaseCompressedBlocks(resolver, dstCodePath); } } else { @@ -3385,22 +3082,6 @@ final class InstallPackageHelper { return dstCodePath; } - private static int extractNativeBinaries(File dstCodePath, String packageName) { - final File libraryRoot = new File(dstCodePath, LIB_DIR_NAME); - NativeLibraryHelper.Handle handle = null; - try { - handle = NativeLibraryHelper.Handle.create(dstCodePath); - return NativeLibraryHelper.copyNativeBinariesWithOverride(handle, libraryRoot, - null /*abiOverride*/, false /*isIncremental*/); - } catch (IOException e) { - logCriticalInfo(Log.ERROR, "Failed to extract native libraries" - + "; pkg: " + packageName); - return PackageManager.INSTALL_FAILED_INTERNAL_ERROR; - } finally { - IoUtils.closeQuietly(handle); - } - } - /** * Tries to restore the disabled system package after an update has been deleted. */ @@ -3418,7 +3099,7 @@ final class InstallPackageHelper { // Reinstate the old system package mPm.mSettings.enableSystemPackageLPw(disabledPs.getPkg().getPackageName()); // Remove any native libraries from the upgraded package. - removeNativeBinariesLI(deletedPs); + PackageManagerServiceUtils.removeNativeBinariesLI(deletedPs); // Install the system package if (DEBUG_REMOVE) Slog.d(TAG, "Re-installing system package: " + disabledPs); @@ -3461,12 +3142,6 @@ final class InstallPackageHelper { } } - private static void removeNativeBinariesLI(PackageSetting ps) { - if (ps != null) { - NativeLibraryHelper.removeNativeBinariesLI(ps.getLegacyNativeLibraryPath()); - } - } - /** * Installs a package that's already on the system partition. */ @@ -3737,7 +3412,7 @@ final class InstallPackageHelper { } if ((scanFlags & SCAN_AS_APK_IN_APEX) != 0 && errorCode != INSTALL_SUCCEEDED) { - mPm.mApexManager.reportErrorWithApkInApex(scanDir.getAbsolutePath(), errorMsg); + mApexManager.reportErrorWithApkInApex(scanDir.getAbsolutePath(), errorMsg); } // Delete invalid userdata apps @@ -3820,7 +3495,7 @@ final class InstallPackageHelper { Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "parsePackage"); final ParsedPackage parsedPackage; - try (PackageParser2 pp = mInjector.getScanningPackageParser()) { + try (PackageParser2 pp = mPm.mInjector.getScanningPackageParser()) { parsedPackage = pp.parsePackage(scanFile, parseFlags, false); } finally { Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER); @@ -3853,7 +3528,7 @@ final class InstallPackageHelper { @PackageManagerService.ScanFlags int scanFlags, long currentTime, @Nullable UserHandle user) throws PackageManagerException { - final Pair<ScanResult, Boolean> scanResultPair = mScanPackageHelper.scanSystemPackageLI( + final Pair<ScanResult, Boolean> scanResultPair = scanSystemPackageLI( parsedPackage, parseFlags, scanFlags, currentTime, user); final ScanResult scanResult = scanResultPair.first; boolean shouldHideSystemApp = scanResultPair.second; @@ -3863,7 +3538,7 @@ final class InstallPackageHelper { try { final String pkgName = scanResult.mPkgSetting.getPackageName(); final Map<String, ReconciledPackage> reconcileResult = - reconcilePackagesLocked( + ReconcilePackageUtils.reconcilePackages( new ReconcileRequest( Collections.singletonMap(pkgName, scanResult), mPm.mSharedLibraries, @@ -3875,7 +3550,7 @@ final class InstallPackageHelper { Collections.singletonMap(pkgName, mPm.getSharedLibLatestVersionSetting( scanResult))), - mPm.mSettings.getKeySetManagerService(), mInjector); + mPm.mSettings.getKeySetManagerService(), mPm.mInjector); appIdCreated = optimisticallyRegisterAppId(scanResult); commitReconciledScanResultLocked( reconcileResult.get(pkgName), mPm.mUserManager.getUserIds()); @@ -3893,10 +3568,10 @@ final class InstallPackageHelper { mPm.mSettings.disableSystemPackageLPw(parsedPackage.getPackageName(), true); } } - if (mPm.mIncrementalManager != null && isIncrementalPath(parsedPackage.getPath())) { + if (mIncrementalManager != null && isIncrementalPath(parsedPackage.getPath())) { if (scanResult.mPkgSetting != null && scanResult.mPkgSetting.isLoading()) { // Continue monitoring loading progress of active incremental packages - mPm.mIncrementalManager.registerLoadingProgressCallback(parsedPackage.getPath(), + mIncrementalManager.registerLoadingProgressCallback(parsedPackage.getPath(), new IncrementalProgressListener(parsedPackage.getPackageName(), mPm)); } } @@ -3934,5 +3609,743 @@ final class InstallPackageHelper { } } + @GuardedBy({"mPm.mInstallLock", "mPm.mLock"}) + private ScanResult scanPackageTracedLI(ParsedPackage parsedPackage, + final @ParsingPackageUtils.ParseFlags int parseFlags, + @PackageManagerService.ScanFlags int scanFlags, long currentTime, + @Nullable UserHandle user, String cpuAbiOverride) throws PackageManagerException { + Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "scanPackage"); + try { + return scanPackageNewLI(parsedPackage, parseFlags, scanFlags, currentTime, user, + cpuAbiOverride); + } finally { + Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER); + } + } + + private ScanRequest prepareInitialScanRequest(@NonNull ParsedPackage parsedPackage, + @ParsingPackageUtils.ParseFlags int parseFlags, + @PackageManagerService.ScanFlags int scanFlags, + @Nullable UserHandle user, String cpuAbiOverride) + throws PackageManagerException { + final AndroidPackage platformPackage; + final String realPkgName; + final PackageSetting disabledPkgSetting; + final PackageSetting installedPkgSetting; + final PackageSetting originalPkgSetting; + final SharedUserSetting sharedUserSetting; + + synchronized (mPm.mLock) { + platformPackage = mPm.getPlatformPackage(); + final String renamedPkgName = mPm.mSettings.getRenamedPackageLPr( + AndroidPackageUtils.getRealPackageOrNull(parsedPackage)); + realPkgName = ScanPackageUtils.getRealPackageName(parsedPackage, renamedPkgName); + if (realPkgName != null) { + ScanPackageUtils.ensurePackageRenamed(parsedPackage, renamedPkgName); + } + originalPkgSetting = getOriginalPackageLocked(parsedPackage, renamedPkgName); + installedPkgSetting = mPm.mSettings.getPackageLPr(parsedPackage.getPackageName()); + if (mPm.mTransferredPackages.contains(parsedPackage.getPackageName())) { + Slog.w(TAG, "Package " + parsedPackage.getPackageName() + + " was transferred to another, but its .apk remains"); + } + disabledPkgSetting = mPm.mSettings.getDisabledSystemPkgLPr( + parsedPackage.getPackageName()); + sharedUserSetting = (parsedPackage.getSharedUserId() != null) + ? mPm.mSettings.getSharedUserLPw(parsedPackage.getSharedUserId(), + 0 /*pkgFlags*/, 0 /*pkgPrivateFlags*/, true) + : null; + if (DEBUG_PACKAGE_SCANNING + && (parseFlags & ParsingPackageUtils.PARSE_CHATTY) != 0 + && sharedUserSetting != null) { + Log.d(TAG, "Shared UserID " + parsedPackage.getSharedUserId() + + " (uid=" + sharedUserSetting.userId + "):" + + " packages=" + sharedUserSetting.packages); + } + } + + final boolean isPlatformPackage = platformPackage != null + && platformPackage.getPackageName().equals(parsedPackage.getPackageName()); + + return new ScanRequest(parsedPackage, sharedUserSetting, + installedPkgSetting == null ? null : installedPkgSetting.getPkg() /* oldPkg */, + installedPkgSetting /* packageSetting */, + disabledPkgSetting /* disabledPackageSetting */, + originalPkgSetting /* originalPkgSetting */, + realPkgName, parseFlags, scanFlags, isPlatformPackage, user, cpuAbiOverride); + } + + @GuardedBy({"mPm.mInstallLock", "mPm.mLock"}) + private ScanResult scanPackageNewLI(@NonNull ParsedPackage parsedPackage, + final @ParsingPackageUtils.ParseFlags int parseFlags, + @PackageManagerService.ScanFlags int scanFlags, long currentTime, + @Nullable UserHandle user, String cpuAbiOverride) throws PackageManagerException { + + final ScanRequest initialScanRequest = prepareInitialScanRequest(parsedPackage, parseFlags, + scanFlags, user, cpuAbiOverride); + final PackageSetting installedPkgSetting = initialScanRequest.mPkgSetting; + final PackageSetting disabledPkgSetting = initialScanRequest.mDisabledPkgSetting; + + boolean isUpdatedSystemApp; + if (installedPkgSetting != null) { + isUpdatedSystemApp = installedPkgSetting.getPkgState().isUpdatedSystemApp(); + } else { + isUpdatedSystemApp = disabledPkgSetting != null; + } + + final int newScanFlags = adjustScanFlags(scanFlags, installedPkgSetting, disabledPkgSetting, + user, parsedPackage); + ScanPackageUtils.applyPolicy(parsedPackage, newScanFlags, + mPm.getPlatformPackage(), isUpdatedSystemApp); + + synchronized (mPm.mLock) { + assertPackageIsValid(parsedPackage, parseFlags, newScanFlags); + final ScanRequest request = new ScanRequest(parsedPackage, + initialScanRequest.mSharedUserSetting, + initialScanRequest.mOldPkg, installedPkgSetting, disabledPkgSetting, + initialScanRequest.mOriginalPkgSetting, initialScanRequest.mRealPkgName, + parseFlags, scanFlags, initialScanRequest.mIsPlatformPackage, user, + cpuAbiOverride); + return ScanPackageUtils.scanPackageOnlyLI(request, mPm.mInjector, mPm.mFactoryTest, + currentTime); + } + } + + private Pair<ScanResult, Boolean> scanSystemPackageLI(ParsedPackage parsedPackage, + @ParsingPackageUtils.ParseFlags int parseFlags, + @PackageManagerService.ScanFlags int scanFlags, long currentTime, + @Nullable UserHandle user) throws PackageManagerException { + final boolean scanSystemPartition = + (parseFlags & ParsingPackageUtils.PARSE_IS_SYSTEM_DIR) != 0; + final ScanRequest initialScanRequest = prepareInitialScanRequest(parsedPackage, parseFlags, + scanFlags, user, null); + final PackageSetting installedPkgSetting = initialScanRequest.mPkgSetting; + final PackageSetting originalPkgSetting = initialScanRequest.mOriginalPkgSetting; + final PackageSetting pkgSetting = + originalPkgSetting == null ? installedPkgSetting : originalPkgSetting; + final boolean pkgAlreadyExists = pkgSetting != null; + final String disabledPkgName = pkgAlreadyExists + ? pkgSetting.getPackageName() : parsedPackage.getPackageName(); + final boolean isSystemPkgUpdated; + final boolean isUpgrade; + synchronized (mPm.mLock) { + isUpgrade = mPm.isDeviceUpgrading(); + if (scanSystemPartition && !pkgAlreadyExists + && mPm.mSettings.getDisabledSystemPkgLPr(disabledPkgName) != null) { + // The updated-package data for /system apk remains inconsistently + // after the package data for /data apk is lost accidentally. + // To recover it, enable /system apk and install it as non-updated system app. + Slog.w(TAG, "Inconsistent package setting of updated system app for " + + disabledPkgName + ". To recover it, enable the system app " + + "and install it as non-updated system app."); + mPm.mSettings.removeDisabledSystemPackageLPw(disabledPkgName); + } + final PackageSetting disabledPkgSetting = + mPm.mSettings.getDisabledSystemPkgLPr(disabledPkgName); + isSystemPkgUpdated = disabledPkgSetting != null; + + if (DEBUG_INSTALL && isSystemPkgUpdated) { + Slog.d(TAG, "updatedPkg = " + disabledPkgSetting); + } + + if (scanSystemPartition && isSystemPkgUpdated) { + // we're updating the disabled package, so, scan it as the package setting + final ScanRequest request = new ScanRequest(parsedPackage, + initialScanRequest.mSharedUserSetting, + null, disabledPkgSetting /* pkgSetting */, + null /* disabledPkgSetting */, null /* originalPkgSetting */, + null, parseFlags, scanFlags, + initialScanRequest.mIsPlatformPackage, user, null); + ScanPackageUtils.applyPolicy(parsedPackage, scanFlags, + mPm.getPlatformPackage(), true); + final ScanResult scanResult = + ScanPackageUtils.scanPackageOnlyLI(request, mPm.mInjector, + mPm.mFactoryTest, -1L); + if (scanResult.mExistingSettingCopied + && scanResult.mRequest.mPkgSetting != null) { + scanResult.mRequest.mPkgSetting.updateFrom(scanResult.mPkgSetting); + } + } + } // End of mLock + + final boolean newPkgChangedPaths = pkgAlreadyExists + && !pkgSetting.getPathString().equals(parsedPackage.getPath()); + final boolean newPkgVersionGreater = pkgAlreadyExists + && parsedPackage.getLongVersionCode() > pkgSetting.getVersionCode(); + final boolean isSystemPkgBetter = scanSystemPartition && isSystemPkgUpdated + && newPkgChangedPaths && newPkgVersionGreater; + if (isSystemPkgBetter) { + // The version of the application on /system is greater than the version on + // /data. Switch back to the application on /system. + // It's safe to assume the application on /system will correctly scan. If not, + // there won't be a working copy of the application. + synchronized (mPm.mLock) { + // just remove the loaded entries from package lists + mPm.mPackages.remove(pkgSetting.getPackageName()); + } + + logCriticalInfo(Log.WARN, + "System package updated;" + + " name: " + pkgSetting.getPackageName() + + "; " + pkgSetting.getVersionCode() + " --> " + + parsedPackage.getLongVersionCode() + + "; " + pkgSetting.getPathString() + + " --> " + parsedPackage.getPath()); + + final InstallArgs args = new FileInstallArgs( + pkgSetting.getPathString(), getAppDexInstructionSets( + pkgSetting.getPrimaryCpuAbi(), pkgSetting.getSecondaryCpuAbi()), mPm); + args.cleanUpResourcesLI(); + synchronized (mPm.mLock) { + mPm.mSettings.enableSystemPackageLPw(pkgSetting.getPackageName()); + } + } + + // The version of the application on the /system partition is less than or + // equal to the version on the /data partition. Throw an exception and use + // the application already installed on the /data partition. + if (scanSystemPartition && isSystemPkgUpdated && !isSystemPkgBetter) { + // In the case of a skipped package, commitReconciledScanResultLocked is not called to + // add the object to the "live" data structures, so this is the final mutation step + // for the package. Which means it needs to be finalized here to cache derived fields. + // This is relevant for cases where the disabled system package is used for flags or + // other metadata. + parsedPackage.hideAsFinal(); + throw new PackageManagerException(Log.WARN, "Package " + parsedPackage.getPackageName() + + " at " + parsedPackage.getPath() + " ignored: updated version " + + (pkgAlreadyExists ? String.valueOf(pkgSetting.getVersionCode()) : "unknown") + + " better than this " + parsedPackage.getLongVersionCode()); + } + + // Verify certificates against what was last scanned. Force re-collecting certificate in two + // special cases: + // 1) when scanning system, force re-collect only if system is upgrading. + // 2) when scanning /data, force re-collect only if the app is privileged (updated from + // preinstall, or treated as privileged, e.g. due to shared user ID). + final boolean forceCollect = scanSystemPartition ? isUpgrade + : PackageManagerServiceUtils.isApkVerificationForced(pkgSetting); + if (DEBUG_VERIFY && forceCollect) { + Slog.d(TAG, "Force collect certificate of " + parsedPackage.getPackageName()); + } + + // Full APK verification can be skipped during certificate collection, only if the file is + // in verified partition, or can be verified on access (when apk verity is enabled). In both + // cases, only data in Signing Block is verified instead of the whole file. + final boolean skipVerify = scanSystemPartition + || (forceCollect && canSkipForcedPackageVerification(parsedPackage)); + ScanPackageUtils.collectCertificatesLI(pkgSetting, parsedPackage, + mPm.getSettingsVersionForPackage(parsedPackage), forceCollect, skipVerify, + mPm.isPreNMR1Upgrade()); + + // Reset profile if the application version is changed + maybeClearProfilesForUpgradesLI(pkgSetting, parsedPackage); + + /* + * A new system app appeared, but we already had a non-system one of the + * same name installed earlier. + */ + boolean shouldHideSystemApp = false; + // A new application appeared on /system, but, we already have a copy of + // the application installed on /data. + if (scanSystemPartition && !isSystemPkgUpdated && pkgAlreadyExists + && !pkgSetting.isSystem()) { + + if (!parsedPackage.getSigningDetails() + .checkCapability(pkgSetting.getSigningDetails(), + SigningDetails.CertCapabilities.INSTALLED_DATA) + && !pkgSetting.getSigningDetails().checkCapability( + parsedPackage.getSigningDetails(), + SigningDetails.CertCapabilities.ROLLBACK)) { + logCriticalInfo(Log.WARN, + "System package signature mismatch;" + + " name: " + pkgSetting.getPackageName()); + try (@SuppressWarnings("unused") PackageFreezer freezer = mPm.freezePackage( + parsedPackage.getPackageName(), + "scanPackageInternalLI")) { + DeletePackageHelper deletePackageHelper = new DeletePackageHelper(mPm); + deletePackageHelper.deletePackageLIF(parsedPackage.getPackageName(), null, true, + mPm.mUserManager.getUserIds(), 0, null, false); + } + } else if (newPkgVersionGreater) { + // The application on /system is newer than the application on /data. + // Simply remove the application on /data [keeping application data] + // and replace it with the version on /system. + logCriticalInfo(Log.WARN, + "System package enabled;" + + " name: " + pkgSetting.getPackageName() + + "; " + pkgSetting.getVersionCode() + " --> " + + parsedPackage.getLongVersionCode() + + "; " + pkgSetting.getPathString() + " --> " + + parsedPackage.getPath()); + InstallArgs args = new FileInstallArgs( + pkgSetting.getPathString(), getAppDexInstructionSets( + pkgSetting.getPrimaryCpuAbi(), pkgSetting.getSecondaryCpuAbi()), + mPm); + synchronized (mPm.mInstallLock) { + args.cleanUpResourcesLI(); + } + } else { + // The application on /system is older than the application on /data. Hide + // the application on /system and the version on /data will be scanned later + // and re-added like an update. + shouldHideSystemApp = true; + logCriticalInfo(Log.INFO, + "System package disabled;" + + " name: " + pkgSetting.getPackageName() + + "; old: " + pkgSetting.getPathString() + " @ " + + pkgSetting.getVersionCode() + + "; new: " + parsedPackage.getPath() + " @ " + + parsedPackage.getPath()); + } + } + + final ScanResult scanResult = scanPackageNewLI(parsedPackage, parseFlags, + scanFlags | SCAN_UPDATE_SIGNATURE, currentTime, user, null); + return new Pair<>(scanResult, shouldHideSystemApp); + } + + /** + * Returns if forced apk verification can be skipped for the whole package, including splits. + */ + private boolean canSkipForcedPackageVerification(AndroidPackage pkg) { + final String packageName = pkg.getPackageName(); + if (!canSkipForcedApkVerification(packageName, pkg.getBaseApkPath())) { + return false; + } + // TODO: Allow base and splits to be verified individually. + String[] splitCodePaths = pkg.getSplitCodePaths(); + if (!ArrayUtils.isEmpty(splitCodePaths)) { + for (int i = 0; i < splitCodePaths.length; i++) { + if (!canSkipForcedApkVerification(packageName, splitCodePaths[i])) { + return false; + } + } + } + return true; + } + + /** + * Returns if forced apk verification can be skipped, depending on current FSVerity setup and + * whether the apk contains signed root hash. Note that the signer's certificate still needs to + * match one in a trusted source, and should be done separately. + */ + private boolean canSkipForcedApkVerification(String packageName, String apkPath) { + if (!PackageManagerServiceUtils.isLegacyApkVerityEnabled()) { + return VerityUtils.hasFsverity(apkPath); + } + try { + final byte[] rootHashObserved = VerityUtils.generateApkVerityRootHash(apkPath); + if (rootHashObserved == null) { + return false; // APK does not contain Merkle tree root hash. + } + synchronized (mPm.mInstallLock) { + // Returns whether the observed root hash matches what kernel has. + mPm.mInstaller.assertFsverityRootHashMatches(packageName, apkPath, + rootHashObserved); + return true; + } + } catch (Installer.InstallerException | IOException | DigestException + | NoSuchAlgorithmException e) { + Slog.w(TAG, "Error in fsverity check. Fallback to full apk verification.", e); + } + return false; + } + + /** + * Clear the package profile if this was an upgrade and the package + * version was updated. + */ + private void maybeClearProfilesForUpgradesLI( + @Nullable PackageSetting originalPkgSetting, + @NonNull AndroidPackage pkg) { + if (originalPkgSetting == null || !mPm.isDeviceUpgrading()) { + return; + } + if (originalPkgSetting.getVersionCode() == pkg.getLongVersionCode()) { + return; + } + + mAppDataHelper.clearAppProfilesLIF(pkg); + if (DEBUG_INSTALL) { + Slog.d(TAG, originalPkgSetting.getPackageName() + + " clear profile due to version change " + + originalPkgSetting.getVersionCode() + " != " + + pkg.getLongVersionCode()); + } + } + + /** + * Returns the original package setting. + * <p>A package can migrate its name during an update. In this scenario, a package + * designates a set of names that it considers as one of its original names. + * <p>An original package must be signed identically and it must have the same + * shared user [if any]. + */ + @GuardedBy("mPm.mLock") + @Nullable + private PackageSetting getOriginalPackageLocked(@NonNull AndroidPackage pkg, + @Nullable String renamedPkgName) { + if (ScanPackageUtils.isPackageRenamed(pkg, renamedPkgName)) { + return null; + } + for (int i = ArrayUtils.size(pkg.getOriginalPackages()) - 1; i >= 0; --i) { + final PackageSetting originalPs = + mPm.mSettings.getPackageLPr(pkg.getOriginalPackages().get(i)); + if (originalPs != null) { + // the package is already installed under its original name... + // but, should we use it? + if (!verifyPackageUpdateLPr(originalPs, pkg)) { + // the new package is incompatible with the original + continue; + } else if (originalPs.getSharedUser() != null) { + if (!originalPs.getSharedUser().name.equals(pkg.getSharedUserId())) { + // the shared user id is incompatible with the original + Slog.w(TAG, "Unable to migrate data from " + originalPs.getPackageName() + + " to " + pkg.getPackageName() + ": old uid " + + originalPs.getSharedUser().name + + " differs from " + pkg.getSharedUserId()); + continue; + } + // TODO: Add case when shared user id is added [b/28144775] + } else { + if (DEBUG_UPGRADE) { + Log.v(TAG, "Renaming new package " + + pkg.getPackageName() + " to old name " + + originalPs.getPackageName()); + } + } + return originalPs; + } + } + return null; + } + + @GuardedBy("mPm.mLock") + private boolean verifyPackageUpdateLPr(PackageSetting oldPkg, AndroidPackage newPkg) { + if ((oldPkg.getFlags() & ApplicationInfo.FLAG_SYSTEM) == 0) { + Slog.w(TAG, "Unable to update from " + oldPkg.getPackageName() + + " to " + newPkg.getPackageName() + + ": old package not in system partition"); + return false; + } else if (mPm.mPackages.get(oldPkg.getPackageName()) != null) { + Slog.w(TAG, "Unable to update from " + oldPkg.getPackageName() + + " to " + newPkg.getPackageName() + + ": old package still exists"); + return false; + } + return true; + } + + /** + * Asserts the parsed package is valid according to the given policy. If the + * package is invalid, for whatever reason, throws {@link PackageManagerException}. + * <p> + * Implementation detail: This method must NOT have any side effects. It would + * ideally be static, but, it requires locks to read system state. + * + * @throws PackageManagerException If the package fails any of the validation checks + */ + private void assertPackageIsValid(AndroidPackage pkg, + final @ParsingPackageUtils.ParseFlags int parseFlags, + final @PackageManagerService.ScanFlags int scanFlags) + throws PackageManagerException { + if ((parseFlags & ParsingPackageUtils.PARSE_ENFORCE_CODE) != 0) { + ScanPackageUtils.assertCodePolicy(pkg); + } + + if (pkg.getPath() == null) { + // Bail out. The resource and code paths haven't been set. + throw new PackageManagerException(INSTALL_FAILED_INVALID_APK, + "Code and resource paths haven't been set correctly"); + } + + // Check that there is an APEX package with the same name only during install/first boot + // after OTA. + final boolean isUserInstall = (scanFlags & SCAN_BOOTING) == 0; + final boolean isFirstBootOrUpgrade = (scanFlags & SCAN_FIRST_BOOT_OR_UPGRADE) != 0; + if ((isUserInstall || isFirstBootOrUpgrade) + && mApexManager.isApexPackage(pkg.getPackageName())) { + throw new PackageManagerException(INSTALL_FAILED_DUPLICATE_PACKAGE, + pkg.getPackageName() + + " is an APEX package and can't be installed as an APK."); + } + + // Make sure we're not adding any bogus keyset info + final KeySetManagerService ksms = mPm.mSettings.getKeySetManagerService(); + ksms.assertScannedPackageValid(pkg); + + synchronized (mPm.mLock) { + // The special "android" package can only be defined once + if (pkg.getPackageName().equals("android")) { + if (mPm.getCoreAndroidApplication() != null) { + Slog.w(TAG, "*************************************************"); + Slog.w(TAG, "Core android package being redefined. Skipping."); + Slog.w(TAG, " codePath=" + pkg.getPath()); + Slog.w(TAG, "*************************************************"); + throw new PackageManagerException(INSTALL_FAILED_DUPLICATE_PACKAGE, + "Core android package being redefined. Skipping."); + } + } + + // A package name must be unique; don't allow duplicates + if ((scanFlags & SCAN_NEW_INSTALL) == 0 + && mPm.mPackages.containsKey(pkg.getPackageName())) { + throw new PackageManagerException(INSTALL_FAILED_DUPLICATE_PACKAGE, + "Application package " + pkg.getPackageName() + + " already installed. Skipping duplicate."); + } + + if (pkg.isStaticSharedLibrary()) { + // Static libs have a synthetic package name containing the version + // but we still want the base name to be unique. + if ((scanFlags & SCAN_NEW_INSTALL) == 0 + && mPm.mPackages.containsKey(pkg.getManifestPackageName())) { + throw new PackageManagerException( + "Duplicate static shared lib provider package"); + } + ScanPackageUtils.assertStaticSharedLibraryIsValid(pkg, scanFlags); + assertStaticSharedLibraryVersionCodeIsValid(pkg); + } + + // If we're only installing presumed-existing packages, require that the + // scanned APK is both already known and at the path previously established + // for it. Previously unknown packages we pick up normally, but if we have an + // a priori expectation about this package's install presence, enforce it. + // With a singular exception for new system packages. When an OTA contains + // a new system package, we allow the codepath to change from a system location + // to the user-installed location. If we don't allow this change, any newer, + // user-installed version of the application will be ignored. + if ((scanFlags & SCAN_REQUIRE_KNOWN) != 0) { + if (mPm.isExpectingBetter(pkg.getPackageName())) { + Slog.w(TAG, "Relax SCAN_REQUIRE_KNOWN requirement for package " + + pkg.getPackageName()); + } else { + PackageSetting known = mPm.mSettings.getPackageLPr(pkg.getPackageName()); + if (known != null) { + if (DEBUG_PACKAGE_SCANNING) { + Log.d(TAG, "Examining " + pkg.getPath() + + " and requiring known path " + known.getPathString()); + } + if (!pkg.getPath().equals(known.getPathString())) { + throw new PackageManagerException(INSTALL_FAILED_PACKAGE_CHANGED, + "Application package " + pkg.getPackageName() + + " found at " + pkg.getPath() + + " but expected at " + known.getPathString() + + "; ignoring."); + } + } else { + throw new PackageManagerException(INSTALL_FAILED_INVALID_INSTALL_LOCATION, + "Application package " + pkg.getPackageName() + + " not found; ignoring."); + } + } + } + + // Verify that this new package doesn't have any content providers + // that conflict with existing packages. Only do this if the + // package isn't already installed, since we don't want to break + // things that are installed. + if ((scanFlags & SCAN_NEW_INSTALL) != 0) { + mPm.mComponentResolver.assertProvidersNotDefined(pkg); + } + + // If this package has defined explicit processes, then ensure that these are + // the only processes used by its components. + ScanPackageUtils.assertProcessesAreValid(pkg); + + // Verify that packages sharing a user with a privileged app are marked as privileged. + assertPackageWithSharedUserIdIsPrivileged(pkg); + + // Apply policies specific for runtime resource overlays (RROs). + if (pkg.getOverlayTarget() != null) { + assertOverlayIsValid(pkg, parseFlags, scanFlags); + } + + // If the package is not on a system partition ensure it is signed with at least the + // minimum signature scheme version required for its target SDK. + ScanPackageUtils.assertMinSignatureSchemeIsValid(pkg, parseFlags); + } + } + + private void assertStaticSharedLibraryVersionCodeIsValid(AndroidPackage pkg) + throws PackageManagerException { + // The version codes must be ordered as lib versions + long minVersionCode = Long.MIN_VALUE; + long maxVersionCode = Long.MAX_VALUE; + + WatchedLongSparseArray<SharedLibraryInfo> versionedLib = mPm.mSharedLibraries.get( + pkg.getStaticSharedLibName()); + if (versionedLib != null) { + final int versionCount = versionedLib.size(); + for (int i = 0; i < versionCount; i++) { + SharedLibraryInfo libInfo = versionedLib.valueAt(i); + final long libVersionCode = libInfo.getDeclaringPackage() + .getLongVersionCode(); + if (libInfo.getLongVersion() < pkg.getStaticSharedLibVersion()) { + minVersionCode = Math.max(minVersionCode, libVersionCode + 1); + } else if (libInfo.getLongVersion() + > pkg.getStaticSharedLibVersion()) { + maxVersionCode = Math.min(maxVersionCode, libVersionCode - 1); + } else { + minVersionCode = maxVersionCode = libVersionCode; + break; + } + } + } + if (pkg.getLongVersionCode() < minVersionCode + || pkg.getLongVersionCode() > maxVersionCode) { + throw new PackageManagerException("Static shared" + + " lib version codes must be ordered as lib versions"); + } + } + + private void assertOverlayIsValid(AndroidPackage pkg, + @ParsingPackageUtils.ParseFlags int parseFlags, + @PackageManagerService.ScanFlags int scanFlags) throws PackageManagerException { + // System overlays have some restrictions on their use of the 'static' state. + if ((scanFlags & SCAN_AS_SYSTEM) != 0) { + // We are scanning a system overlay. This can be the first scan of the + // system/vendor/oem partition, or an update to the system overlay. + if ((parseFlags & ParsingPackageUtils.PARSE_IS_SYSTEM_DIR) == 0) { + // This must be an update to a system overlay. Immutable overlays cannot be + // upgraded. + if (!mPm.isOverlayMutable(pkg.getPackageName())) { + throw new PackageManagerException("Overlay " + + pkg.getPackageName() + + " is static and cannot be upgraded."); + } + } else { + if ((scanFlags & SCAN_AS_VENDOR) != 0) { + if (pkg.getTargetSdkVersion() < ScanPackageUtils.getVendorPartitionVersion()) { + Slog.w(TAG, "System overlay " + pkg.getPackageName() + + " targets an SDK below the required SDK level of vendor" + + " overlays (" + + ScanPackageUtils.getVendorPartitionVersion() + + ")." + + " This will become an install error in a future release"); + } + } else if (pkg.getTargetSdkVersion() < Build.VERSION.SDK_INT) { + Slog.w(TAG, "System overlay " + pkg.getPackageName() + + " targets an SDK below the required SDK level of system" + + " overlays (" + Build.VERSION.SDK_INT + ")." + + " This will become an install error in a future release"); + } + } + } else { + // A non-preloaded overlay packages must have targetSdkVersion >= Q, or be + // signed with the platform certificate. Check this in increasing order of + // computational cost. + if (pkg.getTargetSdkVersion() < Build.VERSION_CODES.Q) { + final PackageSetting platformPkgSetting = + mPm.mSettings.getPackageLPr("android"); + if (!comparePackageSignatures(platformPkgSetting, + pkg.getSigningDetails().getSignatures())) { + throw new PackageManagerException("Overlay " + + pkg.getPackageName() + + " must target Q or later, " + + "or be signed with the platform certificate"); + } + } + + // A non-preloaded overlay package, without <overlay android:targetName>, will + // only be used if it is signed with the same certificate as its target OR if + // it is signed with the same certificate as a reference package declared + // in 'overlay-config-signature' tag of SystemConfig. + // If the target is already installed or 'overlay-config-signature' tag in + // SystemConfig is set, check this here to augment the last line of defense + // which is OMS. + if (pkg.getOverlayTargetOverlayableName() == null) { + final PackageSetting targetPkgSetting = + mPm.mSettings.getPackageLPr(pkg.getOverlayTarget()); + if (targetPkgSetting != null) { + if (!comparePackageSignatures(targetPkgSetting, + pkg.getSigningDetails().getSignatures())) { + // check reference signature + if (mPm.mOverlayConfigSignaturePackage == null) { + throw new PackageManagerException("Overlay " + + pkg.getPackageName() + " and target " + + pkg.getOverlayTarget() + " signed with" + + " different certificates, and the overlay lacks" + + " <overlay android:targetName>"); + } + final PackageSetting refPkgSetting = + mPm.mSettings.getPackageLPr( + mPm.mOverlayConfigSignaturePackage); + if (!comparePackageSignatures(refPkgSetting, + pkg.getSigningDetails().getSignatures())) { + throw new PackageManagerException("Overlay " + + pkg.getPackageName() + " signed with a different " + + "certificate than both the reference package and " + + "target " + pkg.getOverlayTarget() + ", and the " + + "overlay lacks <overlay android:targetName>"); + } + } + } + } + } + } + + private void assertPackageWithSharedUserIdIsPrivileged(AndroidPackage pkg) + throws PackageManagerException { + if (!pkg.isPrivileged() && (pkg.getSharedUserId() != null)) { + SharedUserSetting sharedUserSetting = null; + try { + sharedUserSetting = mPm.mSettings.getSharedUserLPw(pkg.getSharedUserId(), + 0, 0, false); + } catch (PackageManagerException ignore) { + } + if (sharedUserSetting != null && sharedUserSetting.isPrivileged()) { + // Exempt SharedUsers signed with the platform key. + PackageSetting platformPkgSetting = mPm.mSettings.getPackageLPr("android"); + if (!comparePackageSignatures(platformPkgSetting, + pkg.getSigningDetails().getSignatures())) { + throw new PackageManagerException("Apps that share a user with a " + + "privileged app must themselves be marked as privileged. " + + pkg.getPackageName() + " shares privileged user " + + pkg.getSharedUserId() + "."); + } + } + } + } + + private @PackageManagerService.ScanFlags int adjustScanFlags( + @PackageManagerService.ScanFlags int scanFlags, + PackageSetting pkgSetting, PackageSetting disabledPkgSetting, UserHandle user, + AndroidPackage pkg) { + scanFlags = ScanPackageUtils.adjustScanFlagsWithPackageSetting(scanFlags, pkgSetting, + disabledPkgSetting, user); + + // Exception for privileged apps that share a user with a priv-app. + final boolean skipVendorPrivilegeScan = ((scanFlags & SCAN_AS_VENDOR) != 0) + && ScanPackageUtils.getVendorPartitionVersion() < 28; + if (((scanFlags & SCAN_AS_PRIVILEGED) == 0) + && !pkg.isPrivileged() + && (pkg.getSharedUserId() != null) + && !skipVendorPrivilegeScan) { + SharedUserSetting sharedUserSetting = null; + synchronized (mPm.mLock) { + try { + sharedUserSetting = mPm.mSettings.getSharedUserLPw(pkg.getSharedUserId(), 0, + 0, false); + } catch (PackageManagerException ignore) { + } + if (sharedUserSetting != null && sharedUserSetting.isPrivileged()) { + // Exempt SharedUsers signed with the platform key. + // TODO(b/72378145) Fix this exemption. Force signature apps + // to allowlist their privileged permissions just like other + // priv-apps. + PackageSetting platformPkgSetting = mPm.mSettings.getPackageLPr("android"); + if ((compareSignatures( + platformPkgSetting.getSigningDetails().getSignatures(), + pkg.getSigningDetails().getSignatures()) + != PackageManager.SIGNATURE_MATCH)) { + scanFlags |= SCAN_AS_PRIVILEGED; + } + } + } + } + + return scanFlags; + } } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 8f6ac0744574..6f8703bf5a5d 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -57,6 +57,7 @@ import android.app.ApplicationPackageManager; import android.app.IActivityManager; import android.app.admin.IDevicePolicyManager; import android.app.admin.SecurityLog; +import android.app.backup.IBackupManager; import android.app.role.RoleManager; import android.compat.annotation.ChangeId; import android.compat.annotation.EnabledAfter; @@ -582,13 +583,6 @@ public class PackageManagerService extends IPackageManager.Stub /** Directory where installed applications are stored */ private final File mAppInstallDir; - /** Directory where installed application's 32-bit native libraries are copied. */ - @VisibleForTesting - final File mAppLib32InstallDir; - - static File getAppLib32InstallDir() { - return new File(Environment.getDataDirectory(), "app-lib"); - } // ---------------------------------------------------------------- @@ -975,6 +969,7 @@ public class PackageManagerService extends IPackageManager.Stub private final DeletePackageHelper mDeletePackageHelper; private final InitAndSystemPackageHelper mInitAndSystemPackageHelper; private final AppDataHelper mAppDataHelper; + private final InstallPackageHelper mInstallPackageHelper; private final PreferredActivityHelper mPreferredActivityHelper; private final ResolveIntentHelper mResolveIntentHelper; private final DexOptHelper mDexOptHelper; @@ -1525,7 +1520,9 @@ public class PackageManagerService extends IPackageManager.Stub new DefaultSystemWrapper(), LocalServices::getService, context::getSystemService, - (i, pm) -> new BackgroundDexOptService(i.getContext(), i.getDexManager(), pm)); + (i, pm) -> new BackgroundDexOptService(i.getContext(), i.getDexManager(), pm), + (i, pm) -> IBackupManager.Stub.asInterface(ServiceManager.getService( + Context.BACKUP_SERVICE))); if (Build.VERSION.SDK_INT <= 0) { Slog.w(TAG, "**** ro.build.version.sdk not set!"); @@ -1697,7 +1694,6 @@ public class PackageManagerService extends IPackageManager.Stub mEnableFreeCacheV2 = testParams.enableFreeCacheV2; mSdkVersion = testParams.sdkVersion; mAppInstallDir = testParams.appInstallDir; - mAppLib32InstallDir = testParams.appLib32InstallDir; mIsEngBuild = testParams.isEngBuild; mIsUserDebugBuild = testParams.isUserDebugBuild; mIncrementalVersion = testParams.incrementalVersion; @@ -1705,6 +1701,7 @@ public class PackageManagerService extends IPackageManager.Stub mBroadcastHelper = testParams.broadcastHelper; mAppDataHelper = testParams.appDataHelper; + mInstallPackageHelper = testParams.installPackageHelper; mRemovePackageHelper = testParams.removePackageHelper; mInitAndSystemPackageHelper = testParams.initAndSystemPackageHelper; mDeletePackageHelper = testParams.deletePackageHelper; @@ -1837,7 +1834,6 @@ public class PackageManagerService extends IPackageManager.Stub mInstantAppRegistry = new InstantAppRegistry(this, mPermissionManager, mPmInternal); mAppInstallDir = new File(Environment.getDataDirectory(), "app"); - mAppLib32InstallDir = getAppLib32InstallDir(); mDomainVerificationConnection = new DomainVerificationConnection(this); mDomainVerificationManager = injector.getDomainVerificationManagerInternal(); @@ -1845,6 +1841,7 @@ public class PackageManagerService extends IPackageManager.Stub mBroadcastHelper = new BroadcastHelper(mInjector); mAppDataHelper = new AppDataHelper(this); + mInstallPackageHelper = new InstallPackageHelper(this, mAppDataHelper); mRemovePackageHelper = new RemovePackageHelper(this, mAppDataHelper); mInitAndSystemPackageHelper = new InitAndSystemPackageHelper(this); mDeletePackageHelper = new DeletePackageHelper(this, mRemovePackageHelper, @@ -2006,7 +2003,7 @@ public class PackageManagerService extends IPackageManager.Stub // the rest of the commands above) because there's precious little we // can do about it. A settings error is reported, though. final List<String> changedAbiCodePath = - ScanPackageHelper.applyAdjustedAbiToSharedUser( + ScanPackageUtils.applyAdjustedAbiToSharedUser( setting, null /*scannedPackage*/, mInjector.getAbiHelper().getAdjustedAbiForSharedUser( setting.packages, null /*scannedPackage*/)); @@ -4698,35 +4695,10 @@ public class PackageManagerService extends IPackageManager.Stub @Override public int installExistingPackageAsUser(String packageName, int userId, int installFlags, int installReason, List<String> whiteListedPermissions) { - final InstallPackageHelper installPackageHelper = new InstallPackageHelper( - this, mAppDataHelper); - return installPackageHelper.installExistingPackageAsUser(packageName, userId, installFlags, + return mInstallPackageHelper.installExistingPackageAsUser(packageName, userId, installFlags, installReason, whiteListedPermissions, null); } - static void setInstantAppForUser(PackageManagerServiceInjector injector, - PackageSetting pkgSetting, int userId, boolean instantApp, boolean fullApp) { - // no state specified; do nothing - if (!instantApp && !fullApp) { - return; - } - if (userId != UserHandle.USER_ALL) { - if (instantApp && !pkgSetting.getInstantApp(userId)) { - pkgSetting.setInstantApp(true /*instantApp*/, userId); - } else if (fullApp && pkgSetting.getInstantApp(userId)) { - pkgSetting.setInstantApp(false /*instantApp*/, userId); - } - } else { - for (int currentUserId : injector.getUserManagerInternal().getUserIds()) { - if (instantApp && !pkgSetting.getInstantApp(currentUserId)) { - pkgSetting.setInstantApp(true /*instantApp*/, currentUserId); - } else if (fullApp && pkgSetting.getInstantApp(currentUserId)) { - pkgSetting.setInstantApp(false /*instantApp*/, currentUserId); - } - } - } - } - boolean isUserRestricted(int userId, String restrictionKey) { Bundle restrictions = mUserManager.getUserRestrictions(userId); if (restrictions.getBoolean(restrictionKey, false)) { @@ -6733,8 +6705,7 @@ public class PackageManagerService extends IPackageManager.Stub if (isSystemStub && (newState == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT || newState == PackageManager.COMPONENT_ENABLED_STATE_ENABLED)) { - if (!new InstallPackageHelper(this).enableCompressedPackage(deletedPkg, - pkgSetting)) { + if (!mInstallPackageHelper.enableCompressedPackage(deletedPkg, pkgSetting)) { Slog.w(TAG, "Failed setApplicationEnabledSetting: failed to enable " + "commpressed package " + setting.getPackageName()); updateAllowed[i] = false; diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceInjector.java b/services/core/java/com/android/server/pm/PackageManagerServiceInjector.java index 97a09ffc810f..d14cc1f3ebd9 100644 --- a/services/core/java/com/android/server/pm/PackageManagerServiceInjector.java +++ b/services/core/java/com/android/server/pm/PackageManagerServiceInjector.java @@ -17,6 +17,7 @@ package com.android.server.pm; import android.app.ActivityManagerInternal; +import android.app.backup.IBackupManager; import android.content.ComponentName; import android.content.Context; import android.os.Handler; @@ -135,6 +136,7 @@ public class PackageManagerServiceInjector { mDomainVerificationManagerInternalProducer; private final Singleton<Handler> mHandlerProducer; private final Singleton<BackgroundDexOptService> mBackgroundDexOptService; + private final Singleton<IBackupManager> mIBackupManager; PackageManagerServiceInjector(Context context, PackageManagerTracedLock lock, Installer installer, Object installLock, PackageAbiHelper abiHelper, @@ -170,7 +172,8 @@ public class PackageManagerServiceInjector { SystemWrapper systemWrapper, ServiceProducer getLocalServiceProducer, ServiceProducer getSystemServiceProducer, - Producer<BackgroundDexOptService> backgroundDexOptService) { + Producer<BackgroundDexOptService> backgroundDexOptService, + Producer<IBackupManager> iBackupManager) { mContext = context; mLock = lock; mInstaller = installer; @@ -220,6 +223,7 @@ public class PackageManagerServiceInjector { domainVerificationManagerInternalProducer); mHandlerProducer = new Singleton<>(handlerProducer); mBackgroundDexOptService = new Singleton<>(backgroundDexOptService); + mIBackupManager = new Singleton<>(iBackupManager); } /** @@ -384,6 +388,10 @@ public class PackageManagerServiceInjector { return mBackgroundDexOptService.get(this, mPackageManager); } + public IBackupManager getIBackupManager() { + return mIBackupManager.get(this, mPackageManager); + } + /** Provides an abstraction to static access to system state. */ public interface SystemWrapper { void disablePackageCaches(); diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceTestParams.java b/services/core/java/com/android/server/pm/PackageManagerServiceTestParams.java index 9327c5f10af7..a1acc388146e 100644 --- a/services/core/java/com/android/server/pm/PackageManagerServiceTestParams.java +++ b/services/core/java/com/android/server/pm/PackageManagerServiceTestParams.java @@ -104,6 +104,7 @@ public final class PackageManagerServiceTestParams { public final String incrementalVersion = Build.VERSION.INCREMENTAL; public BroadcastHelper broadcastHelper; public AppDataHelper appDataHelper; + public InstallPackageHelper installPackageHelper; public RemovePackageHelper removePackageHelper; public InitAndSystemPackageHelper initAndSystemPackageHelper; public DeletePackageHelper deletePackageHelper; diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java index bcd07087ad6f..898f67345031 100644 --- a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java +++ b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java @@ -18,9 +18,11 @@ package com.android.server.pm; import static android.content.pm.PackageManager.INSTALL_FAILED_SHARED_USER_INCOMPATIBLE; import static android.content.pm.PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE; +import static android.content.pm.PackageManager.INSTALL_FAILED_VERSION_DOWNGRADE; import static android.system.OsConstants.O_CREAT; import static android.system.OsConstants.O_RDWR; +import static com.android.internal.content.NativeLibraryHelper.LIB_DIR_NAME; import static com.android.server.pm.PackageManagerService.COMPRESSED_EXTENSION; import static com.android.server.pm.PackageManagerService.DEBUG_COMPRESSION; import static com.android.server.pm.PackageManagerService.DEBUG_INTENT_MATCHING; @@ -60,6 +62,7 @@ import android.os.FileUtils; import android.os.Process; import android.os.SystemProperties; import android.os.incremental.IncrementalManager; +import android.os.incremental.IncrementalStorage; import android.os.incremental.V4Signature; import android.os.incremental.V4Signature.HashingInfo; import android.os.storage.DiskInfo; @@ -84,6 +87,7 @@ import com.android.internal.util.FastPrintWriter; import com.android.internal.util.HexDump; import com.android.server.EventLogTags; import com.android.server.IntentResolver; +import com.android.server.Watchdog; import com.android.server.compat.PlatformCompat; import com.android.server.pm.dex.PackageDexUsage; import com.android.server.pm.parsing.pkg.AndroidPackage; @@ -649,6 +653,58 @@ public class PackageManagerServiceUtils { } /** + * Extract native libraries to a target path + */ + public static int extractNativeBinaries(File dstCodePath, String packageName) { + final File libraryRoot = new File(dstCodePath, LIB_DIR_NAME); + NativeLibraryHelper.Handle handle = null; + try { + handle = NativeLibraryHelper.Handle.create(dstCodePath); + return NativeLibraryHelper.copyNativeBinariesWithOverride(handle, libraryRoot, + null /*abiOverride*/, false /*isIncremental*/); + } catch (IOException e) { + logCriticalInfo(Log.ERROR, "Failed to extract native libraries" + + "; pkg: " + packageName); + return PackageManager.INSTALL_FAILED_INTERNAL_ERROR; + } finally { + IoUtils.closeQuietly(handle); + } + } + + /** + * Remove native libraries of a given package + */ + public static void removeNativeBinariesLI(PackageSetting ps) { + if (ps != null) { + NativeLibraryHelper.removeNativeBinariesLI(ps.getLegacyNativeLibraryPath()); + } + } + + /** + * Wait for native library extraction to be done in IncrementalService + */ + public static void waitForNativeBinariesExtractionForIncremental( + ArraySet<IncrementalStorage> incrementalStorages) { + if (incrementalStorages.isEmpty()) { + return; + } + try { + // Native library extraction may take very long time: each page could potentially + // wait for either 10s or 100ms (adb vs non-adb data loader), and that easily adds + // up to a full watchdog timeout of 1 min, killing the system after that. It doesn't + // make much sense as blocking here doesn't lock up the framework, but only blocks + // the installation session and the following ones. + Watchdog.getInstance().pauseWatchingCurrentThread("native_lib_extract"); + for (int i = 0; i < incrementalStorages.size(); ++i) { + IncrementalStorage storage = incrementalStorages.valueAtUnchecked(i); + storage.waitForNativeBinariesExtraction(); + } + } finally { + Watchdog.getInstance().resumeWatchingCurrentThread("native_lib_extract"); + } + } + + /** * Decompress files stored in codePath to dstCodePath for a certain package. */ public static int decompressFiles(String codePath, File dstCodePath, String packageName) { @@ -1280,4 +1336,39 @@ public class PackageManagerServiceUtils { return cacheDir; } + + /** + * Check and throw if the given before/after packages would be considered a + * downgrade. + */ + public static void checkDowngrade(AndroidPackage before, PackageInfoLite after) + throws PackageManagerException { + if (after.getLongVersionCode() < before.getLongVersionCode()) { + throw new PackageManagerException(INSTALL_FAILED_VERSION_DOWNGRADE, + "Update version code " + after.versionCode + " is older than current " + + before.getLongVersionCode()); + } else if (after.getLongVersionCode() == before.getLongVersionCode()) { + if (after.baseRevisionCode < before.getBaseRevisionCode()) { + throw new PackageManagerException(INSTALL_FAILED_VERSION_DOWNGRADE, + "Update base revision code " + after.baseRevisionCode + + " is older than current " + before.getBaseRevisionCode()); + } + + if (!ArrayUtils.isEmpty(after.splitNames)) { + for (int i = 0; i < after.splitNames.length; i++) { + final String splitName = after.splitNames[i]; + final int j = ArrayUtils.indexOf(before.getSplitNames(), splitName); + if (j != -1) { + if (after.splitRevisionCodes[i] < before.getSplitRevisionCodes()[j]) { + throw new PackageManagerException(INSTALL_FAILED_VERSION_DOWNGRADE, + "Update split " + splitName + " revision code " + + after.splitRevisionCodes[i] + + " is older than current " + + before.getSplitRevisionCodes()[j]); + } + } + } + } + } + } } diff --git a/services/core/java/com/android/server/pm/ReconcilePackageUtils.java b/services/core/java/com/android/server/pm/ReconcilePackageUtils.java new file mode 100644 index 000000000000..5a250047da8f --- /dev/null +++ b/services/core/java/com/android/server/pm/ReconcilePackageUtils.java @@ -0,0 +1,292 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.pm; + +import static android.content.pm.PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE; +import static android.content.pm.PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES; + +import static com.android.server.pm.PackageManagerService.SCAN_BOOTING; +import static com.android.server.pm.PackageManagerService.SCAN_DONT_KILL_APP; +import static com.android.server.pm.PackageManagerServiceUtils.compareSignatures; +import static com.android.server.pm.PackageManagerServiceUtils.verifySignatures; + +import android.content.pm.PackageManager; +import android.content.pm.SharedLibraryInfo; +import android.content.pm.Signature; +import android.content.pm.SigningDetails; +import android.content.pm.parsing.ParsingPackageUtils; +import android.os.SystemProperties; +import android.util.ArrayMap; +import android.util.Log; + +import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.parsing.pkg.ParsedPackage; +import com.android.server.utils.WatchedLongSparseArray; + +import java.util.List; +import java.util.Map; + +final class ReconcilePackageUtils { + public static Map<String, ReconciledPackage> reconcilePackages( + final ReconcileRequest request, KeySetManagerService ksms, + PackageManagerServiceInjector injector) + throws ReconcileFailure { + final Map<String, ScanResult> scannedPackages = request.mScannedPackages; + + final Map<String, ReconciledPackage> result = new ArrayMap<>(scannedPackages.size()); + + // make a copy of the existing set of packages so we can combine them with incoming packages + final ArrayMap<String, AndroidPackage> combinedPackages = + new ArrayMap<>(request.mAllPackages.size() + scannedPackages.size()); + + combinedPackages.putAll(request.mAllPackages); + + final Map<String, WatchedLongSparseArray<SharedLibraryInfo>> incomingSharedLibraries = + new ArrayMap<>(); + + for (String installPackageName : scannedPackages.keySet()) { + final ScanResult scanResult = scannedPackages.get(installPackageName); + + // add / replace existing with incoming packages + combinedPackages.put(scanResult.mPkgSetting.getPackageName(), + scanResult.mRequest.mParsedPackage); + + // in the first pass, we'll build up the set of incoming shared libraries + final List<SharedLibraryInfo> allowedSharedLibInfos = + SharedLibraryHelper.getAllowedSharedLibInfos(scanResult, + request.mSharedLibrarySource); + if (allowedSharedLibInfos != null) { + for (SharedLibraryInfo info : allowedSharedLibInfos) { + if (!SharedLibraryHelper.addSharedLibraryToPackageVersionMap( + incomingSharedLibraries, info)) { + throw new ReconcileFailure("Shared Library " + info.getName() + + " is being installed twice in this set!"); + } + } + } + + // the following may be null if we're just reconciling on boot (and not during install) + final InstallArgs installArgs = request.mInstallArgs.get(installPackageName); + final PackageInstalledInfo res = request.mInstallResults.get(installPackageName); + final PrepareResult prepareResult = request.mPreparedPackages.get(installPackageName); + final boolean isInstall = installArgs != null; + if (isInstall && (res == null || prepareResult == null)) { + throw new ReconcileFailure("Reconcile arguments are not balanced for " + + installPackageName + "!"); + } + + final DeletePackageAction deletePackageAction; + // we only want to try to delete for non system apps + if (isInstall && prepareResult.mReplace && !prepareResult.mSystem) { + final boolean killApp = (scanResult.mRequest.mScanFlags & SCAN_DONT_KILL_APP) == 0; + final int deleteFlags = PackageManager.DELETE_KEEP_DATA + | (killApp ? 0 : PackageManager.DELETE_DONT_KILL_APP); + deletePackageAction = DeletePackageHelper.mayDeletePackageLocked(res.mRemovedInfo, + prepareResult.mOriginalPs, prepareResult.mDisabledPs, + deleteFlags, null /* all users */); + if (deletePackageAction == null) { + throw new ReconcileFailure( + PackageManager.INSTALL_FAILED_REPLACE_COULDNT_DELETE, + "May not delete " + installPackageName + " to replace"); + } + } else { + deletePackageAction = null; + } + + final int scanFlags = scanResult.mRequest.mScanFlags; + final int parseFlags = scanResult.mRequest.mParseFlags; + final ParsedPackage parsedPackage = scanResult.mRequest.mParsedPackage; + + final PackageSetting disabledPkgSetting = scanResult.mRequest.mDisabledPkgSetting; + final PackageSetting lastStaticSharedLibSetting = + request.mLastStaticSharedLibSettings.get(installPackageName); + final PackageSetting signatureCheckPs = + (prepareResult != null && lastStaticSharedLibSetting != null) + ? lastStaticSharedLibSetting + : scanResult.mPkgSetting; + boolean removeAppKeySetData = false; + boolean sharedUserSignaturesChanged = false; + SigningDetails signingDetails = null; + if (ksms.shouldCheckUpgradeKeySetLocked(signatureCheckPs, scanFlags)) { + if (ksms.checkUpgradeKeySetLocked(signatureCheckPs, parsedPackage)) { + // We just determined the app is signed correctly, so bring + // over the latest parsed certs. + } else { + if ((parseFlags & ParsingPackageUtils.PARSE_IS_SYSTEM_DIR) == 0) { + throw new ReconcileFailure(INSTALL_FAILED_UPDATE_INCOMPATIBLE, + "Package " + parsedPackage.getPackageName() + + " upgrade keys do not match the previously installed" + + " version"); + } else { + String msg = "System package " + parsedPackage.getPackageName() + + " signature changed; retaining data."; + PackageManagerService.reportSettingsProblem(Log.WARN, msg); + } + } + signingDetails = parsedPackage.getSigningDetails(); + } else { + try { + final Settings.VersionInfo versionInfo = + request.mVersionInfos.get(installPackageName); + final boolean compareCompat = isCompatSignatureUpdateNeeded(versionInfo); + final boolean compareRecover = isRecoverSignatureUpdateNeeded(versionInfo); + final boolean isRollback = installArgs != null + && installArgs.mInstallReason == PackageManager.INSTALL_REASON_ROLLBACK; + final boolean compatMatch = verifySignatures(signatureCheckPs, + disabledPkgSetting, parsedPackage.getSigningDetails(), compareCompat, + compareRecover, isRollback); + // The new KeySets will be re-added later in the scanning process. + if (compatMatch) { + removeAppKeySetData = true; + } + // We just determined the app is signed correctly, so bring + // over the latest parsed certs. + signingDetails = parsedPackage.getSigningDetails(); + + // if this is is a sharedUser, check to see if the new package is signed by a + // newer + // signing certificate than the existing one, and if so, copy over the new + // details + if (signatureCheckPs.getSharedUser() != null) { + // Attempt to merge the existing lineage for the shared SigningDetails with + // the lineage of the new package; if the shared SigningDetails are not + // returned this indicates the new package added new signers to the lineage + // and/or changed the capabilities of existing signers in the lineage. + SigningDetails sharedSigningDetails = + signatureCheckPs.getSharedUser().signatures.mSigningDetails; + SigningDetails mergedDetails = sharedSigningDetails.mergeLineageWith( + signingDetails); + if (mergedDetails != sharedSigningDetails) { + signatureCheckPs.getSharedUser().signatures.mSigningDetails = + mergedDetails; + } + if (signatureCheckPs.getSharedUser().signaturesChanged == null) { + signatureCheckPs.getSharedUser().signaturesChanged = Boolean.FALSE; + } + } + } catch (PackageManagerException e) { + if ((parseFlags & ParsingPackageUtils.PARSE_IS_SYSTEM_DIR) == 0) { + throw new ReconcileFailure(e); + } + signingDetails = parsedPackage.getSigningDetails(); + + // If the system app is part of a shared user we allow that shared user to + // change + // signatures as well as part of an OTA. We still need to verify that the + // signatures + // are consistent within the shared user for a given boot, so only allow + // updating + // the signatures on the first package scanned for the shared user (i.e. if the + // signaturesChanged state hasn't been initialized yet in SharedUserSetting). + if (signatureCheckPs.getSharedUser() != null) { + final Signature[] sharedUserSignatures = signatureCheckPs.getSharedUser() + .signatures.mSigningDetails.getSignatures(); + if (signatureCheckPs.getSharedUser().signaturesChanged != null + && compareSignatures(sharedUserSignatures, + parsedPackage.getSigningDetails().getSignatures()) + != PackageManager.SIGNATURE_MATCH) { + if (SystemProperties.getInt("ro.product.first_api_level", 0) <= 29) { + // Mismatched signatures is an error and silently skipping system + // packages will likely break the device in unforeseen ways. + // However, we allow the device to boot anyway because, prior to Q, + // vendors were not expecting the platform to crash in this + // situation. + // This WILL be a hard failure on any new API levels after Q. + throw new ReconcileFailure( + INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES, + "Signature mismatch for shared user: " + + scanResult.mPkgSetting.getSharedUser()); + } else { + // Treat mismatched signatures on system packages using a shared + // UID as + // fatal for the system overall, rather than just failing to install + // whichever package happened to be scanned later. + throw new IllegalStateException( + "Signature mismatch on system package " + + parsedPackage.getPackageName() + + " for shared user " + + scanResult.mPkgSetting.getSharedUser()); + } + } + + sharedUserSignaturesChanged = true; + signatureCheckPs.getSharedUser().signatures.mSigningDetails = + parsedPackage.getSigningDetails(); + signatureCheckPs.getSharedUser().signaturesChanged = Boolean.TRUE; + } + // File a report about this. + String msg = "System package " + parsedPackage.getPackageName() + + " signature changed; retaining data."; + PackageManagerService.reportSettingsProblem(Log.WARN, msg); + } catch (IllegalArgumentException e) { + // should never happen: certs matched when checking, but not when comparing + // old to new for sharedUser + throw new RuntimeException( + "Signing certificates comparison made on incomparable signing details" + + " but somehow passed verifySignatures!", e); + } + } + + result.put(installPackageName, + new ReconciledPackage(request, installArgs, scanResult.mPkgSetting, + res, request.mPreparedPackages.get(installPackageName), scanResult, + deletePackageAction, allowedSharedLibInfos, signingDetails, + sharedUserSignaturesChanged, removeAppKeySetData)); + } + + for (String installPackageName : scannedPackages.keySet()) { + // Check all shared libraries and map to their actual file path. + // We only do this here for apps not on a system dir, because those + // are the only ones that can fail an install due to this. We + // will take care of the system apps by updating all of their + // library paths after the scan is done. Also during the initial + // scan don't update any libs as we do this wholesale after all + // apps are scanned to avoid dependency based scanning. + final ScanResult scanResult = scannedPackages.get(installPackageName); + if ((scanResult.mRequest.mScanFlags & SCAN_BOOTING) != 0 + || (scanResult.mRequest.mParseFlags & ParsingPackageUtils.PARSE_IS_SYSTEM_DIR) + != 0) { + continue; + } + try { + result.get(installPackageName).mCollectedSharedLibraryInfos = + SharedLibraryHelper.collectSharedLibraryInfos( + scanResult.mRequest.mParsedPackage, + combinedPackages, request.mSharedLibrarySource, + incomingSharedLibraries, injector.getCompatibility()); + + } catch (PackageManagerException e) { + throw new ReconcileFailure(e.error, e.getMessage()); + } + } + + return result; + } + + /** + * If the database version for this type of package (internal storage or + * external storage) is less than the version where package signatures + * were updated, return true. + */ + public static boolean isCompatSignatureUpdateNeeded(Settings.VersionInfo ver) { + return ver.databaseVersion < Settings.DatabaseVersion.SIGNATURE_END_ENTITY; + } + + public static boolean isRecoverSignatureUpdateNeeded(Settings.VersionInfo ver) { + return ver.databaseVersion < Settings.DatabaseVersion.SIGNATURE_MALFORMED_RECOVER; + } +} diff --git a/services/core/java/com/android/server/pm/ScanPackageHelper.java b/services/core/java/com/android/server/pm/ScanPackageHelper.java deleted file mode 100644 index eafe0d98e505..000000000000 --- a/services/core/java/com/android/server/pm/ScanPackageHelper.java +++ /dev/null @@ -1,1716 +0,0 @@ -/* - * Copyright (C) 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.server.pm; - -import static android.content.pm.PackageManager.INSTALL_FAILED_DUPLICATE_PACKAGE; -import static android.content.pm.PackageManager.INSTALL_FAILED_INVALID_APK; -import static android.content.pm.PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION; -import static android.content.pm.PackageManager.INSTALL_FAILED_PACKAGE_CHANGED; -import static android.content.pm.PackageManager.INSTALL_FAILED_PROCESS_NOT_DEFINED; -import static android.content.pm.PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES; -import static android.os.Trace.TRACE_TAG_PACKAGE_MANAGER; - -import static com.android.server.pm.InstructionSets.getAppDexInstructionSets; -import static com.android.server.pm.PackageManagerService.DEBUG_ABI_SELECTION; -import static com.android.server.pm.PackageManagerService.DEBUG_INSTALL; -import static com.android.server.pm.PackageManagerService.DEBUG_PACKAGE_SCANNING; -import static com.android.server.pm.PackageManagerService.DEBUG_UPGRADE; -import static com.android.server.pm.PackageManagerService.DEBUG_VERIFY; -import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME; -import static com.android.server.pm.PackageManagerService.SCAN_AS_FULL_APP; -import static com.android.server.pm.PackageManagerService.SCAN_AS_INSTANT_APP; -import static com.android.server.pm.PackageManagerService.SCAN_AS_ODM; -import static com.android.server.pm.PackageManagerService.SCAN_AS_OEM; -import static com.android.server.pm.PackageManagerService.SCAN_AS_PRIVILEGED; -import static com.android.server.pm.PackageManagerService.SCAN_AS_PRODUCT; -import static com.android.server.pm.PackageManagerService.SCAN_AS_SYSTEM; -import static com.android.server.pm.PackageManagerService.SCAN_AS_SYSTEM_EXT; -import static com.android.server.pm.PackageManagerService.SCAN_AS_VENDOR; -import static com.android.server.pm.PackageManagerService.SCAN_AS_VIRTUAL_PRELOAD; -import static com.android.server.pm.PackageManagerService.SCAN_BOOTING; -import static com.android.server.pm.PackageManagerService.SCAN_FIRST_BOOT_OR_UPGRADE; -import static com.android.server.pm.PackageManagerService.SCAN_MOVE; -import static com.android.server.pm.PackageManagerService.SCAN_NEW_INSTALL; -import static com.android.server.pm.PackageManagerService.SCAN_NO_DEX; -import static com.android.server.pm.PackageManagerService.SCAN_REQUIRE_KNOWN; -import static com.android.server.pm.PackageManagerService.SCAN_UPDATE_SIGNATURE; -import static com.android.server.pm.PackageManagerService.SCAN_UPDATE_TIME; -import static com.android.server.pm.PackageManagerService.TAG; -import static com.android.server.pm.PackageManagerServiceUtils.comparePackageSignatures; -import static com.android.server.pm.PackageManagerServiceUtils.compareSignatures; -import static com.android.server.pm.PackageManagerServiceUtils.compressedFileExists; -import static com.android.server.pm.PackageManagerServiceUtils.deriveAbiOverride; -import static com.android.server.pm.PackageManagerServiceUtils.getLastModifiedTime; -import static com.android.server.pm.PackageManagerServiceUtils.logCriticalInfo; - -import android.annotation.NonNull; -import android.annotation.Nullable; -import android.content.pm.ApplicationInfo; -import android.content.pm.PackageManager; -import android.content.pm.SharedLibraryInfo; -import android.content.pm.SigningDetails; -import android.content.pm.parsing.ParsingPackageUtils; -import android.content.pm.parsing.component.ComponentMutateUtils; -import android.content.pm.parsing.component.ParsedActivity; -import android.content.pm.parsing.component.ParsedMainComponent; -import android.content.pm.parsing.component.ParsedProcess; -import android.content.pm.parsing.component.ParsedProvider; -import android.content.pm.parsing.component.ParsedService; -import android.content.pm.parsing.result.ParseResult; -import android.content.pm.parsing.result.ParseTypeImpl; -import android.os.Build; -import android.os.Process; -import android.os.SystemProperties; -import android.os.Trace; -import android.os.UserHandle; -import android.text.TextUtils; -import android.util.ArrayMap; -import android.util.Log; -import android.util.Pair; -import android.util.Slog; -import android.util.apk.ApkSignatureVerifier; -import android.util.jar.StrictJarFile; - -import com.android.internal.annotations.GuardedBy; -import com.android.internal.annotations.VisibleForTesting; -import com.android.internal.security.VerityUtils; -import com.android.internal.util.ArrayUtils; -import com.android.server.SystemConfig; -import com.android.server.pm.parsing.PackageInfoUtils; -import com.android.server.pm.parsing.library.PackageBackwardCompatibility; -import com.android.server.pm.parsing.pkg.AndroidPackage; -import com.android.server.pm.parsing.pkg.AndroidPackageUtils; -import com.android.server.pm.parsing.pkg.ParsedPackage; -import com.android.server.utils.WatchedLongSparseArray; - -import dalvik.system.VMRuntime; - -import java.io.File; -import java.io.IOException; -import java.security.DigestException; -import java.security.NoSuchAlgorithmException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.UUID; - -/** - * Helper class that handles package scanning logic - */ -final class ScanPackageHelper { - final PackageManagerService mPm; - final PackageManagerServiceInjector mInjector; - - // TODO(b/198166813): remove PMS dependency - public ScanPackageHelper(PackageManagerService pm) { - mPm = pm; - mInjector = pm.mInjector; - } - - ScanPackageHelper(PackageManagerService pm, PackageManagerServiceInjector injector) { - mPm = pm; - mInjector = injector; - } - - /** - * Similar to the other scanPackageTracedLI but accepting a ParsedPackage instead of a File. - */ - @GuardedBy({"mPm.mInstallLock", "mPm.mLock"}) - public ScanResult scanPackageTracedLI(ParsedPackage parsedPackage, - final @ParsingPackageUtils.ParseFlags int parseFlags, - @PackageManagerService.ScanFlags int scanFlags, long currentTime, - @Nullable UserHandle user, String cpuAbiOverride) throws PackageManagerException { - Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "scanPackage"); - try { - return scanPackageNewLI(parsedPackage, parseFlags, scanFlags, currentTime, user, - cpuAbiOverride); - } finally { - Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER); - } - } - - // TODO(b/199937291): scanPackageNewLI() and scanPackageOnlyLI() should be merged. - // But, first, committing the results / removing app data needs to be moved up a level to the - // callers of this method. Also, we need to solve the problem of potentially creating a new - // shared user setting. That can probably be done later and patch things up after the fact. - @GuardedBy({"mPm.mInstallLock", "mPm.mLock"}) - private ScanResult scanPackageNewLI(@NonNull ParsedPackage parsedPackage, - final @ParsingPackageUtils.ParseFlags int parseFlags, - @PackageManagerService.ScanFlags int scanFlags, long currentTime, - @Nullable UserHandle user, String cpuAbiOverride) throws PackageManagerException { - - final String renamedPkgName = mPm.mSettings.getRenamedPackageLPr( - AndroidPackageUtils.getRealPackageOrNull(parsedPackage)); - final String realPkgName = getRealPackageName(parsedPackage, renamedPkgName); - if (realPkgName != null) { - ensurePackageRenamed(parsedPackage, renamedPkgName); - } - final PackageSetting originalPkgSetting = getOriginalPackageLocked(parsedPackage, - renamedPkgName); - final PackageSetting pkgSetting = - mPm.mSettings.getPackageLPr(parsedPackage.getPackageName()); - final PackageSetting disabledPkgSetting = - mPm.mSettings.getDisabledSystemPkgLPr(parsedPackage.getPackageName()); - - if (mPm.mTransferredPackages.contains(parsedPackage.getPackageName())) { - Slog.w(TAG, "Package " + parsedPackage.getPackageName() - + " was transferred to another, but its .apk remains"); - } - - scanFlags = adjustScanFlags(scanFlags, pkgSetting, disabledPkgSetting, user, parsedPackage); - synchronized (mPm.mLock) { - boolean isUpdatedSystemApp; - if (pkgSetting != null) { - isUpdatedSystemApp = pkgSetting.getPkgState().isUpdatedSystemApp(); - } else { - isUpdatedSystemApp = disabledPkgSetting != null; - } - applyPolicy(parsedPackage, scanFlags, mPm.getPlatformPackage(), isUpdatedSystemApp); - assertPackageIsValid(parsedPackage, parseFlags, scanFlags); - - SharedUserSetting sharedUserSetting = null; - if (parsedPackage.getSharedUserId() != null) { - // SIDE EFFECTS; may potentially allocate a new shared user - sharedUserSetting = mPm.mSettings.getSharedUserLPw(parsedPackage.getSharedUserId(), - 0 /*pkgFlags*/, 0 /*pkgPrivateFlags*/, true /*create*/); - if (DEBUG_PACKAGE_SCANNING) { - if ((parseFlags & ParsingPackageUtils.PARSE_CHATTY) != 0) { - Log.d(TAG, "Shared UserID " + parsedPackage.getSharedUserId() - + " (uid=" + sharedUserSetting.userId + "):" - + " packages=" + sharedUserSetting.packages); - } - } - } - String platformPackageName = mPm.getPlatformPackage() == null - ? null : mPm.getPlatformPackage().getPackageName(); - final ScanRequest request = new ScanRequest(parsedPackage, sharedUserSetting, - pkgSetting == null ? null : pkgSetting.getPkg(), pkgSetting, disabledPkgSetting, - originalPkgSetting, realPkgName, parseFlags, scanFlags, - Objects.equals(parsedPackage.getPackageName(), platformPackageName), user, - cpuAbiOverride); - return scanPackageOnlyLI(request, mInjector, mPm.mFactoryTest, currentTime); - } - } - - /** - * Just scans the package without any side effects. - * <p>Not entirely true at the moment. There is still one side effect -- this - * method potentially modifies a live {@link PackageSetting} object representing - * the package being scanned. This will be resolved in the future. - * - * @param injector injector for acquiring dependencies - * @param request Information about the package to be scanned - * @param isUnderFactoryTest Whether or not the device is under factory test - * @param currentTime The current time, in millis - * @return The results of the scan - */ - @GuardedBy("mPm.mInstallLock") - @VisibleForTesting - @NonNull - public ScanResult scanPackageOnlyLI(@NonNull ScanRequest request, - PackageManagerServiceInjector injector, - boolean isUnderFactoryTest, long currentTime) - throws PackageManagerException { - final PackageAbiHelper packageAbiHelper = injector.getAbiHelper(); - ParsedPackage parsedPackage = request.mParsedPackage; - PackageSetting pkgSetting = request.mPkgSetting; - final PackageSetting disabledPkgSetting = request.mDisabledPkgSetting; - final PackageSetting originalPkgSetting = request.mOriginalPkgSetting; - final @ParsingPackageUtils.ParseFlags int parseFlags = request.mParseFlags; - final @PackageManagerService.ScanFlags int scanFlags = request.mScanFlags; - final String realPkgName = request.mRealPkgName; - final SharedUserSetting sharedUserSetting = request.mSharedUserSetting; - final UserHandle user = request.mUser; - final boolean isPlatformPackage = request.mIsPlatformPackage; - - List<String> changedAbiCodePath = null; - - if (DEBUG_PACKAGE_SCANNING) { - if ((parseFlags & ParsingPackageUtils.PARSE_CHATTY) != 0) { - Log.d(TAG, "Scanning package " + parsedPackage.getPackageName()); - } - } - - // Initialize package source and resource directories - final File destCodeFile = new File(parsedPackage.getPath()); - - // We keep references to the derived CPU Abis from settings in oder to reuse - // them in the case where we're not upgrading or booting for the first time. - String primaryCpuAbiFromSettings = null; - String secondaryCpuAbiFromSettings = null; - boolean needToDeriveAbi = (scanFlags & SCAN_FIRST_BOOT_OR_UPGRADE) != 0; - if (!needToDeriveAbi) { - if (pkgSetting != null) { - // TODO(b/154610922): if it is not first boot or upgrade, we should directly use - // API info from existing package setting. However, stub packages currently do not - // preserve ABI info, thus the special condition check here. Remove the special - // check after we fix the stub generation. - if (pkgSetting.getPkg() != null && pkgSetting.getPkg().isStub()) { - needToDeriveAbi = true; - } else { - primaryCpuAbiFromSettings = pkgSetting.getPrimaryCpuAbi(); - secondaryCpuAbiFromSettings = pkgSetting.getSecondaryCpuAbi(); - } - } else { - // Re-scanning a system package after uninstalling updates; need to derive ABI - needToDeriveAbi = true; - } - } - - int previousAppId = Process.INVALID_UID; - - if (pkgSetting != null && pkgSetting.getSharedUser() != sharedUserSetting) { - if (pkgSetting.getSharedUser() != null && sharedUserSetting == null) { - previousAppId = pkgSetting.getAppId(); - // Log that something is leaving shareduid and keep going - Slog.i(TAG, - "Package " + parsedPackage.getPackageName() + " shared user changed from " - + pkgSetting.getSharedUser().name + " to " + "<nothing>."); - } else { - PackageManagerService.reportSettingsProblem(Log.WARN, - "Package " + parsedPackage.getPackageName() + " shared user changed from " - + (pkgSetting.getSharedUser() != null - ? pkgSetting.getSharedUser().name : "<nothing>") - + " to " - + (sharedUserSetting != null ? sharedUserSetting.name : "<nothing>") - + "; replacing with new"); - pkgSetting = null; - } - } - - String[] usesSdkLibraries = null; - if (!parsedPackage.getUsesSdkLibraries().isEmpty()) { - usesSdkLibraries = new String[parsedPackage.getUsesSdkLibraries().size()]; - parsedPackage.getUsesSdkLibraries().toArray(usesSdkLibraries); - } - - String[] usesStaticLibraries = null; - if (!parsedPackage.getUsesStaticLibraries().isEmpty()) { - usesStaticLibraries = new String[parsedPackage.getUsesStaticLibraries().size()]; - parsedPackage.getUsesStaticLibraries().toArray(usesStaticLibraries); - } - - final UUID newDomainSetId = injector.getDomainVerificationManagerInternal().generateNewId(); - - // TODO(b/135203078): Remove appInfoFlag usage in favor of individually assigned booleans - // to avoid adding something that's unsupported due to lack of state, since it's called - // with null. - final boolean createNewPackage = (pkgSetting == null); - if (createNewPackage) { - final boolean instantApp = (scanFlags & SCAN_AS_INSTANT_APP) != 0; - final boolean virtualPreload = (scanFlags & SCAN_AS_VIRTUAL_PRELOAD) != 0; - - // Flags contain system values stored in the server variant of AndroidPackage, - // and so the server-side PackageInfoUtils is still called, even without a - // PackageSetting to pass in. - int pkgFlags = PackageInfoUtils.appInfoFlags(parsedPackage, null); - int pkgPrivateFlags = PackageInfoUtils.appInfoPrivateFlags(parsedPackage, null); - - // REMOVE SharedUserSetting from method; update in a separate call - pkgSetting = Settings.createNewSetting(parsedPackage.getPackageName(), - originalPkgSetting, disabledPkgSetting, realPkgName, sharedUserSetting, - destCodeFile, parsedPackage.getNativeLibraryRootDir(), - AndroidPackageUtils.getRawPrimaryCpuAbi(parsedPackage), - AndroidPackageUtils.getRawSecondaryCpuAbi(parsedPackage), - parsedPackage.getLongVersionCode(), pkgFlags, pkgPrivateFlags, user, - true /*allowInstall*/, instantApp, virtualPreload, - UserManagerService.getInstance(), usesSdkLibraries, - parsedPackage.getUsesSdkLibrariesVersionsMajor(), usesStaticLibraries, - parsedPackage.getUsesStaticLibrariesVersions(), parsedPackage.getMimeGroups(), - newDomainSetId); - } else { - // make a deep copy to avoid modifying any existing system state. - pkgSetting = new PackageSetting(pkgSetting); - pkgSetting.setPkg(parsedPackage); - - // REMOVE SharedUserSetting from method; update in a separate call. - // - // TODO(narayan): This update is bogus. nativeLibraryDir & primaryCpuAbi, - // secondaryCpuAbi are not known at this point so we always update them - // to null here, only to reset them at a later point. - Settings.updatePackageSetting(pkgSetting, disabledPkgSetting, sharedUserSetting, - destCodeFile, parsedPackage.getNativeLibraryDir(), - AndroidPackageUtils.getPrimaryCpuAbi(parsedPackage, pkgSetting), - AndroidPackageUtils.getSecondaryCpuAbi(parsedPackage, pkgSetting), - PackageInfoUtils.appInfoFlags(parsedPackage, pkgSetting), - PackageInfoUtils.appInfoPrivateFlags(parsedPackage, pkgSetting), - UserManagerService.getInstance(), - usesSdkLibraries, parsedPackage.getUsesSdkLibrariesVersionsMajor(), - usesStaticLibraries, parsedPackage.getUsesStaticLibrariesVersions(), - parsedPackage.getMimeGroups(), newDomainSetId); - } - if (createNewPackage && originalPkgSetting != null) { - // This is the initial transition from the original package, so, - // fix up the new package's name now. We must do this after looking - // up the package under its new name, so getPackageLP takes care of - // fiddling things correctly. - parsedPackage.setPackageName(originalPkgSetting.getPackageName()); - - // File a report about this. - String msg = "New package " + pkgSetting.getRealName() - + " renamed to replace old package " + pkgSetting.getPackageName(); - PackageManagerService.reportSettingsProblem(Log.WARN, msg); - } - - final int userId = (user == null ? UserHandle.USER_SYSTEM : user.getIdentifier()); - // for existing packages, change the install state; but, only if it's explicitly specified - if (!createNewPackage) { - final boolean instantApp = (scanFlags & SCAN_AS_INSTANT_APP) != 0; - final boolean fullApp = (scanFlags & SCAN_AS_FULL_APP) != 0; - PackageManagerService.setInstantAppForUser( - injector, pkgSetting, userId, instantApp, fullApp); - } - // TODO(patb): see if we can do away with disabled check here. - if (disabledPkgSetting != null - || (0 != (scanFlags & SCAN_NEW_INSTALL) - && pkgSetting != null && pkgSetting.isSystem())) { - pkgSetting.getPkgState().setUpdatedSystemApp(true); - } - - parsedPackage.setSeInfo(SELinuxMMAC.getSeInfo(parsedPackage, sharedUserSetting, - injector.getCompatibility())); - - if (parsedPackage.isSystem()) { - configurePackageComponents(parsedPackage); - } - - final String cpuAbiOverride = deriveAbiOverride(request.mCpuAbiOverride); - final boolean isUpdatedSystemApp = pkgSetting.getPkgState().isUpdatedSystemApp(); - - final File appLib32InstallDir = PackageManagerService.getAppLib32InstallDir(); - if ((scanFlags & SCAN_NEW_INSTALL) == 0) { - if (needToDeriveAbi) { - Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "derivePackageAbi"); - final Pair<PackageAbiHelper.Abis, PackageAbiHelper.NativeLibraryPaths> derivedAbi = - packageAbiHelper.derivePackageAbi(parsedPackage, isUpdatedSystemApp, - cpuAbiOverride, appLib32InstallDir); - derivedAbi.first.applyTo(parsedPackage); - derivedAbi.second.applyTo(parsedPackage); - Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER); - - // Some system apps still use directory structure for native libraries - // in which case we might end up not detecting abi solely based on apk - // structure. Try to detect abi based on directory structure. - - String pkgRawPrimaryCpuAbi = AndroidPackageUtils.getRawPrimaryCpuAbi(parsedPackage); - if (parsedPackage.isSystem() && !isUpdatedSystemApp - && pkgRawPrimaryCpuAbi == null) { - final PackageAbiHelper.Abis abis = packageAbiHelper.getBundledAppAbis( - parsedPackage); - abis.applyTo(parsedPackage); - abis.applyTo(pkgSetting); - final PackageAbiHelper.NativeLibraryPaths nativeLibraryPaths = - packageAbiHelper.deriveNativeLibraryPaths(parsedPackage, - isUpdatedSystemApp, appLib32InstallDir); - nativeLibraryPaths.applyTo(parsedPackage); - } - } else { - // This is not a first boot or an upgrade, don't bother deriving the - // ABI during the scan. Instead, trust the value that was stored in the - // package setting. - parsedPackage.setPrimaryCpuAbi(primaryCpuAbiFromSettings) - .setSecondaryCpuAbi(secondaryCpuAbiFromSettings); - - final PackageAbiHelper.NativeLibraryPaths nativeLibraryPaths = - packageAbiHelper.deriveNativeLibraryPaths(parsedPackage, - isUpdatedSystemApp, appLib32InstallDir); - nativeLibraryPaths.applyTo(parsedPackage); - - if (DEBUG_ABI_SELECTION) { - Slog.i(TAG, "Using ABIS and native lib paths from settings : " - + parsedPackage.getPackageName() + " " - + AndroidPackageUtils.getRawPrimaryCpuAbi(parsedPackage) - + ", " - + AndroidPackageUtils.getRawSecondaryCpuAbi(parsedPackage)); - } - } - } else { - if ((scanFlags & SCAN_MOVE) != 0) { - // We haven't run dex-opt for this move (since we've moved the compiled output too) - // but we already have this packages package info in the PackageSetting. We just - // use that and derive the native library path based on the new code path. - parsedPackage.setPrimaryCpuAbi(pkgSetting.getPrimaryCpuAbi()) - .setSecondaryCpuAbi(pkgSetting.getSecondaryCpuAbi()); - } - - // Set native library paths again. For moves, the path will be updated based on the - // ABIs we've determined above. For non-moves, the path will be updated based on the - // ABIs we determined during compilation, but the path will depend on the final - // package path (after the rename away from the stage path). - final PackageAbiHelper.NativeLibraryPaths nativeLibraryPaths = - packageAbiHelper.deriveNativeLibraryPaths(parsedPackage, isUpdatedSystemApp, - appLib32InstallDir); - nativeLibraryPaths.applyTo(parsedPackage); - } - - // This is a special case for the "system" package, where the ABI is - // dictated by the zygote configuration (and init.rc). We should keep track - // of this ABI so that we can deal with "normal" applications that run under - // the same UID correctly. - if (isPlatformPackage) { - parsedPackage.setPrimaryCpuAbi(VMRuntime.getRuntime().is64Bit() - ? Build.SUPPORTED_64_BIT_ABIS[0] : Build.SUPPORTED_32_BIT_ABIS[0]); - } - - // If there's a mismatch between the abi-override in the package setting - // and the abiOverride specified for the install. Warn about this because we - // would've already compiled the app without taking the package setting into - // account. - if ((scanFlags & SCAN_NO_DEX) == 0 && (scanFlags & SCAN_NEW_INSTALL) != 0) { - if (cpuAbiOverride == null) { - Slog.w(TAG, "Ignoring persisted ABI override for package " - + parsedPackage.getPackageName()); - } - } - - pkgSetting.setPrimaryCpuAbi(AndroidPackageUtils.getRawPrimaryCpuAbi(parsedPackage)) - .setSecondaryCpuAbi(AndroidPackageUtils.getRawSecondaryCpuAbi(parsedPackage)) - .setCpuAbiOverride(cpuAbiOverride); - - if (DEBUG_ABI_SELECTION) { - Slog.d(TAG, "Resolved nativeLibraryRoot for " + parsedPackage.getPackageName() - + " to root=" + parsedPackage.getNativeLibraryRootDir() - + ", to dir=" + parsedPackage.getNativeLibraryDir() - + ", isa=" + parsedPackage.isNativeLibraryRootRequiresIsa()); - } - - // Push the derived path down into PackageSettings so we know what to - // clean up at uninstall time. - pkgSetting.setLegacyNativeLibraryPath(parsedPackage.getNativeLibraryRootDir()); - - if (DEBUG_ABI_SELECTION) { - Log.d(TAG, "Abis for package[" + parsedPackage.getPackageName() + "] are" - + " primary=" + pkgSetting.getPrimaryCpuAbi() - + " secondary=" + pkgSetting.getSecondaryCpuAbi() - + " abiOverride=" + pkgSetting.getCpuAbiOverride()); - } - - if ((scanFlags & SCAN_BOOTING) == 0 && pkgSetting.getSharedUser() != null) { - // We don't do this here during boot because we can do it all - // at once after scanning all existing packages. - // - // We also do this *before* we perform dexopt on this package, so that - // we can avoid redundant dexopts, and also to make sure we've got the - // code and package path correct. - changedAbiCodePath = applyAdjustedAbiToSharedUser(pkgSetting.getSharedUser(), - parsedPackage, packageAbiHelper.getAdjustedAbiForSharedUser( - pkgSetting.getSharedUser().packages, parsedPackage)); - } - - parsedPackage.setFactoryTest(isUnderFactoryTest && parsedPackage.getRequestedPermissions() - .contains(android.Manifest.permission.FACTORY_TEST)); - - if (parsedPackage.isSystem()) { - pkgSetting.setIsOrphaned(true); - } - - // Take care of first install / last update times. - final long scanFileTime = getLastModifiedTime(parsedPackage); - if (currentTime != 0) { - if (pkgSetting.getFirstInstallTime() == 0) { - pkgSetting.setFirstInstallTime(currentTime) - .setLastUpdateTime(currentTime); - } else if ((scanFlags & SCAN_UPDATE_TIME) != 0) { - pkgSetting.setLastUpdateTime(currentTime); - } - } else if (pkgSetting.getFirstInstallTime() == 0) { - // We need *something*. Take time time stamp of the file. - pkgSetting.setFirstInstallTime(scanFileTime) - .setLastUpdateTime(scanFileTime); - } else if ((parseFlags & ParsingPackageUtils.PARSE_IS_SYSTEM_DIR) != 0) { - if (scanFileTime != pkgSetting.getLastModifiedTime()) { - // A package on the system image has changed; consider this - // to be an update. - pkgSetting.setLastUpdateTime(scanFileTime); - } - } - pkgSetting.setLastModifiedTime(scanFileTime); - // TODO(b/135203078): Remove, move to constructor - pkgSetting.setPkg(parsedPackage) - .setFlags(PackageInfoUtils.appInfoFlags(parsedPackage, pkgSetting)) - .setPrivateFlags( - PackageInfoUtils.appInfoPrivateFlags(parsedPackage, pkgSetting)); - if (parsedPackage.getLongVersionCode() != pkgSetting.getVersionCode()) { - pkgSetting.setLongVersionCode(parsedPackage.getLongVersionCode()); - } - // Update volume if needed - final String volumeUuid = parsedPackage.getVolumeUuid(); - if (!Objects.equals(volumeUuid, pkgSetting.getVolumeUuid())) { - Slog.i(PackageManagerService.TAG, - "Update" + (pkgSetting.isSystem() ? " system" : "") - + " package " + parsedPackage.getPackageName() - + " volume from " + pkgSetting.getVolumeUuid() - + " to " + volumeUuid); - pkgSetting.setVolumeUuid(volumeUuid); - } - - SharedLibraryInfo sdkLibraryInfo = null; - if (!TextUtils.isEmpty(parsedPackage.getSdkLibName())) { - sdkLibraryInfo = AndroidPackageUtils.createSharedLibraryForSdk(parsedPackage); - } - SharedLibraryInfo staticSharedLibraryInfo = null; - if (!TextUtils.isEmpty(parsedPackage.getStaticSharedLibName())) { - staticSharedLibraryInfo = - AndroidPackageUtils.createSharedLibraryForStatic(parsedPackage); - } - List<SharedLibraryInfo> dynamicSharedLibraryInfos = null; - if (!ArrayUtils.isEmpty(parsedPackage.getLibraryNames())) { - dynamicSharedLibraryInfos = new ArrayList<>(parsedPackage.getLibraryNames().size()); - for (String name : parsedPackage.getLibraryNames()) { - dynamicSharedLibraryInfos.add( - AndroidPackageUtils.createSharedLibraryForDynamic(parsedPackage, name)); - } - } - - return new ScanResult(request, true, pkgSetting, changedAbiCodePath, - !createNewPackage /* existingSettingCopied */, - previousAppId, sdkLibraryInfo, staticSharedLibraryInfo, - dynamicSharedLibraryInfos); - } - - /** - * Returns the actual scan flags depending upon the state of the other settings. - * <p>Updated system applications will not have the following flags set - * by default and need to be adjusted after the fact: - * <ul> - * <li>{@link PackageManagerService.SCAN_AS_SYSTEM}</li> - * <li>{@link PackageManagerService.SCAN_AS_PRIVILEGED}</li> - * <li>{@link PackageManagerService.SCAN_AS_OEM}</li> - * <li>{@link PackageManagerService.SCAN_AS_VENDOR}</li> - * <li>{@link PackageManagerService.SCAN_AS_PRODUCT}</li> - * <li>{@link PackageManagerService.SCAN_AS_SYSTEM_EXT}</li> - * <li>{@link PackageManagerService.SCAN_AS_INSTANT_APP}</li> - * <li>{@link PackageManagerService.SCAN_AS_VIRTUAL_PRELOAD}</li> - * <li>{@link PackageManagerService.SCAN_AS_ODM}</li> - * </ul> - */ - private @PackageManagerService.ScanFlags int adjustScanFlags( - @PackageManagerService.ScanFlags int scanFlags, - PackageSetting pkgSetting, PackageSetting disabledPkgSetting, UserHandle user, - AndroidPackage pkg) { - - // TODO(patb): Do away entirely with disabledPkgSetting here. PkgSetting will always contain - // the correct isSystem value now that we don't disable system packages before scan. - final PackageSetting systemPkgSetting = - (scanFlags & SCAN_NEW_INSTALL) != 0 && disabledPkgSetting == null - && pkgSetting != null && pkgSetting.isSystem() - ? pkgSetting - : disabledPkgSetting; - if (systemPkgSetting != null) { - // updated system application, must at least have SCAN_AS_SYSTEM - scanFlags |= SCAN_AS_SYSTEM; - if ((systemPkgSetting.getPrivateFlags() - & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) != 0) { - scanFlags |= SCAN_AS_PRIVILEGED; - } - if ((systemPkgSetting.getPrivateFlags() - & ApplicationInfo.PRIVATE_FLAG_OEM) != 0) { - scanFlags |= SCAN_AS_OEM; - } - if ((systemPkgSetting.getPrivateFlags() - & ApplicationInfo.PRIVATE_FLAG_VENDOR) != 0) { - scanFlags |= SCAN_AS_VENDOR; - } - if ((systemPkgSetting.getPrivateFlags() - & ApplicationInfo.PRIVATE_FLAG_PRODUCT) != 0) { - scanFlags |= SCAN_AS_PRODUCT; - } - if ((systemPkgSetting.getPrivateFlags() - & ApplicationInfo.PRIVATE_FLAG_SYSTEM_EXT) != 0) { - scanFlags |= SCAN_AS_SYSTEM_EXT; - } - if ((systemPkgSetting.getPrivateFlags() - & ApplicationInfo.PRIVATE_FLAG_ODM) != 0) { - scanFlags |= SCAN_AS_ODM; - } - } - if (pkgSetting != null) { - final int userId = ((user == null) ? 0 : user.getIdentifier()); - if (pkgSetting.getInstantApp(userId)) { - scanFlags |= SCAN_AS_INSTANT_APP; - } - if (pkgSetting.getVirtualPreload(userId)) { - scanFlags |= SCAN_AS_VIRTUAL_PRELOAD; - } - } - - // Scan as privileged apps that share a user with a priv-app. - final boolean skipVendorPrivilegeScan = ((scanFlags & SCAN_AS_VENDOR) != 0) - && getVendorPartitionVersion() < 28; - if (((scanFlags & SCAN_AS_PRIVILEGED) == 0) - && !pkg.isPrivileged() - && (pkg.getSharedUserId() != null) - && !skipVendorPrivilegeScan) { - SharedUserSetting sharedUserSetting = null; - try { - sharedUserSetting = mPm.mSettings.getSharedUserLPw(pkg.getSharedUserId(), 0, - 0, false); - } catch (PackageManagerException ignore) { - } - if (sharedUserSetting != null && sharedUserSetting.isPrivileged()) { - // Exempt SharedUsers signed with the platform key. - // TODO(b/72378145) Fix this exemption. Force signature apps - // to allowlist their privileged permissions just like other - // priv-apps. - synchronized (mPm.mLock) { - PackageSetting platformPkgSetting = mPm.mSettings.getPackageLPr("android"); - if ((compareSignatures( - platformPkgSetting.getSigningDetails().getSignatures(), - pkg.getSigningDetails().getSignatures()) - != PackageManager.SIGNATURE_MATCH)) { - scanFlags |= SCAN_AS_PRIVILEGED; - } - } - } - } - - return scanFlags; - } - - public Pair<ScanResult, Boolean> scanSystemPackageLI(ParsedPackage parsedPackage, - @ParsingPackageUtils.ParseFlags int parseFlags, - @PackageManagerService.ScanFlags int scanFlags, long currentTime, - @Nullable UserHandle user) throws PackageManagerException { - final boolean scanSystemPartition = - (parseFlags & ParsingPackageUtils.PARSE_IS_SYSTEM_DIR) != 0; - final String renamedPkgName; - final PackageSetting disabledPkgSetting; - final boolean isSystemPkgUpdated; - final boolean pkgAlreadyExists; - PackageSetting pkgSetting; - AndroidPackage platformPackage; - final boolean isUpgrade = mPm.isDeviceUpgrading(); - - synchronized (mPm.mLock) { - platformPackage = mPm.getPlatformPackage(); - renamedPkgName = mPm.mSettings.getRenamedPackageLPr( - AndroidPackageUtils.getRealPackageOrNull(parsedPackage)); - final String realPkgName = getRealPackageName(parsedPackage, - renamedPkgName); - if (realPkgName != null) { - ensurePackageRenamed(parsedPackage, renamedPkgName); - } - final PackageSetting originalPkgSetting = getOriginalPackageLocked(parsedPackage, - renamedPkgName); - final PackageSetting installedPkgSetting = mPm.mSettings.getPackageLPr( - parsedPackage.getPackageName()); - pkgSetting = originalPkgSetting == null ? installedPkgSetting : originalPkgSetting; - pkgAlreadyExists = pkgSetting != null; - final String disabledPkgName = pkgAlreadyExists - ? pkgSetting.getPackageName() : parsedPackage.getPackageName(); - if (scanSystemPartition && !pkgAlreadyExists - && mPm.mSettings.getDisabledSystemPkgLPr(disabledPkgName) != null) { - // The updated-package data for /system apk remains inconsistently - // after the package data for /data apk is lost accidentally. - // To recover it, enable /system apk and install it as non-updated system app. - Slog.w(TAG, "Inconsistent package setting of updated system app for " - + disabledPkgName + ". To recover it, enable the system app" - + "and install it as non-updated system app."); - mPm.mSettings.removeDisabledSystemPackageLPw(disabledPkgName); - } - disabledPkgSetting = mPm.mSettings.getDisabledSystemPkgLPr(disabledPkgName); - isSystemPkgUpdated = disabledPkgSetting != null; - - if (DEBUG_INSTALL && isSystemPkgUpdated) { - Slog.d(TAG, "updatedPkg = " + disabledPkgSetting); - } - - final SharedUserSetting sharedUserSetting = (parsedPackage.getSharedUserId() != null) - ? mPm.mSettings.getSharedUserLPw(parsedPackage.getSharedUserId(), - 0 /*pkgFlags*/, 0 /*pkgPrivateFlags*/, true) - : null; - if (DEBUG_PACKAGE_SCANNING - && (parseFlags & ParsingPackageUtils.PARSE_CHATTY) != 0 - && sharedUserSetting != null) { - Log.d(TAG, "Shared UserID " + parsedPackage.getSharedUserId() - + " (uid=" + sharedUserSetting.userId + "):" - + " packages=" + sharedUserSetting.packages); - } - - if (scanSystemPartition) { - if (isSystemPkgUpdated) { - // we're updating the disabled package, so, scan it as the package setting - boolean isPlatformPackage = platformPackage != null - && platformPackage.getPackageName().equals( - parsedPackage.getPackageName()); - final ScanRequest request = new ScanRequest(parsedPackage, sharedUserSetting, - null, disabledPkgSetting /* pkgSetting */, - null /* disabledPkgSetting */, null /* originalPkgSetting */, - null, parseFlags, scanFlags, isPlatformPackage, user, null); - applyPolicy(parsedPackage, scanFlags, - platformPackage, true); - final ScanResult scanResult = - scanPackageOnlyLI(request, mInjector, - mPm.mFactoryTest, -1L); - if (scanResult.mExistingSettingCopied - && scanResult.mRequest.mPkgSetting != null) { - scanResult.mRequest.mPkgSetting.updateFrom(scanResult.mPkgSetting); - } - } - } - } - - final boolean newPkgChangedPaths = pkgAlreadyExists - && !pkgSetting.getPathString().equals(parsedPackage.getPath()); - final boolean newPkgVersionGreater = pkgAlreadyExists - && parsedPackage.getLongVersionCode() > pkgSetting.getVersionCode(); - final boolean isSystemPkgBetter = scanSystemPartition && isSystemPkgUpdated - && newPkgChangedPaths && newPkgVersionGreater; - if (isSystemPkgBetter) { - // The version of the application on /system is greater than the version on - // /data. Switch back to the application on /system. - // It's safe to assume the application on /system will correctly scan. If not, - // there won't be a working copy of the application. - synchronized (mPm.mLock) { - // just remove the loaded entries from package lists - mPm.mPackages.remove(pkgSetting.getPackageName()); - } - - logCriticalInfo(Log.WARN, - "System package updated;" - + " name: " + pkgSetting.getPackageName() - + "; " + pkgSetting.getVersionCode() + " --> " - + parsedPackage.getLongVersionCode() - + "; " + pkgSetting.getPathString() - + " --> " + parsedPackage.getPath()); - - final InstallArgs args = new FileInstallArgs( - pkgSetting.getPathString(), getAppDexInstructionSets( - pkgSetting.getPrimaryCpuAbi(), pkgSetting.getSecondaryCpuAbi()), mPm); - args.cleanUpResourcesLI(); - synchronized (mPm.mLock) { - mPm.mSettings.enableSystemPackageLPw(pkgSetting.getPackageName()); - } - } - - // The version of the application on the /system partition is less than or - // equal to the version on the /data partition. Throw an exception and use - // the application already installed on the /data partition. - if (scanSystemPartition && isSystemPkgUpdated && !isSystemPkgBetter) { - // In the case of a skipped package, commitReconciledScanResultLocked is not called to - // add the object to the "live" data structures, so this is the final mutation step - // for the package. Which means it needs to be finalized here to cache derived fields. - // This is relevant for cases where the disabled system package is used for flags or - // other metadata. - parsedPackage.hideAsFinal(); - throw new PackageManagerException(Log.WARN, "Package " + parsedPackage.getPackageName() - + " at " + parsedPackage.getPath() + " ignored: updated version " - + (pkgAlreadyExists ? String.valueOf(pkgSetting.getVersionCode()) : "unknown") - + " better than this " + parsedPackage.getLongVersionCode()); - } - - // Verify certificates against what was last scanned. Force re-collecting certificate in two - // special cases: - // 1) when scanning system, force re-collect only if system is upgrading. - // 2) when scannning /data, force re-collect only if the app is privileged (updated from - // preinstall, or treated as privileged, e.g. due to shared user ID). - final boolean forceCollect = scanSystemPartition ? isUpgrade - : PackageManagerServiceUtils.isApkVerificationForced(pkgSetting); - if (DEBUG_VERIFY && forceCollect) { - Slog.d(TAG, "Force collect certificate of " + parsedPackage.getPackageName()); - } - - // Full APK verification can be skipped during certificate collection, only if the file is - // in verified partition, or can be verified on access (when apk verity is enabled). In both - // cases, only data in Signing Block is verified instead of the whole file. - // TODO(b/136132412): skip for Incremental installation - final boolean skipVerify = scanSystemPartition - || (forceCollect && canSkipForcedPackageVerification(parsedPackage)); - collectCertificatesLI(pkgSetting, parsedPackage, forceCollect, skipVerify); - - // Reset profile if the application version is changed - maybeClearProfilesForUpgradesLI(pkgSetting, parsedPackage); - - /* - * A new system app appeared, but we already had a non-system one of the - * same name installed earlier. - */ - boolean shouldHideSystemApp = false; - // A new application appeared on /system, but, we already have a copy of - // the application installed on /data. - if (scanSystemPartition && !isSystemPkgUpdated && pkgAlreadyExists - && !pkgSetting.isSystem()) { - - if (!parsedPackage.getSigningDetails() - .checkCapability(pkgSetting.getSigningDetails(), - SigningDetails.CertCapabilities.INSTALLED_DATA) - && !pkgSetting.getSigningDetails().checkCapability( - parsedPackage.getSigningDetails(), - SigningDetails.CertCapabilities.ROLLBACK)) { - logCriticalInfo(Log.WARN, - "System package signature mismatch;" - + " name: " + pkgSetting.getPackageName()); - try (@SuppressWarnings("unused") PackageFreezer freezer = mPm.freezePackage( - parsedPackage.getPackageName(), - "scanPackageInternalLI")) { - DeletePackageHelper deletePackageHelper = new DeletePackageHelper(mPm); - deletePackageHelper.deletePackageLIF(parsedPackage.getPackageName(), null, true, - mPm.mUserManager.getUserIds(), 0, null, false); - } - pkgSetting = null; - } else if (newPkgVersionGreater) { - // The application on /system is newer than the application on /data. - // Simply remove the application on /data [keeping application data] - // and replace it with the version on /system. - logCriticalInfo(Log.WARN, - "System package enabled;" - + " name: " + pkgSetting.getPackageName() - + "; " + pkgSetting.getVersionCode() + " --> " - + parsedPackage.getLongVersionCode() - + "; " + pkgSetting.getPathString() + " --> " - + parsedPackage.getPath()); - InstallArgs args = new FileInstallArgs( - pkgSetting.getPathString(), getAppDexInstructionSets( - pkgSetting.getPrimaryCpuAbi(), pkgSetting.getSecondaryCpuAbi()), - mPm); - synchronized (mPm.mInstallLock) { - args.cleanUpResourcesLI(); - } - } else { - // The application on /system is older than the application on /data. Hide - // the application on /system and the version on /data will be scanned later - // and re-added like an update. - shouldHideSystemApp = true; - logCriticalInfo(Log.INFO, - "System package disabled;" - + " name: " + pkgSetting.getPackageName() - + "; old: " + pkgSetting.getPathString() + " @ " - + pkgSetting.getVersionCode() - + "; new: " + parsedPackage.getPath() + " @ " - + parsedPackage.getPath()); - } - } - - final ScanResult scanResult = scanPackageNewLI(parsedPackage, parseFlags, - scanFlags | SCAN_UPDATE_SIGNATURE, currentTime, user, null); - return new Pair<>(scanResult, shouldHideSystemApp); - } - - /** - * Returns if forced apk verification can be skipped for the whole package, including splits. - */ - private boolean canSkipForcedPackageVerification(AndroidPackage pkg) { - final String packageName = pkg.getPackageName(); - if (!canSkipForcedApkVerification(packageName, pkg.getBaseApkPath())) { - return false; - } - // TODO: Allow base and splits to be verified individually. - String[] splitCodePaths = pkg.getSplitCodePaths(); - if (!ArrayUtils.isEmpty(splitCodePaths)) { - for (int i = 0; i < splitCodePaths.length; i++) { - if (!canSkipForcedApkVerification(packageName, splitCodePaths[i])) { - return false; - } - } - } - return true; - } - - /** - * Returns if forced apk verification can be skipped, depending on current FSVerity setup and - * whether the apk contains signed root hash. Note that the signer's certificate still needs to - * match one in a trusted source, and should be done separately. - */ - private boolean canSkipForcedApkVerification(String packageName, String apkPath) { - if (!PackageManagerServiceUtils.isLegacyApkVerityEnabled()) { - return VerityUtils.hasFsverity(apkPath); - } - - try { - final byte[] rootHashObserved = VerityUtils.generateApkVerityRootHash(apkPath); - if (rootHashObserved == null) { - return false; // APK does not contain Merkle tree root hash. - } - synchronized (mPm.mInstallLock) { - // Returns whether the observed root hash matches what kernel has. - mPm.mInstaller.assertFsverityRootHashMatches(packageName, apkPath, - rootHashObserved); - return true; - } - } catch (Installer.InstallerException | IOException | DigestException - | NoSuchAlgorithmException e) { - Slog.w(TAG, "Error in fsverity check. Fallback to full apk verification.", e); - } - return false; - } - - private void collectCertificatesLI(PackageSetting ps, ParsedPackage parsedPackage, - boolean forceCollect, boolean skipVerify) throws PackageManagerException { - // When upgrading from pre-N MR1, verify the package time stamp using the package - // directory and not the APK file. - final long lastModifiedTime = mPm.isPreNMR1Upgrade() - ? new File(parsedPackage.getPath()).lastModified() - : getLastModifiedTime(parsedPackage); - final Settings.VersionInfo settingsVersionForPackage = - mPm.getSettingsVersionForPackage(parsedPackage); - if (ps != null && !forceCollect - && ps.getPathString().equals(parsedPackage.getPath()) - && ps.getLastModifiedTime() == lastModifiedTime - && !InstallPackageHelper.isCompatSignatureUpdateNeeded(settingsVersionForPackage) - && !InstallPackageHelper.isRecoverSignatureUpdateNeeded( - settingsVersionForPackage)) { - if (ps.getSigningDetails().getSignatures() != null - && ps.getSigningDetails().getSignatures().length != 0 - && ps.getSigningDetails().getSignatureSchemeVersion() - != SigningDetails.SignatureSchemeVersion.UNKNOWN) { - // Optimization: reuse the existing cached signing data - // if the package appears to be unchanged. - parsedPackage.setSigningDetails( - new SigningDetails(ps.getSigningDetails())); - return; - } - - Slog.w(TAG, "PackageSetting for " + ps.getPackageName() - + " is missing signatures. Collecting certs again to recover them."); - } else { - Slog.i(TAG, parsedPackage.getPath() + " changed; collecting certs" - + (forceCollect ? " (forced)" : "")); - } - - try { - Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "collectCertificates"); - final ParseTypeImpl input = ParseTypeImpl.forDefaultParsing(); - final ParseResult<SigningDetails> result = ParsingPackageUtils.getSigningDetails( - input, parsedPackage, skipVerify); - if (result.isError()) { - throw new PackageManagerException( - result.getErrorCode(), result.getErrorMessage(), result.getException()); - } - parsedPackage.setSigningDetails(result.getResult()); - } finally { - Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER); - } - } - - /** - * Clear the package profile if this was an upgrade and the package - * version was updated. - */ - private void maybeClearProfilesForUpgradesLI( - @Nullable PackageSetting originalPkgSetting, - @NonNull AndroidPackage pkg) { - if (originalPkgSetting == null || !mPm.isDeviceUpgrading()) { - return; - } - if (originalPkgSetting.getVersionCode() == pkg.getLongVersionCode()) { - return; - } - - final AppDataHelper appDataHelper = new AppDataHelper(mPm); - appDataHelper.clearAppProfilesLIF(pkg); - if (DEBUG_INSTALL) { - Slog.d(TAG, originalPkgSetting.getPackageName() - + " clear profile due to version change " - + originalPkgSetting.getVersionCode() + " != " - + pkg.getLongVersionCode()); - } - } - - /** - * Returns the original package setting. - * <p>A package can migrate its name during an update. In this scenario, a package - * designates a set of names that it considers as one of its original names. - * <p>An original package must be signed identically and it must have the same - * shared user [if any]. - */ - @GuardedBy("mPm.mLock") - @Nullable - private PackageSetting getOriginalPackageLocked(@NonNull AndroidPackage pkg, - @Nullable String renamedPkgName) { - if (isPackageRenamed(pkg, renamedPkgName)) { - return null; - } - for (int i = ArrayUtils.size(pkg.getOriginalPackages()) - 1; i >= 0; --i) { - final PackageSetting originalPs = - mPm.mSettings.getPackageLPr(pkg.getOriginalPackages().get(i)); - if (originalPs != null) { - // the package is already installed under its original name... - // but, should we use it? - if (!verifyPackageUpdateLPr(originalPs, pkg)) { - // the new package is incompatible with the original - continue; - } else if (originalPs.getSharedUser() != null) { - if (!originalPs.getSharedUser().name.equals(pkg.getSharedUserId())) { - // the shared user id is incompatible with the original - Slog.w(TAG, "Unable to migrate data from " + originalPs.getPackageName() - + " to " + pkg.getPackageName() + ": old uid " - + originalPs.getSharedUser().name - + " differs from " + pkg.getSharedUserId()); - continue; - } - // TODO: Add case when shared user id is added [b/28144775] - } else { - if (DEBUG_UPGRADE) { - Log.v(TAG, "Renaming new package " - + pkg.getPackageName() + " to old name " - + originalPs.getPackageName()); - } - } - return originalPs; - } - } - return null; - } - - @GuardedBy("mPm.mLock") - private boolean verifyPackageUpdateLPr(PackageSetting oldPkg, AndroidPackage newPkg) { - if ((oldPkg.getFlags() & ApplicationInfo.FLAG_SYSTEM) == 0) { - Slog.w(TAG, "Unable to update from " + oldPkg.getPackageName() - + " to " + newPkg.getPackageName() - + ": old package not in system partition"); - return false; - } else if (mPm.mPackages.get(oldPkg.getPackageName()) != null) { - Slog.w(TAG, "Unable to update from " + oldPkg.getPackageName() - + " to " + newPkg.getPackageName() - + ": old package still exists"); - return false; - } - return true; - } - - /** - * Asserts the parsed package is valid according to the given policy. If the - * package is invalid, for whatever reason, throws {@link PackageManagerException}. - * <p> - * Implementation detail: This method must NOT have any side effects. It would - * ideally be static, but, it requires locks to read system state. - * - * @throws PackageManagerException If the package fails any of the validation checks - */ - private void assertPackageIsValid(AndroidPackage pkg, - final @ParsingPackageUtils.ParseFlags int parseFlags, - final @PackageManagerService.ScanFlags int scanFlags) - throws PackageManagerException { - if ((parseFlags & ParsingPackageUtils.PARSE_ENFORCE_CODE) != 0) { - assertCodePolicy(pkg); - } - - if (pkg.getPath() == null) { - // Bail out. The resource and code paths haven't been set. - throw new PackageManagerException(INSTALL_FAILED_INVALID_APK, - "Code and resource paths haven't been set correctly"); - } - - // Check that there is an APEX package with the same name only during install/first boot - // after OTA. - final boolean isUserInstall = (scanFlags & SCAN_BOOTING) == 0; - final boolean isFirstBootOrUpgrade = (scanFlags & SCAN_FIRST_BOOT_OR_UPGRADE) != 0; - if ((isUserInstall || isFirstBootOrUpgrade) - && mPm.mApexManager.isApexPackage(pkg.getPackageName())) { - throw new PackageManagerException(INSTALL_FAILED_DUPLICATE_PACKAGE, - pkg.getPackageName() - + " is an APEX package and can't be installed as an APK."); - } - - // Make sure we're not adding any bogus keyset info - final KeySetManagerService ksms = mPm.mSettings.getKeySetManagerService(); - ksms.assertScannedPackageValid(pkg); - - synchronized (mPm.mLock) { - // The special "android" package can only be defined once - if (pkg.getPackageName().equals("android")) { - if (mPm.getCoreAndroidApplication() != null) { - Slog.w(TAG, "*************************************************"); - Slog.w(TAG, "Core android package being redefined. Skipping."); - Slog.w(TAG, " codePath=" + pkg.getPath()); - Slog.w(TAG, "*************************************************"); - throw new PackageManagerException(INSTALL_FAILED_DUPLICATE_PACKAGE, - "Core android package being redefined. Skipping."); - } - } - - // A package name must be unique; don't allow duplicates - if ((scanFlags & SCAN_NEW_INSTALL) == 0 - && mPm.mPackages.containsKey(pkg.getPackageName())) { - throw new PackageManagerException(INSTALL_FAILED_DUPLICATE_PACKAGE, - "Application package " + pkg.getPackageName() - + " already installed. Skipping duplicate."); - } - - if (pkg.isStaticSharedLibrary()) { - // Static libs have a synthetic package name containing the version - // but we still want the base name to be unique. - if ((scanFlags & SCAN_NEW_INSTALL) == 0 - && mPm.mPackages.containsKey(pkg.getManifestPackageName())) { - throw new PackageManagerException( - "Duplicate static shared lib provider package"); - } - - // Static shared libraries should have at least O target SDK - if (pkg.getTargetSdkVersion() < Build.VERSION_CODES.O) { - throw new PackageManagerException( - "Packages declaring static-shared libs must target O SDK or higher"); - } - - // Package declaring static a shared lib cannot be instant apps - if ((scanFlags & SCAN_AS_INSTANT_APP) != 0) { - throw new PackageManagerException( - "Packages declaring static-shared libs cannot be instant apps"); - } - - // Package declaring static a shared lib cannot be renamed since the package - // name is synthetic and apps can't code around package manager internals. - if (!ArrayUtils.isEmpty(pkg.getOriginalPackages())) { - throw new PackageManagerException( - "Packages declaring static-shared libs cannot be renamed"); - } - - // Package declaring static a shared lib cannot declare dynamic libs - if (!ArrayUtils.isEmpty(pkg.getLibraryNames())) { - throw new PackageManagerException( - "Packages declaring static-shared libs cannot declare dynamic libs"); - } - - // Package declaring static a shared lib cannot declare shared users - if (pkg.getSharedUserId() != null) { - throw new PackageManagerException( - "Packages declaring static-shared libs cannot declare shared users"); - } - - // Static shared libs cannot declare activities - if (!pkg.getActivities().isEmpty()) { - throw new PackageManagerException( - "Static shared libs cannot declare activities"); - } - - // Static shared libs cannot declare services - if (!pkg.getServices().isEmpty()) { - throw new PackageManagerException( - "Static shared libs cannot declare services"); - } - - // Static shared libs cannot declare providers - if (!pkg.getProviders().isEmpty()) { - throw new PackageManagerException( - "Static shared libs cannot declare content providers"); - } - - // Static shared libs cannot declare receivers - if (!pkg.getReceivers().isEmpty()) { - throw new PackageManagerException( - "Static shared libs cannot declare broadcast receivers"); - } - - // Static shared libs cannot declare permission groups - if (!pkg.getPermissionGroups().isEmpty()) { - throw new PackageManagerException( - "Static shared libs cannot declare permission groups"); - } - - // Static shared libs cannot declare attributions - if (!pkg.getAttributions().isEmpty()) { - throw new PackageManagerException( - "Static shared libs cannot declare features"); - } - - // Static shared libs cannot declare permissions - if (!pkg.getPermissions().isEmpty()) { - throw new PackageManagerException( - "Static shared libs cannot declare permissions"); - } - - // Static shared libs cannot declare protected broadcasts - if (!pkg.getProtectedBroadcasts().isEmpty()) { - throw new PackageManagerException( - "Static shared libs cannot declare protected broadcasts"); - } - - // Static shared libs cannot be overlay targets - if (pkg.getOverlayTarget() != null) { - throw new PackageManagerException( - "Static shared libs cannot be overlay targets"); - } - - // The version codes must be ordered as lib versions - long minVersionCode = Long.MIN_VALUE; - long maxVersionCode = Long.MAX_VALUE; - - WatchedLongSparseArray<SharedLibraryInfo> versionedLib = mPm.mSharedLibraries.get( - pkg.getStaticSharedLibName()); - if (versionedLib != null) { - final int versionCount = versionedLib.size(); - for (int i = 0; i < versionCount; i++) { - SharedLibraryInfo libInfo = versionedLib.valueAt(i); - final long libVersionCode = libInfo.getDeclaringPackage() - .getLongVersionCode(); - if (libInfo.getLongVersion() < pkg.getStaticSharedLibVersion()) { - minVersionCode = Math.max(minVersionCode, libVersionCode + 1); - } else if (libInfo.getLongVersion() - > pkg.getStaticSharedLibVersion()) { - maxVersionCode = Math.min(maxVersionCode, libVersionCode - 1); - } else { - minVersionCode = maxVersionCode = libVersionCode; - break; - } - } - } - if (pkg.getLongVersionCode() < minVersionCode - || pkg.getLongVersionCode() > maxVersionCode) { - throw new PackageManagerException("Static shared" - + " lib version codes must be ordered as lib versions"); - } - } - - // If we're only installing presumed-existing packages, require that the - // scanned APK is both already known and at the path previously established - // for it. Previously unknown packages we pick up normally, but if we have an - // a priori expectation about this package's install presence, enforce it. - // With a singular exception for new system packages. When an OTA contains - // a new system package, we allow the codepath to change from a system location - // to the user-installed location. If we don't allow this change, any newer, - // user-installed version of the application will be ignored. - if ((scanFlags & SCAN_REQUIRE_KNOWN) != 0) { - if (mPm.isExpectingBetter(pkg.getPackageName())) { - Slog.w(TAG, "Relax SCAN_REQUIRE_KNOWN requirement for package " - + pkg.getPackageName()); - } else { - PackageSetting known = mPm.mSettings.getPackageLPr(pkg.getPackageName()); - if (known != null) { - if (DEBUG_PACKAGE_SCANNING) { - Log.d(TAG, "Examining " + pkg.getPath() - + " and requiring known path " + known.getPathString()); - } - if (!pkg.getPath().equals(known.getPathString())) { - throw new PackageManagerException(INSTALL_FAILED_PACKAGE_CHANGED, - "Application package " + pkg.getPackageName() - + " found at " + pkg.getPath() - + " but expected at " + known.getPathString() - + "; ignoring."); - } - } else { - throw new PackageManagerException(INSTALL_FAILED_INVALID_INSTALL_LOCATION, - "Application package " + pkg.getPackageName() - + " not found; ignoring."); - } - } - } - - // Verify that this new package doesn't have any content providers - // that conflict with existing packages. Only do this if the - // package isn't already installed, since we don't want to break - // things that are installed. - if ((scanFlags & SCAN_NEW_INSTALL) != 0) { - mPm.mComponentResolver.assertProvidersNotDefined(pkg); - } - - // If this package has defined explicit processes, then ensure that these are - // the only processes used by its components. - final Map<String, ParsedProcess> procs = pkg.getProcesses(); - if (!procs.isEmpty()) { - if (!procs.containsKey(pkg.getProcessName())) { - throw new PackageManagerException( - INSTALL_FAILED_PROCESS_NOT_DEFINED, - "Can't install because application tag's process attribute " - + pkg.getProcessName() - + " (in package " + pkg.getPackageName() - + ") is not included in the <processes> list"); - } - assertPackageProcesses(pkg, pkg.getActivities(), procs, "activity"); - assertPackageProcesses(pkg, pkg.getServices(), procs, "service"); - assertPackageProcesses(pkg, pkg.getReceivers(), procs, "receiver"); - assertPackageProcesses(pkg, pkg.getProviders(), procs, "provider"); - } - - // Verify that packages sharing a user with a privileged app are marked as privileged. - if (!pkg.isPrivileged() && (pkg.getSharedUserId() != null)) { - SharedUserSetting sharedUserSetting = null; - try { - sharedUserSetting = mPm.mSettings.getSharedUserLPw(pkg.getSharedUserId(), - 0, 0, false); - } catch (PackageManagerException ignore) { - } - if (sharedUserSetting != null && sharedUserSetting.isPrivileged()) { - // Exempt SharedUsers signed with the platform key. - PackageSetting platformPkgSetting = mPm.mSettings.getPackageLPr("android"); - if (!comparePackageSignatures(platformPkgSetting, - pkg.getSigningDetails().getSignatures())) { - throw new PackageManagerException("Apps that share a user with a " - + "privileged app must themselves be marked as privileged. " - + pkg.getPackageName() + " shares privileged user " - + pkg.getSharedUserId() + "."); - } - } - } - - // Apply policies specific for runtime resource overlays (RROs). - if (pkg.getOverlayTarget() != null) { - // System overlays have some restrictions on their use of the 'static' state. - if ((scanFlags & SCAN_AS_SYSTEM) != 0) { - // We are scanning a system overlay. This can be the first scan of the - // system/vendor/oem partition, or an update to the system overlay. - if ((parseFlags & ParsingPackageUtils.PARSE_IS_SYSTEM_DIR) == 0) { - // This must be an update to a system overlay. Immutable overlays cannot be - // upgraded. - if (!mPm.isOverlayMutable(pkg.getPackageName())) { - throw new PackageManagerException("Overlay " - + pkg.getPackageName() - + " is static and cannot be upgraded."); - } - } else { - if ((scanFlags & SCAN_AS_VENDOR) != 0) { - if (pkg.getTargetSdkVersion() < getVendorPartitionVersion()) { - Slog.w(TAG, "System overlay " + pkg.getPackageName() - + " targets an SDK below the required SDK level of vendor" - + " overlays (" + getVendorPartitionVersion() + ")." - + " This will become an install error in a future release"); - } - } else if (pkg.getTargetSdkVersion() < Build.VERSION.SDK_INT) { - Slog.w(TAG, "System overlay " + pkg.getPackageName() - + " targets an SDK below the required SDK level of system" - + " overlays (" + Build.VERSION.SDK_INT + ")." - + " This will become an install error in a future release"); - } - } - } else { - // A non-preloaded overlay packages must have targetSdkVersion >= Q, or be - // signed with the platform certificate. Check this in increasing order of - // computational cost. - if (pkg.getTargetSdkVersion() < Build.VERSION_CODES.Q) { - final PackageSetting platformPkgSetting = - mPm.mSettings.getPackageLPr("android"); - if (!comparePackageSignatures(platformPkgSetting, - pkg.getSigningDetails().getSignatures())) { - throw new PackageManagerException("Overlay " - + pkg.getPackageName() - + " must target Q or later, " - + "or be signed with the platform certificate"); - } - } - - // A non-preloaded overlay package, without <overlay android:targetName>, will - // only be used if it is signed with the same certificate as its target OR if - // it is signed with the same certificate as a reference package declared - // in 'overlay-config-signature' tag of SystemConfig. - // If the target is already installed or 'overlay-config-signature' tag in - // SystemConfig is set, check this here to augment the last line of defense - // which is OMS. - if (pkg.getOverlayTargetOverlayableName() == null) { - final PackageSetting targetPkgSetting = - mPm.mSettings.getPackageLPr(pkg.getOverlayTarget()); - if (targetPkgSetting != null) { - if (!comparePackageSignatures(targetPkgSetting, - pkg.getSigningDetails().getSignatures())) { - // check reference signature - if (mPm.mOverlayConfigSignaturePackage == null) { - throw new PackageManagerException("Overlay " - + pkg.getPackageName() + " and target " - + pkg.getOverlayTarget() + " signed with" - + " different certificates, and the overlay lacks" - + " <overlay android:targetName>"); - } - final PackageSetting refPkgSetting = - mPm.mSettings.getPackageLPr( - mPm.mOverlayConfigSignaturePackage); - if (!comparePackageSignatures(refPkgSetting, - pkg.getSigningDetails().getSignatures())) { - throw new PackageManagerException("Overlay " - + pkg.getPackageName() + " signed with a different " - + "certificate than both the reference package and " - + "target " + pkg.getOverlayTarget() + ", and the " - + "overlay lacks <overlay android:targetName>"); - } - } - } - } - } - } - - // If the package is not on a system partition ensure it is signed with at least the - // minimum signature scheme version required for its target SDK. - if ((parseFlags & ParsingPackageUtils.PARSE_IS_SYSTEM_DIR) == 0) { - int minSignatureSchemeVersion = - ApkSignatureVerifier.getMinimumSignatureSchemeVersionForTargetSdk( - pkg.getTargetSdkVersion()); - if (pkg.getSigningDetails().getSignatureSchemeVersion() - < minSignatureSchemeVersion) { - throw new PackageManagerException(INSTALL_PARSE_FAILED_NO_CERTIFICATES, - "No signature found in package of version " + minSignatureSchemeVersion - + " or newer for package " + pkg.getPackageName()); - } - } - } - } - - private static <T extends ParsedMainComponent> void assertPackageProcesses(AndroidPackage pkg, - List<T> components, Map<String, ParsedProcess> procs, String compName) - throws PackageManagerException { - if (components == null) { - return; - } - for (int i = components.size() - 1; i >= 0; i--) { - final ParsedMainComponent component = components.get(i); - if (!procs.containsKey(component.getProcessName())) { - throw new PackageManagerException( - INSTALL_FAILED_PROCESS_NOT_DEFINED, - "Can't install because " + compName + " " + component.getClassName() - + "'s process attribute " + component.getProcessName() - + " (in package " + pkg.getPackageName() - + ") is not included in the <processes> list"); - } - } - } - - /** - * Applies the adjusted ABI calculated by - * {@link PackageAbiHelper#getAdjustedAbiForSharedUser(Set, AndroidPackage)} to all - * relevant packages and settings. - * @param sharedUserSetting The {@code SharedUserSetting} to adjust - * @param scannedPackage the package being scanned or null - * @param adjustedAbi the adjusted ABI calculated by {@link PackageAbiHelper} - * @return the list of code paths that belong to packages that had their ABIs adjusted. - */ - public static List<String> applyAdjustedAbiToSharedUser(SharedUserSetting sharedUserSetting, - ParsedPackage scannedPackage, String adjustedAbi) { - if (scannedPackage != null) { - scannedPackage.setPrimaryCpuAbi(adjustedAbi); - } - List<String> changedAbiCodePath = null; - for (PackageSetting ps : sharedUserSetting.packages) { - if (scannedPackage == null - || !scannedPackage.getPackageName().equals(ps.getPackageName())) { - if (ps.getPrimaryCpuAbi() != null) { - continue; - } - - ps.setPrimaryCpuAbi(adjustedAbi); - if (ps.getPkg() != null) { - if (!TextUtils.equals(adjustedAbi, - AndroidPackageUtils.getRawPrimaryCpuAbi(ps.getPkg()))) { - if (DEBUG_ABI_SELECTION) { - Slog.i(TAG, - "Adjusting ABI for " + ps.getPackageName() + " to " - + adjustedAbi + " (scannedPackage=" - + (scannedPackage != null ? scannedPackage : "null") - + ")"); - } - if (changedAbiCodePath == null) { - changedAbiCodePath = new ArrayList<>(); - } - changedAbiCodePath.add(ps.getPathString()); - } - } - } - } - return changedAbiCodePath; - } - - /** - * Applies policy to the parsed package based upon the given policy flags. - * Ensures the package is in a good state. - * <p> - * Implementation detail: This method must NOT have any side effect. It would - * ideally be static, but, it requires locks to read system state. - */ - private static void applyPolicy(ParsedPackage parsedPackage, - final @PackageManagerService.ScanFlags int scanFlags, AndroidPackage platformPkg, - boolean isUpdatedSystemApp) { - if ((scanFlags & SCAN_AS_SYSTEM) != 0) { - parsedPackage.setSystem(true); - // TODO(b/135203078): Can this be done in PackageParser? Or just inferred when the flag - // is set during parse. - if (parsedPackage.isDirectBootAware()) { - parsedPackage.setAllComponentsDirectBootAware(true); - } - if (compressedFileExists(parsedPackage.getPath())) { - parsedPackage.setStub(true); - } - } else { - parsedPackage - // Non system apps cannot mark any broadcast as protected - .clearProtectedBroadcasts() - // non system apps can't be flagged as core - .setCoreApp(false) - // clear flags not applicable to regular apps - .setPersistent(false) - .setDefaultToDeviceProtectedStorage(false) - .setDirectBootAware(false) - // non system apps can't have permission priority - .capPermissionPriorities(); - } - if ((scanFlags & SCAN_AS_PRIVILEGED) == 0) { - parsedPackage - .markNotActivitiesAsNotExportedIfSingleUser(); - } - - parsedPackage.setPrivileged((scanFlags & SCAN_AS_PRIVILEGED) != 0) - .setOem((scanFlags & SCAN_AS_OEM) != 0) - .setVendor((scanFlags & SCAN_AS_VENDOR) != 0) - .setProduct((scanFlags & SCAN_AS_PRODUCT) != 0) - .setSystemExt((scanFlags & SCAN_AS_SYSTEM_EXT) != 0) - .setOdm((scanFlags & SCAN_AS_ODM) != 0); - - // Check if the package is signed with the same key as the platform package. - parsedPackage.setSignedWithPlatformKey( - (PLATFORM_PACKAGE_NAME.equals(parsedPackage.getPackageName()) - || (platformPkg != null && compareSignatures( - platformPkg.getSigningDetails().getSignatures(), - parsedPackage.getSigningDetails().getSignatures() - ) == PackageManager.SIGNATURE_MATCH)) - ); - - if (!parsedPackage.isSystem()) { - // Only system apps can use these features. - parsedPackage.clearOriginalPackages() - .clearAdoptPermissions(); - } - - PackageBackwardCompatibility.modifySharedLibraries(parsedPackage, isUpdatedSystemApp); - } - - /** - * Enforces code policy for the package. This ensures that if an APK has - * declared hasCode="true" in its manifest that the APK actually contains - * code. - * - * @throws PackageManagerException If bytecode could not be found when it should exist - */ - private static void assertCodePolicy(AndroidPackage pkg) - throws PackageManagerException { - final boolean shouldHaveCode = pkg.isHasCode(); - if (shouldHaveCode && !apkHasCode(pkg.getBaseApkPath())) { - throw new PackageManagerException(INSTALL_FAILED_INVALID_APK, - "Package " + pkg.getBaseApkPath() + " code is missing"); - } - - if (!ArrayUtils.isEmpty(pkg.getSplitCodePaths())) { - for (int i = 0; i < pkg.getSplitCodePaths().length; i++) { - final boolean splitShouldHaveCode = - (pkg.getSplitFlags()[i] & ApplicationInfo.FLAG_HAS_CODE) != 0; - if (splitShouldHaveCode && !apkHasCode(pkg.getSplitCodePaths()[i])) { - throw new PackageManagerException(INSTALL_FAILED_INVALID_APK, - "Package " + pkg.getSplitCodePaths()[i] + " code is missing"); - } - } - } - } - - /** - * Returns the "real" name of the package. - * <p>This may differ from the package's actual name if the application has already - * been installed under one of this package's original names. - */ - private static @Nullable String getRealPackageName(@NonNull AndroidPackage pkg, - @Nullable String renamedPkgName) { - if (isPackageRenamed(pkg, renamedPkgName)) { - return AndroidPackageUtils.getRealPackageOrNull(pkg); - } - return null; - } - - /** Returns {@code true} if the package has been renamed. Otherwise, {@code false}. */ - private static boolean isPackageRenamed(@NonNull AndroidPackage pkg, - @Nullable String renamedPkgName) { - return pkg.getOriginalPackages().contains(renamedPkgName); - } - - /** - * Renames the package if it was installed under a different name. - * <p>When we've already installed the package under an original name, update - * the new package so we can continue to have the old name. - */ - private static void ensurePackageRenamed(@NonNull ParsedPackage parsedPackage, - @NonNull String renamedPackageName) { - if (!parsedPackage.getOriginalPackages().contains(renamedPackageName) - || parsedPackage.getPackageName().equals(renamedPackageName)) { - return; - } - parsedPackage.setPackageName(renamedPackageName); - } - - /** - * Returns {@code true} if the given file contains code. Otherwise {@code false}. - */ - private static boolean apkHasCode(String fileName) { - StrictJarFile jarFile = null; - try { - jarFile = new StrictJarFile(fileName, - false /*verify*/, false /*signatureSchemeRollbackProtectionsEnforced*/); - return jarFile.findEntry("classes.dex") != null; - } catch (IOException ignore) { - } finally { - try { - if (jarFile != null) { - jarFile.close(); - } - } catch (IOException ignore) { - } - } - return false; - } - - /** - * Sets the enabled state of components configured through {@link SystemConfig}. - * This modifies the {@link PackageSetting} object. - * - * TODO(b/135203078): Move this to package parsing - **/ - private static void configurePackageComponents(AndroidPackage pkg) { - final ArrayMap<String, Boolean> componentsEnabledStates = SystemConfig.getInstance() - .getComponentsEnabledStates(pkg.getPackageName()); - if (componentsEnabledStates == null) { - return; - } - - for (int i = ArrayUtils.size(pkg.getActivities()) - 1; i >= 0; i--) { - final ParsedActivity component = pkg.getActivities().get(i); - final Boolean enabled = componentsEnabledStates.get(component.getName()); - if (enabled != null) { - ComponentMutateUtils.setEnabled(component, enabled); - } - } - - for (int i = ArrayUtils.size(pkg.getReceivers()) - 1; i >= 0; i--) { - final ParsedActivity component = pkg.getReceivers().get(i); - final Boolean enabled = componentsEnabledStates.get(component.getName()); - if (enabled != null) { - ComponentMutateUtils.setEnabled(component, enabled); - } - } - - for (int i = ArrayUtils.size(pkg.getProviders()) - 1; i >= 0; i--) { - final ParsedProvider component = pkg.getProviders().get(i); - final Boolean enabled = componentsEnabledStates.get(component.getName()); - if (enabled != null) { - ComponentMutateUtils.setEnabled(component, enabled); - } - } - - for (int i = ArrayUtils.size(pkg.getServices()) - 1; i >= 0; i--) { - final ParsedService component = pkg.getServices().get(i); - final Boolean enabled = componentsEnabledStates.get(component.getName()); - if (enabled != null) { - ComponentMutateUtils.setEnabled(component, enabled); - } - } - } - - private static int getVendorPartitionVersion() { - final String version = SystemProperties.get("ro.vndk.version"); - if (!version.isEmpty()) { - try { - return Integer.parseInt(version); - } catch (NumberFormatException ignore) { - if (ArrayUtils.contains(Build.VERSION.ACTIVE_CODENAMES, version)) { - return Build.VERSION_CODES.CUR_DEVELOPMENT; - } - } - } - return Build.VERSION_CODES.P; - } -} diff --git a/services/core/java/com/android/server/pm/ScanPackageUtils.java b/services/core/java/com/android/server/pm/ScanPackageUtils.java new file mode 100644 index 000000000000..378c9e07566e --- /dev/null +++ b/services/core/java/com/android/server/pm/ScanPackageUtils.java @@ -0,0 +1,1006 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.pm; + +import static android.content.pm.PackageManager.INSTALL_FAILED_INVALID_APK; +import static android.content.pm.PackageManager.INSTALL_FAILED_PROCESS_NOT_DEFINED; +import static android.content.pm.PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES; +import static android.os.Trace.TRACE_TAG_PACKAGE_MANAGER; + +import static com.android.server.pm.PackageManagerService.DEBUG_ABI_SELECTION; +import static com.android.server.pm.PackageManagerService.DEBUG_PACKAGE_SCANNING; +import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME; +import static com.android.server.pm.PackageManagerService.SCAN_AS_FULL_APP; +import static com.android.server.pm.PackageManagerService.SCAN_AS_INSTANT_APP; +import static com.android.server.pm.PackageManagerService.SCAN_AS_ODM; +import static com.android.server.pm.PackageManagerService.SCAN_AS_OEM; +import static com.android.server.pm.PackageManagerService.SCAN_AS_PRIVILEGED; +import static com.android.server.pm.PackageManagerService.SCAN_AS_PRODUCT; +import static com.android.server.pm.PackageManagerService.SCAN_AS_SYSTEM; +import static com.android.server.pm.PackageManagerService.SCAN_AS_SYSTEM_EXT; +import static com.android.server.pm.PackageManagerService.SCAN_AS_VENDOR; +import static com.android.server.pm.PackageManagerService.SCAN_AS_VIRTUAL_PRELOAD; +import static com.android.server.pm.PackageManagerService.SCAN_BOOTING; +import static com.android.server.pm.PackageManagerService.SCAN_FIRST_BOOT_OR_UPGRADE; +import static com.android.server.pm.PackageManagerService.SCAN_MOVE; +import static com.android.server.pm.PackageManagerService.SCAN_NEW_INSTALL; +import static com.android.server.pm.PackageManagerService.SCAN_NO_DEX; +import static com.android.server.pm.PackageManagerService.SCAN_UPDATE_TIME; +import static com.android.server.pm.PackageManagerService.TAG; +import static com.android.server.pm.PackageManagerServiceUtils.compareSignatures; +import static com.android.server.pm.PackageManagerServiceUtils.compressedFileExists; +import static com.android.server.pm.PackageManagerServiceUtils.deriveAbiOverride; +import static com.android.server.pm.PackageManagerServiceUtils.getLastModifiedTime; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.content.pm.SharedLibraryInfo; +import android.content.pm.SigningDetails; +import android.content.pm.parsing.ParsingPackageUtils; +import android.content.pm.parsing.component.ComponentMutateUtils; +import android.content.pm.parsing.component.ParsedActivity; +import android.content.pm.parsing.component.ParsedMainComponent; +import android.content.pm.parsing.component.ParsedProcess; +import android.content.pm.parsing.component.ParsedProvider; +import android.content.pm.parsing.component.ParsedService; +import android.content.pm.parsing.result.ParseResult; +import android.content.pm.parsing.result.ParseTypeImpl; +import android.os.Build; +import android.os.Environment; +import android.os.Process; +import android.os.SystemProperties; +import android.os.Trace; +import android.os.UserHandle; +import android.text.TextUtils; +import android.util.ArrayMap; +import android.util.Log; +import android.util.Pair; +import android.util.Slog; +import android.util.apk.ApkSignatureVerifier; +import android.util.jar.StrictJarFile; + +import com.android.internal.annotations.GuardedBy; +import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.util.ArrayUtils; +import com.android.server.SystemConfig; +import com.android.server.pm.parsing.PackageInfoUtils; +import com.android.server.pm.parsing.library.PackageBackwardCompatibility; +import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.parsing.pkg.AndroidPackageUtils; +import com.android.server.pm.parsing.pkg.ParsedPackage; + +import dalvik.system.VMRuntime; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.UUID; + +/** + * Helper class that handles package scanning logic + */ +final class ScanPackageUtils { + /** + * Just scans the package without any side effects. + * + * @param injector injector for acquiring dependencies + * @param request Information about the package to be scanned + * @param isUnderFactoryTest Whether or not the device is under factory test + * @param currentTime The current time, in millis + * @return The results of the scan + */ + @GuardedBy("mPm.mInstallLock") + @VisibleForTesting + @NonNull + public static ScanResult scanPackageOnlyLI(@NonNull ScanRequest request, + PackageManagerServiceInjector injector, + boolean isUnderFactoryTest, long currentTime) + throws PackageManagerException { + final PackageAbiHelper packageAbiHelper = injector.getAbiHelper(); + ParsedPackage parsedPackage = request.mParsedPackage; + PackageSetting pkgSetting = request.mPkgSetting; + final PackageSetting disabledPkgSetting = request.mDisabledPkgSetting; + final PackageSetting originalPkgSetting = request.mOriginalPkgSetting; + final @ParsingPackageUtils.ParseFlags int parseFlags = request.mParseFlags; + final @PackageManagerService.ScanFlags int scanFlags = request.mScanFlags; + final String realPkgName = request.mRealPkgName; + final SharedUserSetting sharedUserSetting = request.mSharedUserSetting; + final UserHandle user = request.mUser; + final boolean isPlatformPackage = request.mIsPlatformPackage; + + List<String> changedAbiCodePath = null; + + if (DEBUG_PACKAGE_SCANNING) { + if ((parseFlags & ParsingPackageUtils.PARSE_CHATTY) != 0) { + Log.d(TAG, "Scanning package " + parsedPackage.getPackageName()); + } + } + + // Initialize package source and resource directories + final File destCodeFile = new File(parsedPackage.getPath()); + + // We keep references to the derived CPU Abis from settings in oder to reuse + // them in the case where we're not upgrading or booting for the first time. + String primaryCpuAbiFromSettings = null; + String secondaryCpuAbiFromSettings = null; + boolean needToDeriveAbi = (scanFlags & SCAN_FIRST_BOOT_OR_UPGRADE) != 0; + if (!needToDeriveAbi) { + if (pkgSetting != null) { + // TODO(b/154610922): if it is not first boot or upgrade, we should directly use + // API info from existing package setting. However, stub packages currently do not + // preserve ABI info, thus the special condition check here. Remove the special + // check after we fix the stub generation. + if (pkgSetting.getPkg() != null && pkgSetting.getPkg().isStub()) { + needToDeriveAbi = true; + } else { + primaryCpuAbiFromSettings = pkgSetting.getPrimaryCpuAbi(); + secondaryCpuAbiFromSettings = pkgSetting.getSecondaryCpuAbi(); + } + } else { + // Re-scanning a system package after uninstalling updates; need to derive ABI + needToDeriveAbi = true; + } + } + + int previousAppId = Process.INVALID_UID; + + if (pkgSetting != null && pkgSetting.getSharedUser() != sharedUserSetting) { + if (pkgSetting.getSharedUser() != null && sharedUserSetting == null) { + previousAppId = pkgSetting.getAppId(); + // Log that something is leaving shareduid and keep going + Slog.i(TAG, + "Package " + parsedPackage.getPackageName() + " shared user changed from " + + pkgSetting.getSharedUser().name + " to " + "<nothing>."); + } else { + PackageManagerService.reportSettingsProblem(Log.WARN, + "Package " + parsedPackage.getPackageName() + " shared user changed from " + + (pkgSetting.getSharedUser() != null + ? pkgSetting.getSharedUser().name : "<nothing>") + + " to " + + (sharedUserSetting != null ? sharedUserSetting.name : "<nothing>") + + "; replacing with new"); + pkgSetting = null; + } + } + + String[] usesSdkLibraries = null; + if (!parsedPackage.getUsesSdkLibraries().isEmpty()) { + usesSdkLibraries = new String[parsedPackage.getUsesSdkLibraries().size()]; + parsedPackage.getUsesSdkLibraries().toArray(usesSdkLibraries); + } + + String[] usesStaticLibraries = null; + if (!parsedPackage.getUsesStaticLibraries().isEmpty()) { + usesStaticLibraries = new String[parsedPackage.getUsesStaticLibraries().size()]; + parsedPackage.getUsesStaticLibraries().toArray(usesStaticLibraries); + } + + final UUID newDomainSetId = injector.getDomainVerificationManagerInternal().generateNewId(); + + // TODO(b/135203078): Remove appInfoFlag usage in favor of individually assigned booleans + // to avoid adding something that's unsupported due to lack of state, since it's called + // with null. + final boolean createNewPackage = (pkgSetting == null); + if (createNewPackage) { + final boolean instantApp = (scanFlags & SCAN_AS_INSTANT_APP) != 0; + final boolean virtualPreload = (scanFlags & SCAN_AS_VIRTUAL_PRELOAD) != 0; + + // Flags contain system values stored in the server variant of AndroidPackage, + // and so the server-side PackageInfoUtils is still called, even without a + // PackageSetting to pass in. + int pkgFlags = PackageInfoUtils.appInfoFlags(parsedPackage, null); + int pkgPrivateFlags = PackageInfoUtils.appInfoPrivateFlags(parsedPackage, null); + + // REMOVE SharedUserSetting from method; update in a separate call + pkgSetting = Settings.createNewSetting(parsedPackage.getPackageName(), + originalPkgSetting, disabledPkgSetting, realPkgName, sharedUserSetting, + destCodeFile, parsedPackage.getNativeLibraryRootDir(), + AndroidPackageUtils.getRawPrimaryCpuAbi(parsedPackage), + AndroidPackageUtils.getRawSecondaryCpuAbi(parsedPackage), + parsedPackage.getLongVersionCode(), pkgFlags, pkgPrivateFlags, user, + true /*allowInstall*/, instantApp, virtualPreload, + UserManagerService.getInstance(), usesSdkLibraries, + parsedPackage.getUsesSdkLibrariesVersionsMajor(), usesStaticLibraries, + parsedPackage.getUsesStaticLibrariesVersions(), parsedPackage.getMimeGroups(), + newDomainSetId); + } else { + // make a deep copy to avoid modifying any existing system state. + pkgSetting = new PackageSetting(pkgSetting); + pkgSetting.setPkg(parsedPackage); + + // REMOVE SharedUserSetting from method; update in a separate call. + // + // TODO(narayan): This update is bogus. nativeLibraryDir & primaryCpuAbi, + // secondaryCpuAbi are not known at this point so we always update them + // to null here, only to reset them at a later point. + Settings.updatePackageSetting(pkgSetting, disabledPkgSetting, sharedUserSetting, + destCodeFile, parsedPackage.getNativeLibraryDir(), + AndroidPackageUtils.getPrimaryCpuAbi(parsedPackage, pkgSetting), + AndroidPackageUtils.getSecondaryCpuAbi(parsedPackage, pkgSetting), + PackageInfoUtils.appInfoFlags(parsedPackage, pkgSetting), + PackageInfoUtils.appInfoPrivateFlags(parsedPackage, pkgSetting), + UserManagerService.getInstance(), + usesSdkLibraries, parsedPackage.getUsesSdkLibrariesVersionsMajor(), + usesStaticLibraries, parsedPackage.getUsesStaticLibrariesVersions(), + parsedPackage.getMimeGroups(), newDomainSetId); + } + if (createNewPackage && originalPkgSetting != null) { + // This is the initial transition from the original package, so, + // fix up the new package's name now. We must do this after looking + // up the package under its new name, so getPackageLP takes care of + // fiddling things correctly. + parsedPackage.setPackageName(originalPkgSetting.getPackageName()); + + // File a report about this. + String msg = "New package " + pkgSetting.getRealName() + + " renamed to replace old package " + pkgSetting.getPackageName(); + PackageManagerService.reportSettingsProblem(Log.WARN, msg); + } + + final int userId = (user == null ? UserHandle.USER_SYSTEM : user.getIdentifier()); + // for existing packages, change the install state; but, only if it's explicitly specified + if (!createNewPackage) { + final boolean instantApp = (scanFlags & SCAN_AS_INSTANT_APP) != 0; + final boolean fullApp = (scanFlags & SCAN_AS_FULL_APP) != 0; + setInstantAppForUser(injector, pkgSetting, userId, instantApp, fullApp); + } + // TODO(patb): see if we can do away with disabled check here. + if (disabledPkgSetting != null + || (0 != (scanFlags & SCAN_NEW_INSTALL) + && pkgSetting != null && pkgSetting.isSystem())) { + pkgSetting.getPkgState().setUpdatedSystemApp(true); + } + + parsedPackage.setSeInfo(SELinuxMMAC.getSeInfo(parsedPackage, sharedUserSetting, + injector.getCompatibility())); + + if (parsedPackage.isSystem()) { + configurePackageComponents(parsedPackage); + } + + final String cpuAbiOverride = deriveAbiOverride(request.mCpuAbiOverride); + final boolean isUpdatedSystemApp = pkgSetting.getPkgState().isUpdatedSystemApp(); + + final File appLib32InstallDir = getAppLib32InstallDir(); + if ((scanFlags & SCAN_NEW_INSTALL) == 0) { + if (needToDeriveAbi) { + Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "derivePackageAbi"); + final Pair<PackageAbiHelper.Abis, PackageAbiHelper.NativeLibraryPaths> derivedAbi = + packageAbiHelper.derivePackageAbi(parsedPackage, isUpdatedSystemApp, + cpuAbiOverride, appLib32InstallDir); + derivedAbi.first.applyTo(parsedPackage); + derivedAbi.second.applyTo(parsedPackage); + Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER); + + // Some system apps still use directory structure for native libraries + // in which case we might end up not detecting abi solely based on apk + // structure. Try to detect abi based on directory structure. + + String pkgRawPrimaryCpuAbi = AndroidPackageUtils.getRawPrimaryCpuAbi(parsedPackage); + if (parsedPackage.isSystem() && !isUpdatedSystemApp + && pkgRawPrimaryCpuAbi == null) { + final PackageAbiHelper.Abis abis = packageAbiHelper.getBundledAppAbis( + parsedPackage); + abis.applyTo(parsedPackage); + abis.applyTo(pkgSetting); + final PackageAbiHelper.NativeLibraryPaths nativeLibraryPaths = + packageAbiHelper.deriveNativeLibraryPaths(parsedPackage, + isUpdatedSystemApp, appLib32InstallDir); + nativeLibraryPaths.applyTo(parsedPackage); + } + } else { + // This is not a first boot or an upgrade, don't bother deriving the + // ABI during the scan. Instead, trust the value that was stored in the + // package setting. + parsedPackage.setPrimaryCpuAbi(primaryCpuAbiFromSettings) + .setSecondaryCpuAbi(secondaryCpuAbiFromSettings); + + final PackageAbiHelper.NativeLibraryPaths nativeLibraryPaths = + packageAbiHelper.deriveNativeLibraryPaths(parsedPackage, + isUpdatedSystemApp, appLib32InstallDir); + nativeLibraryPaths.applyTo(parsedPackage); + + if (DEBUG_ABI_SELECTION) { + Slog.i(TAG, "Using ABIS and native lib paths from settings : " + + parsedPackage.getPackageName() + " " + + AndroidPackageUtils.getRawPrimaryCpuAbi(parsedPackage) + + ", " + + AndroidPackageUtils.getRawSecondaryCpuAbi(parsedPackage)); + } + } + } else { + if ((scanFlags & SCAN_MOVE) != 0) { + // We haven't run dex-opt for this move (since we've moved the compiled output too) + // but we already have this packages package info in the PackageSetting. We just + // use that and derive the native library path based on the new code path. + parsedPackage.setPrimaryCpuAbi(pkgSetting.getPrimaryCpuAbi()) + .setSecondaryCpuAbi(pkgSetting.getSecondaryCpuAbi()); + } + + // Set native library paths again. For moves, the path will be updated based on the + // ABIs we've determined above. For non-moves, the path will be updated based on the + // ABIs we determined during compilation, but the path will depend on the final + // package path (after the rename away from the stage path). + final PackageAbiHelper.NativeLibraryPaths nativeLibraryPaths = + packageAbiHelper.deriveNativeLibraryPaths(parsedPackage, isUpdatedSystemApp, + appLib32InstallDir); + nativeLibraryPaths.applyTo(parsedPackage); + } + + // This is a special case for the "system" package, where the ABI is + // dictated by the zygote configuration (and init.rc). We should keep track + // of this ABI so that we can deal with "normal" applications that run under + // the same UID correctly. + if (isPlatformPackage) { + parsedPackage.setPrimaryCpuAbi(VMRuntime.getRuntime().is64Bit() + ? Build.SUPPORTED_64_BIT_ABIS[0] : Build.SUPPORTED_32_BIT_ABIS[0]); + } + + // If there's a mismatch between the abi-override in the package setting + // and the abiOverride specified for the install. Warn about this because we + // would've already compiled the app without taking the package setting into + // account. + if ((scanFlags & SCAN_NO_DEX) == 0 && (scanFlags & SCAN_NEW_INSTALL) != 0) { + if (cpuAbiOverride == null) { + Slog.w(TAG, "Ignoring persisted ABI override for package " + + parsedPackage.getPackageName()); + } + } + + pkgSetting.setPrimaryCpuAbi(AndroidPackageUtils.getRawPrimaryCpuAbi(parsedPackage)) + .setSecondaryCpuAbi(AndroidPackageUtils.getRawSecondaryCpuAbi(parsedPackage)) + .setCpuAbiOverride(cpuAbiOverride); + + if (DEBUG_ABI_SELECTION) { + Slog.d(TAG, "Resolved nativeLibraryRoot for " + parsedPackage.getPackageName() + + " to root=" + parsedPackage.getNativeLibraryRootDir() + + ", to dir=" + parsedPackage.getNativeLibraryDir() + + ", isa=" + parsedPackage.isNativeLibraryRootRequiresIsa()); + } + + // Push the derived path down into PackageSettings so we know what to + // clean up at uninstall time. + pkgSetting.setLegacyNativeLibraryPath(parsedPackage.getNativeLibraryRootDir()); + + if (DEBUG_ABI_SELECTION) { + Log.d(TAG, "Abis for package[" + parsedPackage.getPackageName() + "] are" + + " primary=" + pkgSetting.getPrimaryCpuAbi() + + " secondary=" + pkgSetting.getSecondaryCpuAbi() + + " abiOverride=" + pkgSetting.getCpuAbiOverride()); + } + + if ((scanFlags & SCAN_BOOTING) == 0 && pkgSetting.getSharedUser() != null) { + // We don't do this here during boot because we can do it all + // at once after scanning all existing packages. + // + // We also do this *before* we perform dexopt on this package, so that + // we can avoid redundant dexopts, and also to make sure we've got the + // code and package path correct. + changedAbiCodePath = applyAdjustedAbiToSharedUser(pkgSetting.getSharedUser(), + parsedPackage, packageAbiHelper.getAdjustedAbiForSharedUser( + pkgSetting.getSharedUser().packages, parsedPackage)); + } + + parsedPackage.setFactoryTest(isUnderFactoryTest && parsedPackage.getRequestedPermissions() + .contains(android.Manifest.permission.FACTORY_TEST)); + + if (parsedPackage.isSystem()) { + pkgSetting.setIsOrphaned(true); + } + + // Take care of first install / last update times. + final long scanFileTime = getLastModifiedTime(parsedPackage); + if (currentTime != 0) { + if (pkgSetting.getFirstInstallTime() == 0) { + pkgSetting.setFirstInstallTime(currentTime) + .setLastUpdateTime(currentTime); + } else if ((scanFlags & SCAN_UPDATE_TIME) != 0) { + pkgSetting.setLastUpdateTime(currentTime); + } + } else if (pkgSetting.getFirstInstallTime() == 0) { + // We need *something*. Take time time stamp of the file. + pkgSetting.setFirstInstallTime(scanFileTime) + .setLastUpdateTime(scanFileTime); + } else if ((parseFlags & ParsingPackageUtils.PARSE_IS_SYSTEM_DIR) != 0) { + if (scanFileTime != pkgSetting.getLastModifiedTime()) { + // A package on the system image has changed; consider this + // to be an update. + pkgSetting.setLastUpdateTime(scanFileTime); + } + } + pkgSetting.setLastModifiedTime(scanFileTime); + // TODO(b/135203078): Remove, move to constructor + pkgSetting.setPkg(parsedPackage) + .setFlags(PackageInfoUtils.appInfoFlags(parsedPackage, pkgSetting)) + .setPrivateFlags( + PackageInfoUtils.appInfoPrivateFlags(parsedPackage, pkgSetting)); + if (parsedPackage.getLongVersionCode() != pkgSetting.getVersionCode()) { + pkgSetting.setLongVersionCode(parsedPackage.getLongVersionCode()); + } + // Update volume if needed + final String volumeUuid = parsedPackage.getVolumeUuid(); + if (!Objects.equals(volumeUuid, pkgSetting.getVolumeUuid())) { + Slog.i(PackageManagerService.TAG, + "Update" + (pkgSetting.isSystem() ? " system" : "") + + " package " + parsedPackage.getPackageName() + + " volume from " + pkgSetting.getVolumeUuid() + + " to " + volumeUuid); + pkgSetting.setVolumeUuid(volumeUuid); + } + + SharedLibraryInfo sdkLibraryInfo = null; + if (!TextUtils.isEmpty(parsedPackage.getSdkLibName())) { + sdkLibraryInfo = AndroidPackageUtils.createSharedLibraryForSdk(parsedPackage); + } + SharedLibraryInfo staticSharedLibraryInfo = null; + if (!TextUtils.isEmpty(parsedPackage.getStaticSharedLibName())) { + staticSharedLibraryInfo = + AndroidPackageUtils.createSharedLibraryForStatic(parsedPackage); + } + List<SharedLibraryInfo> dynamicSharedLibraryInfos = null; + if (!ArrayUtils.isEmpty(parsedPackage.getLibraryNames())) { + dynamicSharedLibraryInfos = new ArrayList<>(parsedPackage.getLibraryNames().size()); + for (String name : parsedPackage.getLibraryNames()) { + dynamicSharedLibraryInfos.add( + AndroidPackageUtils.createSharedLibraryForDynamic(parsedPackage, name)); + } + } + + return new ScanResult(request, true, pkgSetting, changedAbiCodePath, + !createNewPackage /* existingSettingCopied */, + previousAppId, sdkLibraryInfo, staticSharedLibraryInfo, + dynamicSharedLibraryInfos); + } + + /** + * Returns the actual scan flags depending upon the state of the other settings. + * <p>Updated system applications will not have the following flags set + * by default and need to be adjusted after the fact: + * <ul> + * <li>{@link PackageManagerService.SCAN_AS_SYSTEM}</li> + * <li>{@link PackageManagerService.SCAN_AS_PRIVILEGED}</li> + * <li>{@link PackageManagerService.SCAN_AS_OEM}</li> + * <li>{@link PackageManagerService.SCAN_AS_VENDOR}</li> + * <li>{@link PackageManagerService.SCAN_AS_PRODUCT}</li> + * <li>{@link PackageManagerService.SCAN_AS_SYSTEM_EXT}</li> + * <li>{@link PackageManagerService.SCAN_AS_INSTANT_APP}</li> + * <li>{@link PackageManagerService.SCAN_AS_VIRTUAL_PRELOAD}</li> + * <li>{@link PackageManagerService.SCAN_AS_ODM}</li> + * </ul> + */ + public static @PackageManagerService.ScanFlags int adjustScanFlagsWithPackageSetting( + @PackageManagerService.ScanFlags int scanFlags, + PackageSetting pkgSetting, PackageSetting disabledPkgSetting, UserHandle user) { + + // TODO(patb): Do away entirely with disabledPkgSetting here. PkgSetting will always contain + // the correct isSystem value now that we don't disable system packages before scan. + final PackageSetting systemPkgSetting = + (scanFlags & SCAN_NEW_INSTALL) != 0 && disabledPkgSetting == null + && pkgSetting != null && pkgSetting.isSystem() + ? pkgSetting + : disabledPkgSetting; + if (systemPkgSetting != null) { + // updated system application, must at least have SCAN_AS_SYSTEM + scanFlags |= SCAN_AS_SYSTEM; + if ((systemPkgSetting.getPrivateFlags() + & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) != 0) { + scanFlags |= SCAN_AS_PRIVILEGED; + } + if ((systemPkgSetting.getPrivateFlags() + & ApplicationInfo.PRIVATE_FLAG_OEM) != 0) { + scanFlags |= SCAN_AS_OEM; + } + if ((systemPkgSetting.getPrivateFlags() + & ApplicationInfo.PRIVATE_FLAG_VENDOR) != 0) { + scanFlags |= SCAN_AS_VENDOR; + } + if ((systemPkgSetting.getPrivateFlags() + & ApplicationInfo.PRIVATE_FLAG_PRODUCT) != 0) { + scanFlags |= SCAN_AS_PRODUCT; + } + if ((systemPkgSetting.getPrivateFlags() + & ApplicationInfo.PRIVATE_FLAG_SYSTEM_EXT) != 0) { + scanFlags |= SCAN_AS_SYSTEM_EXT; + } + if ((systemPkgSetting.getPrivateFlags() + & ApplicationInfo.PRIVATE_FLAG_ODM) != 0) { + scanFlags |= SCAN_AS_ODM; + } + } + if (pkgSetting != null) { + final int userId = ((user == null) ? 0 : user.getIdentifier()); + if (pkgSetting.getInstantApp(userId)) { + scanFlags |= SCAN_AS_INSTANT_APP; + } + if (pkgSetting.getVirtualPreload(userId)) { + scanFlags |= SCAN_AS_VIRTUAL_PRELOAD; + } + } + + return scanFlags; + } + + /** + * Enforces code policy for the package. This ensures that if an APK has + * declared hasCode="true" in its manifest that the APK actually contains + * code. + * + * @throws PackageManagerException If bytecode could not be found when it should exist + */ + public static void assertCodePolicy(AndroidPackage pkg) + throws PackageManagerException { + final boolean shouldHaveCode = pkg.isHasCode(); + if (shouldHaveCode && !apkHasCode(pkg.getBaseApkPath())) { + throw new PackageManagerException(INSTALL_FAILED_INVALID_APK, + "Package " + pkg.getBaseApkPath() + " code is missing"); + } + + if (!ArrayUtils.isEmpty(pkg.getSplitCodePaths())) { + for (int i = 0; i < pkg.getSplitCodePaths().length; i++) { + final boolean splitShouldHaveCode = + (pkg.getSplitFlags()[i] & ApplicationInfo.FLAG_HAS_CODE) != 0; + if (splitShouldHaveCode && !apkHasCode(pkg.getSplitCodePaths()[i])) { + throw new PackageManagerException(INSTALL_FAILED_INVALID_APK, + "Package " + pkg.getSplitCodePaths()[i] + " code is missing"); + } + } + } + } + + public static void assertStaticSharedLibraryIsValid(AndroidPackage pkg, + @PackageManagerService.ScanFlags int scanFlags) throws PackageManagerException { + // Static shared libraries should have at least O target SDK + if (pkg.getTargetSdkVersion() < Build.VERSION_CODES.O) { + throw new PackageManagerException( + "Packages declaring static-shared libs must target O SDK or higher"); + } + + // Package declaring static a shared lib cannot be instant apps + if ((scanFlags & SCAN_AS_INSTANT_APP) != 0) { + throw new PackageManagerException( + "Packages declaring static-shared libs cannot be instant apps"); + } + + // Package declaring static a shared lib cannot be renamed since the package + // name is synthetic and apps can't code around package manager internals. + if (!ArrayUtils.isEmpty(pkg.getOriginalPackages())) { + throw new PackageManagerException( + "Packages declaring static-shared libs cannot be renamed"); + } + + // Package declaring static a shared lib cannot declare dynamic libs + if (!ArrayUtils.isEmpty(pkg.getLibraryNames())) { + throw new PackageManagerException( + "Packages declaring static-shared libs cannot declare dynamic libs"); + } + + // Package declaring static a shared lib cannot declare shared users + if (pkg.getSharedUserId() != null) { + throw new PackageManagerException( + "Packages declaring static-shared libs cannot declare shared users"); + } + + // Static shared libs cannot declare activities + if (!pkg.getActivities().isEmpty()) { + throw new PackageManagerException( + "Static shared libs cannot declare activities"); + } + + // Static shared libs cannot declare services + if (!pkg.getServices().isEmpty()) { + throw new PackageManagerException( + "Static shared libs cannot declare services"); + } + + // Static shared libs cannot declare providers + if (!pkg.getProviders().isEmpty()) { + throw new PackageManagerException( + "Static shared libs cannot declare content providers"); + } + + // Static shared libs cannot declare receivers + if (!pkg.getReceivers().isEmpty()) { + throw new PackageManagerException( + "Static shared libs cannot declare broadcast receivers"); + } + + // Static shared libs cannot declare permission groups + if (!pkg.getPermissionGroups().isEmpty()) { + throw new PackageManagerException( + "Static shared libs cannot declare permission groups"); + } + + // Static shared libs cannot declare attributions + if (!pkg.getAttributions().isEmpty()) { + throw new PackageManagerException( + "Static shared libs cannot declare features"); + } + + // Static shared libs cannot declare permissions + if (!pkg.getPermissions().isEmpty()) { + throw new PackageManagerException( + "Static shared libs cannot declare permissions"); + } + + // Static shared libs cannot declare protected broadcasts + if (!pkg.getProtectedBroadcasts().isEmpty()) { + throw new PackageManagerException( + "Static shared libs cannot declare protected broadcasts"); + } + + // Static shared libs cannot be overlay targets + if (pkg.getOverlayTarget() != null) { + throw new PackageManagerException( + "Static shared libs cannot be overlay targets"); + } + } + + public static void assertProcessesAreValid(AndroidPackage pkg) throws PackageManagerException { + final Map<String, ParsedProcess> procs = pkg.getProcesses(); + if (!procs.isEmpty()) { + if (!procs.containsKey(pkg.getProcessName())) { + throw new PackageManagerException( + INSTALL_FAILED_PROCESS_NOT_DEFINED, + "Can't install because application tag's process attribute " + + pkg.getProcessName() + + " (in package " + pkg.getPackageName() + + ") is not included in the <processes> list"); + } + assertPackageProcesses(pkg, pkg.getActivities(), procs, "activity"); + assertPackageProcesses(pkg, pkg.getServices(), procs, "service"); + assertPackageProcesses(pkg, pkg.getReceivers(), procs, "receiver"); + assertPackageProcesses(pkg, pkg.getProviders(), procs, "provider"); + } + } + + private static <T extends ParsedMainComponent> void assertPackageProcesses(AndroidPackage pkg, + List<T> components, Map<String, ParsedProcess> procs, String compName) + throws PackageManagerException { + if (components == null) { + return; + } + for (int i = components.size() - 1; i >= 0; i--) { + final ParsedMainComponent component = components.get(i); + if (!procs.containsKey(component.getProcessName())) { + throw new PackageManagerException( + INSTALL_FAILED_PROCESS_NOT_DEFINED, + "Can't install because " + compName + " " + component.getClassName() + + "'s process attribute " + component.getProcessName() + + " (in package " + pkg.getPackageName() + + ") is not included in the <processes> list"); + } + } + } + + public static void assertMinSignatureSchemeIsValid(AndroidPackage pkg, + @ParsingPackageUtils.ParseFlags int parseFlags) throws PackageManagerException { + if ((parseFlags & ParsingPackageUtils.PARSE_IS_SYSTEM_DIR) == 0) { + int minSignatureSchemeVersion = + ApkSignatureVerifier.getMinimumSignatureSchemeVersionForTargetSdk( + pkg.getTargetSdkVersion()); + if (pkg.getSigningDetails().getSignatureSchemeVersion() + < minSignatureSchemeVersion) { + throw new PackageManagerException(INSTALL_PARSE_FAILED_NO_CERTIFICATES, + "No signature found in package of version " + minSignatureSchemeVersion + + " or newer for package " + pkg.getPackageName()); + } + } + } + + /** + * Returns the "real" name of the package. + * <p>This may differ from the package's actual name if the application has already + * been installed under one of this package's original names. + */ + public static @Nullable String getRealPackageName(@NonNull AndroidPackage pkg, + @Nullable String renamedPkgName) { + if (isPackageRenamed(pkg, renamedPkgName)) { + return AndroidPackageUtils.getRealPackageOrNull(pkg); + } + return null; + } + + /** Returns {@code true} if the package has been renamed. Otherwise, {@code false}. */ + public static boolean isPackageRenamed(@NonNull AndroidPackage pkg, + @Nullable String renamedPkgName) { + return pkg.getOriginalPackages().contains(renamedPkgName); + } + + /** + * Renames the package if it was installed under a different name. + * <p>When we've already installed the package under an original name, update + * the new package so we can continue to have the old name. + */ + public static void ensurePackageRenamed(@NonNull ParsedPackage parsedPackage, + @NonNull String renamedPackageName) { + if (!parsedPackage.getOriginalPackages().contains(renamedPackageName) + || parsedPackage.getPackageName().equals(renamedPackageName)) { + return; + } + parsedPackage.setPackageName(renamedPackageName); + } + + /** + * Returns {@code true} if the given file contains code. Otherwise {@code false}. + */ + public static boolean apkHasCode(String fileName) { + StrictJarFile jarFile = null; + try { + jarFile = new StrictJarFile(fileName, + false /*verify*/, false /*signatureSchemeRollbackProtectionsEnforced*/); + return jarFile.findEntry("classes.dex") != null; + } catch (IOException ignore) { + } finally { + try { + if (jarFile != null) { + jarFile.close(); + } + } catch (IOException ignore) { + } + } + return false; + } + + /** + * Sets the enabled state of components configured through {@link SystemConfig}. + * This modifies the {@link PackageSetting} object. + * + * TODO(b/135203078): Move this to package parsing + **/ + public static void configurePackageComponents(AndroidPackage pkg) { + final ArrayMap<String, Boolean> componentsEnabledStates = SystemConfig.getInstance() + .getComponentsEnabledStates(pkg.getPackageName()); + if (componentsEnabledStates == null) { + return; + } + + for (int i = ArrayUtils.size(pkg.getActivities()) - 1; i >= 0; i--) { + final ParsedActivity component = pkg.getActivities().get(i); + final Boolean enabled = componentsEnabledStates.get(component.getName()); + if (enabled != null) { + ComponentMutateUtils.setEnabled(component, enabled); + } + } + + for (int i = ArrayUtils.size(pkg.getReceivers()) - 1; i >= 0; i--) { + final ParsedActivity component = pkg.getReceivers().get(i); + final Boolean enabled = componentsEnabledStates.get(component.getName()); + if (enabled != null) { + ComponentMutateUtils.setEnabled(component, enabled); + } + } + + for (int i = ArrayUtils.size(pkg.getProviders()) - 1; i >= 0; i--) { + final ParsedProvider component = pkg.getProviders().get(i); + final Boolean enabled = componentsEnabledStates.get(component.getName()); + if (enabled != null) { + ComponentMutateUtils.setEnabled(component, enabled); + } + } + + for (int i = ArrayUtils.size(pkg.getServices()) - 1; i >= 0; i--) { + final ParsedService component = pkg.getServices().get(i); + final Boolean enabled = componentsEnabledStates.get(component.getName()); + if (enabled != null) { + ComponentMutateUtils.setEnabled(component, enabled); + } + } + } + + public static int getVendorPartitionVersion() { + final String version = SystemProperties.get("ro.vndk.version"); + if (!version.isEmpty()) { + try { + return Integer.parseInt(version); + } catch (NumberFormatException ignore) { + if (ArrayUtils.contains(Build.VERSION.ACTIVE_CODENAMES, version)) { + return Build.VERSION_CODES.CUR_DEVELOPMENT; + } + } + } + return Build.VERSION_CODES.P; + } + + /** + * Applies policy to the parsed package based upon the given policy flags. + * Ensures the package is in a good state. + * <p> + * Implementation detail: This method must NOT have any side effect. It would + * ideally be static, but, it requires locks to read system state. + */ + public static void applyPolicy(ParsedPackage parsedPackage, + final @PackageManagerService.ScanFlags int scanFlags, AndroidPackage platformPkg, + boolean isUpdatedSystemApp) { + if ((scanFlags & SCAN_AS_SYSTEM) != 0) { + parsedPackage.setSystem(true); + // TODO(b/135203078): Can this be done in PackageParser? Or just inferred when the flag + // is set during parse. + if (parsedPackage.isDirectBootAware()) { + parsedPackage.setAllComponentsDirectBootAware(true); + } + if (compressedFileExists(parsedPackage.getPath())) { + parsedPackage.setStub(true); + } + } else { + parsedPackage + // Non system apps cannot mark any broadcast as protected + .clearProtectedBroadcasts() + // non system apps can't be flagged as core + .setCoreApp(false) + // clear flags not applicable to regular apps + .setPersistent(false) + .setDefaultToDeviceProtectedStorage(false) + .setDirectBootAware(false) + // non system apps can't have permission priority + .capPermissionPriorities(); + } + if ((scanFlags & SCAN_AS_PRIVILEGED) == 0) { + parsedPackage + .markNotActivitiesAsNotExportedIfSingleUser(); + } + + parsedPackage.setPrivileged((scanFlags & SCAN_AS_PRIVILEGED) != 0) + .setOem((scanFlags & SCAN_AS_OEM) != 0) + .setVendor((scanFlags & SCAN_AS_VENDOR) != 0) + .setProduct((scanFlags & SCAN_AS_PRODUCT) != 0) + .setSystemExt((scanFlags & SCAN_AS_SYSTEM_EXT) != 0) + .setOdm((scanFlags & SCAN_AS_ODM) != 0); + + // Check if the package is signed with the same key as the platform package. + parsedPackage.setSignedWithPlatformKey( + (PLATFORM_PACKAGE_NAME.equals(parsedPackage.getPackageName()) + || (platformPkg != null && compareSignatures( + platformPkg.getSigningDetails().getSignatures(), + parsedPackage.getSigningDetails().getSignatures() + ) == PackageManager.SIGNATURE_MATCH)) + ); + + if (!parsedPackage.isSystem()) { + // Only system apps can use these features. + parsedPackage.clearOriginalPackages() + .clearAdoptPermissions(); + } + + PackageBackwardCompatibility.modifySharedLibraries(parsedPackage, isUpdatedSystemApp); + } + + /** + * Applies the adjusted ABI calculated by + * {@link PackageAbiHelper#getAdjustedAbiForSharedUser(Set, AndroidPackage)} to all + * relevant packages and settings. + * @param sharedUserSetting The {@code SharedUserSetting} to adjust + * @param scannedPackage the package being scanned or null + * @param adjustedAbi the adjusted ABI calculated by {@link PackageAbiHelper} + * @return the list of code paths that belong to packages that had their ABIs adjusted. + */ + public static List<String> applyAdjustedAbiToSharedUser(SharedUserSetting sharedUserSetting, + ParsedPackage scannedPackage, String adjustedAbi) { + if (scannedPackage != null) { + scannedPackage.setPrimaryCpuAbi(adjustedAbi); + } + List<String> changedAbiCodePath = null; + for (PackageSetting ps : sharedUserSetting.packages) { + if (scannedPackage == null + || !scannedPackage.getPackageName().equals(ps.getPackageName())) { + if (ps.getPrimaryCpuAbi() != null) { + continue; + } + + ps.setPrimaryCpuAbi(adjustedAbi); + if (ps.getPkg() != null) { + if (!TextUtils.equals(adjustedAbi, + AndroidPackageUtils.getRawPrimaryCpuAbi(ps.getPkg()))) { + if (DEBUG_ABI_SELECTION) { + Slog.i(TAG, + "Adjusting ABI for " + ps.getPackageName() + " to " + + adjustedAbi + " (scannedPackage=" + + (scannedPackage != null ? scannedPackage : "null") + + ")"); + } + if (changedAbiCodePath == null) { + changedAbiCodePath = new ArrayList<>(); + } + changedAbiCodePath.add(ps.getPathString()); + } + } + } + } + return changedAbiCodePath; + } + + public static void collectCertificatesLI(PackageSetting ps, ParsedPackage parsedPackage, + Settings.VersionInfo settingsVersionForPackage, boolean forceCollect, + boolean skipVerify, boolean isPreNMR1Upgrade) + throws PackageManagerException { + // When upgrading from pre-N MR1, verify the package time stamp using the package + // directory and not the APK file. + final long lastModifiedTime = isPreNMR1Upgrade + ? new File(parsedPackage.getPath()).lastModified() + : getLastModifiedTime(parsedPackage); + if (ps != null && !forceCollect + && ps.getPathString().equals(parsedPackage.getPath()) + && ps.getLastModifiedTime() == lastModifiedTime + && !ReconcilePackageUtils.isCompatSignatureUpdateNeeded(settingsVersionForPackage) + && !ReconcilePackageUtils.isRecoverSignatureUpdateNeeded( + settingsVersionForPackage)) { + if (ps.getSigningDetails().getSignatures() != null + && ps.getSigningDetails().getSignatures().length != 0 + && ps.getSigningDetails().getSignatureSchemeVersion() + != SigningDetails.SignatureSchemeVersion.UNKNOWN) { + // Optimization: reuse the existing cached signing data + // if the package appears to be unchanged. + parsedPackage.setSigningDetails( + new SigningDetails(ps.getSigningDetails())); + return; + } + + Slog.w(TAG, "PackageSetting for " + ps.getPackageName() + + " is missing signatures. Collecting certs again to recover them."); + } else { + Slog.i(TAG, parsedPackage.getPath() + " changed; collecting certs" + + (forceCollect ? " (forced)" : "")); + } + + try { + Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "collectCertificates"); + final ParseTypeImpl input = ParseTypeImpl.forDefaultParsing(); + final ParseResult<SigningDetails> result = ParsingPackageUtils.getSigningDetails( + input, parsedPackage, skipVerify); + if (result.isError()) { + throw new PackageManagerException( + result.getErrorCode(), result.getErrorMessage(), result.getException()); + } + parsedPackage.setSigningDetails(result.getResult()); + } finally { + Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER); + } + } + + public static void setInstantAppForUser(PackageManagerServiceInjector injector, + PackageSetting pkgSetting, int userId, boolean instantApp, boolean fullApp) { + // no state specified; do nothing + if (!instantApp && !fullApp) { + return; + } + if (userId != UserHandle.USER_ALL) { + if (instantApp && !pkgSetting.getInstantApp(userId)) { + pkgSetting.setInstantApp(true /*instantApp*/, userId); + } else if (fullApp && pkgSetting.getInstantApp(userId)) { + pkgSetting.setInstantApp(false /*instantApp*/, userId); + } + } else { + for (int currentUserId : injector.getUserManagerInternal().getUserIds()) { + if (instantApp && !pkgSetting.getInstantApp(currentUserId)) { + pkgSetting.setInstantApp(true /*instantApp*/, currentUserId); + } else if (fullApp && pkgSetting.getInstantApp(currentUserId)) { + pkgSetting.setInstantApp(false /*instantApp*/, currentUserId); + } + } + } + } + + /** Directory where installed application's 32-bit native libraries are copied. */ + public static File getAppLib32InstallDir() { + return new File(Environment.getDataDirectory(), "app-lib"); + } +} diff --git a/services/core/java/com/android/server/uri/UriGrantsManagerService.java b/services/core/java/com/android/server/uri/UriGrantsManagerService.java index b17257a9db80..344270427569 100644 --- a/services/core/java/com/android/server/uri/UriGrantsManagerService.java +++ b/services/core/java/com/android/server/uri/UriGrantsManagerService.java @@ -117,7 +117,6 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub { PackageManagerInternal mPmInternal; /** File storing persisted {@link #mGrantedUriPermissions}. */ - @GuardedBy("mLock") private final AtomicFile mGrantFile; /** XML constants used in {@link #mGrantFile} */ @@ -1299,15 +1298,14 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub { return false; } - @GuardedBy("mLock") - private void writeGrantedUriPermissionsLocked() { + private void writeGrantedUriPermissions() { if (DEBUG) Slog.v(TAG, "writeGrantedUriPermissions()"); final long startTime = SystemClock.uptimeMillis(); // Snapshot permissions so we can persist without lock ArrayList<UriPermission.Snapshot> persist = Lists.newArrayList(); - synchronized (this) { + synchronized (mLock) { final int size = mGrantedUriPermissions.size(); for (int i = 0; i < size; i++) { final ArrayMap<GrantUri, UriPermission> perms = mGrantedUriPermissions.valueAt(i); @@ -1330,8 +1328,8 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub { out.startTag(null, TAG_URI_GRANT); out.attributeInt(null, ATTR_SOURCE_USER_ID, perm.uri.sourceUserId); out.attributeInt(null, ATTR_TARGET_USER_ID, perm.targetUserId); - out.attribute(null, ATTR_SOURCE_PKG, perm.sourcePkg); - out.attribute(null, ATTR_TARGET_PKG, perm.targetPkg); + out.attributeInterned(null, ATTR_SOURCE_PKG, perm.sourcePkg); + out.attributeInterned(null, ATTR_TARGET_PKG, perm.targetPkg); out.attribute(null, ATTR_URI, String.valueOf(perm.uri.uri)); writeBooleanAttribute(out, ATTR_PREFIX, perm.uri.prefix); out.attributeInt(null, ATTR_MODE_FLAGS, perm.persistedModeFlags); @@ -1360,9 +1358,7 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub { public void handleMessage(Message msg) { switch (msg.what) { case PERSIST_URI_GRANTS_MSG: { - synchronized (mLock) { - writeGrantedUriPermissionsLocked(); - } + writeGrantedUriPermissions(); break; } } diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 343b14702b3c..1c93b99fde9e 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -2007,23 +2007,8 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp } void configureDisplayPolicy() { - final int width = mBaseDisplayWidth; - final int height = mBaseDisplayHeight; - final int shortSize; - final int longSize; - if (width > height) { - shortSize = height; - longSize = width; - } else { - shortSize = width; - longSize = height; - } - - final int shortSizeDp = shortSize * DENSITY_DEFAULT / mBaseDisplayDensity; - final int longSizeDp = longSize * DENSITY_DEFAULT / mBaseDisplayDensity; - mDisplayPolicy.updateConfigurationAndScreenSizeDependentBehaviors(); - mDisplayRotation.configure(width, height, shortSizeDp, longSizeDp); + mDisplayRotation.configure(mBaseDisplayWidth, mBaseDisplayHeight); } /** @@ -2806,6 +2791,15 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp mIsSizeForced ? mBaseDisplayHeight : newHeight, mIsDensityForced ? mBaseDisplayDensity : newDensity); + configureDisplayPolicy(); + + if (physicalDisplayChanged) { + // Reapply the rotation window settings, we are doing this after updating + // the screen size and configuring display policy as the rotation depends + // on the display size + mWmService.mDisplayWindowSettings.applyRotationSettingsToDisplayLocked(this); + } + // Real display metrics changed, so we should also update initial values. mInitialDisplayWidth = newWidth; mInitialDisplayHeight = newHeight; diff --git a/services/core/java/com/android/server/wm/DisplayRotation.java b/services/core/java/com/android/server/wm/DisplayRotation.java index ae0600790e65..8c8b33f344fd 100644 --- a/services/core/java/com/android/server/wm/DisplayRotation.java +++ b/services/core/java/com/android/server/wm/DisplayRotation.java @@ -294,7 +294,7 @@ public class DisplayRotation { currentUserRes.getBoolean(R.bool.config_allowSeamlessRotationDespiteNavBarMoving); } - void configure(int width, int height, int shortSizeDp, int longSizeDp) { + void configure(int width, int height) { final Resources res = mContext.getResources(); if (width > height) { mLandscapeRotation = Surface.ROTATION_0; diff --git a/services/core/java/com/android/server/wm/DisplayWindowSettings.java b/services/core/java/com/android/server/wm/DisplayWindowSettings.java index 6d5abe1e2f31..8260fd6c09f4 100644 --- a/services/core/java/com/android/server/wm/DisplayWindowSettings.java +++ b/services/core/java/com/android/server/wm/DisplayWindowSettings.java @@ -265,10 +265,6 @@ class DisplayWindowSettings { dc.mIsDensityForced = hasDensityOverride; dc.mIsSizeForced = hasSizeOverride; - final boolean ignoreOrientationRequest = settings.mIgnoreOrientationRequest != null - ? settings.mIgnoreOrientationRequest : false; - dc.setIgnoreOrientationRequest(ignoreOrientationRequest); - final boolean ignoreDisplayCutout = settings.mIgnoreDisplayCutout != null ? settings.mIgnoreDisplayCutout : false; dc.mIgnoreDisplayCutout = ignoreDisplayCutout; @@ -288,6 +284,15 @@ class DisplayWindowSettings { dc.mDontMoveToTop = dontMoveToTop; } + void applyRotationSettingsToDisplayLocked(DisplayContent dc) { + final DisplayInfo displayInfo = dc.getDisplayInfo(); + final SettingsProvider.SettingsEntry settings = mSettingsProvider.getSettings(displayInfo); + + final boolean ignoreOrientationRequest = settings.mIgnoreOrientationRequest != null + ? settings.mIgnoreOrientationRequest : false; + dc.setIgnoreOrientationRequest(ignoreOrientationRequest); + } + /** * Updates settings for the given display after system features are loaded into window manager * service, e.g. if this device is PC and if this device supports freeform. diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 45d962622b3d..663e17bc9784 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -151,6 +151,7 @@ import com.android.server.os.DeviceIdentifiersPolicyService; import com.android.server.os.NativeTombstoneManagerService; import com.android.server.os.SchedulingPolicyService; import com.android.server.people.PeopleService; +import com.android.server.pm.ApexManager; import com.android.server.pm.CrossProfileAppsService; import com.android.server.pm.DataLoaderManagerService; import com.android.server.pm.DynamicCodeLoggingService; @@ -220,6 +221,7 @@ import java.util.Arrays; import java.util.Date; import java.util.LinkedList; import java.util.Locale; +import java.util.Map; import java.util.Timer; import java.util.TreeSet; import java.util.concurrent.CountDownLatch; @@ -918,6 +920,13 @@ public final class SystemServer implements Dumpable { startBootstrapServices(t); startCoreServices(t); startOtherServices(t); + // Apex services must be the last category of services to start. No other service must + // be starting after this point. This is to prevent unnessary stability issues when + // these apexes are updated outside of OTA; and to avoid breaking dependencies from + // system into apexes. + // TODO(satayev): lock mSystemServiceManager.startService to stop accepting new services + // after this step + startApexServices(t); } catch (Throwable ex) { Slog.e("System", "******************************************"); Slog.e("System", "************ Failure starting system services", ex); @@ -3051,6 +3060,27 @@ public final class SystemServer implements Dumpable { t.traceEnd(); // startOtherServices } + /** + * Starts system services defined in apexes. + */ + private void startApexServices(@NonNull TimingsTraceAndSlog t) { + t.traceBegin("startApexServices"); + Map<String, String> services = ApexManager.getInstance().getApexSystemServices(); + // TODO(satayev): filter out already started services + // TODO(satayev): introduce android:order for services coming the same apexes + for (String name : new TreeSet<>(services.keySet())) { + String jarPath = services.get(name); + t.traceBegin("starting " + name); + if (TextUtils.isEmpty(jarPath)) { + mSystemServiceManager.startService(name); + } else { + mSystemServiceManager.startServiceFromJar(name, jarPath); + } + t.traceEnd(); + } + t.traceEnd(); // startApexServices + } + private boolean deviceHasConfigString(@NonNull Context context, @StringRes int resId) { String serviceName = context.getString(resId); return !TextUtils.isEmpty(serviceName); diff --git a/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java index 847fe2ecf52d..7f7c716bc1f0 100644 --- a/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java @@ -61,6 +61,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.util.Map; @SmallTest @Presubmit @@ -130,6 +131,17 @@ public class ApexManagerTest { } @Test + public void testGetApexSystemServices() throws RemoteException { + when(mApexService.getAllPackages()).thenReturn(createApexInfoForTestPkg(true, false)); + mApexManager.scanApexPackagesTraced(mPackageParser2, + ParallelPackageParser.makeExecutorService()); + + Map<String, String> services = mApexManager.getApexSystemServices(); + assertThat(services).hasSize(1); + assertThat(services).containsKey("com.android.apex.test.ApexSystemService"); + } + + @Test public void testGetActivePackages() throws RemoteException { when(mApexService.getAllPackages()).thenReturn(createApexInfoForTestPkg(true, true)); mApexManager.scanApexPackagesTraced(mPackageParser2, diff --git a/services/tests/servicestests/src/com/android/server/pm/ScanTests.java b/services/tests/servicestests/src/com/android/server/pm/ScanTests.java index 71d5b77306a4..28f24f2b55ee 100644 --- a/services/tests/servicestests/src/com/android/server/pm/ScanTests.java +++ b/services/tests/servicestests/src/com/android/server/pm/ScanTests.java @@ -470,9 +470,7 @@ public class ScanTests { .addUsesPermission( new ParsedUsesPermissionImpl(Manifest.permission.FACTORY_TEST, 0)); - final ScanPackageHelper scanPackageHelper = new ScanPackageHelper( - mMockPackageManager, mMockInjector); - final ScanResult scanResult = scanPackageHelper.scanPackageOnlyLI( + final ScanResult scanResult = ScanPackageUtils.scanPackageOnlyLI( createBasicScanRequestBuilder(basicPackage).build(), mMockInjector, true /*isUnderFactoryTest*/, @@ -520,9 +518,7 @@ public class ScanTests { private ScanResult executeScan( ScanRequest scanRequest) throws PackageManagerException { - final ScanPackageHelper scanPackageHelper = new ScanPackageHelper( - mMockPackageManager, mMockInjector); - ScanResult result = scanPackageHelper.scanPackageOnlyLI( + ScanResult result = ScanPackageUtils.scanPackageOnlyLI( scanRequest, mMockInjector, false /*isUnderFactoryTest*/, diff --git a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java index e8a279907c5e..d49cf670f471 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java @@ -5112,6 +5112,11 @@ public class PreferencesHelperTest extends UiServiceTestCase { assertTrue(expected.containsKey(uid)); assertThat(expected.get(uid)).isEqualTo( builder.getInt(PackageNotificationPreferences.IMPORTANCE_FIELD_NUMBER)); + + // pre-migration, the userSet field will always default to false + boolean userSet = builder.getBoolean( + PackageNotificationPreferences.USER_SET_IMPORTANCE_FIELD_NUMBER); + assertFalse(userSet); } } } @@ -5123,8 +5128,8 @@ public class PreferencesHelperTest extends UiServiceTestCase { // build a collection of app permissions that should be passed in but ignored ArrayMap<Pair<Integer, String>, Pair<Boolean, Boolean>> appPermissions = new ArrayMap<>(); appPermissions.put(new Pair(1, "first"), new Pair(true, false)); // not in local prefs - appPermissions.put(new Pair(3, "third"), new Pair(false, false)); // not in local prefs - appPermissions.put(new Pair(UID_O, PKG_O), new Pair(false, false)); // in local prefs + appPermissions.put(new Pair(3, "third"), new Pair(false, true)); // not in local prefs + appPermissions.put(new Pair(UID_O, PKG_O), new Pair(false, true)); // in local prefs // package preferences: PKG_O not banned based on local importance, and PKG_P is mHelper.setImportance(PKG_O, UID_O, IMPORTANCE_HIGH); @@ -5132,11 +5137,11 @@ public class PreferencesHelperTest extends UiServiceTestCase { // expected output. format: uid -> importance, as only uid (and not package name) // is in PackageNotificationPreferences - ArrayMap<Integer, Integer> expected = new ArrayMap<>(); - expected.put(1, IMPORTANCE_DEFAULT); - expected.put(3, IMPORTANCE_NONE); - expected.put(UID_O, IMPORTANCE_NONE); // banned by permissions - expected.put(UID_P, IMPORTANCE_NONE); // defaults to none + ArrayMap<Integer, Pair<Integer, Boolean>> expected = new ArrayMap<>(); + expected.put(1, new Pair(IMPORTANCE_DEFAULT, false)); + expected.put(3, new Pair(IMPORTANCE_NONE, true)); + expected.put(UID_O, new Pair(IMPORTANCE_NONE, true)); // banned by permissions + expected.put(UID_P, new Pair(IMPORTANCE_NONE, false)); // defaults to none, false ArrayList<StatsEvent> events = new ArrayList<>(); mHelper.pullPackagePreferencesStats(events, appPermissions); @@ -5144,11 +5149,14 @@ public class PreferencesHelperTest extends UiServiceTestCase { for (WrappedSysUiStatsEvent.WrappedBuilder builder : mStatsEventBuilderFactory.builders) { if (builder.getAtomId() == PACKAGE_NOTIFICATION_PREFERENCES) { int uid = builder.getInt(PackageNotificationPreferences.UID_FIELD_NUMBER); + boolean userSet = builder.getBoolean( + PackageNotificationPreferences.USER_SET_IMPORTANCE_FIELD_NUMBER); // if it's one of the expected ids, then make sure the importance matches assertTrue(expected.containsKey(uid)); - assertThat(expected.get(uid)).isEqualTo( + assertThat(expected.get(uid).first).isEqualTo( builder.getInt(PackageNotificationPreferences.IMPORTANCE_FIELD_NUMBER)); + assertThat(expected.get(uid).second).isEqualTo(userSet); } } } diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTestsBase.java index f5b361cff16d..97b1c91d156a 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTestsBase.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyTestsBase.java @@ -16,7 +16,6 @@ package com.android.server.wm; -import static android.util.DisplayMetrics.DENSITY_DEFAULT; import static android.view.DisplayCutout.BOUNDS_POSITION_BOTTOM; import static android.view.DisplayCutout.BOUNDS_POSITION_LEFT; import static android.view.DisplayCutout.BOUNDS_POSITION_RIGHT; @@ -56,7 +55,6 @@ public class DisplayPolicyTestsBase extends WindowTestsBase { static final int DISPLAY_WIDTH = 500; static final int DISPLAY_HEIGHT = 1000; - static final int DISPLAY_DENSITY = 320; static final int DISPLAY_CUTOUT_HEIGHT = 8; static final int IME_HEIGHT = 415; @@ -85,12 +83,7 @@ public class DisplayPolicyTestsBase extends WindowTestsBase { doReturn(true).when(mDisplayPolicy).hasNavigationBar(); doReturn(true).when(mDisplayPolicy).hasStatusBar(); - final int shortSizeDp = - Math.min(DISPLAY_WIDTH, DISPLAY_HEIGHT) * DENSITY_DEFAULT / DISPLAY_DENSITY; - final int longSizeDp = - Math.min(DISPLAY_WIDTH, DISPLAY_HEIGHT) * DENSITY_DEFAULT / DISPLAY_DENSITY; - mDisplayContent.getDisplayRotation().configure( - DISPLAY_WIDTH, DISPLAY_HEIGHT, shortSizeDp, longSizeDp); + mDisplayContent.getDisplayRotation().configure(DISPLAY_WIDTH, DISPLAY_HEIGHT); mDisplayPolicy.onConfigurationChanged(); addWindow(mStatusBarWindow); diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayRotationTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayRotationTests.java index e1aca55762d6..6342183ea28e 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayRotationTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayRotationTests.java @@ -681,7 +681,7 @@ public class DisplayRotationTests { } /** - * Call {@link DisplayRotation#configure(int, int, int, int)} to configure {@link #mTarget} + * Call {@link DisplayRotation#configure(int, int)} to configure {@link #mTarget} * according to given parameters. */ private void configureDisplayRotation(int displayOrientation, boolean isCar, boolean isTv) { @@ -709,9 +709,7 @@ public class DisplayRotationTests { when(mockPackageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK)) .thenReturn(isTv); - final int shortSizeDp = (isCar || isTv) ? 540 : 720; - final int longSizeDp = 960; - mTarget.configure(width, height, shortSizeDp, longSizeDp); + mTarget.configure(width, height); } private void freezeRotation(int rotation) { diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index 4bfb2d815f90..53261cb0a599 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -4466,6 +4466,29 @@ public class CarrierConfigManager { "subscription_group_uuid_string"; /** + * Controls the cellular usage setting. + * + * The usage setting indicates whether a device will remain attached to a network based on + * the primary use case for the service. A device will detach and search for a more-preferred + * network if the primary use case (voice or data) is not satisfied. Depending on the type + * of device, it may operate in a voice or data-centric mode by default. + * + * <p>Sets the usage setting in accordance with 3gpp 24.301 sec 4.3 and 3gpp 24.501 sec 4.3. + * Also refer to "UE's usage setting" as defined in 3gpp 24.301 section 3.1 and 3gpp 23.221 + * Annex A. + * + * Either omit this key or pass a value of + * {@link SubscriptionManager#USAGE_SETTING_UNKNOWN unknown} to preserve the current setting. + * + * {@link SubscriptionManager#USAGE_SETTING_DEFAULT default}, + * {@link SubscriptionManager#USAGE_SETTING_VOICE_CENTRIC voice-centric}, + * or {@link SubscriptionManager#USAGE_SETTING_DATA_CENTRIC data-centric}. + * {@see SubscriptionInfo#getUsageSetting} + */ + public static final String KEY_CELLULAR_USAGE_SETTING_INT = + "cellular_usage_setting_int"; + + /** * Data switch validation minimal gap time, in milliseconds. * * Which means, if the same subscription on the same network (based on MCC+MNC+TAC+subId) @@ -6087,6 +6110,8 @@ public class CarrierConfigManager { sDefaults.putStringArray(KEY_IWLAN_HANDOVER_POLICY_STRING_ARRAY, new String[]{ "source=GERAN|UTRAN|EUTRAN|NGRAN|IWLAN, " + "target=GERAN|UTRAN|EUTRAN|NGRAN|IWLAN, type=allowed"}); + sDefaults.putInt(KEY_CELLULAR_USAGE_SETTING_INT, + SubscriptionManager.USAGE_SETTING_UNKNOWN); } /** diff --git a/telephony/java/android/telephony/SubscriptionInfo.java b/telephony/java/android/telephony/SubscriptionInfo.java index d11ad914061d..c36eb2f9cf65 100644 --- a/telephony/java/android/telephony/SubscriptionInfo.java +++ b/telephony/java/android/telephony/SubscriptionInfo.java @@ -37,6 +37,7 @@ import android.os.Build; import android.os.Parcel; import android.os.ParcelUuid; import android.os.Parcelable; +import android.telephony.SubscriptionManager.UsageSetting; import android.text.TextUtils; import android.util.DisplayMetrics; import android.util.Log; @@ -227,6 +228,11 @@ public class SubscriptionInfo implements Parcelable { private final int mPortIndex; /** + * Subscription's preferred usage setting. + */ + private @UsageSetting int mUsageSetting = SubscriptionManager.USAGE_SETTING_UNKNOWN; + + /** * Public copy constructor. * @hide */ @@ -284,6 +290,7 @@ public class SubscriptionInfo implements Parcelable { cardId, isOpportunistic, groupUUID, isGroupDisabled, carrierId, profileClass, subType, groupOwner, carrierConfigAccessRules, areUiccApplicationsEnabled, 0); } + /** * @hide */ @@ -295,6 +302,24 @@ public class SubscriptionInfo implements Parcelable { int carrierId, int profileClass, int subType, @Nullable String groupOwner, @Nullable UiccAccessRule[] carrierConfigAccessRules, boolean areUiccApplicationsEnabled, int portIndex) { + this(id, iccId, simSlotIndex, displayName, carrierName, nameSource, iconTint, number, + roaming, icon, mcc, mnc, countryIso, isEmbedded, nativeAccessRules, cardString, + cardId, isOpportunistic, groupUUID, isGroupDisabled, carrierId, profileClass, + subType, groupOwner, carrierConfigAccessRules, areUiccApplicationsEnabled, + portIndex, SubscriptionManager.USAGE_SETTING_DEFAULT); + } + + /** + * @hide + */ + public SubscriptionInfo(int id, String iccId, int simSlotIndex, CharSequence displayName, + CharSequence carrierName, int nameSource, int iconTint, String number, int roaming, + Bitmap icon, String mcc, String mnc, String countryIso, boolean isEmbedded, + @Nullable UiccAccessRule[] nativeAccessRules, String cardString, int cardId, + boolean isOpportunistic, @Nullable String groupUUID, boolean isGroupDisabled, + int carrierId, int profileClass, int subType, @Nullable String groupOwner, + @Nullable UiccAccessRule[] carrierConfigAccessRules, + boolean areUiccApplicationsEnabled, int portIndex, @UsageSetting int usageSetting) { this.mId = id; this.mIccId = iccId; this.mSimSlotIndex = simSlotIndex; @@ -322,6 +347,7 @@ public class SubscriptionInfo implements Parcelable { this.mCarrierConfigAccessRules = carrierConfigAccessRules; this.mAreUiccApplicationsEnabled = areUiccApplicationsEnabled; this.mPortIndex = portIndex; + this.mUsageSetting = usageSetting; } /** * @return the subscription ID. @@ -796,7 +822,18 @@ public class SubscriptionInfo implements Parcelable { return mAreUiccApplicationsEnabled; } - public static final @android.annotation.NonNull Parcelable.Creator<SubscriptionInfo> CREATOR = new Parcelable.Creator<SubscriptionInfo>() { + /** + * Get the usage setting for this subscription. + * + * @return the usage setting used for this subscription. + */ + public @UsageSetting int getUsageSetting() { + return mUsageSetting; + } + + public static final @android.annotation.NonNull + Parcelable.Creator<SubscriptionInfo> CREATOR = + new Parcelable.Creator<SubscriptionInfo>() { @Override public SubscriptionInfo createFromParcel(Parcel source) { int id = source.readInt(); @@ -828,12 +865,14 @@ public class SubscriptionInfo implements Parcelable { UiccAccessRule[] carrierConfigAccessRules = source.createTypedArray( UiccAccessRule.CREATOR); boolean areUiccApplicationsEnabled = source.readBoolean(); + int usageSetting = source.readInt(); SubscriptionInfo info = new SubscriptionInfo(id, iccId, simSlotIndex, displayName, carrierName, nameSource, iconTint, number, dataRoaming, /* icon= */ null, mcc, mnc, countryIso, isEmbedded, nativeAccessRules, cardString, cardId, isOpportunistic, groupUUID, isGroupDisabled, carrierid, profileClass, subType, - groupOwner, carrierConfigAccessRules, areUiccApplicationsEnabled, portId); + groupOwner, carrierConfigAccessRules, areUiccApplicationsEnabled, + portId, usageSetting); info.setAssociatedPlmns(ehplmns, hplmns); return info; } @@ -875,6 +914,7 @@ public class SubscriptionInfo implements Parcelable { dest.writeString(mGroupOwner); dest.writeTypedArray(mCarrierConfigAccessRules, flags); dest.writeBoolean(mAreUiccApplicationsEnabled); + dest.writeInt(mUsageSetting); } @Override @@ -919,7 +959,8 @@ public class SubscriptionInfo implements Parcelable { + " subscriptionType=" + mSubscriptionType + " groupOwner=" + mGroupOwner + " carrierConfigAccessRules=" + Arrays.toString(mCarrierConfigAccessRules) - + " areUiccApplicationsEnabled=" + mAreUiccApplicationsEnabled + "}"; + + " areUiccApplicationsEnabled=" + mAreUiccApplicationsEnabled + + " usageSetting=" + mUsageSetting + "}"; } @Override @@ -927,7 +968,8 @@ public class SubscriptionInfo implements Parcelable { return Objects.hash(mId, mSimSlotIndex, mNameSource, mIconTint, mDataRoaming, mIsEmbedded, mIsOpportunistic, mGroupUUID, mIccId, mNumber, mMcc, mMnc, mCountryIso, mCardString, mCardId, mDisplayName, mCarrierName, mNativeAccessRules, mIsGroupDisabled, - mCarrierId, mProfileClass, mGroupOwner, mAreUiccApplicationsEnabled, mPortIndex); + mCarrierId, mProfileClass, mGroupOwner, mAreUiccApplicationsEnabled, mPortIndex, + mUsageSetting); } @Override @@ -967,6 +1009,7 @@ public class SubscriptionInfo implements Parcelable { && Arrays.equals(mNativeAccessRules, toCompare.mNativeAccessRules) && mProfileClass == toCompare.mProfileClass && Arrays.equals(mEhplmns, toCompare.mEhplmns) - && Arrays.equals(mHplmns, toCompare.mHplmns); + && Arrays.equals(mHplmns, toCompare.mHplmns) + && mUsageSetting == toCompare.mUsageSetting; } } diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java index 821b74ab87e4..4e6a7a36d879 100644 --- a/telephony/java/android/telephony/SubscriptionManager.java +++ b/telephony/java/android/telephony/SubscriptionManager.java @@ -1037,12 +1037,75 @@ public class SubscriptionManager { public static final String UICC_APPLICATIONS_ENABLED = SimInfo.COLUMN_UICC_APPLICATIONS_ENABLED; /** - * Indicate which network type is allowed. By default it's enabled. + * Indicate which network type is allowed. * @hide */ public static final String ALLOWED_NETWORK_TYPES = SimInfo.COLUMN_ALLOWED_NETWORK_TYPES_FOR_REASONS; + /** @hide */ + @Retention(RetentionPolicy.SOURCE) + @IntDef(prefix = {"USAGE_SETTING_"}, + value = { + USAGE_SETTING_UNKNOWN, + USAGE_SETTING_DEFAULT, + USAGE_SETTING_VOICE_CENTRIC, + USAGE_SETTING_DATA_CENTRIC}) + public @interface UsageSetting {} + + /** + * The usage setting is unknown. + * + * This will be the usage setting returned on devices that do not support querying the + * or setting the usage setting. + * + * It may also be provided by a carrier that wishes to provide a value to avoid making any + * settings changes. + */ + public static final int USAGE_SETTING_UNKNOWN = -1; + + /** + * Subscription uses the default setting. + * + * The value is based upon device capability and the other properties of the subscription. + * + * Most subscriptions will default to voice-centric when in a phone. + * + * An opportunistic subscription will default to data-centric. + * + * {@see SubscriptionInfo#isOpportunistic} + */ + public static final int USAGE_SETTING_DEFAULT = 0; + + /** + * This subscription is forced to voice-centric mode + * + * <p>Refer to voice-centric mode in 3gpp 24.301 sec 4.3 and 3gpp 24.501 sec 4.3. + * Also refer to "UE's usage setting" as defined in 3gpp 24.301 section 3.1 and 3gpp 23.221 + * Annex A. + */ + public static final int USAGE_SETTING_VOICE_CENTRIC = 1; + + /** + * This subscription is forced to data-centric mode + * + * <p>Refer to data-centric mode in 3gpp 24.301 sec 4.3 and 3gpp 24.501 sec 4.3. + * Also refer to "UE's usage setting" as defined in 3gpp 24.301 section 3.1 and 3gpp 23.221 + * Annex A. + */ + public static final int USAGE_SETTING_DATA_CENTRIC = 2; + + /** + * Indicate the preferred usage setting for the subscription. + * + * 0 - Default - If the value has not been explicitly set, it will be "default" + * 1 - Voice-centric + * 2 - Data-centric + * + * @hide + */ + public static final String USAGE_SETTING = SimInfo.COLUMN_USAGE_SETTING; + /** * Broadcast Action: The user has changed one of the default subs related to * data, phone calls, or sms</p> @@ -3950,4 +4013,33 @@ public class SubscriptionManager { throw ex.rethrowAsRuntimeException(); } } + + /** + * Set the preferred usage setting. + * + * The cellular usage setting is a switch which controls the mode of operation for the cellular + * radio to either require or not require voice service. It is not managed via Android’s + * Settings. + * + * @param subscriptionId the subId of the subscription. + * @param usageSetting the requested usage setting. + * + * @throws IllegalStateException if a specific mode or setting the mode is not supported on a + * particular device. + * + * <p>Requires {@link android.Manifest.permission#MODIFY_PHONE_STATE} + * or that the calling app has CarrierPrivileges for the given subscription. + * + * Note: This method will not allow the setting of USAGE_SETTING_UNKNOWN. + * + * @hide + */ + @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) + void setUsageSetting(int subscriptionId, @UsageSetting int usageSetting) { + if (VDBG) logd("[setUsageSetting]+ setting:" + usageSetting + " subId:" + subscriptionId); + setSubscriptionPropertyHelper(subscriptionId, "setUsageSetting", + (iSub)-> iSub.setUsageSetting( + usageSetting, subscriptionId, mContext.getOpPackageName())); + } } + diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 7f10d644a53e..2d16f9e62e25 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -6775,10 +6775,12 @@ public class TelephonyManager { * @param p2 P2 parameter (described in ISO 7816-4). * @return an IccOpenLogicalChannelResponse object. * @hide + * @deprecated instead use {@link #iccOpenLogicalChannelByPort(int, int, String, int)} */ @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) @SystemApi @Nullable + @Deprecated public IccOpenLogicalChannelResponse iccOpenLogicalChannelBySlot(int slotIndex, @Nullable String aid, int p2) { try { @@ -6799,6 +6801,58 @@ public class TelephonyManager { } /** + * Opens a logical channel to the ICC card using the physical slot index and port index. + * + * Use this method when no subscriptions are available on the SIM and the operation must be + * performed using the physical slot index and port index. + * + * This operation wraps two APDU instructions: + * <ul> + * <li>MANAGE CHANNEL to open a logical channel</li> + * <li>SELECT the given {@code AID} using the given {@code p2}</li> + * </ul> + * + * Per Open Mobile API Specification v3.2 section 6.2.7.h, only p2 values of 0x00, 0x04, 0x08, + * and 0x0C are guaranteed to be supported. + * + * If the SELECT command's status word is not '9000', '62xx', or '63xx', the status word will be + * considered an error and the channel shall not be opened. + * + * Input parameters equivalent to TS 27.007 AT+CCHO command. + * + * @param slotIndex the physical slot index of the ICC card + * @param portIndex The port index is an enumeration of the ports available on the UICC. + * Use {@link UiccPortInfo#getPortIndex()} to get portIndex. + * @param aid Application id. See ETSI 102.221 and 101.220. + * @param p2 P2 parameter (described in ISO 7816-4). + * @return an IccOpenLogicalChannelResponse object. + * @hide + */ + @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) + @SystemApi + @NonNull + public IccOpenLogicalChannelResponse iccOpenLogicalChannelByPort(int slotIndex, + int portIndex, @Nullable String aid, int p2) { + try { + ITelephony telephony = getITelephony(); + if (telephony != null) { + IccLogicalChannelRequest request = new IccLogicalChannelRequest(); + request.slotIndex = slotIndex; + request.portIndex = portIndex; + request.aid = aid; + request.p2 = p2; + request.callingPackage = getOpPackageName(); + request.binder = new Binder(); + return telephony.iccOpenLogicalChannel(request); + } else { + throw new IllegalStateException("telephony service is null."); + } + } catch (RemoteException ex) { + throw ex.rethrowAsRuntimeException(); + } + } + + /** * Opens a logical channel to the ICC card. * * This operation wraps two APDU instructions: @@ -6888,9 +6942,11 @@ public class TelephonyManager { * iccOpenLogicalChannel. * @return true if the channel was closed successfully. * @hide + * @deprecated instead use {@link #iccCloseLogicalChannelByPort(int, int, int)} */ @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) @SystemApi + @Deprecated public boolean iccCloseLogicalChannelBySlot(int slotIndex, int channel) { try { ITelephony telephony = getITelephony(); @@ -6907,6 +6963,45 @@ public class TelephonyManager { } /** + * Closes a previously opened logical channel to the ICC card using the physical slot index and + * port index. + * + * Use this method when no subscriptions are available on the SIM and the operation must be + * performed using the physical slot index and port index. + * + * Input parameters equivalent to TS 27.007 AT+CCHC command. + * + * @param slotIndex the physical slot index of the ICC card + * @param portIndex The port index is an enumeration of the ports available on the UICC. + * Use {@link UiccPortInfo#getPortIndex()} to get portIndex. + * @param channel is the channel id to be closed as returned by a successful + * iccOpenLogicalChannel. + * + * @throws IllegalStateException if the Telephony process is not currently available or modem + * currently can't process this command. + * @throws IllegalArgumentException if invalid arguments are passed. + * @hide + */ + @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) + @SystemApi + public void iccCloseLogicalChannelByPort(int slotIndex, int portIndex, int channel) { + try { + ITelephony telephony = getITelephony(); + if (telephony != null) { + IccLogicalChannelRequest request = new IccLogicalChannelRequest(); + request.slotIndex = slotIndex; + request.portIndex = portIndex; + request.channel = channel; + telephony.iccCloseLogicalChannel(request); + } else { + throw new IllegalStateException("telephony service is null."); + } + } catch (RemoteException ex) { + throw ex.rethrowAsRuntimeException(); + } + } + + /** * Closes a previously opened logical channel to the ICC card. * * Input parameters equivalent to TS 27.007 AT+CCHC command. @@ -6977,10 +7072,13 @@ public class TelephonyManager { * @return The APDU response from the ICC card with the status appended at the end, or null if * there is an issue connecting to the Telephony service. * @hide + * @deprecated instead use + * {@link #iccTransmitApduLogicalChannelByPort(int, int, int, int, int, int, int, int, String)} */ @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) @SystemApi @Nullable + @Deprecated public String iccTransmitApduLogicalChannelBySlot(int slotIndex, int channel, int cla, int instruction, int p1, int p2, int p3, @Nullable String data) { try { @@ -6996,6 +7094,50 @@ public class TelephonyManager { } /** + * Transmit an APDU to the ICC card over a logical channel using the physical slot index. + * + * Use this method when no subscriptions are available on the SIM and the operation must be + * performed using the physical slot index. + * + * Input parameters equivalent to TS 27.007 AT+CGLA command. + * + * @param slotIndex the physical slot index of the ICC card + * @param portIndex The port index is an enumeration of the ports available on the UICC. + * Use {@link UiccPortInfo#getPortIndex()} to get portIndex. + * @param channel is the channel id to be closed as returned by a successful + * iccOpenLogicalChannel. + * @param cla Class of the APDU command. + * @param instruction Instruction of the APDU command. + * @param p1 P1 value of the APDU command. + * @param p2 P2 value of the APDU command. + * @param p3 P3 value of the APDU command. If p3 is negative a 4 byte APDU + * is sent to the SIM. + * @param data Data to be sent with the APDU. + * @return The APDU response from the ICC card with the status appended at the end, or null if + * there is an issue connecting to the Telephony service. + * @hide + */ + @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) + @SystemApi + @NonNull + public String iccTransmitApduLogicalChannelByPort(int slotIndex, int portIndex, int channel, + int cla, int instruction, int p1, int p2, int p3, @Nullable String data) { + String response; + try { + ITelephony telephony = getITelephony(); + if (telephony != null) { + response = telephony.iccTransmitApduLogicalChannelByPort(slotIndex, portIndex, + channel, cla, instruction, p1, p2, p3, data); + } else { + throw new IllegalStateException("telephony service is null."); + } + } catch (RemoteException ex) { + throw ex.rethrowAsRuntimeException(); + } + return response; + } + + /** * Transmit an APDU to the ICC card over a logical channel. * * Input parameters equivalent to TS 27.007 AT+CGLA command. @@ -7080,10 +7222,13 @@ public class TelephonyManager { * @return The APDU response from the ICC card with the status appended at * the end. * @hide + * @deprecated instead use + * {@link #iccTransmitApduBasicChannelByPort(int, int, int, int, int, int, int, String)} */ @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) @SystemApi @NonNull + @Deprecated public String iccTransmitApduBasicChannelBySlot(int slotIndex, int cla, int instruction, int p1, int p2, int p3, @Nullable String data) { try { @@ -7099,6 +7244,47 @@ public class TelephonyManager { } /** + * Transmit an APDU to the ICC card over the basic channel using the physical slot index. + * + * Use this method when no subscriptions are available on the SIM and the operation must be + * performed using the physical slot index. + * + * Input parameters equivalent to TS 27.007 AT+CSIM command. + * + * @param slotIndex the physical slot index of the ICC card to target + * @param portIndex The port index is an enumeration of the ports available on the UICC. + * Use {@link UiccPortInfo#getPortIndex()} to get portIndex. + * @param cla Class of the APDU command. + * @param instruction Instruction of the APDU command. + * @param p1 P1 value of the APDU command. + * @param p2 P2 value of the APDU command. + * @param p3 P3 value of the APDU command. If p3 is negative a 4 byte APDU + * is sent to the SIM. + * @param data Data to be sent with the APDU. + * @return The APDU response from the ICC card with the status appended at + * the end. + * @hide + */ + @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) + @SystemApi + @NonNull + public String iccTransmitApduBasicChannelByPort(int slotIndex, int portIndex, int cla, + int instruction, int p1, int p2, int p3, @Nullable String data) { + String response; + try { + ITelephony telephony = getITelephony(); + if (telephony != null) { + response = telephony.iccTransmitApduBasicChannelByPort(slotIndex, portIndex, + getOpPackageName(), cla, instruction, p1, p2, p3, data); + } else { + throw new IllegalStateException("telephony service is null."); + } + } catch (RemoteException ex) { + throw ex.rethrowAsRuntimeException(); + } + return response; + } + /** * Transmit an APDU to the ICC card over the basic channel. * * Input parameters equivalent to TS 27.007 AT+CSIM command. @@ -16262,4 +16448,76 @@ public class TelephonyManager { } return null; } + + /** + * Callback to listen for when the set of packages with carrier privileges for a SIM changes. + * + * @hide + */ + @SystemApi + public interface CarrierPrivilegesListener { + /** + * Called when the set of packages with carrier privileges has changed. + * + * <p>Of note, this callback will <b>not</b> be fired if a carrier triggers a SIM profile + * switch and the same set of packages remains privileged after the switch. + * + * <p>At registration, the callback will receive the current set of privileged packages. + * + * @param privilegedPackageNames The updated set of package names that have carrier + * privileges + * @param privilegedUids The updated set of UIDs that have carrier privileges + */ + void onCarrierPrivilegesChanged( + @NonNull List<String> privilegedPackageNames, @NonNull int[] privilegedUids); + } + + /** + * Registers a {@link CarrierPrivilegesListener} on the given {@code logicalSlotIndex} to + * receive callbacks when the set of packages with carrier privileges changes. The callback will + * immediately be called with the latest state. + * + * @param logicalSlotIndex The SIM slot to listen on + * @param executor The executor where {@code listener} will be invoked + * @param listener The callback to register + * @hide + */ + @SystemApi + @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) + public void addCarrierPrivilegesListener( + int logicalSlotIndex, + @NonNull @CallbackExecutor Executor executor, + @NonNull CarrierPrivilegesListener listener) { + if (mContext == null) { + throw new IllegalStateException("Telephony service is null"); + } else if (executor == null || listener == null) { + throw new IllegalArgumentException( + "CarrierPrivilegesListener and executor must be non-null"); + } + mTelephonyRegistryMgr = mContext.getSystemService(TelephonyRegistryManager.class); + if (mTelephonyRegistryMgr == null) { + throw new IllegalStateException("Telephony registry service is null"); + } + mTelephonyRegistryMgr.addCarrierPrivilegesListener(logicalSlotIndex, executor, listener); + } + + /** + * Unregisters an existing {@link CarrierPrivilegesListener}. + * + * @hide + */ + @SystemApi + @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) + public void removeCarrierPrivilegesListener(@NonNull CarrierPrivilegesListener listener) { + if (mContext == null) { + throw new IllegalStateException("Telephony service is null"); + } else if (listener == null) { + throw new IllegalArgumentException("CarrierPrivilegesListener must be non-null"); + } + mTelephonyRegistryMgr = mContext.getSystemService(TelephonyRegistryManager.class); + if (mTelephonyRegistryMgr == null) { + throw new IllegalStateException("Telephony registry service is null"); + } + mTelephonyRegistryMgr.removeCarrierPrivilegesListener(listener); + } } diff --git a/telephony/java/android/telephony/data/DataService.java b/telephony/java/android/telephony/data/DataService.java index 2f034752ae5f..892eb2937491 100644 --- a/telephony/java/android/telephony/data/DataService.java +++ b/telephony/java/android/telephony/data/DataService.java @@ -402,6 +402,21 @@ public abstract class DataService extends Service { } /** + * Notify the system that a given DataProfile was unthrottled. + * + * @param dataProfile DataProfile associated with an APN returned from the modem + */ + public final void notifyDataProfileUnthrottled(@NonNull DataProfile dataProfile) { + synchronized (mApnUnthrottledCallbacks) { + for (IDataServiceCallback callback : mApnUnthrottledCallbacks) { + mHandler.obtainMessage(DATA_SERVICE_INDICATION_APN_UNTHROTTLED, + mSlotIndex, 0, new ApnUnthrottledIndication(dataProfile, + callback)).sendToTarget(); + } + } + } + + /** * Called when the instance of data service is destroyed (e.g. got unbind or binder died) * or when the data service provider is removed. The extended class should implement this * method to perform cleanup works. @@ -496,13 +511,20 @@ public abstract class DataService extends Service { } private static final class ApnUnthrottledIndication { + public final DataProfile dataProfile; public final String apn; public final IDataServiceCallback callback; ApnUnthrottledIndication(String apn, IDataServiceCallback callback) { + this.dataProfile = null; this.apn = apn; this.callback = callback; } + ApnUnthrottledIndication(DataProfile dataProfile, IDataServiceCallback callback) { + this.dataProfile = dataProfile; + this.apn = null; + this.callback = callback; + } } private class DataServiceHandler extends Handler { @@ -636,8 +658,13 @@ public abstract class DataService extends Service { ApnUnthrottledIndication apnUnthrottledIndication = (ApnUnthrottledIndication) message.obj; try { - apnUnthrottledIndication.callback - .onApnUnthrottled(apnUnthrottledIndication.apn); + if (apnUnthrottledIndication.dataProfile != null) { + apnUnthrottledIndication.callback + .onDataProfileUnthrottled(apnUnthrottledIndication.dataProfile); + } else { + apnUnthrottledIndication.callback + .onApnUnthrottled(apnUnthrottledIndication.apn); + } } catch (RemoteException e) { loge("Failed to call onApnUnthrottled. " + e); } diff --git a/telephony/java/android/telephony/data/DataServiceCallback.java b/telephony/java/android/telephony/data/DataServiceCallback.java index d0827159b98d..051d6c5d5ec0 100644 --- a/telephony/java/android/telephony/data/DataServiceCallback.java +++ b/telephony/java/android/telephony/data/DataServiceCallback.java @@ -260,8 +260,8 @@ public class DataServiceCallback { /** * Unthrottles the APN on the current transport. There is no matching "APN throttle" method. - * Instead, the APN is throttled for the time specified in - * {@link DataCallResponse#getRetryDurationMillis}. + * Instead, the APN is throttled when {@link IDataService#setupDataCall} fails within + * the time specified by {@link DataCallResponse#getRetryDurationMillis}. * <p/> * see: {@link DataCallResponse#getRetryDurationMillis} * @@ -279,4 +279,27 @@ public class DataServiceCallback { Rlog.e(TAG, "onApnUnthrottled: callback is null!"); } } + + /** + * Unthrottles the DataProfile on the current transport. + * There is no matching "DataProfile throttle" method. + * Instead, the DataProfile is throttled when {@link IDataService#setupDataCall} fails within + * the time specified by {@link DataCallResponse#getRetryDurationMillis}. + * <p/> + * see: {@link DataCallResponse#getRetryDurationMillis} + * + * @param dataProfile DataProfile containing the APN to be throttled + */ + public void onDataProfileUnthrottled(final @NonNull DataProfile dataProfile) { + if (mCallback != null) { + try { + if (DBG) Rlog.d(TAG, "onDataProfileUnthrottled"); + mCallback.onDataProfileUnthrottled(dataProfile); + } catch (RemoteException e) { + Rlog.e(TAG, "onDataProfileUnthrottled: remote exception", e); + } + } else { + Rlog.e(TAG, "onDataProfileUnthrottled: callback is null!"); + } + } } diff --git a/telephony/java/android/telephony/data/IDataServiceCallback.aidl b/telephony/java/android/telephony/data/IDataServiceCallback.aidl index 9cc2feac331a..8205b5eb4d37 100644 --- a/telephony/java/android/telephony/data/IDataServiceCallback.aidl +++ b/telephony/java/android/telephony/data/IDataServiceCallback.aidl @@ -17,6 +17,7 @@ package android.telephony.data; import android.telephony.data.DataCallResponse; +import android.telephony.data.DataProfile; /** * The call back interface @@ -33,4 +34,5 @@ oneway interface IDataServiceCallback void onHandoverStarted(int result); void onHandoverCancelled(int result); void onApnUnthrottled(in String apn); + void onDataProfileUnthrottled(in DataProfile dp); } diff --git a/telephony/java/com/android/internal/telephony/ISub.aidl b/telephony/java/com/android/internal/telephony/ISub.aidl index a900c84c1819..1e38b9215d76 100755 --- a/telephony/java/com/android/internal/telephony/ISub.aidl +++ b/telephony/java/com/android/internal/telephony/ISub.aidl @@ -313,4 +313,15 @@ interface ISub { void setPhoneNumber(int subId, int source, String number, String callingPackage, String callingFeatureId); + + /** + * Set the Usage Setting for this subscription. + * + * @param usageSetting the usage setting for this subscription + * @param subId the unique SubscriptionInfo index in database + * @param callingPackage The package making the IPC. + * + * @throws SecurityException if doesn't have MODIFY_PHONE_STATE or Carrier Privileges + */ + int setUsageSetting(int usageSetting, int subId, String callingPackage); } |