From bd7aba8cbf44be345d087db80f15f73ef894a0f4 Mon Sep 17 00:00:00 2001 From: Kevin Hufnagle Date: Tue, 24 Nov 2020 18:30:38 -0500 Subject: [PATCH 001/288] docs: Remove error in requestPermissions doc If an app has already been granted a permission and it requests that permission again, the user shouldn't see a system dialog. Update the documentation to reflect this intended behavior. Test: m ds-docs-java Bug: 157530031 Exempt-From-Owner-Approval: Docs-only change Change-Id: I7096e17480831324dee72f4093cdaa064e3b9165 --- core/java/android/app/Activity.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index 3772755beca18..1265ce8650e1e 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -5183,12 +5183,6 @@ public class Activity extends ContextThemeWrapper * #checkSelfPermission(String)}. *

*

- * Calling this API for permissions already granted to your app would show UI - * to the user to decide whether the app can still hold these permissions. This - * can be useful if the way your app uses data guarded by the permissions - * changes significantly. - *

- *

* You cannot request a permission if your activity sets {@link * android.R.styleable#AndroidManifestActivity_noHistory noHistory} to * true because in this case the activity would not receive From 09080dc177288035c4694690a0f2dcd752acb3ba Mon Sep 17 00:00:00 2001 From: Nate Myren Date: Mon, 30 Nov 2020 12:06:26 -0800 Subject: [PATCH 002/288] Revoke storage on SDK downgrade or new full storage request When an app downgrades from above API 28 to below, or when an app begins requesting full storage in api 29, revoke storage permissions Test: Atest StorageEscalationTest Bug: 171430330 Merged-In: Ia6bd5658b77a26ab15fea013ec875050457473e0 Change-Id: Ia6bd5658b77a26ab15fea013ec875050457473e0 --- .../server/pm/PackageManagerService.java | 1 + .../permission/PermissionManagerService.java | 62 +++++++++++++++++++ .../PermissionManagerServiceInternal.java | 11 ++++ 3 files changed, 74 insertions(+) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index e8b2f3c428bce..bb7f17d4524a4 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -12486,6 +12486,7 @@ public class PackageManagerService extends IPackageManager.Stub if (hasOldPkg) { mPermissionManager.revokeRuntimePermissionsIfGroupChanged(pkg, oldPkg, allPackageNames); + mPermissionManager.revokeStoragePermissionsIfScopeExpanded(pkg, oldPkg); } if (hasPermissionDefinitionChanges) { mPermissionManager.revokeRuntimePermissionsIfPermissionDefinitionChanged( diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java index d864cfb75d51a..7f0796fc99ac0 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -206,6 +206,9 @@ public class PermissionManagerService extends IPermissionManager.Stub { private static final int USER_PERMISSION_FLAGS = FLAG_PERMISSION_USER_SET | FLAG_PERMISSION_USER_FIXED; + /** All storage permissions */ + private static final List STORAGE_PERMISSIONS = new ArrayList<>(); + /** If the permission of the value is granted, so is the key */ private static final Map FULLER_PERMISSION_MAP = new HashMap<>(); @@ -214,6 +217,9 @@ public class PermissionManagerService extends IPermissionManager.Stub { Manifest.permission.ACCESS_FINE_LOCATION); FULLER_PERMISSION_MAP.put(Manifest.permission.INTERACT_ACROSS_USERS, Manifest.permission.INTERACT_ACROSS_USERS_FULL); + STORAGE_PERMISSIONS.add(Manifest.permission.READ_EXTERNAL_STORAGE); + STORAGE_PERMISSIONS.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); + STORAGE_PERMISSIONS.add(Manifest.permission.ACCESS_MEDIA_LOCATION); } /** Lock to protect internal data access */ @@ -2265,6 +2271,49 @@ public class PermissionManagerService extends IPermissionManager.Stub { return protectionLevel; } + /** + * If the app is updated, and has scoped storage permissions, then it is possible that the + * app updated in an attempt to get unscoped storage. If so, revoke all storage permissions. + * @param newPackage The new package that was installed + * @param oldPackage The old package that was updated + */ + private void revokeStoragePermissionsIfScopeExpanded( + @NonNull AndroidPackage newPackage, + @NonNull AndroidPackage oldPackage, + @NonNull PermissionCallback permissionCallback) { + boolean downgradedSdk = oldPackage.getTargetSdkVersion() >= Build.VERSION_CODES.Q + && newPackage.getTargetSdkVersion() < Build.VERSION_CODES.Q; + boolean upgradedSdk = oldPackage.getTargetSdkVersion() < Build.VERSION_CODES.Q + && newPackage.getTargetSdkVersion() >= Build.VERSION_CODES.Q; + boolean newlyRequestsLegacy = !upgradedSdk && !oldPackage.isRequestLegacyExternalStorage() + && newPackage.isRequestLegacyExternalStorage(); + + if (!newlyRequestsLegacy && !downgradedSdk) { + return; + } + + final int callingUid = Binder.getCallingUid(); + final int userId = UserHandle.getUserId(newPackage.getUid()); + int numRequestedPermissions = newPackage.getRequestedPermissions().size(); + for (int i = 0; i < numRequestedPermissions; i++) { + PermissionInfo permInfo = getPermissionInfo(newPackage.getRequestedPermissions().get(i), + newPackage.getPackageName(), 0); + if (permInfo == null || !STORAGE_PERMISSIONS.contains(permInfo.name)) { + continue; + } + + EventLog.writeEvent(0x534e4554, "171430330", newPackage.getUid(), + "Revoking permission " + permInfo.name + " from package " + + newPackage.getPackageName() + " as either the sdk downgraded " + + downgradedSdk + " or newly requested legacy full storage " + + newlyRequestsLegacy); + + revokeRuntimePermissionInternal(permInfo.name, newPackage.getPackageName(), + false, callingUid, userId, null, permissionCallback); + } + + } + /** * We might auto-grant permissions if any permission of the group is already granted. Hence if * the group of a granted permission changes we need to revoke it to avoid having permissions of @@ -4726,6 +4775,19 @@ public class PermissionManagerService extends IPermissionManager.Stub { @UserIdInt int userId) { return PermissionManagerService.this.isPermissionsReviewRequired(pkg, userId); } + /** + * If the app is updated, and has scoped storage permissions, then it is possible that the + * app updated in an attempt to get unscoped storage. If so, revoke all storage permissions. + * @param newPackage The new package that was installed + * @param oldPackage The old package that was updated + */ + public void revokeStoragePermissionsIfScopeExpanded( + @NonNull AndroidPackage newPackage, + @NonNull AndroidPackage oldPackage + ) { + PermissionManagerService.this.revokeStoragePermissionsIfScopeExpanded(newPackage, + oldPackage, mDefaultPermissionCallback); + } @Override public void revokeRuntimePermissionsIfGroupChanged( diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java index 31a65ba35f5eb..df0edfa16924b 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java @@ -265,6 +265,17 @@ public abstract class PermissionManagerServiceInternal extends PermissionManager @NonNull List permissionsToRevoke, @NonNull ArrayList allPackageNames); + /** + * If the app is updated, and has scoped storage permissions, then it is possible that the + * app updated in an attempt to get unscoped storage. If so, revoke all storage permissions. + * @param newPackage The new package that was installed + * @param oldPackage The old package that was updated + */ + public abstract void revokeStoragePermissionsIfScopeExpanded( + @NonNull AndroidPackage newPackage, + @NonNull AndroidPackage oldPackage + ); + /** * Add all permissions in the given package. *

From 10f79644fc7db512daa6dcf71685dc4f71f8f11b Mon Sep 17 00:00:00 2001 From: arangelov Date: Fri, 30 Oct 2020 20:37:40 +0000 Subject: [PATCH 003/288] [RESTRICT AUTOMERGE] Remove DPMS#getProfileOwner in favor of getProfileOwnerAsUser Test: atest DevicePolicyManagerTest Test: atest CrossProfileAppsTest Bug: 153995973 Change-Id: I103c45ea61814e476eea197d357ef0ce75edefdc (cherry picked from commit 790348fbf190dc647188fc10d68f6d18cbf06b14) --- .../app/admin/DevicePolicyManager.java | 2 +- .../app/admin/IDevicePolicyManager.aidl | 1 - .../devicepolicy/CertificateMonitor.java | 2 +- .../DevicePolicyManagerService.java | 30 ++++++++----------- .../devicepolicy/DevicePolicyManagerTest.java | 10 +++++++ 5 files changed, 24 insertions(+), 21 deletions(-) diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index 322cac81d58b3..d6056d23699e6 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -6994,7 +6994,7 @@ public class DevicePolicyManager { throwIfParentInstance("isProfileOwnerApp"); if (mService != null) { try { - ComponentName profileOwner = mService.getProfileOwner(myUserId()); + ComponentName profileOwner = mService.getProfileOwnerAsUser(myUserId()); return profileOwner != null && profileOwner.getPackageName().equals(packageName); } catch (RemoteException re) { diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl index 9c6a274ccf8cf..86058d9933df2 100644 --- a/core/java/android/app/admin/IDevicePolicyManager.aidl +++ b/core/java/android/app/admin/IDevicePolicyManager.aidl @@ -156,7 +156,6 @@ interface IDevicePolicyManager { boolean setProfileOwner(in ComponentName who, String ownerName, int userHandle); ComponentName getProfileOwnerAsUser(int userHandle); - ComponentName getProfileOwner(int userHandle); ComponentName getProfileOwnerOrDeviceOwnerSupervisionComponent(in UserHandle userHandle); String getProfileOwnerName(int userHandle); void setProfileEnabled(in ComponentName who); diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/CertificateMonitor.java b/services/devicepolicy/java/com/android/server/devicepolicy/CertificateMonitor.java index aa38880d6d7db..a33a512b3be0e 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/CertificateMonitor.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/CertificateMonitor.java @@ -177,7 +177,7 @@ public class CertificateMonitor { int parentUserId = userHandle.getIdentifier(); - if (mService.getProfileOwner(userHandle.getIdentifier()) != null) { + if (mService.getProfileOwnerAsUser(userHandle.getIdentifier()) != null) { contentText = resources.getString(R.string.ssl_ca_cert_noti_managed, mService.getProfileOwnerName(userHandle.getIdentifier())); smallIconId = R.drawable.stat_sys_certificate_info; diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index c6b93d6ca4f48..15cb5bff01d9d 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -4714,7 +4714,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { public boolean isSeparateProfileChallengeAllowed(int userHandle) { enforceSystemCaller("query separate challenge support"); - ComponentName profileOwner = getProfileOwner(userHandle); + ComponentName profileOwner = getProfileOwnerAsUser(userHandle); // Profile challenge is supported on N or newer release. return profileOwner != null && getTargetSdk(profileOwner.getPackageName(), userHandle) > Build.VERSION_CODES.M; @@ -6622,7 +6622,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { final UserHandle caller = mInjector.binderGetCallingUserHandle(); // If there is a profile owner, redirect to that; otherwise query the device owner. - ComponentName aliasChooser = getProfileOwner(caller.getIdentifier()); + ComponentName aliasChooser = getProfileOwnerAsUser(caller.getIdentifier()); if (aliasChooser == null && caller.isSystem()) { synchronized (getLockObject()) { final ActiveAdmin deviceOwnerAdmin = getDeviceOwnerAdminLocked(); @@ -8744,7 +8744,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } public boolean isProfileOwner(ComponentName who, int userId) { - final ComponentName profileOwner = getProfileOwner(userId); + final ComponentName profileOwner = getProfileOwnerAsUser(userId); return who != null && who.equals(profileOwner); } @@ -9302,16 +9302,10 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { @Override public ComponentName getProfileOwnerAsUser(int userHandle) { - enforceCrossUsersPermission(userHandle); - - return getProfileOwner(userHandle); - } - - @Override - public ComponentName getProfileOwner(int userHandle) { if (!mHasFeature) { return null; } + enforceCrossUsersPermission(userHandle); synchronized (getLockObject()) { return mOwners.getProfileOwnerComponent(userHandle); } @@ -9354,9 +9348,9 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { return mInjector.binderWithCleanCallingIdentity(() -> { for (UserInfo userInfo : mUserManager.getProfiles(userHandle)) { if (userInfo.isManagedProfile()) { - if (getProfileOwner(userInfo.id) != null + if (getProfileOwnerAsUser(userInfo.id) != null && isProfileOwnerOfOrganizationOwnedDevice(userInfo.id)) { - ComponentName who = getProfileOwner(userInfo.id); + ComponentName who = getProfileOwnerAsUser(userInfo.id); return getActiveAdminUncheckedLocked(who, userInfo.id); } } @@ -9396,7 +9390,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { return null; } enforceManageUsers(); - ComponentName profileOwner = getProfileOwner(userHandle); + ComponentName profileOwner = getProfileOwnerAsUser(userHandle); if (profileOwner == null) { return null; } @@ -9793,7 +9787,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { return false; } - final ComponentName profileOwner = getProfileOwner(userId); + final ComponentName profileOwner = getProfileOwnerAsUser(userId); if (profileOwner == null) { return false; } @@ -13368,7 +13362,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { // Managed-profiles cannot be setup on the system user. return CODE_SPLIT_SYSTEM_USER_DEVICE_SYSTEM_USER; } - if (getProfileOwner(callingUserId) != null) { + if (getProfileOwnerAsUser(callingUserId) != null) { // Managed user cannot have a managed profile. return CODE_USER_HAS_PROFILE_OWNER; } @@ -14022,7 +14016,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { return true; } - final ComponentName profileOwner = getProfileOwner(userId); + final ComponentName profileOwner = getProfileOwnerAsUser(userId); if (profileOwner == null) { return false; } @@ -14232,7 +14226,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { enforceUserUnlocked(userId); - final ComponentName profileOwner = getProfileOwner(userId); + final ComponentName profileOwner = getProfileOwnerAsUser(userId); if (profileOwner != null && packageName.equals(profileOwner.getPackageName())) { throw new IllegalArgumentException("Cannot uninstall a package with a profile owner"); } @@ -15768,7 +15762,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { final List admins = new ArrayList<>(); int[] users = mUserManager.getProfileIdsWithDisabled(UserHandle.getCallingUserId()); for (int i = 0; i < users.length; i++) { - final ComponentName componentName = getProfileOwner(users[i]); + final ComponentName componentName = getProfileOwnerAsUser(users[i]); if (componentName != null) { ActiveAdmin admin = getActiveAdminUncheckedLocked(componentName, users[i]); if (admin != null) { diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java index daaabf8141fff..82c23e5051c93 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java @@ -666,6 +666,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { */ public void testRemoveActiveAdmin_fromDifferentUserWithINTERACT_ACROSS_USERS_FULL() { mContext.callerPermissions.add(android.Manifest.permission.MANAGE_DEVICE_ADMINS); + mContext.callerPermissions.add(permission.INTERACT_ACROSS_USERS); // Add admin1. @@ -2684,6 +2685,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { mContext.callerPermissions.add(permission.MANAGE_DEVICE_ADMINS); mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS); mContext.callerPermissions.add(permission.INTERACT_ACROSS_USERS_FULL); + mContext.callerPermissions.add(permission.INTERACT_ACROSS_USERS); // Check that the system user is unaffiliated. mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID; @@ -4220,6 +4222,8 @@ public class DevicePolicyManagerTest extends DpmTestBase { } public void testGetBindDeviceAdminTargetUsers() throws Exception { + mContext.callerPermissions.add(permission.INTERACT_ACROSS_USERS); + // Setup device owner. mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID; setupDeviceOwner(); @@ -6051,6 +6055,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { } public void testGetAllCrossProfilePackages_notSet_returnsEmpty() throws Exception { + mContext.callerPermissions.add(permission.INTERACT_ACROSS_USERS); addManagedProfile(admin1, mServiceContext.binder.callingUid, admin1); mContext.packageName = admin1.getPackageName(); @@ -6062,6 +6067,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { public void testGetAllCrossProfilePackages_notSet_dpmsReinitialized_returnsEmpty() throws Exception { + mContext.callerPermissions.add(permission.INTERACT_ACROSS_USERS); addManagedProfile(admin1, mServiceContext.binder.callingUid, admin1); mContext.packageName = admin1.getPackageName(); @@ -6073,6 +6079,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { } public void testGetAllCrossProfilePackages_whenSet_returnsCombinedSet() throws Exception { + mContext.callerPermissions.add(permission.INTERACT_ACROSS_USERS); addManagedProfile(admin1, mServiceContext.binder.callingUid, admin1); final Set packages = Sets.newSet("TEST_PACKAGE", "TEST_COMMON_PACKAGE"); mContext.packageName = admin1.getPackageName(); @@ -6090,6 +6097,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { public void testGetAllCrossProfilePackages_whenSet_dpmsReinitialized_returnsCombinedSet() throws Exception { + mContext.callerPermissions.add(permission.INTERACT_ACROSS_USERS); addManagedProfile(admin1, mServiceContext.binder.callingUid, admin1); final Set packages = Sets.newSet("TEST_PACKAGE", "TEST_COMMON_PACKAGE"); mContext.packageName = admin1.getPackageName(); @@ -6261,6 +6269,8 @@ public class DevicePolicyManagerTest extends DpmTestBase { public void testSetAccountTypesWithManagementDisabledOnOrgOwnedManagedProfile() throws Exception { + mContext.callerPermissions.add(permission.INTERACT_ACROSS_USERS); + final int managedProfileUserId = 15; final int managedProfileAdminUid = UserHandle.getUid(managedProfileUserId, 19436); From c33703be7408a50819909dfffbda1b0b78a31da3 Mon Sep 17 00:00:00 2001 From: Alex Kershaw Date: Mon, 30 Nov 2020 17:18:42 +0000 Subject: [PATCH 004/288] Protect DeviceAdminReceiver intents Fixes: 170639543 Change-Id: Ic12812efebe29aa99da93b59b6cf783097f3de76 (cherry picked from commit 74ad72137b1b4acea452c7300b1b632c2a531117) --- core/res/AndroidManifest.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 162fa70dd16af..529a3d83a7f6a 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -115,6 +115,12 @@ + + + + + + From d7f514abbe0bee01003ef694a67abfaa30667b4d Mon Sep 17 00:00:00 2001 From: Eugene Susla Date: Mon, 26 Oct 2020 09:08:49 -0700 Subject: [PATCH 005/288] Prevent non-system overlays from showing over CDM UI Since CDM grants privileges, it should have the same overlay policy as permission UI Test: use an app wit ha visible overlay to ensure the overlay disappears when CDM is shown Fixes: 171221090 Change-Id: I004843edf5a156dc07fb961edf80272f5cb50163 (cherry picked from commit ea4ce4d48eb22e05f03b36e281149f1e944674fa) Merged-In: I004843edf5a156dc07fb961edf80272f5cb50163 --- .../android/companiondevicemanager/DeviceChooserActivity.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java index 16ef59f201f17..7bc9993751d40 100644 --- a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java +++ b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java @@ -17,6 +17,7 @@ package com.android.companiondevicemanager; import static android.companion.BluetoothDeviceFilterUtils.getDeviceMacAddress; +import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS; import android.app.Activity; import android.companion.CompanionDeviceManager; @@ -56,6 +57,8 @@ public class DeviceChooserActivity extends Activity { Log.e(LOG_TAG, "About to show UI, but no devices to show"); } + getWindow().addSystemFlags(SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS); + if (getService().mRequest.isSingleDevice()) { setContentView(R.layout.device_confirmation); final DeviceFilterPair selectedDevice = getService().mDevicesFound.get(0); From f717d7195fa8654a7c9e4e28bbe473f8513eef64 Mon Sep 17 00:00:00 2001 From: Eugene Susla Date: Fri, 4 Dec 2020 16:01:46 -0800 Subject: [PATCH 006/288] Allow CDM to hide overlays Since CDM has sensitive user consent UIs, it should be able to hide non-system overlays Test: use a 3p overlay app with a visible overlay to ensure overlay disappears when CDM is shown Bug: 171221090 Change-Id: I78673b7b95f4c3cb31fab180201eb17c9123bddf Merged-In: I78673b7b95f4c3cb31fab180201eb17c9123bddf --- packages/CompanionDeviceManager/AndroidManifest.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/CompanionDeviceManager/AndroidManifest.xml b/packages/CompanionDeviceManager/AndroidManifest.xml index ea9b52cbf3d51..e4e5b9fa781a2 100644 --- a/packages/CompanionDeviceManager/AndroidManifest.xml +++ b/packages/CompanionDeviceManager/AndroidManifest.xml @@ -31,6 +31,7 @@ + Date: Mon, 26 Oct 2020 09:08:49 -0700 Subject: [PATCH 007/288] RESTRICT AUTOMERGE Prevent non-system overlays from showing over CDM UI Since CDM grants privileges, it should have the same overlay policy as permission UI Test: use an app wit ha visible overlay to ensure the overlay disappears when CDM is shown Fixes: 171221090 Change-Id: I4daaee7d8b710a72f6166cbb2252ef8af84c2c60 --- .../android/companiondevicemanager/DeviceChooserActivity.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java index 16ef59f201f17..7bc9993751d40 100644 --- a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java +++ b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java @@ -17,6 +17,7 @@ package com.android.companiondevicemanager; import static android.companion.BluetoothDeviceFilterUtils.getDeviceMacAddress; +import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS; import android.app.Activity; import android.companion.CompanionDeviceManager; @@ -56,6 +57,8 @@ public class DeviceChooserActivity extends Activity { Log.e(LOG_TAG, "About to show UI, but no devices to show"); } + getWindow().addSystemFlags(SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS); + if (getService().mRequest.isSingleDevice()) { setContentView(R.layout.device_confirmation); final DeviceFilterPair selectedDevice = getService().mDevicesFound.get(0); From 30e9d28c22e7c21ab8e06ba54d2df665fba9ed5e Mon Sep 17 00:00:00 2001 From: Eugene Susla Date: Fri, 4 Dec 2020 16:01:46 -0800 Subject: [PATCH 008/288] RESTRICT AUTOMERGE Allow CDM to hide overlays Since CDM has sensitive user consent UIs, it should be able to hide non-system overlays Test: use a 3p overlay app with a visible overlay to ensure overlay disappears when CDM is shown Bug: 171221090 Change-Id: I3274cb7f03f63e1fa99a9ca06759972ce2a51309 --- packages/CompanionDeviceManager/AndroidManifest.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/CompanionDeviceManager/AndroidManifest.xml b/packages/CompanionDeviceManager/AndroidManifest.xml index 42885e8193a72..c975c95b8b7cc 100644 --- a/packages/CompanionDeviceManager/AndroidManifest.xml +++ b/packages/CompanionDeviceManager/AndroidManifest.xml @@ -29,6 +29,7 @@ + Date: Mon, 26 Oct 2020 09:08:49 -0700 Subject: [PATCH 009/288] RESTRICT AUTOMERGE Prevent non-system overlays from showing over CDM UI Since CDM grants privileges, it should have the same overlay policy as permission UI Test: use an app wit ha visible overlay to ensure the overlay disappears when CDM is shown Fixes: 171221090 Change-Id: I4daaee7d8b710a72f6166cbb2252ef8af84c2c60 --- .../companiondevicemanager/DeviceChooserActivity.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java index 16ef59f201f17..34139a8e58e9e 100644 --- a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java +++ b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java @@ -17,6 +17,7 @@ package com.android.companiondevicemanager; import static android.companion.BluetoothDeviceFilterUtils.getDeviceMacAddress; +import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS; import android.app.Activity; import android.companion.CompanionDeviceManager; @@ -56,6 +57,8 @@ public class DeviceChooserActivity extends Activity { Log.e(LOG_TAG, "About to show UI, but no devices to show"); } + getWindow().addPrivateFlags(PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS); + if (getService().mRequest.isSingleDevice()) { setContentView(R.layout.device_confirmation); final DeviceFilterPair selectedDevice = getService().mDevicesFound.get(0); @@ -157,4 +160,4 @@ public class DeviceChooserActivity extends Activity { new Intent().putExtra(CompanionDeviceManager.EXTRA_DEVICE, selectedDevice.device)); finish(); } -} \ No newline at end of file +} From 486773ff4567bbfd63f7f57dc9cb1f0ffb8a6c12 Mon Sep 17 00:00:00 2001 From: Eugene Susla Date: Fri, 4 Dec 2020 16:01:46 -0800 Subject: [PATCH 010/288] RESTRICT AUTOMERGE Allow CDM to hide overlays Since CDM has sensitive user consent UIs, it should be able to hide non-system overlays Test: use a 3p overlay app with a visible overlay to ensure overlay disappears when CDM is shown Bug: 171221090 Change-Id: I3274cb7f03f63e1fa99a9ca06759972ce2a51309 --- packages/CompanionDeviceManager/AndroidManifest.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/CompanionDeviceManager/AndroidManifest.xml b/packages/CompanionDeviceManager/AndroidManifest.xml index 34bc4ebcd0aa2..2224dfc6a81ba 100644 --- a/packages/CompanionDeviceManager/AndroidManifest.xml +++ b/packages/CompanionDeviceManager/AndroidManifest.xml @@ -28,6 +28,7 @@ + Date: Mon, 26 Oct 2020 09:08:49 -0700 Subject: [PATCH 011/288] RESTRICT AUTOMERGE Prevent non-system overlays from showing over CDM UI Since CDM grants privileges, it should have the same overlay policy as permission UI Test: use an app wit ha visible overlay to ensure the overlay disappears when CDM is shown Fixes: 171221090 Change-Id: I4daaee7d8b710a72f6166cbb2252ef8af84c2c60 --- .../companiondevicemanager/DeviceChooserActivity.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java index 7e23ee152ed94..18cec01dadf05 100644 --- a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java +++ b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java @@ -17,6 +17,7 @@ package com.android.companiondevicemanager; import static android.companion.BluetoothDeviceFilterUtils.getDeviceMacAddress; +import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS; import android.app.Activity; import android.companion.CompanionDeviceManager; @@ -55,6 +56,8 @@ public class DeviceChooserActivity extends Activity { Log.e(LOG_TAG, "About to show UI, but no devices to show"); } + getWindow().addPrivateFlags(PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS); + if (getService().mRequest.isSingleDevice()) { setContentView(R.layout.device_confirmation); final DeviceFilterPair selectedDevice = getService().mDevicesFound.get(0); @@ -155,4 +158,4 @@ public class DeviceChooserActivity extends Activity { new Intent().putExtra(CompanionDeviceManager.EXTRA_DEVICE, selectedDevice.device)); finish(); } -} \ No newline at end of file +} From 6a5777dd5020378507b97511925a0369f8f408b4 Mon Sep 17 00:00:00 2001 From: Eugene Susla Date: Fri, 4 Dec 2020 16:01:46 -0800 Subject: [PATCH 012/288] RESTRICT AUTOMERGE Allow CDM to hide overlays Since CDM has sensitive user consent UIs, it should be able to hide non-system overlays Test: use a 3p overlay app with a visible overlay to ensure overlay disappears when CDM is shown Bug: 171221090 Change-Id: I3274cb7f03f63e1fa99a9ca06759972ce2a51309 --- packages/CompanionDeviceManager/AndroidManifest.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/CompanionDeviceManager/AndroidManifest.xml b/packages/CompanionDeviceManager/AndroidManifest.xml index 34bc4ebcd0aa2..2224dfc6a81ba 100644 --- a/packages/CompanionDeviceManager/AndroidManifest.xml +++ b/packages/CompanionDeviceManager/AndroidManifest.xml @@ -28,6 +28,7 @@ + Date: Mon, 19 Oct 2020 19:37:30 +0100 Subject: [PATCH 013/288] Enforce BACKUP permission on Service end. BackupManager runs in the client process, whereas BackupManagerService runs in the system server process. Therefore, apps permissions need should be enforced on the service side. Bug: 158482162 Test: Manually checked that a sample app encounters SecurityException after but not before this CL, when running code similar to the sample in http://b/158482162#comment1 to figure out whether isBackupServiceActive() for its own uid. Change-Id: I59693819542a80a065a9c88373393b0ba0dbef65 Merged-In: I59693819542a80a065a9c88373393b0ba0dbef65 (cherry picked from commit b2ab2c414fcac5f68edd8d790d3773f1f9330e3b) --- core/java/android/app/backup/BackupManager.java | 2 -- .../java/com/android/server/backup/BackupManagerService.java | 2 ++ 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/java/android/app/backup/BackupManager.java b/core/java/android/app/backup/BackupManager.java index 3bc043ee09126..56e9c36fe4b4c 100644 --- a/core/java/android/app/backup/BackupManager.java +++ b/core/java/android/app/backup/BackupManager.java @@ -401,8 +401,6 @@ public class BackupManager { @SystemApi @RequiresPermission(android.Manifest.permission.BACKUP) public boolean isBackupServiceActive(UserHandle user) { - mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP, - "isBackupServiceActive"); checkServiceBinder(); if (sService != null) { try { diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java index b13bef2de1512..19ada753f33d7 100644 --- a/services/backup/java/com/android/server/backup/BackupManagerService.java +++ b/services/backup/java/com/android/server/backup/BackupManagerService.java @@ -506,6 +506,8 @@ public class BackupManagerService extends IBackupManager.Stub { */ @Override public boolean isBackupServiceActive(int userId) { + mContext.enforceCallingPermission(android.Manifest.permission.BACKUP, + "isBackupServiceActive"); synchronized (mStateLock) { return !mGlobalDisable && isBackupActivatedForUser(userId); } From b50cdde5f009ca1e8a548605c8b364d860110b67 Mon Sep 17 00:00:00 2001 From: Tobias Thierer Date: Mon, 19 Oct 2020 19:37:30 +0100 Subject: [PATCH 014/288] BackupManagerService: Make new behavior conditional on ChangeId. Base CL ag/12885739 introduced unconditional enforcement of the BACKUP permission for callers of BackupManagerService.isBackupServiceActive() in the service, but dropped the enforcement on the app process side (BackupManager). This CL makes the behavior change conditional on a compat ChangeId. Bug: 158482162 Test: Manually checked that an app similar to the code sample from http://b/158482162#comment1 can reproduce the behavior. This is true both before the base CL and after this CL, when the app targets an old SDK version (26). Test: Checked that both (a) before this CL, (b) after this CL where the change is manually enabled for the app via the below commands, the app runs into a SecurityException instead: $ adb shell am compat enable 158482162 com.example.tester $ adb shell dumpsys platform_compat | grep 158482162 ChangeId(158482162; name=IS_BACKUP_SERVICE_ACTIVE_ENFORCE_PERMISSION_IN_SERVICE; enableSinceTargetSdk=31; packageOverrides={com.example.tester=true}) Change-Id: I58e5d2a0b438296137fd76720636c8fdce740ded Merged-In: I58e5d2a0b438296137fd76720636c8fdce740ded (cherry picked from commit 7671f0d95c7e92a2342ed05a053a38d8aa16a17f) --- .../android/app/backup/BackupManager.java | 20 +++++++++++++++++++ .../server/backup/BackupManagerService.java | 9 +++++++-- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/core/java/android/app/backup/BackupManager.java b/core/java/android/app/backup/BackupManager.java index 56e9c36fe4b4c..acaea5fdd6098 100644 --- a/core/java/android/app/backup/BackupManager.java +++ b/core/java/android/app/backup/BackupManager.java @@ -21,10 +21,14 @@ import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.annotation.TestApi; +import android.app.compat.CompatChanges; +import android.compat.annotation.ChangeId; +import android.compat.annotation.EnabledAfter; import android.compat.annotation.UnsupportedAppUsage; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Message; @@ -391,6 +395,17 @@ public class BackupManager { return false; } + + /** + * If this change is enabled, the {@code BACKUP} permission needed for + * {@code isBackupServiceActive()} will be enforced on the service end + * rather than client-side in {@link BackupManager}. + * @hide + */ + @ChangeId + @EnabledAfter(targetSdkVersion = Build.VERSION_CODES.R) + public static final long IS_BACKUP_SERVICE_ACTIVE_ENFORCE_PERMISSION_IN_SERVICE = 158482162; + /** * Report whether the backup mechanism is currently active. * When it is inactive, the device will not perform any backup operations, nor will it @@ -401,6 +416,11 @@ public class BackupManager { @SystemApi @RequiresPermission(android.Manifest.permission.BACKUP) public boolean isBackupServiceActive(UserHandle user) { + if (!CompatChanges.isChangeEnabled( + IS_BACKUP_SERVICE_ACTIVE_ENFORCE_PERMISSION_IN_SERVICE)) { + mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP, + "isBackupServiceActive"); + } checkServiceBinder(); if (sService != null) { try { diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java index 19ada753f33d7..445297a839ba6 100644 --- a/services/backup/java/com/android/server/backup/BackupManagerService.java +++ b/services/backup/java/com/android/server/backup/BackupManagerService.java @@ -30,6 +30,7 @@ import android.app.backup.IBackupObserver; import android.app.backup.IFullBackupRestoreObserver; import android.app.backup.IRestoreSession; import android.app.backup.ISelectBackupTransportCallback; +import android.app.compat.CompatChanges; import android.app.job.JobParameters; import android.app.job.JobScheduler; import android.app.job.JobService; @@ -506,8 +507,12 @@ public class BackupManagerService extends IBackupManager.Stub { */ @Override public boolean isBackupServiceActive(int userId) { - mContext.enforceCallingPermission(android.Manifest.permission.BACKUP, - "isBackupServiceActive"); + int callingUid = Binder.getCallingUid(); + if (CompatChanges.isChangeEnabled( + BackupManager.IS_BACKUP_SERVICE_ACTIVE_ENFORCE_PERMISSION_IN_SERVICE, callingUid)) { + mContext.enforceCallingPermission(android.Manifest.permission.BACKUP, + "isBackupServiceActive"); + } synchronized (mStateLock) { return !mGlobalDisable && isBackupActivatedForUser(userId); } From d8b61b515938cecd441fae16fc001f1e49274780 Mon Sep 17 00:00:00 2001 From: Tobias Thierer Date: Thu, 10 Dec 2020 13:46:08 +0000 Subject: [PATCH 015/288] Fix DevicePolicyManager.isBackupServiceEnabled() breakage. http://ag/12885739 introduced a enforceCallingPermission(BACKUP) check but callers of this API do not hold that permission. This CL fixes this by changing the check to enforceCallingOrSelfPermission(BACKUP), and clearing the binder identity in DevicePolicyManagerService, which makes the system server process the owner of that call. Bug: 158482162 Bug: 172466964 Test: atest com.android.cts.devicepolicy.{Device,Profile}OwnerTest#testBackupServiceEnabling Change-Id: I11d863229c4d62a058aaf37446a694b9c73ae5b8 Merged-In: I11d863229c4d62a058aaf37446a694b9c73ae5b8 (cherry picked from commit 630dec9eb496bc70db44c4f0b4196ea91e7df6cb) --- .../server/backup/BackupManagerService.java | 2 +- .../DevicePolicyManagerService.java | 18 ++++++++++-------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java index 445297a839ba6..89a6eca8fdaad 100644 --- a/services/backup/java/com/android/server/backup/BackupManagerService.java +++ b/services/backup/java/com/android/server/backup/BackupManagerService.java @@ -510,7 +510,7 @@ public class BackupManagerService extends IBackupManager.Stub { int callingUid = Binder.getCallingUid(); if (CompatChanges.isChangeEnabled( BackupManager.IS_BACKUP_SERVICE_ACTIVE_ENFORCE_PERMISSION_IN_SERVICE, callingUid)) { - mContext.enforceCallingPermission(android.Manifest.permission.BACKUP, + mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP, "isBackupServiceActive"); } synchronized (mStateLock) { diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index ce3cdeab232a5..33a346d1ac9b4 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -14438,15 +14438,17 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } enforceProfileOrDeviceOwner(admin); - synchronized (getLockObject()) { - try { - IBackupManager ibm = mInjector.getIBackupManager(); - return ibm != null && ibm.isBackupServiceActive( - mInjector.userHandleGetCallingUserId()); - } catch (RemoteException e) { - throw new IllegalStateException("Failed requesting backup service state.", e); + final int userId = mInjector.userHandleGetCallingUserId(); + return mInjector.binderWithCleanCallingIdentity(() -> { + synchronized (getLockObject()) { + try { + IBackupManager ibm = mInjector.getIBackupManager(); + return ibm != null && ibm.isBackupServiceActive(userId); + } catch (RemoteException e) { + throw new IllegalStateException("Failed requesting backup service state.", e); + } } - } + }); } @Override From 638ebb32547a75cdc94a27acb3731e5a89434448 Mon Sep 17 00:00:00 2001 From: Evan Laird Date: Wed, 30 Sep 2020 15:04:37 -0400 Subject: [PATCH 016/288] Listen for EXTRA_PRESENT changes ACTION_BATTERY_CHANGED can pass a boolean EXTRA_PRESENT which would alert listeners that a battery may or may not be present. SystemUI now wants to show an error battery state instead of a potentially misleading status in this situation. Bug: 169935148 Test: adb shell cmd battery set present 1 Change-Id: I7d576248bb9931059100facb67ca6b46e81e554e Merged-In: I7d576248bb9931059100facb67ca6b46e81e554e --- .../settingslib/fuelgauge/BatteryStatus.java | 6 +- .../res/drawable/ic_battery_unknown.xml | 24 +++ packages/SystemUI/res/values/config.xml | 5 + packages/SystemUI/res/values/strings.xml | 9 + .../keyguard/KeyguardUpdateMonitor.java | 9 +- .../android/systemui/BatteryMeterView.java | 51 +++++- .../com/android/systemui/SystemUIService.java | 11 +- .../KeyguardIndicationController.java | 160 ++++++++++-------- .../statusbar/policy/BatteryController.java | 3 + .../policy/BatteryControllerImpl.java | 28 +++ .../statusbar/policy/BatteryStateNotifier.kt | 90 ++++++++++ .../KeyguardIndicationControllerTest.java | 15 +- .../policy/BatteryControllerTest.java | 37 ++++ .../policy/BatteryStateNotifierTest.kt | 81 +++++++++ 14 files changed, 446 insertions(+), 83 deletions(-) create mode 100644 packages/SystemUI/res/drawable/ic_battery_unknown.xml create mode 100644 packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryStateNotifier.kt create mode 100644 packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryStateNotifierTest.kt diff --git a/packages/SettingsLib/src/com/android/settingslib/fuelgauge/BatteryStatus.java b/packages/SettingsLib/src/com/android/settingslib/fuelgauge/BatteryStatus.java index ce60fafaa31b7..b3205d7563b2c 100644 --- a/packages/SettingsLib/src/com/android/settingslib/fuelgauge/BatteryStatus.java +++ b/packages/SettingsLib/src/com/android/settingslib/fuelgauge/BatteryStatus.java @@ -25,6 +25,7 @@ import static android.os.BatteryManager.EXTRA_LEVEL; import static android.os.BatteryManager.EXTRA_MAX_CHARGING_CURRENT; import static android.os.BatteryManager.EXTRA_MAX_CHARGING_VOLTAGE; import static android.os.BatteryManager.EXTRA_PLUGGED; +import static android.os.BatteryManager.EXTRA_PRESENT; import static android.os.BatteryManager.EXTRA_STATUS; import android.content.Context; @@ -50,14 +51,16 @@ public class BatteryStatus { public final int plugged; public final int health; public final int maxChargingWattage; + public final boolean present; public BatteryStatus(int status, int level, int plugged, int health, - int maxChargingWattage) { + int maxChargingWattage, boolean present) { this.status = status; this.level = level; this.plugged = plugged; this.health = health; this.maxChargingWattage = maxChargingWattage; + this.present = present; } public BatteryStatus(Intent batteryChangedIntent) { @@ -65,6 +68,7 @@ public class BatteryStatus { plugged = batteryChangedIntent.getIntExtra(EXTRA_PLUGGED, 0); level = batteryChangedIntent.getIntExtra(EXTRA_LEVEL, 0); health = batteryChangedIntent.getIntExtra(EXTRA_HEALTH, BATTERY_HEALTH_UNKNOWN); + present = batteryChangedIntent.getBooleanExtra(EXTRA_PRESENT, true); final int maxChargingMicroAmp = batteryChangedIntent.getIntExtra(EXTRA_MAX_CHARGING_CURRENT, -1); diff --git a/packages/SystemUI/res/drawable/ic_battery_unknown.xml b/packages/SystemUI/res/drawable/ic_battery_unknown.xml new file mode 100644 index 0000000000000..8b2ba12fe0bef --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_battery_unknown.xml @@ -0,0 +1,24 @@ + + + + diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index 5e5df6bfd9880..9530a74d0ece2 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -579,4 +579,9 @@ 320 1.25 + + + false + + diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 824521ecd1e76..174f5c737d147 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -437,6 +437,8 @@ Battery three bars. Battery full. + + Battery percentage unknown. No phone. @@ -2870,4 +2872,11 @@ Couldn\'t connect. Try again. Pair new device + + + Problem reading your battery meter + + Tap for more information diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index 60cd24019b973..deaa4255c2f1e 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -1696,7 +1696,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab } // Take a guess at initial SIM state, battery status and PLMN until we get an update - mBatteryStatus = new BatteryStatus(BATTERY_STATUS_UNKNOWN, 100, 0, 0, 0); + mBatteryStatus = new BatteryStatus(BATTERY_STATUS_UNKNOWN, 100, 0, 0, 0, true); // Watch for interesting updates final IntentFilter filter = new IntentFilter(); @@ -2563,6 +2563,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab final boolean wasPluggedIn = old.isPluggedIn(); final boolean stateChangedWhilePluggedIn = wasPluggedIn && nowPluggedIn && (old.status != current.status); + final boolean nowPresent = current.present; + final boolean wasPresent = old.present; // change in plug state is always interesting if (wasPluggedIn != nowPluggedIn || stateChangedWhilePluggedIn) { @@ -2584,6 +2586,11 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab return true; } + // Battery either showed up or disappeared + if (wasPresent != nowPresent) { + return true; + } + return false; } diff --git a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java index a46ab3a9e35b6..fc30be416c0f9 100644 --- a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java +++ b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java @@ -33,6 +33,7 @@ import android.content.res.Resources; import android.content.res.TypedArray; import android.database.ContentObserver; import android.graphics.Rect; +import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Handler; import android.provider.Settings; @@ -95,12 +96,15 @@ public class BatteryMeterView extends LinearLayout implements private int mTextColor; private int mLevel; private int mShowPercentMode = MODE_DEFAULT; - private boolean mForceShowPercent; private boolean mShowPercentAvailable; // Some places may need to show the battery conditionally, and not obey the tuner private boolean mIgnoreTunerUpdates; private boolean mIsSubscribedForTunerUpdates; private boolean mCharging; + // Error state where we know nothing about the current battery state + private boolean mBatteryStateUnknown; + // Lazily-loaded since this is expected to be a rare-if-ever state + private Drawable mUnknownStateDrawable; private DualToneHandler mDualToneHandler; private int mUser; @@ -350,6 +354,11 @@ public class BatteryMeterView extends LinearLayout implements } private void updatePercentText() { + if (mBatteryStateUnknown) { + setContentDescription(getContext().getString(R.string.accessibility_battery_unknown)); + return; + } + if (mBatteryController == null) { return; } @@ -390,9 +399,13 @@ public class BatteryMeterView extends LinearLayout implements final boolean systemSetting = 0 != whitelistIpcs(() -> Settings.System .getIntForUser(getContext().getContentResolver(), SHOW_BATTERY_PERCENT, 0, mUser)); + boolean shouldShow = + (mShowPercentAvailable && systemSetting && mShowPercentMode != MODE_OFF) + || mShowPercentMode == MODE_ON + || mShowPercentMode == MODE_ESTIMATE; + shouldShow = shouldShow && !mBatteryStateUnknown; - if ((mShowPercentAvailable && systemSetting && mShowPercentMode != MODE_OFF) - || mShowPercentMode == MODE_ON || mShowPercentMode == MODE_ESTIMATE) { + if (shouldShow) { if (!showing) { mBatteryPercentView = loadPercentView(); if (mPercentageStyleId != 0) { // Only set if specified as attribute @@ -418,6 +431,32 @@ public class BatteryMeterView extends LinearLayout implements scaleBatteryMeterViews(); } + private Drawable getUnknownStateDrawable() { + if (mUnknownStateDrawable == null) { + mUnknownStateDrawable = mContext.getDrawable(R.drawable.ic_battery_unknown); + mUnknownStateDrawable.setTint(mTextColor); + } + + return mUnknownStateDrawable; + } + + @Override + public void onBatteryUnknownStateChanged(boolean isUnknown) { + if (mBatteryStateUnknown == isUnknown) { + return; + } + + mBatteryStateUnknown = isUnknown; + + if (mBatteryStateUnknown) { + mBatteryIconView.setImageDrawable(getUnknownStateDrawable()); + } else { + mBatteryIconView.setImageDrawable(mDrawable); + } + + updateShowPercent(); + } + /** * Looks up the scale factor for status bar icons and scales the battery view by that amount. */ @@ -458,6 +497,10 @@ public class BatteryMeterView extends LinearLayout implements if (mBatteryPercentView != null) { mBatteryPercentView.setTextColor(singleToneColor); } + + if (mUnknownStateDrawable != null) { + mUnknownStateDrawable.setTint(singleToneColor); + } } public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { @@ -467,8 +510,8 @@ public class BatteryMeterView extends LinearLayout implements pw.println(" mDrawable.getPowerSave: " + powerSave); pw.println(" mBatteryPercentView.getText(): " + percent); pw.println(" mTextColor: #" + Integer.toHexString(mTextColor)); + pw.println(" mBatteryStateUnknown: " + mBatteryStateUnknown); pw.println(" mLevel: " + mLevel); - pw.println(" mForceShowPercent: " + mForceShowPercent); } private final class SettingObserver extends ContentObserver { diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIService.java b/packages/SystemUI/src/com/android/systemui/SystemUIService.java index 708002d5b9460..1f41038c260fa 100644 --- a/packages/SystemUI/src/com/android/systemui/SystemUIService.java +++ b/packages/SystemUI/src/com/android/systemui/SystemUIService.java @@ -32,6 +32,7 @@ import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dump.DumpHandler; import com.android.systemui.dump.LogBufferFreezer; import com.android.systemui.dump.SystemUIAuxiliaryDumpService; +import com.android.systemui.statusbar.policy.BatteryStateNotifier; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -44,18 +45,21 @@ public class SystemUIService extends Service { private final DumpHandler mDumpHandler; private final BroadcastDispatcher mBroadcastDispatcher; private final LogBufferFreezer mLogBufferFreezer; + private final BatteryStateNotifier mBatteryStateNotifier; @Inject public SystemUIService( @Main Handler mainHandler, DumpHandler dumpHandler, BroadcastDispatcher broadcastDispatcher, - LogBufferFreezer logBufferFreezer) { + LogBufferFreezer logBufferFreezer, + BatteryStateNotifier batteryStateNotifier) { super(); mMainHandler = mainHandler; mDumpHandler = dumpHandler; mBroadcastDispatcher = broadcastDispatcher; mLogBufferFreezer = logBufferFreezer; + mBatteryStateNotifier = batteryStateNotifier; } @Override @@ -68,6 +72,11 @@ public class SystemUIService extends Service { // Finish initializing dump logic mLogBufferFreezer.attach(mBroadcastDispatcher); + // If configured, set up a battery notification + if (getResources().getBoolean(R.bool.config_showNotificationForUnknownBatteryState)) { + mBatteryStateNotifier.startListening(); + } + // For debugging RescueParty if (Build.IS_DEBUGGABLE && SystemProperties.getBoolean("debug.crash_sysui", false)) { throw new RuntimeException(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java index 39d2f71e7e0bd..155ec5ea72de2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java @@ -123,6 +123,7 @@ public class KeyguardIndicationController implements StateListener, private int mChargingSpeed; private int mChargingWattage; private int mBatteryLevel; + private boolean mBatteryPresent = true; private long mChargingTimeRemaining; private float mDisclosureMaxAlpha; private String mMessageToShowOnScreenOn; @@ -391,86 +392,103 @@ public class KeyguardIndicationController implements StateListener, mWakeLock.setAcquired(false); } - if (mVisible) { - // Walk down a precedence-ordered list of what indication - // should be shown based on user or device state - if (mDozing) { - // When dozing we ignore any text color and use white instead, because - // colors can be hard to read in low brightness. - mTextView.setTextColor(Color.WHITE); - if (!TextUtils.isEmpty(mTransientIndication)) { - mTextView.switchIndication(mTransientIndication); - } else if (!TextUtils.isEmpty(mAlignmentIndication)) { - mTextView.switchIndication(mAlignmentIndication); - mTextView.setTextColor(mContext.getColor(R.color.misalignment_text_color)); - } else if (mPowerPluggedIn || mEnableBatteryDefender) { - String indication = computePowerIndication(); - if (animate) { - animateText(mTextView, indication); - } else { - mTextView.switchIndication(indication); - } - } else { - String percentage = NumberFormat.getPercentInstance() - .format(mBatteryLevel / 100f); - mTextView.switchIndication(percentage); - } - return; - } + if (!mVisible) { + return; + } - int userId = KeyguardUpdateMonitor.getCurrentUser(); - String trustGrantedIndication = getTrustGrantedIndication(); - String trustManagedIndication = getTrustManagedIndication(); + // A few places might need to hide the indication, so always start by making it visible + mIndicationArea.setVisibility(View.VISIBLE); - String powerIndication = null; - if (mPowerPluggedIn || mEnableBatteryDefender) { - powerIndication = computePowerIndication(); - } - - boolean isError = false; - if (!mKeyguardUpdateMonitor.isUserUnlocked(userId)) { - mTextView.switchIndication(com.android.internal.R.string.lockscreen_storage_locked); - } else if (!TextUtils.isEmpty(mTransientIndication)) { - if (powerIndication != null && !mTransientIndication.equals(powerIndication)) { - String indication = mContext.getResources().getString( - R.string.keyguard_indication_trust_unlocked_plugged_in, - mTransientIndication, powerIndication); - mTextView.switchIndication(indication); - } else { - mTextView.switchIndication(mTransientIndication); - } - isError = mTransientTextIsError; - } else if (!TextUtils.isEmpty(trustGrantedIndication) - && mKeyguardUpdateMonitor.getUserHasTrust(userId)) { - if (powerIndication != null) { - String indication = mContext.getResources().getString( - R.string.keyguard_indication_trust_unlocked_plugged_in, - trustGrantedIndication, powerIndication); - mTextView.switchIndication(indication); - } else { - mTextView.switchIndication(trustGrantedIndication); - } + // Walk down a precedence-ordered list of what indication + // should be shown based on user or device state + if (mDozing) { + // When dozing we ignore any text color and use white instead, because + // colors can be hard to read in low brightness. + mTextView.setTextColor(Color.WHITE); + if (!TextUtils.isEmpty(mTransientIndication)) { + mTextView.switchIndication(mTransientIndication); + } else if (!mBatteryPresent) { + // If there is no battery detected, hide the indication and bail + mIndicationArea.setVisibility(View.GONE); } else if (!TextUtils.isEmpty(mAlignmentIndication)) { mTextView.switchIndication(mAlignmentIndication); - isError = true; + mTextView.setTextColor(mContext.getColor(R.color.misalignment_text_color)); } else if (mPowerPluggedIn || mEnableBatteryDefender) { - if (DEBUG_CHARGING_SPEED) { - powerIndication += ", " + (mChargingWattage / 1000) + " mW"; - } + String indication = computePowerIndication(); if (animate) { - animateText(mTextView, powerIndication); + animateText(mTextView, indication); } else { - mTextView.switchIndication(powerIndication); + mTextView.switchIndication(indication); } - } else if (!TextUtils.isEmpty(trustManagedIndication) - && mKeyguardUpdateMonitor.getUserTrustIsManaged(userId) - && !mKeyguardUpdateMonitor.getUserHasTrust(userId)) { - mTextView.switchIndication(trustManagedIndication); } else { - mTextView.switchIndication(mRestingIndication); + String percentage = NumberFormat.getPercentInstance() + .format(mBatteryLevel / 100f); + mTextView.switchIndication(percentage); } - mTextView.setTextColor(isError ? Utils.getColorError(mContext) - : mInitialTextColorState); + return; + } + + int userId = KeyguardUpdateMonitor.getCurrentUser(); + String trustGrantedIndication = getTrustGrantedIndication(); + String trustManagedIndication = getTrustManagedIndication(); + + String powerIndication = null; + if (mPowerPluggedIn || mEnableBatteryDefender) { + powerIndication = computePowerIndication(); + } + + // Some cases here might need to hide the indication (if the battery is not present) + boolean hideIndication = false; + boolean isError = false; + if (!mKeyguardUpdateMonitor.isUserUnlocked(userId)) { + mTextView.switchIndication(com.android.internal.R.string.lockscreen_storage_locked); + } else if (!TextUtils.isEmpty(mTransientIndication)) { + if (powerIndication != null && !mTransientIndication.equals(powerIndication)) { + String indication = mContext.getResources().getString( + R.string.keyguard_indication_trust_unlocked_plugged_in, + mTransientIndication, powerIndication); + mTextView.switchIndication(indication); + hideIndication = !mBatteryPresent; + } else { + mTextView.switchIndication(mTransientIndication); + } + isError = mTransientTextIsError; + } else if (!TextUtils.isEmpty(trustGrantedIndication) + && mKeyguardUpdateMonitor.getUserHasTrust(userId)) { + if (powerIndication != null) { + String indication = mContext.getResources().getString( + R.string.keyguard_indication_trust_unlocked_plugged_in, + trustGrantedIndication, powerIndication); + mTextView.switchIndication(indication); + hideIndication = !mBatteryPresent; + } else { + mTextView.switchIndication(trustGrantedIndication); + } + } else if (!TextUtils.isEmpty(mAlignmentIndication)) { + mTextView.switchIndication(mAlignmentIndication); + isError = true; + hideIndication = !mBatteryPresent; + } else if (mPowerPluggedIn || mEnableBatteryDefender) { + if (DEBUG_CHARGING_SPEED) { + powerIndication += ", " + (mChargingWattage / 1000) + " mW"; + } + if (animate) { + animateText(mTextView, powerIndication); + } else { + mTextView.switchIndication(powerIndication); + } + hideIndication = !mBatteryPresent; + } else if (!TextUtils.isEmpty(trustManagedIndication) + && mKeyguardUpdateMonitor.getUserTrustIsManaged(userId) + && !mKeyguardUpdateMonitor.getUserHasTrust(userId)) { + mTextView.switchIndication(trustManagedIndication); + } else { + mTextView.switchIndication(mRestingIndication); + } + mTextView.setTextColor(isError ? Utils.getColorError(mContext) + : mInitialTextColorState); + if (hideIndication) { + mIndicationArea.setVisibility(View.GONE); } } @@ -654,6 +672,7 @@ public class KeyguardIndicationController implements StateListener, pw.println(" mMessageToShowOnScreenOn: " + mMessageToShowOnScreenOn); pw.println(" mDozing: " + mDozing); pw.println(" mBatteryLevel: " + mBatteryLevel); + pw.println(" mBatteryPresent: " + mBatteryPresent); pw.println(" mTextView.getText(): " + (mTextView == null ? null : mTextView.getText())); pw.println(" computePowerIndication(): " + computePowerIndication()); } @@ -694,6 +713,7 @@ public class KeyguardIndicationController implements StateListener, mBatteryLevel = status.level; mBatteryOverheated = status.isOverheated(); mEnableBatteryDefender = mBatteryOverheated && status.isPluggedIn(); + mBatteryPresent = status.present; try { mChargingTimeRemaining = mPowerPluggedIn ? mBatteryInfo.computeChargeTimeRemaining() : -1; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java index e5a46797d0356..5009fce5216d4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java @@ -97,6 +97,9 @@ public interface BatteryController extends DemoMode, Dumpable, default void onPowerSaveChanged(boolean isPowerSave) { } + default void onBatteryUnknownStateChanged(boolean isUnknown) { + } + default void onReverseChanged(boolean isReverse, int level, String name) { } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java index d30f01a658f6b..ea79c246f0145 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java @@ -16,6 +16,8 @@ package com.android.systemui.statusbar.policy; +import static android.os.BatteryManager.EXTRA_PRESENT; + import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; @@ -70,6 +72,7 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC protected int mLevel; protected boolean mPluggedIn; protected boolean mCharging; + private boolean mStateUnknown = false; private boolean mCharged; protected boolean mPowerSave; private boolean mAodPowerSave; @@ -126,6 +129,7 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC pw.print(" mCharging="); pw.println(mCharging); pw.print(" mCharged="); pw.println(mCharged); pw.print(" mPowerSave="); pw.println(mPowerSave); + pw.print(" mStateUnknown="); pw.println(mStateUnknown); } @Override @@ -139,8 +143,11 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC mChangeCallbacks.add(cb); } if (!mHasReceivedBattery) return; + + // Make sure new callbacks get the correct initial state cb.onBatteryLevelChanged(mLevel, mPluggedIn, mCharging); cb.onPowerSaveChanged(mPowerSave); + cb.onBatteryUnknownStateChanged(mStateUnknown); } @Override @@ -168,6 +175,13 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC mWirelessCharging = mCharging && intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0) == BatteryManager.BATTERY_PLUGGED_WIRELESS; + boolean present = intent.getBooleanExtra(EXTRA_PRESENT, true); + boolean unknown = !present; + if (unknown != mStateUnknown) { + mStateUnknown = unknown; + fireBatteryUnknownStateChanged(); + } + fireBatteryLevelChanged(); } else if (action.equals(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED)) { updatePowerSave(); @@ -316,6 +330,15 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC } } + private void fireBatteryUnknownStateChanged() { + synchronized (mChangeCallbacks) { + final int n = mChangeCallbacks.size(); + for (int i = 0; i < n; i++) { + mChangeCallbacks.get(i).onBatteryUnknownStateChanged(mStateUnknown); + } + } + } + private void firePowerSaveChanged() { synchronized (mChangeCallbacks) { final int N = mChangeCallbacks.size(); @@ -340,6 +363,7 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC String level = args.getString("level"); String plugged = args.getString("plugged"); String powerSave = args.getString("powersave"); + String present = args.getString("present"); if (level != null) { mLevel = Math.min(Math.max(Integer.parseInt(level), 0), 100); } @@ -350,6 +374,10 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC mPowerSave = powerSave.equals("true"); firePowerSaveChanged(); } + if (present != null) { + mStateUnknown = !present.equals("true"); + fireBatteryUnknownStateChanged(); + } fireBatteryLevelChanged(); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryStateNotifier.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryStateNotifier.kt new file mode 100644 index 0000000000000..92e5b78f776a4 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryStateNotifier.kt @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.policy + +import android.app.Notification +import android.app.NotificationChannel +import android.app.NotificationManager +import android.app.PendingIntent +import android.content.Context +import android.content.Intent +import android.net.Uri +import com.android.systemui.R +import com.android.systemui.util.concurrency.DelayableExecutor +import javax.inject.Inject + +/** + * Listens for important battery states and sends non-dismissible system notifications if there is a + * problem + */ +class BatteryStateNotifier @Inject constructor( + val controller: BatteryController, + val noMan: NotificationManager, + val delayableExecutor: DelayableExecutor, + val context: Context +) : BatteryController.BatteryStateChangeCallback { + var stateUnknown = false + + fun startListening() { + controller.addCallback(this) + } + + fun stopListening() { + controller.removeCallback(this) + } + + override fun onBatteryUnknownStateChanged(isUnknown: Boolean) { + stateUnknown = isUnknown + if (stateUnknown) { + val channel = NotificationChannel("battery_status", "Battery status", + NotificationManager.IMPORTANCE_DEFAULT) + noMan.createNotificationChannel(channel) + + val intent = Intent(Intent.ACTION_VIEW, + Uri.parse(context.getString(R.string.config_batteryStateUnknownUrl))) + val pi = PendingIntent.getActivity(context, 0, intent, 0) + + val builder = Notification.Builder(context, channel.id) + .setAutoCancel(false) + .setContentTitle( + context.getString(R.string.battery_state_unknown_notification_title)) + .setContentText( + context.getString(R.string.battery_state_unknown_notification_text)) + .setSmallIcon(com.android.internal.R.drawable.stat_sys_adb) + .setContentIntent(pi) + .setAutoCancel(true) + .setOngoing(true) + + noMan.notify(TAG, ID, builder.build()) + } else { + scheduleNotificationCancel() + } + } + + private fun scheduleNotificationCancel() { + val r = { + if (!stateUnknown) { + noMan.cancel(ID) + } + } + delayableExecutor.executeDelayed(r, DELAY_MILLIS) + } +} + +private const val TAG = "BatteryStateNotifier" +private const val ID = 666 +private const val DELAY_MILLIS: Long = 4 * 60 * 60 * 1000 \ No newline at end of file diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java index 052f3382099f6..91144be7347d1 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java @@ -495,7 +495,7 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase { createController(); BatteryStatus status = new BatteryStatus(BatteryManager.BATTERY_STATUS_CHARGING, 80 /* level */, BatteryManager.BATTERY_PLUGGED_WIRELESS, 100 /* health */, - 0 /* maxChargingWattage */); + 0 /* maxChargingWattage */, true /* present */); mController.getKeyguardCallback().onRefreshBatteryInfo(status); verify(mIBatteryStats).computeChargeTimeRemaining(); @@ -507,7 +507,7 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase { createController(); BatteryStatus status = new BatteryStatus(BatteryManager.BATTERY_STATUS_CHARGING, 80 /* level */, 0 /* plugged */, 100 /* health */, - 0 /* maxChargingWattage */); + 0 /* maxChargingWattage */, true /* present */); mController.getKeyguardCallback().onRefreshBatteryInfo(status); verify(mIBatteryStats, never()).computeChargeTimeRemaining(); @@ -553,7 +553,8 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase { createController(); BatteryStatus status = new BatteryStatus(BatteryManager.BATTERY_STATUS_CHARGING, 80 /* level */, BatteryManager.BATTERY_PLUGGED_AC, - BatteryManager.BATTERY_HEALTH_OVERHEAT, 0 /* maxChargingWattage */); + BatteryManager.BATTERY_HEALTH_OVERHEAT, 0 /* maxChargingWattage */, + true /* present */); mController.getKeyguardCallback().onRefreshBatteryInfo(status); mController.setVisible(true); @@ -569,7 +570,8 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase { createController(); BatteryStatus status = new BatteryStatus(BatteryManager.BATTERY_STATUS_DISCHARGING, 80 /* level */, BatteryManager.BATTERY_PLUGGED_AC, - BatteryManager.BATTERY_HEALTH_OVERHEAT, 0 /* maxChargingWattage */); + BatteryManager.BATTERY_HEALTH_OVERHEAT, 0 /* maxChargingWattage */, + true /* present */); mController.getKeyguardCallback().onRefreshBatteryInfo(status); mController.setVisible(true); @@ -585,7 +587,8 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase { createController(); BatteryStatus status = new BatteryStatus(BatteryManager.BATTERY_STATUS_CHARGING, 100 /* level */, BatteryManager.BATTERY_PLUGGED_AC, - BatteryManager.BATTERY_HEALTH_OVERHEAT, 0 /* maxChargingWattage */); + BatteryManager.BATTERY_HEALTH_OVERHEAT, 0 /* maxChargingWattage */, + true /* present */); mController.getKeyguardCallback().onRefreshBatteryInfo(status); mController.setVisible(true); @@ -599,7 +602,7 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase { createController(); BatteryStatus status = new BatteryStatus(BatteryManager.BATTERY_STATUS_DISCHARGING, 90 /* level */, 0 /* plugged */, BatteryManager.BATTERY_HEALTH_OVERHEAT, - 0 /* maxChargingWattage */); + 0 /* maxChargingWattage */, true /* present */); mController.getKeyguardCallback().onRefreshBatteryInfo(status); mController.setDozing(true); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerTest.java index eca48c8c2ee12..e985a61c7a56e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerTest.java @@ -16,7 +16,11 @@ package com.android.systemui.statusbar.policy; +import static android.os.BatteryManager.EXTRA_PRESENT; + +import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.Intent; @@ -30,6 +34,7 @@ import android.testing.TestableLooper; import com.android.systemui.SysuiTestCase; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.power.EnhancedEstimates; +import com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback; import org.junit.Assert; import org.junit.Before; @@ -93,4 +98,36 @@ public class BatteryControllerTest extends SysuiTestCase { Assert.assertFalse(mBatteryController.isAodPowerSave()); } + @Test + public void testBatteryPresentState_notPresent() { + // GIVEN a battery state callback listening for changes + BatteryStateChangeCallback cb = mock(BatteryStateChangeCallback.class); + mBatteryController.addCallback(cb); + + // WHEN the state of the battery becomes unknown + Intent i = new Intent(Intent.ACTION_BATTERY_CHANGED); + i.putExtra(EXTRA_PRESENT, false); + mBatteryController.onReceive(getContext(), i); + + // THEN the callback is notified + verify(cb, atLeastOnce()).onBatteryUnknownStateChanged(true); + } + + @Test + public void testBatteryPresentState_callbackAddedAfterStateChange() { + // GIVEN a battery state callback + BatteryController.BatteryStateChangeCallback cb = + mock(BatteryController.BatteryStateChangeCallback.class); + + // GIVEN the state has changed before adding a new callback + Intent i = new Intent(Intent.ACTION_BATTERY_CHANGED); + i.putExtra(EXTRA_PRESENT, false); + mBatteryController.onReceive(getContext(), i); + + // WHEN a callback is added + mBatteryController.addCallback(cb); + + // THEN it is informed about the battery state + verify(cb, atLeastOnce()).onBatteryUnknownStateChanged(true); + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryStateNotifierTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryStateNotifierTest.kt new file mode 100644 index 0000000000000..dcd57f137d713 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryStateNotifierTest.kt @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.policy + +import android.app.NotificationManager +import android.testing.AndroidTestingRunner +import android.testing.TestableLooper.RunWithLooper + +import androidx.test.filters.SmallTest + +import com.android.systemui.SysuiTestCase +import com.android.systemui.util.concurrency.FakeExecutor +import com.android.systemui.util.time.FakeSystemClock + +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.ArgumentMatchers.anyInt +import org.mockito.ArgumentMatchers.anyString +import org.mockito.Mock +import org.mockito.Mockito +import org.mockito.Mockito.verify +import org.mockito.MockitoAnnotations + +private fun anyObject(): T { + return Mockito.anyObject() +} + +@RunWith(AndroidTestingRunner::class) +@RunWithLooper() +@SmallTest +class BatteryStateNotifierTest : SysuiTestCase() { + @Mock private lateinit var batteryController: BatteryController + @Mock private lateinit var noMan: NotificationManager + + private val clock = FakeSystemClock() + private val executor = FakeExecutor(clock) + + private lateinit var notifier: BatteryStateNotifier + + @Before + fun setup() { + MockitoAnnotations.initMocks(this) + notifier = BatteryStateNotifier(batteryController, noMan, executor, context) + notifier.startListening() + + context.ensureTestableResources() + } + + @Test + fun testNotifyWhenStateUnknown() { + notifier.onBatteryUnknownStateChanged(true) + verify(noMan).notify(anyString(), anyInt(), anyObject()) + } + + @Test + fun testCancelAfterDelay() { + notifier.onBatteryUnknownStateChanged(true) + notifier.onBatteryUnknownStateChanged(false) + + clock.advanceTime(DELAY_MILLIS + 1) + verify(noMan).cancel(anyInt()) + } +} + +// From BatteryStateNotifier.kt +private const val DELAY_MILLIS: Long = 40 * 60 * 60 * 1000 From a68473ce978f3e3ad73bd127cdcfcf663d9fd4d9 Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Thu, 3 Dec 2020 15:57:36 +0800 Subject: [PATCH 017/288] Only update native InputApplicationHandle once This makes sure the write operation (NativeInputApplicationHandle ::updateInfo) is always called from window manager side once when calling SurfaceControl.Transaction#setInputWindowInfo or InputManagerService#setFocusedApplication. If the info of input application handle is changed, a new instance will be created. That avoids the race condition of reading the fields of the same InputApplicationInfo instance from input dispatcher. Bug: 171857140 Bug: 161334769 Bug: 174768985 Test: WindowInputTests Merged-In: Ief84bbe6e6fa4da5309912059904932ccf775b75 Merged-In: I70de9835c7699fe6f56fc3655b0fee5c317ecc3a Change-Id: I70de9835c7699fe6f56fc3655b0fee5c317ecc3a --- .../android/view/InputApplicationHandle.java | 10 +++++++--- core/java/android/view/InputWindowHandle.java | 2 +- ...d_hardware_input_InputApplicationHandle.cpp | 5 +++++ .../com/android/server/wm/ActivityRecord.java | 18 ++++++++++++++++-- .../java/com/android/server/wm/DragState.java | 6 ++---- .../android/server/wm/InputConsumerImpl.java | 6 ++---- .../com/android/server/wm/InputMonitor.java | 14 ++++---------- .../com/android/server/wm/TaskPositioner.java | 6 ++---- .../com/android/server/wm/WindowState.java | 3 ++- 9 files changed, 41 insertions(+), 29 deletions(-) diff --git a/core/java/android/view/InputApplicationHandle.java b/core/java/android/view/InputApplicationHandle.java index 3d05e2a0b9f68..9b96f7fd1c5c3 100644 --- a/core/java/android/view/InputApplicationHandle.java +++ b/core/java/android/view/InputApplicationHandle.java @@ -16,6 +16,7 @@ package android.view; +import android.annotation.NonNull; import android.os.IBinder; /** @@ -31,17 +32,20 @@ public final class InputApplicationHandle { private long ptr; // Application name. - public String name; + public final @NonNull String name; // Dispatching timeout. - public long dispatchingTimeoutNanos; + public final long dispatchingTimeoutNanos; public final IBinder token; private native void nativeDispose(); - public InputApplicationHandle(IBinder token) { + public InputApplicationHandle(@NonNull IBinder token, @NonNull String name, + long dispatchingTimeoutNanos) { this.token = token; + this.name = name; + this.dispatchingTimeoutNanos = dispatchingTimeoutNanos; } public InputApplicationHandle(InputApplicationHandle handle) { diff --git a/core/java/android/view/InputWindowHandle.java b/core/java/android/view/InputWindowHandle.java index 5f74b2a510ca5..71d26b8880f7e 100644 --- a/core/java/android/view/InputWindowHandle.java +++ b/core/java/android/view/InputWindowHandle.java @@ -36,7 +36,7 @@ public final class InputWindowHandle { private long ptr; // The input application handle. - public final InputApplicationHandle inputApplicationHandle; + public InputApplicationHandle inputApplicationHandle; // The token associates input data with a window and its input channel. The client input // channel and the server input channel will both contain this token. diff --git a/core/jni/android_hardware_input_InputApplicationHandle.cpp b/core/jni/android_hardware_input_InputApplicationHandle.cpp index 71edfd553e7ea..c1ecae8618273 100644 --- a/core/jni/android_hardware_input_InputApplicationHandle.cpp +++ b/core/jni/android_hardware_input_InputApplicationHandle.cpp @@ -58,6 +58,11 @@ bool NativeInputApplicationHandle::updateInfo() { if (!obj) { return false; } + if (mInfo.token.get() != nullptr) { + // The java fields are immutable, so it doesn't need to update again. + env->DeleteLocalRef(obj); + return true; + } mInfo.name = getStringField(env, obj, gInputApplicationHandleClassInfo.name, ""); diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 41e48b8ec9db5..af921e2018618 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -416,7 +416,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // mOccludesParent field. final boolean hasWallpaper; // Input application handle used by the input dispatcher. - final InputApplicationHandle mInputApplicationHandle; + private InputApplicationHandle mInputApplicationHandle; final int launchedFromPid; // always the pid who started the activity. final int launchedFromUid; // always the uid who started the activity. @@ -1501,7 +1501,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A info = aInfo; mUserId = UserHandle.getUserId(info.applicationInfo.uid); packageName = info.applicationInfo.packageName; - mInputApplicationHandle = new InputApplicationHandle(appToken); intent = _intent; // If the class name in the intent doesn't match that of the target, this is probably an @@ -1685,6 +1684,21 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A return lockTaskLaunchMode; } + @NonNull InputApplicationHandle getInputApplicationHandle(boolean update) { + if (mInputApplicationHandle == null) { + mInputApplicationHandle = new InputApplicationHandle(appToken, toString(), + mInputDispatchingTimeoutNanos); + } else if (update) { + final String name = toString(); + if (mInputDispatchingTimeoutNanos != mInputApplicationHandle.dispatchingTimeoutNanos + || !name.equals(mInputApplicationHandle.name)) { + mInputApplicationHandle = new InputApplicationHandle(appToken, name, + mInputDispatchingTimeoutNanos); + } + } + return mInputApplicationHandle; + } + @Override ActivityRecord asActivityRecord() { // I am an activity record! diff --git a/services/core/java/com/android/server/wm/DragState.java b/services/core/java/com/android/server/wm/DragState.java index f840d9273f606..7b562a9f44460 100644 --- a/services/core/java/com/android/server/wm/DragState.java +++ b/services/core/java/com/android/server/wm/DragState.java @@ -269,10 +269,8 @@ class DragState { mInputEventReceiver = new DragInputEventReceiver(mClientChannel, mService.mH.getLooper(), mDragDropController); - mDragApplicationHandle = new InputApplicationHandle(new Binder()); - mDragApplicationHandle.name = "drag"; - mDragApplicationHandle.dispatchingTimeoutNanos = - WindowManagerService.DEFAULT_INPUT_DISPATCHING_TIMEOUT_NANOS; + mDragApplicationHandle = new InputApplicationHandle(new Binder(), "drag", + WindowManagerService.DEFAULT_INPUT_DISPATCHING_TIMEOUT_NANOS); mDragWindowHandle = new InputWindowHandle(mDragApplicationHandle, display.getDisplayId()); diff --git a/services/core/java/com/android/server/wm/InputConsumerImpl.java b/services/core/java/com/android/server/wm/InputConsumerImpl.java index 3b39b6ba18c53..19185736fc892 100644 --- a/services/core/java/com/android/server/wm/InputConsumerImpl.java +++ b/services/core/java/com/android/server/wm/InputConsumerImpl.java @@ -67,10 +67,8 @@ class InputConsumerImpl implements IBinder.DeathRecipient { } mService.mInputManager.registerInputChannel(mServerChannel); - mApplicationHandle = new InputApplicationHandle(new Binder()); - mApplicationHandle.name = name; - mApplicationHandle.dispatchingTimeoutNanos = - WindowManagerService.DEFAULT_INPUT_DISPATCHING_TIMEOUT_NANOS; + mApplicationHandle = new InputApplicationHandle(new Binder(), name, + WindowManagerService.DEFAULT_INPUT_DISPATCHING_TIMEOUT_NANOS); mWindowHandle = new InputWindowHandle(mApplicationHandle, displayId); mWindowHandle.name = name; diff --git a/services/core/java/com/android/server/wm/InputMonitor.java b/services/core/java/com/android/server/wm/InputMonitor.java index 0216db4718436..fe9bf12ec96a6 100644 --- a/services/core/java/com/android/server/wm/InputMonitor.java +++ b/services/core/java/com/android/server/wm/InputMonitor.java @@ -43,7 +43,6 @@ import android.os.Trace; import android.os.UserHandle; import android.util.ArrayMap; import android.util.Slog; -import android.view.InputApplicationHandle; import android.view.InputChannel; import android.view.InputEventReceiver; import android.view.InputWindowHandle; @@ -258,6 +257,8 @@ final class InputMonitor { final boolean hasFocus, final boolean hasWallpaper) { // Add a window to our list of input windows. inputWindowHandle.name = child.toString(); + inputWindowHandle.inputApplicationHandle = child.mActivityRecord != null + ? child.mActivityRecord.getInputApplicationHandle(false /* update */) : null; flags = child.getSurfaceTouchableRegion(inputWindowHandle, flags); inputWindowHandle.layoutParamsFlags = flags; inputWindowHandle.layoutParamsType = type; @@ -376,15 +377,8 @@ final class InputMonitor { public void setFocusedAppLw(ActivityRecord newApp) { // Focused app has changed. - if (newApp == null) { - mService.mInputManager.setFocusedApplication(mDisplayId, null); - } else { - final InputApplicationHandle handle = newApp.mInputApplicationHandle; - handle.name = newApp.toString(); - handle.dispatchingTimeoutNanos = newApp.mInputDispatchingTimeoutNanos; - - mService.mInputManager.setFocusedApplication(mDisplayId, handle); - } + mService.mInputManager.setFocusedApplication(mDisplayId, + newApp != null ? newApp.getInputApplicationHandle(true /* update */) : null); } public void pauseDispatchingLw(WindowToken window) { diff --git a/services/core/java/com/android/server/wm/TaskPositioner.java b/services/core/java/com/android/server/wm/TaskPositioner.java index c68b660bb76fd..44f4a58af7ab1 100644 --- a/services/core/java/com/android/server/wm/TaskPositioner.java +++ b/services/core/java/com/android/server/wm/TaskPositioner.java @@ -228,10 +228,8 @@ class TaskPositioner implements IBinder.DeathRecipient { mClientChannel, mService.mAnimationHandler.getLooper(), mService.mAnimator.getChoreographer()); - mDragApplicationHandle = new InputApplicationHandle(new Binder()); - mDragApplicationHandle.name = TAG; - mDragApplicationHandle.dispatchingTimeoutNanos = - WindowManagerService.DEFAULT_INPUT_DISPATCHING_TIMEOUT_NANOS; + mDragApplicationHandle = new InputApplicationHandle(new Binder(), TAG, + WindowManagerService.DEFAULT_INPUT_DISPATCHING_TIMEOUT_NANOS); mDragWindowHandle = new InputWindowHandle(mDragApplicationHandle, displayContent.getDisplayId()); diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 11db705f4e045..f357d7be53fd0 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -942,7 +942,8 @@ class WindowState extends WindowContainer implements WindowManagerP mLastRequestedHeight = 0; mLayer = 0; mInputWindowHandle = new InputWindowHandle( - mActivityRecord != null ? mActivityRecord.mInputApplicationHandle : null, + mActivityRecord != null + ? mActivityRecord.getInputApplicationHandle(false /* update */) : null, getDisplayId()); // Make sure we initial all fields before adding to parentWindow, to prevent exception From 6ff42dd2d264cd89acdf45cf403147a870a14086 Mon Sep 17 00:00:00 2001 From: Dmitry Dementyev Date: Wed, 9 Dec 2020 07:24:43 -0800 Subject: [PATCH 018/288] Protect account chooser activities against overlay. Bug: 172841550 Test: manual Change-Id: I1a16808426934f4a8d12410576d769443e4c2a04 Merged-In: I3cd5a94386f15cf60a7fe3095b00815e4a6485ae --- core/java/android/accounts/ChooseAccountActivity.java | 7 +++++-- .../android/accounts/ChooseAccountTypeActivity.java | 5 ++++- .../accounts/ChooseTypeAndAccountActivity.java | 11 ++++++----- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/core/java/android/accounts/ChooseAccountActivity.java b/core/java/android/accounts/ChooseAccountActivity.java index 4af22bfac92de..b826def55e92c 100644 --- a/core/java/android/accounts/ChooseAccountActivity.java +++ b/core/java/android/accounts/ChooseAccountActivity.java @@ -16,7 +16,6 @@ package android.accounts; import android.app.Activity; -import android.app.ActivityManager; import android.app.ActivityTaskManager; import android.content.Context; import android.content.pm.PackageManager; @@ -25,8 +24,8 @@ import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.IBinder; import android.os.Parcelable; -import android.os.RemoteException; import android.os.Process; +import android.os.RemoteException; import android.os.UserHandle; import android.util.Log; import android.view.LayoutInflater; @@ -37,6 +36,7 @@ import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; + import com.android.internal.R; import java.util.HashMap; @@ -60,6 +60,9 @@ public class ChooseAccountActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + getWindow().addSystemFlags( + android.view.WindowManager.LayoutParams + .SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS); mAccounts = getIntent().getParcelableArrayExtra(AccountManager.KEY_ACCOUNTS); mAccountManagerResponse = getIntent().getParcelableExtra(AccountManager.KEY_ACCOUNT_MANAGER_RESPONSE); diff --git a/core/java/android/accounts/ChooseAccountTypeActivity.java b/core/java/android/accounts/ChooseAccountTypeActivity.java index e3352bc856685..300fdd4ee4192 100644 --- a/core/java/android/accounts/ChooseAccountTypeActivity.java +++ b/core/java/android/accounts/ChooseAccountTypeActivity.java @@ -31,6 +31,7 @@ import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; + import com.android.internal.R; import java.util.ArrayList; @@ -51,7 +52,9 @@ public class ChooseAccountTypeActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - + getWindow().addSystemFlags( + android.view.WindowManager.LayoutParams + .SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS); if (Log.isLoggable(TAG, Log.VERBOSE)) { Log.v(TAG, "ChooseAccountTypeActivity.onCreate(savedInstanceState=" + savedInstanceState + ")"); diff --git a/core/java/android/accounts/ChooseTypeAndAccountActivity.java b/core/java/android/accounts/ChooseTypeAndAccountActivity.java index 57c1083267064..8cdc6a71caf84 100644 --- a/core/java/android/accounts/ChooseTypeAndAccountActivity.java +++ b/core/java/android/accounts/ChooseTypeAndAccountActivity.java @@ -15,11 +15,8 @@ */ package android.accounts; -import android.app.ActivityTaskManager; -import com.google.android.collect.Sets; - import android.app.Activity; -import android.app.ActivityManager; +import android.app.ActivityTaskManager; import android.content.Intent; import android.os.Bundle; import android.os.IBinder; @@ -39,6 +36,8 @@ import android.widget.TextView; import com.android.internal.R; +import com.google.android.collect.Sets; + import java.io.IOException; import java.util.ArrayList; import java.util.HashSet; @@ -143,7 +142,9 @@ public class ChooseTypeAndAccountActivity extends Activity Log.v(TAG, "ChooseTypeAndAccountActivity.onCreate(savedInstanceState=" + savedInstanceState + ")"); } - + getWindow().addSystemFlags( + android.view.WindowManager.LayoutParams + .SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS); String message = null; try { From fedbadf57eeeb82813d8fd43aade685659b909c2 Mon Sep 17 00:00:00 2001 From: Dmitry Dementyev Date: Wed, 9 Dec 2020 14:58:46 -0800 Subject: [PATCH 019/288] Protect account chooser activities against overlay. Bug: 172841550 Test: manual Merged-In: I1a16808426934f4a8d12410576d769443e4c2a04 Merged-In: I3cd5a94386f15cf60a7fe3095b00815e4a6485ae Change-Id: I35dc86b5721a4531447a6d99d6c30f23543130cb --- core/java/android/accounts/ChooseAccountActivity.java | 6 +++++- core/java/android/accounts/ChooseAccountTypeActivity.java | 5 ++++- .../android/accounts/ChooseTypeAndAccountActivity.java | 8 +++++--- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/core/java/android/accounts/ChooseAccountActivity.java b/core/java/android/accounts/ChooseAccountActivity.java index 6a436869a0ec9..0502087e14d71 100644 --- a/core/java/android/accounts/ChooseAccountActivity.java +++ b/core/java/android/accounts/ChooseAccountActivity.java @@ -24,8 +24,8 @@ import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.IBinder; import android.os.Parcelable; -import android.os.RemoteException; import android.os.Process; +import android.os.RemoteException; import android.os.UserHandle; import android.util.Log; import android.view.LayoutInflater; @@ -36,6 +36,7 @@ import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; + import com.android.internal.R; import java.util.HashMap; @@ -59,6 +60,9 @@ public class ChooseAccountActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + getWindow().addPrivateFlags( + android.view.WindowManager.LayoutParams + .PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS); mAccounts = getIntent().getParcelableArrayExtra(AccountManager.KEY_ACCOUNTS); mAccountManagerResponse = getIntent().getParcelableExtra(AccountManager.KEY_ACCOUNT_MANAGER_RESPONSE); diff --git a/core/java/android/accounts/ChooseAccountTypeActivity.java b/core/java/android/accounts/ChooseAccountTypeActivity.java index e3352bc856685..4b998e86fc8a1 100644 --- a/core/java/android/accounts/ChooseAccountTypeActivity.java +++ b/core/java/android/accounts/ChooseAccountTypeActivity.java @@ -31,6 +31,7 @@ import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; + import com.android.internal.R; import java.util.ArrayList; @@ -51,7 +52,9 @@ public class ChooseAccountTypeActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - + getWindow().addPrivateFlags( + android.view.WindowManager.LayoutParams + .PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS); if (Log.isLoggable(TAG, Log.VERBOSE)) { Log.v(TAG, "ChooseAccountTypeActivity.onCreate(savedInstanceState=" + savedInstanceState + ")"); diff --git a/core/java/android/accounts/ChooseTypeAndAccountActivity.java b/core/java/android/accounts/ChooseTypeAndAccountActivity.java index 6680ce6acb043..887ba18822f89 100644 --- a/core/java/android/accounts/ChooseTypeAndAccountActivity.java +++ b/core/java/android/accounts/ChooseTypeAndAccountActivity.java @@ -15,8 +15,6 @@ */ package android.accounts; -import com.google.android.collect.Sets; - import android.app.Activity; import android.app.ActivityManager; import android.content.Intent; @@ -38,6 +36,8 @@ import android.widget.TextView; import com.android.internal.R; +import com.google.android.collect.Sets; + import java.io.IOException; import java.util.ArrayList; import java.util.HashSet; @@ -142,7 +142,9 @@ public class ChooseTypeAndAccountActivity extends Activity Log.v(TAG, "ChooseTypeAndAccountActivity.onCreate(savedInstanceState=" + savedInstanceState + ")"); } - + getWindow().addPrivateFlags( + android.view.WindowManager.LayoutParams + .PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS); String message = null; try { From d0ad4beb52aed0352dbe9b27fece992df5962a89 Mon Sep 17 00:00:00 2001 From: Robert Carr Date: Fri, 11 Dec 2020 12:59:08 -0800 Subject: [PATCH 020/288] DO NOT MERGE: WM: Only allow system to use NO_INPUT_CHANNEL. NO_INPUT_CHANNEL is a hidden WM flag that allows creation of a window without an input channel. Unfortunately in releases prior to Android R this would allow creation of a Window which will not be known to the InputDispatcher at all. This means that the logic generating FLAG_OBSCURED will work and a window will be able to overlay another window without the overlayed window being notified. In Android R and later this isn't a problem as the InputDispatcher is informed of all windows, input channel or not. For past Android releases, this patch disables NO_INPUT_CHANNEL for use outside of the WM. Bug: 152064592 Test: Existing tests pass Change-Id: I7e1f45cba139eab92e7df88d1e052baba0ae2cc6 --- core/java/android/view/InputChannel.java | 7 +++++++ core/java/android/view/ViewRootImpl.java | 7 ++----- .../java/com/android/server/wm/WindowManagerService.java | 9 +++++++-- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/core/java/android/view/InputChannel.java b/core/java/android/view/InputChannel.java index ecb727c790160..346628bbdabda 100644 --- a/core/java/android/view/InputChannel.java +++ b/core/java/android/view/InputChannel.java @@ -110,6 +110,13 @@ public final class InputChannel implements Parcelable { return name != null ? name : "uninitialized"; } + /** + * @hide + */ + public boolean isValid() { + return mPtr != 0; + } + /** * Disposes the input channel. * Explicitly releases the reference this object is holding on the input channel. diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 57a01a32e1b83..afc4ff4377780 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -875,10 +875,7 @@ public final class ViewRootImpl implements ViewParent, // manager, to make sure we do the relayout before receiving // any other events from the system. requestLayout(); - if ((mWindowAttributes.inputFeatures - & WindowManager.LayoutParams.INPUT_FEATURE_NO_INPUT_CHANNEL) == 0) { - mInputChannel = new InputChannel(); - } + mInputChannel = new InputChannel(); mForceDecorViewVisibility = (mWindowAttributes.privateFlags & PRIVATE_FLAG_FORCE_DECOR_VIEW_VISIBILITY) != 0; try { @@ -971,7 +968,7 @@ public final class ViewRootImpl implements ViewParent, mInputQueueCallback = ((RootViewSurfaceTaker)view).willYouTakeTheInputQueue(); } - if (mInputChannel != null) { + if (mInputChannel.isValid()) { if (mInputQueueCallback != null) { mInputQueue = new InputQueue(); mInputQueueCallback.onInputQueueCreated(mInputQueue); diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index a9f157d985a61..d08533e3ee036 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -1462,8 +1462,13 @@ public class WindowManagerService extends IWindowManager.Stub return res; } - final boolean openInputChannels = (outInputChannel != null - && (attrs.inputFeatures & INPUT_FEATURE_NO_INPUT_CHANNEL) == 0); + boolean openInputChannels = (outInputChannel != null + && (attrs.inputFeatures & INPUT_FEATURE_NO_INPUT_CHANNEL) == 0); + if (callingUid != SYSTEM_UID) { + Slog.e(TAG_WM, + "App trying to use insecure INPUT_FEATURE_NO_INPUT_CHANNEL flag. Ignoring"); + openInputChannels = true; + } if (openInputChannels) { win.openInputChannel(outInputChannel); } From 0fed2d8e7e2b9757c7c40cd445772d52398478b1 Mon Sep 17 00:00:00 2001 From: Robert Carr Date: Fri, 11 Dec 2020 12:59:08 -0800 Subject: [PATCH 021/288] DO NOT MERGE: WM: Only allow system to use NO_INPUT_CHANNEL. NO_INPUT_CHANNEL is a hidden WM flag that allows creation of a window without an input channel. Unfortunately in releases prior to Android R this would allow creation of a Window which will not be known to the InputDispatcher at all. This means that the logic generating FLAG_OBSCURED will work and a window will be able to overlay another window without the overlayed window being notified. In Android R and later this isn't a problem as the InputDispatcher is informed of all windows, input channel or not. For past Android releases, this patch disables NO_INPUT_CHANNEL for use outside of the WM. Bug: 152064592 Test: Existing tests pass Change-Id: I7e1f45cba139eab92e7df88d1e052baba0ae2cc6 --- core/java/android/view/InputChannel.java | 7 +++++++ core/java/android/view/ViewRootImpl.java | 7 ++----- .../java/com/android/server/wm/WindowManagerService.java | 9 +++++++-- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/core/java/android/view/InputChannel.java b/core/java/android/view/InputChannel.java index de195ae524c8b..6223bc10222c4 100644 --- a/core/java/android/view/InputChannel.java +++ b/core/java/android/view/InputChannel.java @@ -103,6 +103,13 @@ public final class InputChannel implements Parcelable { return name != null ? name : "uninitialized"; } + /** + * @hide + */ + public boolean isValid() { + return mPtr != 0; + } + /** * Disposes the input channel. * Explicitly releases the reference this object is holding on the input channel. diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index a1c0967f0ab17..950fb125366f6 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -745,10 +745,7 @@ public final class ViewRootImpl implements ViewParent, // manager, to make sure we do the relayout before receiving // any other events from the system. requestLayout(); - if ((mWindowAttributes.inputFeatures - & WindowManager.LayoutParams.INPUT_FEATURE_NO_INPUT_CHANNEL) == 0) { - mInputChannel = new InputChannel(); - } + mInputChannel = new InputChannel(); mForceDecorViewVisibility = (mWindowAttributes.privateFlags & PRIVATE_FLAG_FORCE_DECOR_VIEW_VISIBILITY) != 0; try { @@ -838,7 +835,7 @@ public final class ViewRootImpl implements ViewParent, mInputQueueCallback = ((RootViewSurfaceTaker)view).willYouTakeTheInputQueue(); } - if (mInputChannel != null) { + if (mInputChannel.isValid()) { if (mInputQueueCallback != null) { mInputQueue = new InputQueue(); mInputQueueCallback.onInputQueueCreated(mInputQueue); diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index b438d044d102c..96379488ba684 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -1348,8 +1348,13 @@ public class WindowManagerService extends IWindowManager.Stub return res; } - final boolean openInputChannels = (outInputChannel != null - && (attrs.inputFeatures & INPUT_FEATURE_NO_INPUT_CHANNEL) == 0); + boolean openInputChannels = (outInputChannel != null + && (attrs.inputFeatures & INPUT_FEATURE_NO_INPUT_CHANNEL) == 0); + if (callingUid != SYSTEM_UID) { + Slog.e(TAG_WM, + "App trying to use insecure INPUT_FEATURE_NO_INPUT_CHANNEL flag. Ignoring"); + openInputChannels = true; + } if (openInputChannels) { win.openInputChannel(outInputChannel); } From 514b3297768f4a7469117a7005556663124040f9 Mon Sep 17 00:00:00 2001 From: Robert Carr Date: Fri, 11 Dec 2020 12:59:08 -0800 Subject: [PATCH 022/288] DO NOT MERGE: WM: Only allow system to use NO_INPUT_CHANNEL. NO_INPUT_CHANNEL is a hidden WM flag that allows creation of a window without an input channel. Unfortunately in releases prior to Android R this would allow creation of a Window which will not be known to the InputDispatcher at all. This means that the logic generating FLAG_OBSCURED will work and a window will be able to overlay another window without the overlayed window being notified. In Android R and later this isn't a problem as the InputDispatcher is informed of all windows, input channel or not. For past Android releases, this patch disables NO_INPUT_CHANNEL for use outside of the WM. Bug: 152064592 Test: Existing tests pass Change-Id: I7e1f45cba139eab92e7df88d1e052baba0ae2cc6 --- core/java/android/view/InputChannel.java | 7 +++++++ core/java/android/view/ViewRootImpl.java | 7 ++----- .../java/com/android/server/wm/WindowManagerService.java | 9 +++++++-- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/core/java/android/view/InputChannel.java b/core/java/android/view/InputChannel.java index ecb727c790160..346628bbdabda 100644 --- a/core/java/android/view/InputChannel.java +++ b/core/java/android/view/InputChannel.java @@ -110,6 +110,13 @@ public final class InputChannel implements Parcelable { return name != null ? name : "uninitialized"; } + /** + * @hide + */ + public boolean isValid() { + return mPtr != 0; + } + /** * Disposes the input channel. * Explicitly releases the reference this object is holding on the input channel. diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index aceb276e9fc04..735678cd096d6 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -851,10 +851,7 @@ public final class ViewRootImpl implements ViewParent, // manager, to make sure we do the relayout before receiving // any other events from the system. requestLayout(); - if ((mWindowAttributes.inputFeatures - & WindowManager.LayoutParams.INPUT_FEATURE_NO_INPUT_CHANNEL) == 0) { - mInputChannel = new InputChannel(); - } + mInputChannel = new InputChannel(); mForceDecorViewVisibility = (mWindowAttributes.privateFlags & PRIVATE_FLAG_FORCE_DECOR_VIEW_VISIBILITY) != 0; try { @@ -947,7 +944,7 @@ public final class ViewRootImpl implements ViewParent, mInputQueueCallback = ((RootViewSurfaceTaker)view).willYouTakeTheInputQueue(); } - if (mInputChannel != null) { + if (mInputChannel.isValid()) { if (mInputQueueCallback != null) { mInputQueue = new InputQueue(); mInputQueueCallback.onInputQueueCreated(mInputQueue); diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 2de8ae155f817..11e89fbe5b6a1 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -1441,8 +1441,13 @@ public class WindowManagerService extends IWindowManager.Stub return res; } - final boolean openInputChannels = (outInputChannel != null - && (attrs.inputFeatures & INPUT_FEATURE_NO_INPUT_CHANNEL) == 0); + boolean openInputChannels = (outInputChannel != null + && (attrs.inputFeatures & INPUT_FEATURE_NO_INPUT_CHANNEL) == 0); + if (callingUid != SYSTEM_UID) { + Slog.e(TAG_WM, + "App trying to use insecure INPUT_FEATURE_NO_INPUT_CHANNEL flag. Ignoring"); + openInputChannels = true; + } if (openInputChannels) { win.openInputChannel(outInputChannel); } From 9661bf7a40d33470bcd35f15758ab71c7c635c63 Mon Sep 17 00:00:00 2001 From: Robert Carr Date: Fri, 11 Dec 2020 12:59:08 -0800 Subject: [PATCH 023/288] DO NOT MERGE: WM: Only allow system to use NO_INPUT_CHANNEL. NO_INPUT_CHANNEL is a hidden WM flag that allows creation of a window without an input channel. Unfortunately in releases prior to Android R this would allow creation of a Window which will not be known to the InputDispatcher at all. This means that the logic generating FLAG_OBSCURED will work and a window will be able to overlay another window without the overlayed window being notified. In Android R and later this isn't a problem as the InputDispatcher is informed of all windows, input channel or not. For past Android releases, this patch disables NO_INPUT_CHANNEL for use outside of the WM. Bug: 152064592 Test: Existing tests pass Change-Id: I7e1f45cba139eab92e7df88d1e052baba0ae2cc6 --- core/java/android/view/InputChannel.java | 7 +++++++ core/java/android/view/ViewRootImpl.java | 7 ++----- .../java/com/android/server/wm/WindowManagerService.java | 9 +++++++-- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/core/java/android/view/InputChannel.java b/core/java/android/view/InputChannel.java index de195ae524c8b..6223bc10222c4 100644 --- a/core/java/android/view/InputChannel.java +++ b/core/java/android/view/InputChannel.java @@ -103,6 +103,13 @@ public final class InputChannel implements Parcelable { return name != null ? name : "uninitialized"; } + /** + * @hide + */ + public boolean isValid() { + return mPtr != 0; + } + /** * Disposes the input channel. * Explicitly releases the reference this object is holding on the input channel. diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 3f1ea34c37ab0..51d6c09fcc77f 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -713,10 +713,7 @@ public final class ViewRootImpl implements ViewParent, // manager, to make sure we do the relayout before receiving // any other events from the system. requestLayout(); - if ((mWindowAttributes.inputFeatures - & WindowManager.LayoutParams.INPUT_FEATURE_NO_INPUT_CHANNEL) == 0) { - mInputChannel = new InputChannel(); - } + mInputChannel = new InputChannel(); mForceDecorViewVisibility = (mWindowAttributes.privateFlags & PRIVATE_FLAG_FORCE_DECOR_VIEW_VISIBILITY) != 0; try { @@ -805,7 +802,7 @@ public final class ViewRootImpl implements ViewParent, mInputQueueCallback = ((RootViewSurfaceTaker)view).willYouTakeTheInputQueue(); } - if (mInputChannel != null) { + if (mInputChannel.isValid()) { if (mInputQueueCallback != null) { mInputQueue = new InputQueue(); mInputQueueCallback.onInputQueueCreated(mInputQueue); diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index c0e56688bf8ad..756af3cad50e0 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -1413,8 +1413,13 @@ public class WindowManagerService extends IWindowManager.Stub return res; } - final boolean openInputChannels = (outInputChannel != null - && (attrs.inputFeatures & INPUT_FEATURE_NO_INPUT_CHANNEL) == 0); + boolean openInputChannels = (outInputChannel != null + && (attrs.inputFeatures & INPUT_FEATURE_NO_INPUT_CHANNEL) == 0); + if (callingUid != SYSTEM_UID) { + Slog.e(TAG_WM, + "App trying to use insecure INPUT_FEATURE_NO_INPUT_CHANNEL flag. Ignoring"); + openInputChannels = true; + } if (openInputChannels) { win.openInputChannel(outInputChannel); } From 3995f0db93b6b5015fbdb6d89eefcc1952999b57 Mon Sep 17 00:00:00 2001 From: Dave Mankoff Date: Fri, 4 Dec 2020 17:42:20 -0500 Subject: [PATCH 024/288] Unregister Touch Sensors for DOZE_AOD_DOCKED DOZE_AOD_DOCKED should not have screen based trigger sensors enabled. In fact, it can end up in inconsistent states currently. When first entering it, the sensors are not enabled. But if the screen then turns off (in a dark room) and then back on, the sensors are left on from the prior state. This change ensures that, when we ask to turn off touch based sensors, they actually turn off. Fixes: 172412931 Test: manual Change-Id: I86f800cb75fee9f2d7e60655af4803e616a68fb2 Merged-In: I86f800cb75fee9f2d7e60655af4803e616a68fb2 --- .../android/systemui/doze/DozeSensors.java | 23 ++++++++++++------ .../android/systemui/doze/DozeTriggers.java | 24 ++++++++----------- .../systemui/doze/DozeSensorsTest.java | 10 ++++---- .../systemui/doze/DozeTriggersTest.java | 1 + 4 files changed, 31 insertions(+), 27 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java index aebf41b884c4f..2eadbd0365e46 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java @@ -46,6 +46,7 @@ import com.android.internal.logging.UiEvent; import com.android.internal.logging.UiEventLogger; import com.android.internal.logging.UiEventLoggerImpl; import com.android.internal.logging.nano.MetricsProto; +import com.android.internal.util.IndentingPrintWriter; import com.android.systemui.plugins.SensorManagerPlugin; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.util.sensors.AsyncSensorManager; @@ -80,6 +81,7 @@ public class DozeSensors { private long mDebounceFrom; private boolean mSettingRegistered; private boolean mListening; + private boolean mListeningTouchScreenSensors; @VisibleForTesting public enum DozeSensorsUiEvent implements UiEventLogger.UiEventEnum { @@ -222,22 +224,25 @@ public class DozeSensors { /** * If sensors should be registered and sending signals. */ - public void setListening(boolean listen) { - if (mListening == listen) { + public void setListening(boolean listen, boolean includeTouchScreenSensors) { + if (mListening == listen && mListeningTouchScreenSensors == includeTouchScreenSensors) { return; } mListening = listen; + mListeningTouchScreenSensors = includeTouchScreenSensors; updateListening(); } /** * Registers/unregisters sensors based on internal state. */ - public void updateListening() { + private void updateListening() { boolean anyListening = false; for (TriggerSensor s : mSensors) { - s.setListening(mListening); - if (mListening) { + boolean listen = mListening + && (!s.mRequiresTouchscreen || mListeningTouchScreenSensors); + s.setListening(listen); + if (listen) { anyListening = true; } } @@ -309,10 +314,14 @@ public class DozeSensors { /** Dump current state */ public void dump(PrintWriter pw) { + pw.println("mListening=" + mListening); + pw.println("mListeningTouchScreenSensors=" + mListeningTouchScreenSensors); + IndentingPrintWriter idpw = new IndentingPrintWriter(pw, " "); + idpw.increaseIndent(); for (TriggerSensor s : mSensors) { - pw.println(" Sensor: " + s.toString()); + idpw.println("Sensor: " + s.toString()); } - pw.println(" ProxSensor: " + mProximitySensor.toString()); + idpw.println("ProxSensor: " + mProximitySensor.toString()); } /** diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java index cbf8f578744c2..043edee44492f 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java @@ -38,6 +38,7 @@ import com.android.internal.logging.UiEvent; import com.android.internal.logging.UiEventLogger; import com.android.internal.logging.UiEventLoggerImpl; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; +import com.android.internal.util.IndentingPrintWriter; import com.android.systemui.Dependency; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dock.DockManager; @@ -408,15 +409,12 @@ public class DozeTriggers implements DozeMachine.Part { break; case DOZE_PULSE_DONE: mDozeSensors.requestTemporaryDisable(); - // A pulse will temporarily disable sensors that require a touch screen. - // Let's make sure that they are re-enabled when the pulse is over. - mDozeSensors.updateListening(); break; case FINISH: mBroadcastReceiver.unregister(mBroadcastDispatcher); mDozeHost.removeCallback(mHostCallback); mDockManager.removeListener(mDockEventListener); - mDozeSensors.setListening(false); + mDozeSensors.setListening(false, false); mDozeSensors.setProxListening(false); mWantSensors = false; mWantProx = false; @@ -424,20 +422,16 @@ public class DozeTriggers implements DozeMachine.Part { break; default: } + mDozeSensors.setListening(mWantSensors, mWantTouchScreenSensors); } @Override public void onScreenState(int state) { mDozeSensors.onScreenState(state); - if (state == Display.STATE_DOZE || state == Display.STATE_DOZE_SUSPEND - || state == Display.STATE_OFF) { - mDozeSensors.setProxListening(mWantProx); - mDozeSensors.setListening(mWantSensors); - mDozeSensors.setTouchscreenSensorsListening(mWantTouchScreenSensors); - } else { - mDozeSensors.setProxListening(false); - mDozeSensors.setListening(mWantSensors); - } + mDozeSensors.setProxListening(mWantProx && (state == Display.STATE_DOZE + || state == Display.STATE_DOZE_SUSPEND + || state == Display.STATE_OFF)); + mDozeSensors.setListening(mWantSensors, mWantTouchScreenSensors); } private void checkTriggersAtInit() { @@ -513,7 +507,9 @@ public class DozeTriggers implements DozeMachine.Part { pw.println(" pulsePending=" + mPulsePending); pw.println("DozeSensors:"); - mDozeSensors.dump(pw); + IndentingPrintWriter idpw = new IndentingPrintWriter(pw, " "); + idpw.increaseIndent(); + mDozeSensors.dump(idpw); } private class TriggerReceiver extends BroadcastReceiver { diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java index ebd2c3afe646a..35e3bb392f7c6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java @@ -77,8 +77,6 @@ public class DozeSensorsTest extends SysuiTestCase { @Mock private Consumer mProxCallback; @Mock - private AlwaysOnDisplayPolicy mAlwaysOnDisplayPolicy; - @Mock private TriggerSensor mTriggerSensor; @Mock private DozeLog mDozeLog; @@ -110,7 +108,7 @@ public class DozeSensorsTest extends SysuiTestCase { @Test public void testSensorDebounce() { - mDozeSensors.setListening(true); + mDozeSensors.setListening(true, true); mWakeLockScreenListener.onSensorChanged(mock(SensorManagerPlugin.SensorEvent.class)); mTestableLooper.processAllMessages(); @@ -128,7 +126,7 @@ public class DozeSensorsTest extends SysuiTestCase { @Test public void testSetListening_firstTrue_registerSettingsObserver() { verify(mSensorManager, never()).registerListener(any(), any(Sensor.class), anyInt()); - mDozeSensors.setListening(true); + mDozeSensors.setListening(true, true); verify(mTriggerSensor).registerSettingsObserver(any(ContentObserver.class)); } @@ -136,8 +134,8 @@ public class DozeSensorsTest extends SysuiTestCase { @Test public void testSetListening_twiceTrue_onlyRegisterSettingsObserverOnce() { verify(mSensorManager, never()).registerListener(any(), any(Sensor.class), anyInt()); - mDozeSensors.setListening(true); - mDozeSensors.setListening(true); + mDozeSensors.setListening(true, true); + mDozeSensors.setListening(true, true); verify(mTriggerSensor, times(1)).registerSettingsObserver(any(ContentObserver.class)); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java index 655f933d28fe4..be4fdb0babc6f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java @@ -149,6 +149,7 @@ public class DozeTriggersTest extends SysuiTestCase { clearInvocations(mSensors); mTriggers.transitionTo(DozeMachine.State.DOZE_PULSING, DozeMachine.State.DOZE_PULSE_DONE); + mTriggers.transitionTo(DozeMachine.State.DOZE_PULSE_DONE, DozeMachine.State.DOZE_AOD); waitForSensorManager(); verify(mSensors).requestTriggerSensor(any(), eq(mTapSensor)); } From 346eed7325d47d8ed453266f613ccad1b4260c67 Mon Sep 17 00:00:00 2001 From: Hui Yu Date: Thu, 6 Aug 2020 16:55:19 -0700 Subject: [PATCH 025/288] RESTRICT AUTOMERGE: Set mAllowWhileInUsePermissionInFgs correctly when bindService() from background. Pass original callingPid and callingUid into shouldAllowWhileInUsePermissionInFgsLocked() after Binder.clearCallingIdentity(). Bug: 163084228, 173516292 Test: atest cts/tests/app/src/android/app/cts/ActivityManagerFgsBgStartTest.java#testFgsLocationStartFromBGWithBind Change-Id: I7a240621267648ea54e7dc737ebc55bc665e39b6 Merged-In: I7a240621267648ea54e7dc737ebc55bc665e39b6 (cherry picked from commit 86bd39db3595842bae77abe7e768226e412591c8) --- .../java/com/android/server/am/ActiveServices.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index 3f867f656c245..dd0e1f6458f99 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -1836,11 +1836,13 @@ public final class ActiveServices { if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "bindService: " + service + " type=" + resolvedType + " conn=" + connection.asBinder() + " flags=0x" + Integer.toHexString(flags)); + final int callingPid = Binder.getCallingPid(); + final int callingUid = Binder.getCallingUid(); final ProcessRecord callerApp = mAm.getRecordForAppLocked(caller); if (callerApp == null) { throw new SecurityException( "Unable to find app for caller " + caller - + " (pid=" + Binder.getCallingPid() + + " (pid=" + callingPid + ") when binding service " + service); } @@ -1880,19 +1882,19 @@ public final class ActiveServices { } if ((flags & Context.BIND_SCHEDULE_LIKE_TOP_APP) != 0 && !isCallerSystem) { - throw new SecurityException("Non-system caller (pid=" + Binder.getCallingPid() + throw new SecurityException("Non-system caller (pid=" + callingPid + ") set BIND_SCHEDULE_LIKE_TOP_APP when binding service " + service); } if ((flags & Context.BIND_ALLOW_WHITELIST_MANAGEMENT) != 0 && !isCallerSystem) { throw new SecurityException( - "Non-system caller " + caller + " (pid=" + Binder.getCallingPid() + "Non-system caller " + caller + " (pid=" + callingPid + ") set BIND_ALLOW_WHITELIST_MANAGEMENT when binding service " + service); } if ((flags & Context.BIND_ALLOW_INSTANT) != 0 && !isCallerSystem) { throw new SecurityException( - "Non-system caller " + caller + " (pid=" + Binder.getCallingPid() + "Non-system caller " + caller + " (pid=" + callingPid + ") set BIND_ALLOW_INSTANT when binding service " + service); } @@ -1908,7 +1910,7 @@ public final class ActiveServices { ServiceLookupResult res = retrieveServiceLocked(service, instanceName, resolvedType, callingPackage, - Binder.getCallingPid(), Binder.getCallingUid(), userId, true, + callingPid, callingUid, userId, true, callerFg, isBindExternal, allowInstant); if (res == null) { return 0; @@ -2068,7 +2070,7 @@ public final class ActiveServices { if (!s.mAllowWhileInUsePermissionInFgs) { s.mAllowWhileInUsePermissionInFgs = shouldAllowWhileInUsePermissionInFgsLocked(callingPackage, - Binder.getCallingPid(), Binder.getCallingUid(), + callingPid, callingUid, service, s, false); } From 23abf11a3a8518a665f12f173c53d77993a27a32 Mon Sep 17 00:00:00 2001 From: Jack Yu Date: Fri, 13 Nov 2020 18:34:42 +0800 Subject: [PATCH 026/288] Nfc adapter randomly returns null on devices having Nfc Try to get NfcAdapter from NfcManager only when nfc service interface is ready. Bug: 173184157 Test: manaul test Change-Id: Ifcb0f60e23f01cafd8b6b5f6bc8522773ece23a6 (cherry picked from commit 3217255a4d1f6dcbc28a0351dc74f136331f2d39) --- core/java/android/nfc/NfcAdapter.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/java/android/nfc/NfcAdapter.java b/core/java/android/nfc/NfcAdapter.java index c61f10f50c93b..dc4ce039bf77e 100644 --- a/core/java/android/nfc/NfcAdapter.java +++ b/core/java/android/nfc/NfcAdapter.java @@ -677,6 +677,12 @@ public final class NfcAdapter { throw new IllegalArgumentException( "context not associated with any application (using a mock context?)"); } + + if (getServiceInterface() == null) { + // NFC is not available + return null; + } + /* use getSystemService() for consistency */ NfcManager manager = (NfcManager) context.getSystemService(Context.NFC_SERVICE); if (manager == null) { From 7d5eb9543fd3deba691cf0994f7add204e26f1b7 Mon Sep 17 00:00:00 2001 From: Beth Thibodeau Date: Mon, 21 Dec 2020 15:46:01 -0500 Subject: [PATCH 027/288] Use default color when artwork is too small Fixes: 175833333 Test: atest SystemUITests:MediaDataManagerTest Change-Id: I12e0bd8c32f3f5f824f83312d4b3b3cf181fd486 (cherry picked from commit 8d15cc48fb51e359d7c7296be19d4c1ac212a3b9) --- .../systemui/media/MediaDataManager.kt | 9 +++++--- .../systemui/media/MediaDataManagerTest.kt | 23 +++++++++++++++++++ 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt b/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt index 2be509a138163..2d7aafc497d8b 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt @@ -70,6 +70,7 @@ private const val DEBUG = true private const val DEFAULT_LUMINOSITY = 0.25f private const val LUMINOSITY_THRESHOLD = 0.05f private const val SATURATION_MULTIPLIER = 0.8f +const val DEFAULT_COLOR = Color.DKGRAY private val LOADING = MediaData(-1, false, 0, null, null, null, null, null, emptyList(), emptyList(), "INVALID", null, null, null, true, null) @@ -380,7 +381,7 @@ class MediaDataManager( } else { null } - val bgColor = artworkBitmap?.let { computeBackgroundColor(it) } ?: Color.DKGRAY + val bgColor = artworkBitmap?.let { computeBackgroundColor(it) } ?: DEFAULT_COLOR val mediaAction = getResumeMediaAction(resumeAction) foregroundExecutor.execute { @@ -559,12 +560,14 @@ class MediaDataManager( private fun computeBackgroundColor(artworkBitmap: Bitmap?): Int { var color = Color.WHITE - if (artworkBitmap != null) { - // If we have art, get colors from that + if (artworkBitmap != null && artworkBitmap.width > 1 && artworkBitmap.height > 1) { + // If we have valid art, get colors from that val p = MediaNotificationProcessor.generateArtworkPaletteBuilder(artworkBitmap) .generate() val swatch = MediaNotificationProcessor.findBackgroundSwatch(p) color = swatch.rgb + } else { + return DEFAULT_COLOR } // Adapt background color, so it's always subdued and text is legible val tmpHsl = floatArrayOf(0f, 0f, 0f) diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt index b47ee29213803..2f99b2a2a449f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt @@ -2,6 +2,7 @@ package com.android.systemui.media import android.app.Notification.MediaStyle import android.app.PendingIntent +import android.graphics.Bitmap import android.media.MediaDescription import android.media.MediaMetadata import android.media.session.MediaController @@ -246,4 +247,26 @@ class MediaDataManagerTest : SysuiTestCase() { verify(listener).onMediaDataRemoved(eq(KEY)) } + + @Test + fun testBadArtwork_doesNotUse() { + // WHEN notification has a too-small artwork + val artwork = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888) + val notif = SbnBuilder().run { + setPkg(PACKAGE_NAME) + modifyNotification(context).also { + it.setSmallIcon(android.R.drawable.ic_media_pause) + it.setStyle(MediaStyle().apply { setMediaSession(session.sessionToken) }) + it.setLargeIcon(artwork) + } + build() + } + mediaDataManager.onNotificationAdded(KEY, notif) + + // THEN it loads and uses the default background color + assertThat(backgroundExecutor.runAllReady()).isEqualTo(1) + assertThat(foregroundExecutor.runAllReady()).isEqualTo(1) + verify(listener).onMediaDataLoaded(eq(KEY), eq(null), capture(mediaDataCaptor)) + assertThat(mediaDataCaptor.value!!.backgroundColor).isEqualTo(DEFAULT_COLOR) + } } From f20d333adacbf0d0876161f739a6e9f9de1de56c Mon Sep 17 00:00:00 2001 From: Varun Shah Date: Tue, 29 Dec 2020 15:24:43 -0800 Subject: [PATCH 028/288] DO NOT MERGE: Disable StrictMode VM Policy check. Disable the VM policy violation for intents that contain a content URI but don't have FLAG_GRANT_URI_PERMISSION when scheduling alarms. Fixes: 160426113 Test: atest CalendarProvider2Test Change-Id: If6e4a03609fc3d03dde66bcaa3136b23662ccaeb (cherry picked from commit 224822ecafdf09a3a2cda11d95645f3056ab58dc) --- core/java/android/provider/CalendarContract.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/core/java/android/provider/CalendarContract.java b/core/java/android/provider/CalendarContract.java index 17fae1cafe62f..5e3f852229b7d 100644 --- a/core/java/android/provider/CalendarContract.java +++ b/core/java/android/provider/CalendarContract.java @@ -39,6 +39,7 @@ import android.database.Cursor; import android.database.DatabaseUtils; import android.net.Uri; import android.os.RemoteException; +import android.os.StrictMode; import android.text.format.DateUtils; import android.text.format.TimeMigrationUtils; import android.util.Log; @@ -2618,7 +2619,13 @@ public final class CalendarContract { intent.setData(ContentUris.withAppendedId(CalendarContract.CONTENT_URI, alarmTime)); intent.putExtra(ALARM_TIME, alarmTime); intent.setFlags(Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND); + + // Disable strict mode VM policy violations temporarily for intents that contain a + // content URI but don't have FLAG_GRANT_READ_URI_PERMISSION. + StrictMode.VmPolicy oldVmPolicy = StrictMode.allowVmViolations(); PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0); + StrictMode.setVmPolicy(oldVmPolicy); + manager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, alarmTime, pi); } From ab6fd7362d48745785e89d10979d8d1f43616220 Mon Sep 17 00:00:00 2001 From: Danny Epstein Date: Mon, 14 Dec 2020 18:14:59 -0800 Subject: [PATCH 029/288] DO NOT MERGE Focus clock by default When nudging up to the status bar, focus the clock by default. Test: Nudge up to status bar, switch from Launcher to Home Bug: 169250454 Change-Id: Id55c236a447b86d502d46e799814b51c984916e4 --- packages/CarSystemUI/res/layout/car_top_navigation_bar.xml | 4 ++-- .../res/layout/car_top_navigation_bar_unprovisioned.xml | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/CarSystemUI/res/layout/car_top_navigation_bar.xml b/packages/CarSystemUI/res/layout/car_top_navigation_bar.xml index cdc29eec21cde..cb1aadaf7fe74 100644 --- a/packages/CarSystemUI/res/layout/car_top_navigation_bar.xml +++ b/packages/CarSystemUI/res/layout/car_top_navigation_bar.xml @@ -77,8 +77,8 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:background="@null" - systemui:intent="intent:#Intent;component=com.android.car.settings/.common.CarSettingActivities$QuickSettingActivity;launchFlags=0x24000000;end" - /> + android:focusedByDefault="true" + systemui:intent="intent:#Intent;component=com.android.car.settings/.common.CarSettingActivities$QuickSettingActivity;launchFlags=0x24000000;end"/> + android:background="@null" + android:focusedByDefault="true"/> Date: Tue, 29 Dec 2020 10:42:33 -0800 Subject: [PATCH 030/288] Clean up dead code in NetInitiatedActivity Bug: 174151048 Test: on device Change-Id: I5a3a77557720571b455ffec296cdd4e2e1a02f7b (cherry picked from commit b5765cc3e75d9f4a7ff9e805b2225de5790d3cfe) --- .../internal/app/NetInitiatedActivity.java | 31 ------------------- .../location/GpsNetInitiatedHandler.java | 3 -- 2 files changed, 34 deletions(-) diff --git a/core/java/com/android/internal/app/NetInitiatedActivity.java b/core/java/com/android/internal/app/NetInitiatedActivity.java index 92e9fe492442d..5efeb0fc928e7 100644 --- a/core/java/com/android/internal/app/NetInitiatedActivity.java +++ b/core/java/com/android/internal/app/NetInitiatedActivity.java @@ -17,18 +17,14 @@ package com.android.internal.app; import android.app.AlertDialog; -import android.compat.annotation.UnsupportedAppUsage; -import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; -import android.content.IntentFilter; import android.location.LocationManagerInternal; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; -import android.widget.Toast; import com.android.internal.R; import com.android.internal.location.GpsNetInitiatedHandler; @@ -43,7 +39,6 @@ public class NetInitiatedActivity extends AlertActivity implements DialogInterfa private static final String TAG = "NetInitiatedActivity"; private static final boolean DEBUG = true; - private static final boolean VERBOSE = false; private static final int POSITIVE_BUTTON = AlertDialog.BUTTON_POSITIVE; private static final int NEGATIVE_BUTTON = AlertDialog.BUTTON_NEGATIVE; @@ -55,17 +50,6 @@ public class NetInitiatedActivity extends AlertActivity implements DialogInterfa private int default_response = -1; private int default_response_timeout = 6; - /** Used to detect when NI request is received */ - private BroadcastReceiver mNetInitiatedReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - if (DEBUG) Log.d(TAG, "NetInitiatedReceiver onReceive: " + intent.getAction()); - if (intent.getAction() == GpsNetInitiatedHandler.ACTION_NI_VERIFY) { - handleNIVerify(intent); - } - } - }; - private final Handler mHandler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { @@ -109,14 +93,12 @@ public class NetInitiatedActivity extends AlertActivity implements DialogInterfa protected void onResume() { super.onResume(); if (DEBUG) Log.d(TAG, "onResume"); - registerReceiver(mNetInitiatedReceiver, new IntentFilter(GpsNetInitiatedHandler.ACTION_NI_VERIFY)); } @Override protected void onPause() { super.onPause(); if (DEBUG) Log.d(TAG, "onPause"); - unregisterReceiver(mNetInitiatedReceiver); } /** @@ -141,17 +123,4 @@ public class NetInitiatedActivity extends AlertActivity implements DialogInterfa LocationManagerInternal lm = LocalServices.getService(LocationManagerInternal.class); lm.sendNiResponse(notificationId, response); } - - @UnsupportedAppUsage - private void handleNIVerify(Intent intent) { - int notifId = intent.getIntExtra(GpsNetInitiatedHandler.NI_INTENT_KEY_NOTIF_ID, -1); - notificationId = notifId; - - if (DEBUG) Log.d(TAG, "handleNIVerify action: " + intent.getAction()); - } - - private void showNIError() { - Toast.makeText(this, "NI error" /* com.android.internal.R.string.usb_storage_error_message */, - Toast.LENGTH_LONG).show(); - } } diff --git a/location/java/com/android/internal/location/GpsNetInitiatedHandler.java b/location/java/com/android/internal/location/GpsNetInitiatedHandler.java index 67a040dba3e7f..a3765151a6f74 100644 --- a/location/java/com/android/internal/location/GpsNetInitiatedHandler.java +++ b/location/java/com/android/internal/location/GpsNetInitiatedHandler.java @@ -51,9 +51,6 @@ public class GpsNetInitiatedHandler { private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); - // NI verify activity for bringing up UI (not used yet) - public static final String ACTION_NI_VERIFY = "android.intent.action.NETWORK_INITIATED_VERIFY"; - // string constants for defining data fields in NI Intent public static final String NI_INTENT_KEY_NOTIF_ID = "notif_id"; public static final String NI_INTENT_KEY_TITLE = "title"; From 72704403aabf41e2807cc67388faafdf4457f924 Mon Sep 17 00:00:00 2001 From: Alex Kershaw Date: Sun, 29 Nov 2020 18:21:57 +0000 Subject: [PATCH 031/288] [RESTRICT AUTOMERGE] Make WPMS look for DOs and POs in the correct calling user Currently, it will always look in user 0 since it uses the DPM from mContext, which will always be from user 0 as WPMS is in the system server process. Extend DPMI to provide the necessary external helper API. This is preferable to just using createContextAsUser before getting the DPM instance since it avoids a second binding. Fixes: 144048540 Fixes: 172682826 Bug: 153995973 Bug: 174642338 Test: atest com.android.cts.devicepolicy.MixedManagedProfileOwnerTest#testSetWallpaper_disallowed Change-Id: I52b71000fac31ff6725ddded58206f69b263ae33 (cherry picked from commit 5b36ee3f1d2c60473f4c30161cca6a62cd9ea71f) --- .../admin/DevicePolicyManagerInternal.java | 7 +++++++ .../wallpaper/WallpaperManagerService.java | 10 +++++----- .../DevicePolicyManagerService.java | 20 +++++++++++++++++++ 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/core/java/android/app/admin/DevicePolicyManagerInternal.java b/core/java/android/app/admin/DevicePolicyManagerInternal.java index 62ac84b2b1e60..d24694faff930 100644 --- a/core/java/android/app/admin/DevicePolicyManagerInternal.java +++ b/core/java/android/app/admin/DevicePolicyManagerInternal.java @@ -16,6 +16,7 @@ package android.app.admin; +import android.annotation.Nullable; import android.annotation.UserIdInt; import android.content.ComponentName; import android.content.Intent; @@ -221,6 +222,7 @@ public abstract class DevicePolicyManagerInternal { /** * Returns the profile owner component for the given user, or {@code null} if there is not one. */ + @Nullable public abstract ComponentName getProfileOwnerAsUser(int userHandle); /** @@ -234,4 +236,9 @@ public abstract class DevicePolicyManagerInternal { * {@link #supportsResetOp(int)} is true. */ public abstract void resetOp(int op, String packageName, @UserIdInt int userId); + + /** + * Returns whether the given package is a device owner or a profile owner in the calling user. + */ + public abstract boolean isDeviceOrProfileOwnerInCallingUser(String packageName); } diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java index 1300e657333c7..aaf27d32452d5 100644 --- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java +++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java @@ -39,7 +39,7 @@ import android.app.WallpaperColors; import android.app.WallpaperInfo; import android.app.WallpaperManager; import android.app.WallpaperManager.SetWallpaperFlags; -import android.app.admin.DevicePolicyManager; +import android.app.admin.DevicePolicyManagerInternal; import android.app.backup.WallpaperBackupHelper; import android.content.BroadcastReceiver; import android.content.ComponentName; @@ -2861,10 +2861,10 @@ public class WallpaperManagerService extends IWallpaperManager.Stub if (!uidMatchPackage) { return false; // callingPackage was faked. } - - // TODO(b/144048540): DPM needs to take into account the userId, not just the package. - final DevicePolicyManager dpm = mContext.getSystemService(DevicePolicyManager.class); - if (dpm.isDeviceOwnerApp(callingPackage) || dpm.isProfileOwnerApp(callingPackage)) { + DevicePolicyManagerInternal devicePolicyManagerInternal = + LocalServices.getService(DevicePolicyManagerInternal.class); + if (devicePolicyManagerInternal != null && + devicePolicyManagerInternal.isDeviceOrProfileOwnerInCallingUser(callingPackage)) { return true; } final int callingUserId = UserHandle.getCallingUserId(); diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index b8a20ed4fe5b7..86e130577ea8f 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -12839,6 +12839,26 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { ? AppOpsManager.MODE_ALLOWED : AppOpsManager.opToDefaultMode(AppOpsManager.OP_INTERACT_ACROSS_PROFILES); } + + public boolean isDeviceOrProfileOwnerInCallingUser(String packageName) { + return isDeviceOwnerInCallingUser(packageName) + || isProfileOwnerInCallingUser(packageName); + } + + private boolean isDeviceOwnerInCallingUser(String packageName) { + final ComponentName deviceOwnerInCallingUser = + DevicePolicyManagerService.this.getDeviceOwnerComponent( + /* callingUserOnly= */ true); + return deviceOwnerInCallingUser != null + && packageName.equals(deviceOwnerInCallingUser.getPackageName()); + } + + private boolean isProfileOwnerInCallingUser(String packageName) { + final ComponentName profileOwnerInCallingUser = + getProfileOwnerAsUser(UserHandle.getCallingUserId()); + return profileOwnerInCallingUser != null + && packageName.equals(profileOwnerInCallingUser.getPackageName()); + } } private Intent createShowAdminSupportIntent(ComponentName admin, int userId) { From e8bd5284d33386d1c2a7d3109d9ad6cbd08e3423 Mon Sep 17 00:00:00 2001 From: Tiger Huang Date: Thu, 3 Sep 2020 23:01:21 +0800 Subject: [PATCH 032/288] Notify visibility change if source visibility is changed This makes view root dispatch the up-to-date WindowInsets to the app. Fix: 166619182 Test: Steps in the bug (comment#12) Change-Id: I8c47e3be84357f65084a7d9994f7d7b68f15611e (cherry picked from commit fd9435130557b054d203835eab6f287fee58ec1b) --- core/java/android/view/InsetsSourceConsumer.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/core/java/android/view/InsetsSourceConsumer.java b/core/java/android/view/InsetsSourceConsumer.java index 700dc66fab556..ba40459692f79 100644 --- a/core/java/android/view/InsetsSourceConsumer.java +++ b/core/java/android/view/InsetsSourceConsumer.java @@ -113,13 +113,20 @@ public class InsetsSourceConsumer { InsetsState.typeToString(control.getType()), mController.getHost().getRootViewTitle())); } - // We are loosing control if (mSourceControl == null) { + // We are loosing control mController.notifyControlRevoked(this); - // Restore server visibility. - mState.getSource(getType()).setVisible( - mController.getLastDispatchedState().getSource(getType()).isVisible()); + // Check if we need to restore server visibility. + final InsetsSource source = mState.getSource(mType); + final boolean serverVisibility = + mController.getLastDispatchedState().getSourceOrDefaultVisibility(mType); + if (source.isVisible() != serverVisibility) { + source.setVisible(serverVisibility); + mController.notifyVisibilityChanged(); + } + + // For updateCompatSysUiVisibility applyLocalVisibilityOverride(); } else { // We are gaining control, and need to run an animation since previous state From 13070106c6fb95adf1c5418586fefcc2f734ad48 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 8 Jan 2021 06:49:10 -0800 Subject: [PATCH 033/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I216f1736a0b63c8cf0c8b4a73e9ba57d5142fd32 --- packages/SettingsLib/res/values-ar/strings.xml | 2 +- packages/SettingsLib/res/values-b+sr+Latn/strings.xml | 2 +- packages/SettingsLib/res/values-bg/strings.xml | 2 +- packages/SettingsLib/res/values-ca/strings.xml | 2 +- packages/SettingsLib/res/values-el/strings.xml | 2 +- packages/SettingsLib/res/values-eu/strings.xml | 2 +- packages/SettingsLib/res/values-gl/strings.xml | 2 +- packages/SettingsLib/res/values-hy/strings.xml | 2 +- packages/SettingsLib/res/values-kk/strings.xml | 2 +- packages/SettingsLib/res/values-kn/strings.xml | 2 +- packages/SettingsLib/res/values-ml/strings.xml | 2 +- packages/SettingsLib/res/values-mn/strings.xml | 2 +- packages/SettingsLib/res/values-nb/strings.xml | 2 +- packages/SettingsLib/res/values-pa/strings.xml | 2 +- packages/SettingsLib/res/values-pl/strings.xml | 2 +- packages/SettingsLib/res/values-si/strings.xml | 2 +- packages/SettingsLib/res/values-sl/strings.xml | 2 +- packages/SettingsLib/res/values-sr/strings.xml | 2 +- packages/SettingsLib/res/values-te/strings.xml | 2 +- packages/SettingsLib/res/values-th/strings.xml | 2 +- packages/SettingsLib/res/values-uk/strings.xml | 2 +- packages/SettingsLib/res/values-uz/strings.xml | 2 +- packages/SettingsLib/res/values-zh-rHK/strings.xml | 2 +- packages/SettingsLib/res/values-zh-rTW/strings.xml | 2 +- 24 files changed, 24 insertions(+), 24 deletions(-) diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml index d1c60113656e3..ce0654a39e844 100644 --- a/packages/SettingsLib/res/values-ar/strings.xml +++ b/packages/SettingsLib/res/values-ar/strings.xml @@ -446,7 +446,7 @@ "%1$s - %2$s" "%1$s إلى أن يتم شحن الجهاز بالكامل" "%1$s - %2$s إلى أن يتم شحن الجهاز بالكامل" - "%1$s - التحسين لسلامة البطارية" + "%1$s - التحسين للحفاظ على سلامة البطارية" "غير معروف" "جارٍ الشحن" "جارٍ الشحن سريعًا" diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml index f3106d5e58c6d..a410b63481a22 100644 --- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml +++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml @@ -446,7 +446,7 @@ "%1$s – %2$s" "Napuniće se za %1$s" "%1$s – napuniće se za %2$s" - "%1$s – Optimizuje se radi stanja baterije" + "%1$s – Optimizuje se radi boljeg stanja baterije" "Nepoznato" "Puni se" "Brzo se puni" diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml index 4b7e9a88da46e..70ec30e70deaa 100644 --- a/packages/SettingsLib/res/values-bg/strings.xml +++ b/packages/SettingsLib/res/values-bg/strings.xml @@ -446,7 +446,7 @@ "%1$s – %2$s" "Оставащо време до пълно зареждане: %1$s" "%1$s – %2$s до пълно зареждане" - "%1$s – Оптимизиране за състоян. на батерията" + "%1$s – Оптимизиране с цел състоянието на батерията" "Неизвестно" "Зарежда се" "Зарежда се бързо" diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml index f8fc174883f64..3ad8b9da9a980 100644 --- a/packages/SettingsLib/res/values-ca/strings.xml +++ b/packages/SettingsLib/res/values-ca/strings.xml @@ -446,7 +446,7 @@ "%1$s: %2$s" "%1$s per completar la càrrega" "%1$s: %2$s per completar la càrrega" - "%1$s: optimitzant per a l\'estat de la bateria" + "%1$s: s\'està optimitzant per preservar l\'estat de la bateria" "Desconegut" "S\'està carregant" "Carregant ràpidament" diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml index 10b8c77b56194..c53f38a0c78c0 100644 --- a/packages/SettingsLib/res/values-el/strings.xml +++ b/packages/SettingsLib/res/values-el/strings.xml @@ -446,7 +446,7 @@ "%1$s - %2$s" "Απομένουν %1$s για ολοκλήρωση της φόρτισης" "%1$s - %2$s για την ολοκλήρωση της φόρτισης" - "%1$s - Βελτιστοποίηση κατάστασης μπαταρίας" + "%1$s - Βελτιστοποίηση για τη διατήρηση της καλής κατάστασης της μπαταρίας" "Άγνωστο" "Φόρτιση" "Ταχεία φόρτιση" diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml index af869d6cec965..3584975737f62 100644 --- a/packages/SettingsLib/res/values-eu/strings.xml +++ b/packages/SettingsLib/res/values-eu/strings.xml @@ -446,7 +446,7 @@ "%1$s - %2$s" "%1$s guztiz kargatu arte" "%1$s - %2$s guztiz kargatu arte" - "%1$s - Optimizatzen bateria egoera onean mantentzeko" + "%1$s - Optimizatzen, bateria egoera onean mantentzeko" "Ezezaguna" "Kargatzen" "Bizkor kargatzen" diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml index d9450ba1d54c2..8f143e4d583ae 100644 --- a/packages/SettingsLib/res/values-gl/strings.xml +++ b/packages/SettingsLib/res/values-gl/strings.xml @@ -446,7 +446,7 @@ "%1$s - %2$s" "%1$s para completar a carga" "%1$s: %2$s para completar a carga" - "%1$s: optimizando para manter a batería en bo estado" + "%1$s: optimizando a preservación da batería" "Descoñecido" "Cargando" "Cargando rapidamente" diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml index 14ee4c9a16dc5..c9c4f25d9e5dc 100644 --- a/packages/SettingsLib/res/values-hy/strings.xml +++ b/packages/SettingsLib/res/values-hy/strings.xml @@ -446,7 +446,7 @@ "%1$s - %2$s" "%1$s մինչև լիցքավորումը" "%1$s – %2$s մինչև լիցքավորումը" - "%1$s – Օպտիմալացվում է" + "%1$s – Օպտիմալացվում է մարտկոցի պահպանման համար" "Անհայտ" "Լիցքավորում" "Արագ լիցքավորում" diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml index bc12fee6a9eb9..32d8091dd01c8 100644 --- a/packages/SettingsLib/res/values-kk/strings.xml +++ b/packages/SettingsLib/res/values-kk/strings.xml @@ -446,7 +446,7 @@ "%1$s - %2$s" "Зарядталғанға дейін %1$s қалды" "%1$s – зарядталғанға дейін %2$s" - "%1$s - Батареяның жұмыс істеу қабілеті оңтайландырылуда" + "%1$s - Батарея жұмысын оңтайландыру" "Белгісіз" "Зарядталуда" "Жылдам зарядталуда" diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml index df25363d0cbf7..682f4d5f9ca4f 100644 --- a/packages/SettingsLib/res/values-kn/strings.xml +++ b/packages/SettingsLib/res/values-kn/strings.xml @@ -446,7 +446,7 @@ "%1$s - %2$s" "ಚಾರ್ಜ್ ಆಗಲು %1$s ಸಮಯ ಬಾಕಿ ಇದೆ" "%1$s - ಚಾರ್ಜ್ ಆಗಲು %2$s ಸಮಯ ಬೇಕು" - "%1$s - ಬ್ಯಾಟರಿಯ ಆರೋಗ್ಯಕ್ಕಾಗಿ ಆಪ್ಟಿಮೈಸ್ ಮಾಡಲಾಗುತ್ತಿದೆ" + "%1$s - ಬ್ಯಾಟರಿಯ ಸುಸ್ಥಿತಿಗಾಗಿ ಆಪ್ಟಿಮೈಸ್ ಮಾಡಲಾಗುತ್ತಿದೆ" "ಅಪರಿಚಿತ" "ಚಾರ್ಜ್ ಆಗುತ್ತಿದೆ" "ವೇಗದ ಚಾರ್ಜಿಂಗ್" diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml index e9f707003fc23..a5c32816a41ed 100644 --- a/packages/SettingsLib/res/values-ml/strings.xml +++ b/packages/SettingsLib/res/values-ml/strings.xml @@ -446,7 +446,7 @@ "%1$s - %2$s" "പൂർണ്ണമായി ചാർജാവാൻ %1$s ശേഷിക്കുന്നു" "%1$s - പൂർണ്ണമായി ചാർജാവാൻ %2$s" - "%1$s - ബാറ്ററി നില ഒപ്റ്റിമൈസ് ചെയ്യുന്നു" + "%1$s - ബാറ്ററിയുടെ ആയുസിനായി ഒപ്റ്റിമൈസ് ചെയ്യുന്നു" "അജ്ഞാതം" "ചാർജ് ചെയ്യുന്നു" "അതിവേഗ ചാർജിംഗ്" diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml index 6b628bdf02bf7..ec79127b9029b 100644 --- a/packages/SettingsLib/res/values-mn/strings.xml +++ b/packages/SettingsLib/res/values-mn/strings.xml @@ -446,7 +446,7 @@ "%1$s - %2$s" "Цэнэглэх хүртэл үлдсэн %1$s" "%1$s - цэнэглэх хүртэл %2$s" - "%1$s - Батарейн чанарыг оновчилж байна" + "%1$s - Батарейн барилтыг оновчилж байна" "Тодорхойгүй" "Цэнэглэж байна" "Хурдан цэнэглэж байна" diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml index b8a010a6ed7ba..d4385758d3469 100644 --- a/packages/SettingsLib/res/values-nb/strings.xml +++ b/packages/SettingsLib/res/values-nb/strings.xml @@ -446,7 +446,7 @@ "%1$s – %2$s" "%1$s til batteriet er fulladet" "%1$s – %2$s til batteriet er fulladet" - "%1$s – Optimaliserer batteritilstanden" + "%1$s – optimaliserer batteritilstanden" "Ukjent" "Lader" "Lader raskt" diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml index 177e29377ee3b..b1735a3294e38 100644 --- a/packages/SettingsLib/res/values-pa/strings.xml +++ b/packages/SettingsLib/res/values-pa/strings.xml @@ -446,7 +446,7 @@ "%1$s - %2$s" "ਚਾਰਜ ਹੋਣ ਵਿੱਚ %1$s ਬਾਕੀ" "%1$s - %2$s ਤੱਕ ਚਾਰਜ ਹੋ ਜਾਵੇਗੀ" - "%1$s - ਬੈਟਰੀ ਸਥਿਤੀ ਲਈ ਅਨੁਕੂਲ ਬਣਾਇਆ ਜਾ ਰਿਹਾ" + "%1$s - ਬੈਟਰੀ ਦੀ ਸਥਿਤੀ ਲਈ ਅਨੁਕੂਲ ਬਣਾਇਆ ਜਾ ਰਿਹਾ ਹੈ" "ਅਗਿਆਤ" "ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੈ" "ਤੇਜ਼ ਚਾਰਜ ਹੋ ਰਹੀ ਹੈ" diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml index 00cc98728729d..38bc6e1c3547e 100644 --- a/packages/SettingsLib/res/values-pl/strings.xml +++ b/packages/SettingsLib/res/values-pl/strings.xml @@ -446,7 +446,7 @@ "%1$s – %2$s" "Do naładowania %1$s" "%1$s – do naładowania %2$s" - "%1$s – Optymalizuję, by utrzymać baterię w dobrym stanie" + "%1$s – Optymalizuję, aby utrzymać baterię w dobrym stanie" "Nieznane" "Ładowanie" "Szybkie ładowanie" diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml index 9cc7a20819ba5..24b7710ce1b16 100644 --- a/packages/SettingsLib/res/values-si/strings.xml +++ b/packages/SettingsLib/res/values-si/strings.xml @@ -446,7 +446,7 @@ "%1$s - %2$s" "ආරෝපණය වන තෙක් %1$s ඇත" "%1$s - ආරෝපණය වන තෙක් %2$s" - "%1$s - බැටරි සෞඛ්‍යය සඳහා ප්‍රශස්ත කරමින්" + "%1$s - බැටරි ආයු කාලය වැඩි දියුණු කරමින්" "නොදනී" "ආරෝපණය වෙමින්" "ශීඝ්‍ර ආරෝපණය" diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml index be2e1a8778e8b..68e1e5deaf195 100644 --- a/packages/SettingsLib/res/values-sl/strings.xml +++ b/packages/SettingsLib/res/values-sl/strings.xml @@ -446,7 +446,7 @@ "%1$s – %2$s" "Še %1$s do polne napolnjenosti" "%1$s – %2$s do polne napolnjenosti" - "%1$s – Optimizacija za ohran. zmog. baterije" + "%1$s – Optimizacija za ohranjanje zmogljivosti baterije" "Neznano" "Polnjenje" "Hitro polnjenje" diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml index 2b59a92c6c3a5..947eb43516558 100644 --- a/packages/SettingsLib/res/values-sr/strings.xml +++ b/packages/SettingsLib/res/values-sr/strings.xml @@ -446,7 +446,7 @@ "%1$s – %2$s" "Напуниће се за %1$s" "%1$s – напуниће се за %2$s" - "%1$s – Оптимизује се ради стања батерије" + "%1$s – Оптимизује се ради бољег стања батерије" "Непознато" "Пуни се" "Брзо се пуни" diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml index 05dbd43f2daa2..6f2da08810ea0 100644 --- a/packages/SettingsLib/res/values-te/strings.xml +++ b/packages/SettingsLib/res/values-te/strings.xml @@ -446,7 +446,7 @@ "%1$s - %2$s" "ఛార్జ్ అవ్వడానికి %1$s సమయం మిగిలి ఉంది" "%1$s - ఛార్జ్ అవ్వడానికి %2$s పడుతుంది" - "%1$s - బ్యాటరీ స్థితిని ఆప్టిమైజ్ చేయడం కోసం" + "%1$s - బ్యాటరీ జీవితకాలాన్ని పెంచడం కోసం ఆప్టిమైజ్ చేస్తోంది" "తెలియదు" "ఛార్జ్ అవుతోంది" "వేగవంతమైన ఛార్జింగ్" diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml index d0b4a9a90c82b..d34455c1a6d72 100644 --- a/packages/SettingsLib/res/values-th/strings.xml +++ b/packages/SettingsLib/res/values-th/strings.xml @@ -284,7 +284,7 @@ "เพิ่มระดับการบันทึก Wi‑Fi แสดงต่อ SSID RSSI ในตัวเลือก Wi‑Fi" "ลดการเปลืองแบตเตอรี่และเพิ่มประสิทธิภาพเครือข่าย" "เมื่อเปิดใช้โหมดนี้ ที่อยู่ MAC ของอุปกรณ์นี้อาจเปลี่ยนทุกครั้งที่เชื่อมต่อกับเครือข่ายที่มีการเปิดใช้การสุ่ม MAC" - "แบบจำกัดปริมาณอินเทอร์เน็ต" + "แบบจำกัดปริมาณ" "ไม่มีการวัดปริมาณอินเทอร์เน็ต" "ขนาดบัฟเฟอร์ของตัวบันทึก" "เลือกขนาด Logger ต่อบัฟเฟอร์ไฟล์บันทึก" diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml index ad83aa5496060..b1d5d43b1b0ce 100644 --- a/packages/SettingsLib/res/values-uk/strings.xml +++ b/packages/SettingsLib/res/values-uk/strings.xml @@ -446,7 +446,7 @@ "%1$s – %2$s" "%1$s до повного заряду" "%1$s – %2$s до повного заряду" - "%1$s – стан акумулятора оптимізується" + "%1$s – Оптимізація для збереження заряду акумулятора" "Невідомо" "Заряджається" "Швидке заряджання" diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml index 4ddb19fcfb17d..7f63b12fea1d9 100644 --- a/packages/SettingsLib/res/values-uz/strings.xml +++ b/packages/SettingsLib/res/values-uz/strings.xml @@ -446,7 +446,7 @@ "%1$s – %2$s" "%1$s ichida toʻladi" "%1$s – %2$s ichida toʻladi" - "%1$s – Batareya quvvati muvozanatlanmoqda" + "%1$s – Batareya uchun optimizatsiya" "Noma’lum" "Quvvat olmoqda" "Tezkor quvvat olmoqda" diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml index 556df308c1438..937439e257069 100644 --- a/packages/SettingsLib/res/values-zh-rHK/strings.xml +++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml @@ -446,7 +446,7 @@ "%1$s - %2$s" "還需 %1$s才能充滿電" "%1$s - 還需 %2$s才能充滿電" - "%1$s - 正在優化電池狀態" + "%1$s - 優化電池效能" "未知" "充電中" "正在快速充電" diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml index efe13bd348926..704d265e4e236 100644 --- a/packages/SettingsLib/res/values-zh-rTW/strings.xml +++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml @@ -446,7 +446,7 @@ "%1$s - %2$s" "%1$s後充飽電" "%1$s - %2$s後充飽電" - "%1$s - 針對電池狀態進行最佳化調整" + "%1$s - 最佳化調整電池狀態" "不明" "充電中" "快速充電中" From d8409498161db3fb6c1b0a517df71f08de6cb29a Mon Sep 17 00:00:00 2001 From: Todd Kennedy Date: Thu, 7 Jan 2021 16:31:39 -0800 Subject: [PATCH 034/288] Ensure OK/Cancel buttons always shown There is some weirdness with the way the AlertActivity behaves when it's populated and elements are enabled while it's not actually on the screen. Work around this by populating the AlertActivity during onResume() [eg. every time the activity is shown] instead of onCreate() [eg. only the first time the activity is created]. Fixes: 172699073, 173159446 Test: Manual Test: Start a staging install Test: Turn off the phone screen Test: Wait for the staging to complete Test: Turn on the phone screen. Test: See the install dialog has OK/Cancel buttons Change-Id: Ia9525f20f98f42e6b2b865fa926b9707d416cde4 --- .../packageinstaller/PackageInstallerActivity.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java b/packages/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java index 5675c9986ac9c..665d262d8067f 100644 --- a/packages/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java +++ b/packages/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java @@ -343,17 +343,19 @@ public class PackageInstallerActivity extends AlertActivity { if (!wasSetUp) { return; } - - // load dummy layout with OK button disabled until we override this layout in - // startInstallConfirm - bindUi(); - checkIfAllowedAndInitiateInstall(); } @Override protected void onResume() { super.onResume(); + if (mAppSnippet != null) { + // load dummy layout with OK button disabled until we override this layout in + // startInstallConfirm + bindUi(); + checkIfAllowedAndInitiateInstall(); + } + if (mOk != null) { mOk.setEnabled(mEnableOk); } From 23ed52f9716134e5ea7fe9c90bedab29cf90876c Mon Sep 17 00:00:00 2001 From: Ivan Chiang Date: Tue, 10 Nov 2020 10:44:05 +0800 Subject: [PATCH 035/288] Fix renaming file and moving file issue in MTP After the user renames/moves a file/directory, the database of MediaProvider is not updated. It causes that the file can't be opened via MediaProvider. Use scanFile to instead of MP.update for the file/directory. Handle the .nomedia case for create/copy/move/delete/rename. Scan the parent directory to update the database. Test: atest MtpTests Test: atest --test-mapping packages/providers/MediaProvider Test: manual. 1. Move/rename the file/directory. 2. Open the file in DocumentsUI 3. create/copy/move/delete/rename for .nomedia case Bug: 169300366 Bug: 171538933 Bug: 172029805 Bug: 170798581 Change-Id: Ia37be7a027bfe502e3f7c96babe5a5bbed5f942c Merged-In: Ia37be7a027bfe502e3f7c96babe5a5bbed5f942c (cherry picked from commit 20079f10644e641bbb2c35c250e8a9e0b9f6c1b3) --- media/java/android/mtp/MtpDatabase.java | 120 +++++------------------- 1 file changed, 24 insertions(+), 96 deletions(-) diff --git a/media/java/android/mtp/MtpDatabase.java b/media/java/android/mtp/MtpDatabase.java index ed56b4398c226..798bf6e2f8ee7 100755 --- a/media/java/android/mtp/MtpDatabase.java +++ b/media/java/android/mtp/MtpDatabase.java @@ -19,8 +19,7 @@ package android.mtp; import android.annotation.NonNull; import android.content.BroadcastReceiver; import android.content.ContentProviderClient; -import android.content.ContentUris; -import android.content.ContentValues; +import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; @@ -32,7 +31,6 @@ import android.media.ExifInterface; import android.media.ThumbnailUtils; import android.net.Uri; import android.os.BatteryManager; -import android.os.RemoteException; import android.os.SystemProperties; import android.os.storage.StorageVolume; import android.provider.MediaStore; @@ -103,8 +101,6 @@ public class MtpDatabase implements AutoCloseable { private MtpStorageManager mManager; private static final String PATH_WHERE = Files.FileColumns.DATA + "=?"; - private static final String[] ID_PROJECTION = new String[] {Files.FileColumns._ID}; - private static final String[] PATH_PROJECTION = new String[] {Files.FileColumns.DATA}; private static final String NO_MEDIA = ".nomedia"; static { @@ -431,7 +427,7 @@ public class MtpDatabase implements AutoCloseable { } // Add the new file to MediaProvider if (succeeded) { - MediaStore.scanFile(mContext.getContentResolver(), obj.getPath().toFile()); + updateMediaStore(mContext, obj.getPath().toFile()); } } @@ -580,32 +576,8 @@ public class MtpDatabase implements AutoCloseable { return MtpConstants.RESPONSE_GENERAL_ERROR; } - // finally update MediaProvider - ContentValues values = new ContentValues(); - values.put(Files.FileColumns.DATA, newPath.toString()); - String[] whereArgs = new String[]{oldPath.toString()}; - try { - // note - we are relying on a special case in MediaProvider.update() to update - // the paths for all children in the case where this is a directory. - final Uri objectsUri = MediaStore.Files.getContentUri(obj.getVolumeName()); - mMediaProvider.update(objectsUri, values, PATH_WHERE, whereArgs); - } catch (RemoteException e) { - Log.e(TAG, "RemoteException in mMediaProvider.update", e); - } - - // check if nomedia status changed - if (obj.isDir()) { - // for directories, check if renamed from something hidden to something non-hidden - if (oldPath.getFileName().startsWith(".") && !newPath.startsWith(".")) { - MediaStore.scanFile(mContext.getContentResolver(), newPath.toFile()); - } - } else { - // for files, check if renamed from .nomedia to something else - if (oldPath.getFileName().toString().toLowerCase(Locale.US).equals(NO_MEDIA) - && !newPath.getFileName().toString().toLowerCase(Locale.US).equals(NO_MEDIA)) { - MediaStore.scanFile(mContext.getContentResolver(), newPath.getParent().toFile()); - } - } + updateMediaStore(mContext, oldPath.toFile()); + updateMediaStore(mContext, newPath.toFile()); return MtpConstants.RESPONSE_OK; } @@ -635,48 +607,15 @@ public class MtpDatabase implements AutoCloseable { Log.e(TAG, "Failed to end move object"); return; } - obj = mManager.getObject(objId); if (!success || obj == null) return; - // Get parent info from MediaProvider, since the id is different from MTP's - ContentValues values = new ContentValues(); + Path path = newParentObj.getPath().resolve(name); Path oldPath = oldParentObj.getPath().resolve(name); - values.put(Files.FileColumns.DATA, path.toString()); - if (obj.getParent().isRoot()) { - values.put(Files.FileColumns.PARENT, 0); - } else { - int parentId = findInMedia(newParentObj, path.getParent()); - if (parentId != -1) { - values.put(Files.FileColumns.PARENT, parentId); - } else { - // The new parent isn't in MediaProvider, so delete the object instead - deleteFromMedia(obj, oldPath, obj.isDir()); - return; - } - } - // update MediaProvider - Cursor c = null; - String[] whereArgs = new String[]{oldPath.toString()}; - try { - int parentId = -1; - if (!oldParentObj.isRoot()) { - parentId = findInMedia(oldParentObj, oldPath.getParent()); - } - if (oldParentObj.isRoot() || parentId != -1) { - // Old parent exists in MediaProvider - perform a move - // note - we are relying on a special case in MediaProvider.update() to update - // the paths for all children in the case where this is a directory. - final Uri objectsUri = MediaStore.Files.getContentUri(obj.getVolumeName()); - mMediaProvider.update(objectsUri, values, PATH_WHERE, whereArgs); - } else { - // Old parent doesn't exist - add the object - MediaStore.scanFile(mContext.getContentResolver(), path.toFile()); - } - } catch (RemoteException e) { - Log.e(TAG, "RemoteException in mMediaProvider.update", e); - } + + updateMediaStore(mContext, oldPath.toFile()); + updateMediaStore(mContext, path.toFile()); } @VisibleForNative @@ -699,7 +638,19 @@ public class MtpDatabase implements AutoCloseable { if (!success) { return; } - MediaStore.scanFile(mContext.getContentResolver(), obj.getPath().toFile()); + + updateMediaStore(mContext, obj.getPath().toFile()); + } + + private static void updateMediaStore(@NonNull Context context, @NonNull File file) { + final ContentResolver resolver = context.getContentResolver(); + // For file, check whether the file name is .nomedia or not. + // If yes, scan the parent directory to update all files in the directory. + if (!file.isDirectory() && file.getName().toLowerCase(Locale.ROOT).endsWith(NO_MEDIA)) { + MediaStore.scanFile(resolver, file.getParentFile()); + } else { + MediaStore.scanFile(resolver, file); + } } @VisibleForNative @@ -928,26 +879,6 @@ public class MtpDatabase implements AutoCloseable { deleteFromMedia(obj, obj.getPath(), obj.isDir()); } - private int findInMedia(MtpStorageManager.MtpObject obj, Path path) { - final Uri objectsUri = MediaStore.Files.getContentUri(obj.getVolumeName()); - - int ret = -1; - Cursor c = null; - try { - c = mMediaProvider.query(objectsUri, ID_PROJECTION, PATH_WHERE, - new String[]{path.toString()}, null, null); - if (c != null && c.moveToNext()) { - ret = c.getInt(0); - } - } catch (RemoteException e) { - Log.e(TAG, "Error finding " + path + " in MediaProvider"); - } finally { - if (c != null) - c.close(); - } - return ret; - } - private void deleteFromMedia(MtpStorageManager.MtpObject obj, Path path, boolean isDir) { final Uri objectsUri = MediaStore.Files.getContentUri(obj.getVolumeName()); try { @@ -963,13 +894,10 @@ public class MtpDatabase implements AutoCloseable { } String[] whereArgs = new String[]{path.toString()}; - if (mMediaProvider.delete(objectsUri, PATH_WHERE, whereArgs) > 0) { - if (!isDir && path.toString().toLowerCase(Locale.US).endsWith(NO_MEDIA)) { - MediaStore.scanFile(mContext.getContentResolver(), path.getParent().toFile()); - } - } else { - Log.i(TAG, "Mediaprovider didn't delete " + path); + if (mMediaProvider.delete(objectsUri, PATH_WHERE, whereArgs) == 0) { + Log.i(TAG, "MediaProvider didn't delete " + path); } + updateMediaStore(mContext, path.toFile()); } catch (Exception e) { Log.d(TAG, "Failed to delete " + path + " from MediaProvider"); } From 557838f5506760076e5c523081590b2992b619ff Mon Sep 17 00:00:00 2001 From: Lais Andrade Date: Thu, 3 Dec 2020 21:07:27 +0000 Subject: [PATCH 036/288] Check mode/boost index before accessing cached support value Bug: 174243830 Test: manual Change-Id: I2f81bcd57181791fa95d35ad52e6af2d7d9c8dcf Merged-In: If305a4b694a9d6fcc27da8279f1f53f9fd9cb685 Merged-In: I345d9ff828021da35556f2d51da512840dda8026 --- ...ndroid_server_power_PowerManagerService.cpp | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/services/core/jni/com_android_server_power_PowerManagerService.cpp b/services/core/jni/com_android_server_power_PowerManagerService.cpp index 469838357f306..85d5c1f256930 100644 --- a/services/core/jni/com_android_server_power_PowerManagerService.cpp +++ b/services/core/jni/com_android_server_power_PowerManagerService.cpp @@ -190,19 +190,18 @@ static void setPowerBoostWithHandle(sp handle, Boost boost, int32_t static std::array, static_cast(Boost::DISPLAY_UPDATE_IMMINENT) + 1> boostSupportedArray = {HalSupport::UNKNOWN}; + size_t idx = static_cast(boost); // Quick return if boost is not supported by HAL - if (boost > Boost::DISPLAY_UPDATE_IMMINENT || - boostSupportedArray[static_cast(boost)] == HalSupport::OFF) { + if (idx >= boostSupportedArray.size() || boostSupportedArray[idx] == HalSupport::OFF) { ALOGV("Skipped setPowerBoost %s because HAL doesn't support it", toString(boost).c_str()); return; } - if (boostSupportedArray[static_cast(boost)] == HalSupport::UNKNOWN) { + if (boostSupportedArray[idx] == HalSupport::UNKNOWN) { bool isSupported = false; handle->isBoostSupported(boost, &isSupported); - boostSupportedArray[static_cast(boost)] = - isSupported ? HalSupport::ON : HalSupport::OFF; + boostSupportedArray[idx] = isSupported ? HalSupport::ON : HalSupport::OFF; if (!isSupported) { ALOGV("Skipped setPowerBoost %s because HAL doesn't support it", toString(boost).c_str()); @@ -230,19 +229,18 @@ static bool setPowerModeWithHandle(sp handle, Mode mode, bool enable // Need to increase the array if more mode supported. static std::array, static_cast(Mode::DISPLAY_INACTIVE) + 1> modeSupportedArray = {HalSupport::UNKNOWN}; + size_t idx = static_cast(mode); // Quick return if mode is not supported by HAL - if (mode > Mode::DISPLAY_INACTIVE || - modeSupportedArray[static_cast(mode)] == HalSupport::OFF) { + if (idx >= modeSupportedArray.size() || modeSupportedArray[idx] == HalSupport::OFF) { ALOGV("Skipped setPowerMode %s because HAL doesn't support it", toString(mode).c_str()); return false; } - if (modeSupportedArray[static_cast(mode)] == HalSupport::UNKNOWN) { + if (modeSupportedArray[idx] == HalSupport::UNKNOWN) { bool isSupported = false; handle->isModeSupported(mode, &isSupported); - modeSupportedArray[static_cast(mode)] = - isSupported ? HalSupport::ON : HalSupport::OFF; + modeSupportedArray[idx] = isSupported ? HalSupport::ON : HalSupport::OFF; if (!isSupported) { ALOGV("Skipped setPowerMode %s because HAL doesn't support it", toString(mode).c_str()); return false; From 20b47da57ac2067429519c83f3053269195a38c8 Mon Sep 17 00:00:00 2001 From: Lais Andrade Date: Thu, 3 Dec 2020 21:07:27 +0000 Subject: [PATCH 037/288] Check mode/boost index before accessing cached support value Bug: 174243830 Test: manual Change-Id: I2f81bcd57181791fa95d35ad52e6af2d7d9c8dcf Merged-In: If305a4b694a9d6fcc27da8279f1f53f9fd9cb685 Merged-In: I345d9ff828021da35556f2d51da512840dda8026 --- ...ndroid_server_power_PowerManagerService.cpp | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/services/core/jni/com_android_server_power_PowerManagerService.cpp b/services/core/jni/com_android_server_power_PowerManagerService.cpp index 469838357f306..85d5c1f256930 100644 --- a/services/core/jni/com_android_server_power_PowerManagerService.cpp +++ b/services/core/jni/com_android_server_power_PowerManagerService.cpp @@ -190,19 +190,18 @@ static void setPowerBoostWithHandle(sp handle, Boost boost, int32_t static std::array, static_cast(Boost::DISPLAY_UPDATE_IMMINENT) + 1> boostSupportedArray = {HalSupport::UNKNOWN}; + size_t idx = static_cast(boost); // Quick return if boost is not supported by HAL - if (boost > Boost::DISPLAY_UPDATE_IMMINENT || - boostSupportedArray[static_cast(boost)] == HalSupport::OFF) { + if (idx >= boostSupportedArray.size() || boostSupportedArray[idx] == HalSupport::OFF) { ALOGV("Skipped setPowerBoost %s because HAL doesn't support it", toString(boost).c_str()); return; } - if (boostSupportedArray[static_cast(boost)] == HalSupport::UNKNOWN) { + if (boostSupportedArray[idx] == HalSupport::UNKNOWN) { bool isSupported = false; handle->isBoostSupported(boost, &isSupported); - boostSupportedArray[static_cast(boost)] = - isSupported ? HalSupport::ON : HalSupport::OFF; + boostSupportedArray[idx] = isSupported ? HalSupport::ON : HalSupport::OFF; if (!isSupported) { ALOGV("Skipped setPowerBoost %s because HAL doesn't support it", toString(boost).c_str()); @@ -230,19 +229,18 @@ static bool setPowerModeWithHandle(sp handle, Mode mode, bool enable // Need to increase the array if more mode supported. static std::array, static_cast(Mode::DISPLAY_INACTIVE) + 1> modeSupportedArray = {HalSupport::UNKNOWN}; + size_t idx = static_cast(mode); // Quick return if mode is not supported by HAL - if (mode > Mode::DISPLAY_INACTIVE || - modeSupportedArray[static_cast(mode)] == HalSupport::OFF) { + if (idx >= modeSupportedArray.size() || modeSupportedArray[idx] == HalSupport::OFF) { ALOGV("Skipped setPowerMode %s because HAL doesn't support it", toString(mode).c_str()); return false; } - if (modeSupportedArray[static_cast(mode)] == HalSupport::UNKNOWN) { + if (modeSupportedArray[idx] == HalSupport::UNKNOWN) { bool isSupported = false; handle->isModeSupported(mode, &isSupported); - modeSupportedArray[static_cast(mode)] = - isSupported ? HalSupport::ON : HalSupport::OFF; + modeSupportedArray[idx] = isSupported ? HalSupport::ON : HalSupport::OFF; if (!isSupported) { ALOGV("Skipped setPowerMode %s because HAL doesn't support it", toString(mode).c_str()); return false; From bf88e9faf1e9d892dee24896c1bb5a944b355e0a Mon Sep 17 00:00:00 2001 From: Dave Mankoff Date: Mon, 17 Aug 2020 15:33:21 -0400 Subject: [PATCH 038/288] Pass interaction type to FalsingManager.isFalse This ensures that the falsing manager always is testing against the correct interaction type when it is asked. Prior to this change, we could end up in states where a user was swiping down (opening the quick settings) but the falsing manager believed the user was trying to unlock the phone. Fixes: 160967364 Test: atest SystemUITests && manual Change-Id: I176f54a768622dec3e758a7f01ed8aec26223648 Merged-In: I176f54a768622dec3e758a7f01ed8aec26223648 --- .../systemui/plugins/FalsingManager.java | 5 ++-- .../NotificationSwipeActionHelper.java | 11 +++++---- .../src/com/android/systemui/SwipeHelper.java | 9 +++++--- .../classifier/FalsingManagerFake.java | 2 +- .../classifier/FalsingManagerImpl.java | 2 +- .../classifier/FalsingManagerProxy.java | 4 ++-- .../brightline/BrightLineFalsingManager.java | 3 ++- .../brightline/FalsingDataProvider.java | 5 +++- .../media/MediaCarouselScrollHandler.kt | 4 +++- .../systemui/statusbar/DragDownHelper.java | 4 +++- .../statusbar/PulseExpansionHandler.kt | 3 ++- .../stack/NotificationSwipeHelper.java | 2 +- .../phone/KeyguardAffordanceHelper.java | 5 +++- .../NotificationPanelViewController.java | 8 ++++--- .../statusbar/phone/PanelViewController.java | 23 +++++++++++++++---- 15 files changed, 62 insertions(+), 28 deletions(-) diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/FalsingManager.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/FalsingManager.java index 9d52098f37d5c..63f8b1f5dbb8e 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/FalsingManager.java +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/FalsingManager.java @@ -30,7 +30,7 @@ import java.io.PrintWriter; */ @ProvidesInterface(version = FalsingManager.VERSION) public interface FalsingManager { - int VERSION = 4; + int VERSION = 5; void onSuccessfulUnlock(); @@ -42,7 +42,8 @@ public interface FalsingManager { boolean isUnlockingDisabled(); - boolean isFalseTouch(); + /** Returns true if the gesture should be rejected. */ + boolean isFalseTouch(int interactionType); void onNotificatonStopDraggingDown(); diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/NotificationSwipeActionHelper.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/NotificationSwipeActionHelper.java index 02c4c5eff26e5..4b6efa91a7c8e 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/NotificationSwipeActionHelper.java +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/NotificationSwipeActionHelper.java @@ -14,16 +14,16 @@ package com.android.systemui.plugins.statusbar; -import com.android.systemui.plugins.annotations.DependsOn; -import com.android.systemui.plugins.annotations.ProvidesInterface; -import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper.SnoozeOption; - import android.service.notification.SnoozeCriterion; import android.service.notification.StatusBarNotification; import android.view.MotionEvent; import android.view.View; import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction; +import com.android.systemui.plugins.annotations.DependsOn; +import com.android.systemui.plugins.annotations.ProvidesInterface; +import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper.SnoozeOption; + @ProvidesInterface(version = NotificationSwipeActionHelper.VERSION) @DependsOn(target = SnoozeOption.class) public interface NotificationSwipeActionHelper { @@ -52,7 +52,8 @@ public interface NotificationSwipeActionHelper { public boolean isDismissGesture(MotionEvent ev); - public boolean isFalseGesture(MotionEvent ev); + /** Returns true if the gesture should be rejected. */ + boolean isFalseGesture(); public boolean swipedFarEnough(float translation, float viewSize); diff --git a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java index d17ca4041b31e..0bb8c9cd81f3d 100644 --- a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java +++ b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java @@ -16,6 +16,8 @@ package com.android.systemui; +import static com.android.systemui.classifier.Classifier.NOTIFICATION_DISMISS; + import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; @@ -697,14 +699,15 @@ public class SwipeHelper implements Gefingerpoken { float translation = getTranslation(mCurrView); return ev.getActionMasked() == MotionEvent.ACTION_UP && !mFalsingManager.isUnlockingDisabled() - && !isFalseGesture(ev) && (swipedFastEnough() || swipedFarEnough()) + && !isFalseGesture() && (swipedFastEnough() || swipedFarEnough()) && mCallback.canChildBeDismissedInDirection(mCurrView, translation > 0); } - public boolean isFalseGesture(MotionEvent ev) { + /** Returns true if the gesture should be rejected. */ + public boolean isFalseGesture() { boolean falsingDetected = mCallback.isAntiFalsingNeeded(); if (mFalsingManager.isClassifierEnabled()) { - falsingDetected = falsingDetected && mFalsingManager.isFalseTouch(); + falsingDetected = falsingDetected && mFalsingManager.isFalseTouch(NOTIFICATION_DISMISS); } else { falsingDetected = falsingDetected && !mTouchAboveFalsingThreshold; } diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerFake.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerFake.java index 646e62062dfb0..6961b45c3c375 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerFake.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerFake.java @@ -70,7 +70,7 @@ public class FalsingManagerFake implements FalsingManager { } @Override - public boolean isFalseTouch() { + public boolean isFalseTouch(@Classifier.InteractionType int interactionType) { return mIsFalseTouch; } diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerImpl.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerImpl.java index cc64fb53f15fc..decaec10e572f 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerImpl.java @@ -262,7 +262,7 @@ public class FalsingManagerImpl implements FalsingManager { /** * @return true if the classifier determined that this is not a human interacting with the phone */ - public boolean isFalseTouch() { + public boolean isFalseTouch(@Classifier.InteractionType int interactionType) { if (FalsingLog.ENABLED) { // We're getting some false wtfs from touches that happen after the device went // to sleep. Only report missing sessions that happen when the device is interactive. diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java index f35322bd2a777..be6c5f9a905f0 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java @@ -187,8 +187,8 @@ public class FalsingManagerProxy implements FalsingManager, Dumpable { } @Override - public boolean isFalseTouch() { - return mInternalFalsingManager.isFalseTouch(); + public boolean isFalseTouch(@Classifier.InteractionType int interactionType) { + return mInternalFalsingManager.isFalseTouch(interactionType); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java b/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java index a50f9ce9713b0..9d847ca62465d 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java @@ -189,7 +189,8 @@ public class BrightLineFalsingManager implements FalsingManager { } @Override - public boolean isFalseTouch() { + public boolean isFalseTouch(@Classifier.InteractionType int interactionType) { + mDataProvider.setInteractionType(interactionType); if (!mDataProvider.isDirty()) { return mPreviousResult; } diff --git a/packages/SystemUI/src/com/android/systemui/classifier/brightline/FalsingDataProvider.java b/packages/SystemUI/src/com/android/systemui/classifier/brightline/FalsingDataProvider.java index ea46441c8fbe2..8d067489a8cce 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/brightline/FalsingDataProvider.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/brightline/FalsingDataProvider.java @@ -116,7 +116,10 @@ public class FalsingDataProvider { * interactionType is defined by {@link com.android.systemui.classifier.Classifier}. */ final void setInteractionType(@Classifier.InteractionType int interactionType) { - this.mInteractionType = interactionType; + if (mInteractionType != interactionType) { + mInteractionType = interactionType; + mDirty = true; + } } public boolean isDirty() { diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselScrollHandler.kt b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselScrollHandler.kt index 77cac5023db37..486399979db7c 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselScrollHandler.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselScrollHandler.kt @@ -30,6 +30,7 @@ import com.android.settingslib.Utils import com.android.systemui.Gefingerpoken import com.android.systemui.qs.PageIndicator import com.android.systemui.R +import com.android.systemui.classifier.Classifier.NOTIFICATION_DISMISS import com.android.systemui.plugins.FalsingManager import com.android.systemui.util.animation.PhysicsAnimator import com.android.systemui.util.concurrency.DelayableExecutor @@ -315,7 +316,8 @@ class MediaCarouselScrollHandler( return false } - private fun isFalseTouch() = falsingProtectionNeeded && falsingManager.isFalseTouch + private fun isFalseTouch() = falsingProtectionNeeded && + falsingManager.isFalseTouch(NOTIFICATION_DISMISS) private fun getMaxTranslation() = if (showsSettingsButton) { settingsButton.width diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/DragDownHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/DragDownHelper.java index 4fa782269c2d7..e61e05a7dc2f2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/DragDownHelper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/DragDownHelper.java @@ -16,6 +16,8 @@ package com.android.systemui.statusbar; +import static com.android.systemui.classifier.Classifier.NOTIFICATION_DRAG_DOWN; + import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; @@ -163,7 +165,7 @@ public class DragDownHelper implements Gefingerpoken { if (!mDragDownCallback.isFalsingCheckNeeded()) { return false; } - return mFalsingManager.isFalseTouch() || !mDraggedFarEnough; + return mFalsingManager.isFalseTouch(NOTIFICATION_DRAG_DOWN) || !mDraggedFarEnough; } private void captureStartingChild(float x, float y) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt b/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt index 7b2585324b9f5..38f96f42bdd4a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt @@ -30,6 +30,7 @@ import android.view.ViewConfiguration import com.android.systemui.Gefingerpoken import com.android.systemui.Interpolators import com.android.systemui.R +import com.android.systemui.classifier.Classifier.NOTIFICATION_DRAG_DOWN import com.android.systemui.plugins.FalsingManager import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator @@ -106,7 +107,7 @@ constructor( private var velocityTracker: VelocityTracker? = null private val isFalseTouch: Boolean - get() = falsingManager.isFalseTouch + get() = falsingManager.isFalseTouch(NOTIFICATION_DRAG_DOWN) var qsExpanded: Boolean = false var pulseExpandAbortListener: Runnable? = null var bouncerShowing: Boolean = false diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelper.java index d7d09e05c2386..ac528b245ce93 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelper.java @@ -209,7 +209,7 @@ class NotificationSwipeHelper extends SwipeHelper implements NotificationSwipeAc || (isFastNonDismissGesture && isAbleToShowMenu); int menuSnapTarget = menuRow.getMenuSnapTarget(); boolean isNonFalseMenuRevealingGesture = - !isFalseGesture(ev) && isMenuRevealingGestureAwayFromMenu; + !isFalseGesture() && isMenuRevealingGestureAwayFromMenu; if ((isNonDismissGestureTowardsMenu || isNonFalseMenuRevealingGesture) && menuSnapTarget != 0) { // Menu has not been snapped to previously and this is menu revealing gesture diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardAffordanceHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardAffordanceHelper.java index 858023dc6c625..ba94202658495 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardAffordanceHelper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardAffordanceHelper.java @@ -27,6 +27,7 @@ import android.view.ViewConfiguration; import com.android.systemui.Interpolators; import com.android.systemui.R; +import com.android.systemui.classifier.Classifier; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.statusbar.FlingAnimationUtils; import com.android.systemui.statusbar.KeyguardAffordanceView; @@ -317,7 +318,9 @@ public class KeyguardAffordanceHelper { // We snap back if the current translation is not far enough boolean snapBack = false; if (mCallback.needsAntiFalsing()) { - snapBack = snapBack || mFalsingManager.isFalseTouch(); + snapBack = snapBack || mFalsingManager.isFalseTouch( + mTargetedView == mRightIcon + ? Classifier.RIGHT_AFFORDANCE : Classifier.LEFT_AFFORDANCE); } snapBack = snapBack || isBelowFalsingThreshold(); 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 799e16cc6d8d4..53cbf02e57f05 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java @@ -18,6 +18,7 @@ package com.android.systemui.statusbar.phone; import static android.view.View.GONE; +import static com.android.systemui.classifier.Classifier.QUICK_SETTINGS; import static com.android.systemui.statusbar.notification.ActivityLaunchAnimator.ExpandAnimationParameters; import static com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout.ROWS_ALL; @@ -69,6 +70,7 @@ import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.systemui.DejankUtils; import com.android.systemui.Interpolators; import com.android.systemui.R; +import com.android.systemui.classifier.Classifier; import com.android.systemui.dagger.qualifiers.DisplayId; import com.android.systemui.doze.DozeLog; import com.android.systemui.fragments.FragmentHostManager; @@ -1204,7 +1206,7 @@ public class NotificationPanelViewController extends PanelViewController { } private boolean flingExpandsQs(float vel) { - if (mFalsingManager.isUnlockingDisabled() || isFalseTouch()) { + if (mFalsingManager.isUnlockingDisabled() || isFalseTouch(QUICK_SETTINGS)) { return false; } if (Math.abs(vel) < mFlingAnimationUtils.getMinVelocityPxPerSecond()) { @@ -1214,12 +1216,12 @@ public class NotificationPanelViewController extends PanelViewController { } } - private boolean isFalseTouch() { + private boolean isFalseTouch(@Classifier.InteractionType int interactionType) { if (!mKeyguardAffordanceHelperCallback.needsAntiFalsing()) { return false; } if (mFalsingManager.isClassifierEnabled()) { - return mFalsingManager.isFalseTouch(); + return mFalsingManager.isFalseTouch(interactionType); } return !mQsTouchAboveFalsingThreshold; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java index e942d85790c16..a4f9b06b86a51 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java @@ -16,6 +16,10 @@ package com.android.systemui.statusbar.phone; +import static com.android.systemui.classifier.Classifier.BOUNCER_UNLOCK; +import static com.android.systemui.classifier.Classifier.QUICK_SETTINGS; +import static com.android.systemui.classifier.Classifier.UNLOCK; + import static java.lang.Float.isNaN; import android.animation.Animator; @@ -41,6 +45,7 @@ import com.android.internal.util.LatencyTracker; import com.android.systemui.DejankUtils; import com.android.systemui.Interpolators; import com.android.systemui.R; +import com.android.systemui.classifier.Classifier; import com.android.systemui.doze.DozeLog; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.statusbar.FlingAnimationUtils; @@ -397,7 +402,12 @@ public abstract class PanelViewController { mLockscreenGestureLogger.write(MetricsEvent.ACTION_LS_UNLOCK, heightDp, velocityDp); mLockscreenGestureLogger.log(LockscreenUiEvent.LOCKSCREEN_UNLOCK); } - fling(vel, expand, isFalseTouch(x, y)); + @Classifier.InteractionType int interactionType = vel > 0 + ? QUICK_SETTINGS : ( + mKeyguardStateController.canDismissLockScreen() + ? UNLOCK : BOUNCER_UNLOCK); + + fling(vel, expand, isFalseTouch(x, y, interactionType)); onTrackingStopped(expand); mUpdateFlingOnLayout = expand && mPanelClosedOnDown && !mHasLayoutedSinceDown; if (mUpdateFlingOnLayout) { @@ -492,7 +502,11 @@ public abstract class PanelViewController { return true; } - if (isFalseTouch(x, y)) { + @Classifier.InteractionType int interactionType = vel > 0 + ? QUICK_SETTINGS : ( + mKeyguardStateController.canDismissLockScreen() ? UNLOCK : BOUNCER_UNLOCK); + + if (isFalseTouch(x, y, interactionType)) { return true; } if (Math.abs(vectorVel) < mFlingAnimationUtils.getMinVelocityPxPerSecond()) { @@ -511,12 +525,13 @@ public abstract class PanelViewController { * @param y the final y-coordinate when the finger was lifted * @return whether this motion should be regarded as a false touch */ - private boolean isFalseTouch(float x, float y) { + private boolean isFalseTouch(float x, float y, + @Classifier.InteractionType int interactionType) { if (!mStatusBar.isFalsingThresholdNeeded()) { return false; } if (mFalsingManager.isClassifierEnabled()) { - return mFalsingManager.isFalseTouch(); + return mFalsingManager.isFalseTouch(interactionType); } if (!mTouchAboveFalsingThreshold) { return true; From a13fc7f314ac56e75eca09c94db8090f928023ff Mon Sep 17 00:00:00 2001 From: Michael Groover Date: Tue, 21 Jan 2020 20:00:41 -0800 Subject: [PATCH 039/288] Update the getIccId docs to reflect access requirements In Android 10 access to device identifiers was limited to apps with the READ_PRIVILEGED_PHONE_STATE permission, carrier privileges, the READ_DEVICE_IDENTIFIERS appop set to allow, or those that pass a device / profile owner check. TelephonyManager#getSimSerialNumber was guarded behind these new access requirements, but the same value is still accessible via SubscriptionInfo#getIccId. This change updates the documentation to reflect that the getIccId will no longer be accessible if the caller does not meet the new access requirements. Bug: 131909991 Bug: 173421434 Test: Builds Change-Id: I03072c65e1c7101538a7a20541d2ac59a2d213e3 Merged-In: I03072c65e1c7101538a7a20541d2ac59a2d213e3 --- .../android/telephony/SubscriptionInfo.java | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/telephony/java/android/telephony/SubscriptionInfo.java b/telephony/java/android/telephony/SubscriptionInfo.java index 1e6cd474d13bf..d34b8c932f77d 100644 --- a/telephony/java/android/telephony/SubscriptionInfo.java +++ b/telephony/java/android/telephony/SubscriptionInfo.java @@ -38,6 +38,8 @@ import android.text.TextUtils; import android.util.DisplayMetrics; import android.util.Log; +import com.android.telephony.Rlog; + import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -200,6 +202,19 @@ public class SubscriptionInfo implements Parcelable { */ private int mSubscriptionType; + /** + * Public copy constructor. + * @hide + */ + public SubscriptionInfo(SubscriptionInfo info) { + this(info.mId, info.mIccId, info.mSimSlotIndex, info.mDisplayName, info.mCarrierName, + info.mNameSource, info.mIconTint, info.mNumber, info.mDataRoaming, info.mIconBitmap, + info.mMcc, info.mMnc, info.mCountryIso, info.mIsEmbedded, info.mAccessRules, + info.mCardString, info.mCardId, info.mIsOpportunistic, + info.mGroupUUID == null ? null : info.mGroupUUID.toString(), info.mIsGroupDisabled, + info.mCarrierId, info.mProfileClass, info.mSubscriptionType, info.mGroupOwner); + } + /** * @hide */ @@ -271,12 +286,26 @@ public class SubscriptionInfo implements Parcelable { } /** - * @return the ICC ID. + * Returns the ICC ID if the calling app has been granted the READ_PRIVILEGED_PHONE_STATE + * permission, has carrier privileges (see {@link TelephonyManager#hasCarrierPrivileges}), or + * is a device owner or profile owner that has been granted the READ_PHONE_STATE permission. + * The profile owner is an app that owns a managed profile on the device; for more details see + * Work profiles. Profile + * owner access is deprecated and will be removed in a future release. + * + * @return the ICC ID, or an empty string if one of these requirements is not met */ public String getIccId() { return this.mIccId; } + /** + * @hide + */ + public void clearIccId() { + this.mIccId = ""; + } + /** * @return the slot index of this Subscription's SIM card. */ From 1c1bc30ce345f770de44b4348420e860d0958534 Mon Sep 17 00:00:00 2001 From: Michael Groover Date: Wed, 19 Feb 2020 23:37:42 -0800 Subject: [PATCH 040/288] Whitelist READ_PRIVILEGED_PHONE_STATE for the contacts provider In Android 10 access to device identifiers was moved from a runtime permission to the privileged READ_PRIVILEGED_PHONE_STATE permission. One of the non-resettable identifiers missed was SubscriptionInfo# getIccId. The contacts provider currently uses this ID to upgrade to version 1003 of the database; to ensure there are no issues with this upgrade this permission is being whitelisted for the contacts provider. Bug: 131909991 Bug: 173421434 Test: atest ContactsProviderTests Change-Id: I7574f787a7e55aa0337237b9fe916ee143a2f697 Merged-In: I7574f787a7e55aa0337237b9fe916ee143a2f697 --- data/etc/privapp-permissions-platform.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml index ff4e1005c9d98..3648280233053 100644 --- a/data/etc/privapp-permissions-platform.xml +++ b/data/etc/privapp-permissions-platform.xml @@ -177,6 +177,7 @@ applications that come with the platform + From 5aba70130d3539fc77cfdfb4b550d8e86acd8a60 Mon Sep 17 00:00:00 2001 From: Michael Groover Date: Fri, 20 Mar 2020 13:13:36 -0700 Subject: [PATCH 041/288] Add method to clear out SubscriptionInfo#getCardString In Androird 10 access to device identifiers was limited to apps with the READ_PRIVILEGED_PHONE_STATE permission, carrier privileges, the READ_DEVICE_IDENTIFIERS appop set to allow, or those that pass a device / profile owner check. TelephonyManager#getSimSerialNumber was guarded behind these new access requirements, but the same value is still accessible as the cardString from the SubscriptionInfo. While getCardString is a hidden API SubscriptionInfo#toString can be used to obtain this value. Bug: 152057778 Bug: 173421434 Test: atest SubscriptionControllerTest Change-Id: I9b8786a321b1ba79d81b74c3041589f30df8e9c8 Merged-In: I9b8786a321b1ba79d81b74c3041589f30df8e9c8 --- .../android/telephony/SubscriptionInfo.java | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/telephony/java/android/telephony/SubscriptionInfo.java b/telephony/java/android/telephony/SubscriptionInfo.java index d34b8c932f77d..fcfc728b2c7be 100644 --- a/telephony/java/android/telephony/SubscriptionInfo.java +++ b/telephony/java/android/telephony/SubscriptionInfo.java @@ -38,8 +38,6 @@ import android.text.TextUtils; import android.util.DisplayMetrics; import android.util.Log; -import com.android.telephony.Rlog; - import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -629,8 +627,16 @@ public class SubscriptionInfo implements Parcelable { } /** - * @return the card string of the SIM card which contains the subscription. The card string is - * the ICCID for UICCs or the EID for eUICCs. + * Returns the card string if the calling app has been granted the READ_PRIVILEGED_PHONE_STATE + * permission, has carrier privileges (see {@link TelephonyManager#hasCarrierPrivileges}), or + * is a device owner or profile owner on an organization owned device that has been granted the + * READ_PHONE_STATE permission. The profile owner is an app that owns a managed profile on the + * device; for more details see + * Work profiles. + * + * @return the card string of the SIM card which contains the subscription or an empty string + * if these requirements are not met. The card string is the ICCID for UICCs or the EID for + * eUICCs. * @hide * //TODO rename usages in LPA: UiccSlotUtil.java, UiccSlotsManager.java, UiccSlotInfoTest.java */ @@ -638,6 +644,13 @@ public class SubscriptionInfo implements Parcelable { return this.mCardString; } + /** + * @hide + */ + public void clearCardString() { + this.mCardString = ""; + } + /** * Returns the card ID of the SIM card which contains the subscription (see * {@link UiccCardInfo#getCardId()}. From 400e7d5dda91c58690f8febba4132856e560663d Mon Sep 17 00:00:00 2001 From: raylinhsu Date: Wed, 6 Jan 2021 15:58:05 +0800 Subject: [PATCH 042/288] Fix the ambient lux which did not update for blocking zone When the display enters doze mode, it should unregister the light sensor. It should register light sensor again when the display state change from doze to on otherwise we will lost lux information and then the refresh rate could not be locked. Bug: 176018998 Test: atest DisplayModeDirectorTest Test: no fps transition in the blocking zone when the display state change Test: check if the lux will update when the display state change Change-Id: Ibf2e7cb2e336c88a583f00f59abcbc9d06ec3d62 Merged-In: Ibf2e7cb2e336c88a583f00f59abcbc9d06ec3d62 --- .../server/display/DisplayModeDirector.java | 35 ++++++++++++---- .../display/DisplayModeDirectorTest.java | 42 ++++++++++++++++++- 2 files changed, 67 insertions(+), 10 deletions(-) diff --git a/services/core/java/com/android/server/display/DisplayModeDirector.java b/services/core/java/com/android/server/display/DisplayModeDirector.java index 02ee059194ec3..29a77e2b6ef23 100644 --- a/services/core/java/com/android/server/display/DisplayModeDirector.java +++ b/services/core/java/com/android/server/display/DisplayModeDirector.java @@ -52,9 +52,12 @@ import com.android.server.display.utils.AmbientFilterFactory; import com.android.server.utils.DeviceConfigInterface; import java.io.PrintWriter; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; +import java.util.Date; import java.util.List; +import java.util.Locale; import java.util.Objects; /** @@ -1160,7 +1163,8 @@ public class DisplayModeDirector { // mShouldObserveAmbientHighChange is true, screen is on, peak refresh rate // changeable and low power mode off. After initialization, these states will // be updated from the same handler thread. - private boolean mDefaultDisplayOn = false; + private int mDefaultDisplayState = Display.STATE_UNKNOWN; + private boolean mIsDeviceActive = false; private boolean mRefreshRateChangeable = false; private boolean mLowPowerModeEnabled = false; @@ -1341,7 +1345,8 @@ public class DisplayModeDirector { pw.println(" BrightnessObserver"); pw.println(" mAmbientLux: " + mAmbientLux); pw.println(" mBrightness: " + mBrightness); - pw.println(" mDefaultDisplayOn: " + mDefaultDisplayOn); + pw.println(" mDefaultDisplayState: " + mDefaultDisplayState); + pw.println(" mIsDeviceActive: " + mIsDeviceActive); pw.println(" mLowPowerModeEnabled: " + mLowPowerModeEnabled); pw.println(" mRefreshRateChangeable: " + mRefreshRateChangeable); pw.println(" mShouldObserveDisplayLowChange: " + mShouldObserveDisplayLowChange); @@ -1567,14 +1572,17 @@ public class DisplayModeDirector { private void updateDefaultDisplayState() { Display display = mContext.getSystemService(DisplayManager.class) .getDisplay(Display.DEFAULT_DISPLAY); - boolean defaultDisplayOn = display != null && display.getState() != Display.STATE_OFF; - setDefaultDisplayState(defaultDisplayOn); + if (display == null) { + return; + } + + setDefaultDisplayState(display.getState()); } @VisibleForTesting - public void setDefaultDisplayState(boolean on) { - if (mDefaultDisplayOn != on) { - mDefaultDisplayOn = on; + public void setDefaultDisplayState(int state) { + if (mDefaultDisplayState != state) { + mDefaultDisplayState = state; updateSensorStatus(); } } @@ -1595,15 +1603,19 @@ public class DisplayModeDirector { } private boolean isDeviceActive() { - return mDefaultDisplayOn && mInjector.isDeviceInteractive(mContext); + mIsDeviceActive = mInjector.isDeviceInteractive(mContext); + return (mDefaultDisplayState == Display.STATE_ON) + && mIsDeviceActive; } private final class LightSensorEventListener implements SensorEventListener { final private static int INJECT_EVENTS_INTERVAL_MS = LIGHT_SENSOR_RATE_MS; private float mLastSensorData; + private long mTimestamp; public void dumpLocked(PrintWriter pw) { pw.println(" mLastSensorData: " + mLastSensorData); + pw.println(" mTimestamp: " + formatTimestamp(mTimestamp)); } @Override @@ -1627,6 +1639,7 @@ public class DisplayModeDirector { } long now = SystemClock.uptimeMillis(); + mTimestamp = System.currentTimeMillis(); if (mAmbientFilter != null) { mAmbientFilter.addValue(now, mLastSensorData); } @@ -1653,6 +1666,12 @@ public class DisplayModeDirector { mHandler.removeCallbacks(mInjectSensorEventRunnable); } + private String formatTimestamp(long time) { + SimpleDateFormat dateFormat = + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.US); + return dateFormat.format(new Date(time)); + } + private void processSensorData(long now) { if (mAmbientFilter != null) { mAmbientLux = mAmbientFilter.getEstimate(now); diff --git a/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java b/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java index c467ee949aeba..e202145b7dbee 100644 --- a/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java +++ b/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java @@ -34,6 +34,7 @@ import static org.mockito.Mockito.any; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import static org.mockito.internal.verification.VerificationModeFactory.times; import android.annotation.NonNull; import android.content.ContentResolver; @@ -410,7 +411,7 @@ public class DisplayModeDirectorTest { createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0); setPeakRefreshRate(90); director.getSettingsObserver().setDefaultRefreshRate(90); - director.getBrightnessObserver().setDefaultDisplayState(true); + director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON); final FakeDeviceConfig config = mInjector.getDeviceConfig(); config.setRefreshRateInLowZone(90); @@ -453,7 +454,7 @@ public class DisplayModeDirectorTest { createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0); setPeakRefreshRate(90 /*fps*/); director.getSettingsObserver().setDefaultRefreshRate(90); - director.getBrightnessObserver().setDefaultDisplayState(true); + director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON); final FakeDeviceConfig config = mInjector.getDeviceConfig(); config.setRefreshRateInHighZone(60); @@ -490,6 +491,43 @@ public class DisplayModeDirectorTest { assertVoteForRefreshRateLocked(vote, 60 /*fps*/); } + @Test + public void testSensorRegistration() { + DisplayModeDirector director = + createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0); + setPeakRefreshRate(90 /*fps*/); + director.getSettingsObserver().setDefaultRefreshRate(90); + director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON); + + Sensor lightSensor = createLightSensor(); + SensorManager sensorManager = createMockSensorManager(lightSensor); + + director.start(sensorManager); + ArgumentCaptor listenerCaptor = + ArgumentCaptor.forClass(SensorEventListener.class); + Mockito.verify(sensorManager, Mockito.timeout(TimeUnit.SECONDS.toMillis(1))) + .registerListener( + listenerCaptor.capture(), + eq(lightSensor), + anyInt(), + any(Handler.class)); + + // Dispaly state changed from On to Doze + director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_DOZE); + Mockito.verify(sensorManager) + .unregisterListener(listenerCaptor.capture()); + + // Dispaly state changed from Doze to On + director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON); + Mockito.verify(sensorManager, times(2)) + .registerListener( + listenerCaptor.capture(), + eq(lightSensor), + anyInt(), + any(Handler.class)); + + } + private void assertVoteForRefreshRateLocked(Vote vote, float refreshRate) { assertThat(vote).isNotNull(); final DisplayModeDirector.RefreshRateRange expectedRange = From 2565d0b3a1d7e277d5bbafbd1caf92ad5924a21e Mon Sep 17 00:00:00 2001 From: Winson Date: Wed, 9 Dec 2020 17:00:23 -0800 Subject: [PATCH 043/288] Only allow BROWSABLE && DEFAULT Intents to be always opened Auto verification of app links requires that an intent filter declare action=VIEW, scheme=HTTP(S), category=BROWSABLE. However, PackageManagerService was not taking that into account, missing the category requirement. But the app info Settings UI did take category into account, so it was possible for a user to set an application to automatically open web URIs without understanding that this also granted domains that were not visible in the app info UI. To resolve both this, this change makes it so that both auto verification and the Settings state can only consider the app as "always" open only if the Intent contains both BROWSABLE and DEFAULT. Bug: 175139501 Bug: 175319005 Test: manual, see bug for reproduction steps Merged-In: Ib957258735893bf2779bed19bd400c6726ee6478 Change-Id: Ib957258735893bf2779bed19bd400c6726ee6478 (cherry picked from commit 4266f938c6705466d3844385c2031d1e80ee7b2d) --- .../com/android/server/pm/PackageManagerService.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 19b2c7c70cbf4..955cb7b74ce37 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -23,6 +23,8 @@ import static android.Manifest.permission.READ_EXTERNAL_STORAGE; import static android.Manifest.permission.REQUEST_DELETE_PACKAGES; import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE; import static android.Manifest.permission.WRITE_MEDIA_STORAGE; +import static android.content.Intent.CATEGORY_BROWSABLE; +import static android.content.Intent.CATEGORY_DEFAULT; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED; @@ -7881,6 +7883,13 @@ public class PackageManagerService extends IPackageManager.Stub Slog.i(TAG, " + always: " + info.activityInfo.packageName + " : linkgen=" + linkGeneration); } + + if (!intent.hasCategory(CATEGORY_BROWSABLE) + || !intent.hasCategory(CATEGORY_DEFAULT)) { + undefinedList.add(info); + continue; + } + // Use link-enabled generation as preferredOrder, i.e. // prefer newly-enabled over earlier-enabled. info.preferredOrder = linkGeneration; From a154d7a648ebad658c107eb2f6cfd0bf0f8bb8b2 Mon Sep 17 00:00:00 2001 From: Winson Date: Wed, 9 Dec 2020 17:00:23 -0800 Subject: [PATCH 044/288] Only allow BROWSABLE && DEFAULT Intents to be always opened Auto verification of app links requires that an intent filter declare action=VIEW, scheme=HTTP(S), category=BROWSABLE. However, PackageManagerService was not taking that into account, missing the category requirement. But the app info Settings UI did take category into account, so it was possible for a user to set an application to automatically open web URIs without understanding that this also granted domains that were not visible in the app info UI. To resolve both this, this change makes it so that both auto verification and the Settings state can only consider the app as "always" open only if the Intent contains both BROWSABLE and DEFAULT. Bug: 175139501 Bug: 175319005 Test: manual, see bug for reproduction steps Merged-In: Ib957258735893bf2779bed19bd400c6726ee6478 Change-Id: Ib957258735893bf2779bed19bd400c6726ee6478 (cherry picked from commit 4266f938c6705466d3844385c2031d1e80ee7b2d) --- .../com/android/server/pm/PackageManagerService.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index c55ab9a3a2e92..363969497ed5d 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -26,6 +26,8 @@ import static android.Manifest.permission.SET_HARMFUL_APP_WARNINGS; import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE; import static android.content.pm.PackageManager.CERT_INPUT_RAW_X509; import static android.content.pm.PackageManager.CERT_INPUT_SHA256; +import static android.content.Intent.CATEGORY_BROWSABLE; +import static android.content.Intent.CATEGORY_DEFAULT; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED; @@ -7150,6 +7152,13 @@ public class PackageManagerService extends IPackageManager.Stub Slog.i(TAG, " + always: " + info.activityInfo.packageName + " : linkgen=" + linkGeneration); } + + if (!intent.hasCategory(CATEGORY_BROWSABLE) + || !intent.hasCategory(CATEGORY_DEFAULT)) { + undefinedList.add(info); + continue; + } + // Use link-enabled generation as preferredOrder, i.e. // prefer newly-enabled over earlier-enabled. info.preferredOrder = linkGeneration; From 5a90c4c75b97ab1e2d0cb1c9abffb4e6969224af Mon Sep 17 00:00:00 2001 From: Winson Date: Wed, 9 Dec 2020 17:00:23 -0800 Subject: [PATCH 045/288] Only allow BROWSABLE && DEFAULT Intents to be always opened Auto verification of app links requires that an intent filter declare action=VIEW, scheme=HTTP(S), category=BROWSABLE. However, PackageManagerService was not taking that into account, missing the category requirement. But the app info Settings UI did take category into account, so it was possible for a user to set an application to automatically open web URIs without understanding that this also granted domains that were not visible in the app info UI. To resolve both this, this change makes it so that both auto verification and the Settings state can only consider the app as "always" open only if the Intent contains both BROWSABLE and DEFAULT. Bug: 175139501 Bug: 175319005 Test: manual, see bug for reproduction steps Merged-In: Ib957258735893bf2779bed19bd400c6726ee6478 Change-Id: Ib957258735893bf2779bed19bd400c6726ee6478 (cherry picked from commit 4266f938c6705466d3844385c2031d1e80ee7b2d) --- .../com/android/server/pm/PackageManagerService.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 50b5f79eab200..eaabf468fc46c 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -29,6 +29,8 @@ import static android.content.Intent.CATEGORY_DEFAULT; import static android.content.Intent.CATEGORY_HOME; import static android.content.pm.PackageManager.CERT_INPUT_RAW_X509; import static android.content.pm.PackageManager.CERT_INPUT_SHA256; +import static android.content.Intent.CATEGORY_BROWSABLE; +import static android.content.Intent.CATEGORY_DEFAULT; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED; @@ -7780,6 +7782,13 @@ public class PackageManagerService extends IPackageManager.Stub Slog.i(TAG, " + always: " + info.activityInfo.packageName + " : linkgen=" + linkGeneration); } + + if (!intent.hasCategory(CATEGORY_BROWSABLE) + || !intent.hasCategory(CATEGORY_DEFAULT)) { + undefinedList.add(info); + continue; + } + // Use link-enabled generation as preferredOrder, i.e. // prefer newly-enabled over earlier-enabled. info.preferredOrder = linkGeneration; From eb8d0c749d3b8063672cee803006da2d8d550e97 Mon Sep 17 00:00:00 2001 From: Winson Date: Wed, 9 Dec 2020 17:00:23 -0800 Subject: [PATCH 046/288] Only allow BROWSABLE && DEFAULT Intents to be always opened Auto verification of app links requires that an intent filter declare action=VIEW, scheme=HTTP(S), category=BROWSABLE. However, PackageManagerService was not taking that into account, missing the category requirement. But the app info Settings UI did take category into account, so it was possible for a user to set an application to automatically open web URIs without understanding that this also granted domains that were not visible in the app info UI. To resolve both this, this change makes it so that both auto verification and the Settings state can only consider the app as "always" open only if the Intent contains both BROWSABLE and DEFAULT. Bug: 175139501 Bug: 175319005 Test: manual, see bug for reproduction steps Merged-In: Ib957258735893bf2779bed19bd400c6726ee6478 Change-Id: Ib957258735893bf2779bed19bd400c6726ee6478 (cherry picked from commit 4266f938c6705466d3844385c2031d1e80ee7b2d) --- .../com/android/server/pm/PackageManagerService.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index e8b2f3c428bce..18f2655dc2d6a 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -35,6 +35,8 @@ import static android.content.Intent.EXTRA_PACKAGE_NAME; import static android.content.Intent.EXTRA_VERSION_CODE; import static android.content.pm.PackageManager.CERT_INPUT_RAW_X509; import static android.content.pm.PackageManager.CERT_INPUT_SHA256; +import static android.content.Intent.CATEGORY_BROWSABLE; +import static android.content.Intent.CATEGORY_DEFAULT; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED; @@ -7695,6 +7697,13 @@ public class PackageManagerService extends IPackageManager.Stub Slog.i(TAG, " + always: " + info.activityInfo.packageName + " : linkgen=" + linkGeneration); } + + if (!intent.hasCategory(CATEGORY_BROWSABLE) + || !intent.hasCategory(CATEGORY_DEFAULT)) { + undefinedList.add(info); + continue; + } + // Use link-enabled generation as preferredOrder, i.e. // prefer newly-enabled over earlier-enabled. info.preferredOrder = linkGeneration; From 0f337fcea8de957ac2939f602461913283ecabce Mon Sep 17 00:00:00 2001 From: Winson Date: Wed, 9 Dec 2020 17:00:23 -0800 Subject: [PATCH 047/288] Only allow BROWSABLE && DEFAULT Intents to be always opened Auto verification of app links requires that an intent filter declare action=VIEW, scheme=HTTP(S), category=BROWSABLE. However, PackageManagerService was not taking that into account, missing the category requirement. But the app info Settings UI did take category into account, so it was possible for a user to set an application to automatically open web URIs without understanding that this also granted domains that were not visible in the app info UI. To resolve both this, this change makes it so that both auto verification and the Settings state can only consider the app as "always" open only if the Intent contains both BROWSABLE and DEFAULT. Bug: 175139501 Bug: 175319005 Test: manual, see bug for reproduction steps Merged-In: Ib957258735893bf2779bed19bd400c6726ee6478 Change-Id: Ib957258735893bf2779bed19bd400c6726ee6478 (cherry picked from commit 4266f938c6705466d3844385c2031d1e80ee7b2d) --- .../com/android/server/pm/PackageManagerService.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 0af4ff4df93f7..40723e073ba10 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -35,6 +35,8 @@ import static android.content.Intent.EXTRA_PACKAGE_NAME; import static android.content.Intent.EXTRA_VERSION_CODE; import static android.content.pm.PackageManager.CERT_INPUT_RAW_X509; import static android.content.pm.PackageManager.CERT_INPUT_SHA256; +import static android.content.Intent.CATEGORY_BROWSABLE; +import static android.content.Intent.CATEGORY_DEFAULT; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED; @@ -7704,6 +7706,13 @@ public class PackageManagerService extends IPackageManager.Stub Slog.i(TAG, " + always: " + info.activityInfo.packageName + " : linkgen=" + linkGeneration); } + + if (!intent.hasCategory(CATEGORY_BROWSABLE) + || !intent.hasCategory(CATEGORY_DEFAULT)) { + undefinedList.add(info); + continue; + } + // Use link-enabled generation as preferredOrder, i.e. // prefer newly-enabled over earlier-enabled. info.preferredOrder = linkGeneration; From dca1c94faa2ffb9787cb2ab61c3cb2f9503422e4 Mon Sep 17 00:00:00 2001 From: Winson Date: Wed, 9 Dec 2020 17:00:23 -0800 Subject: [PATCH 048/288] Only allow BROWSABLE && DEFAULT Intents to be always opened Auto verification of app links requires that an intent filter declare action=VIEW, scheme=HTTP(S), category=BROWSABLE. However, PackageManagerService was not taking that into account, missing the category requirement. But the app info Settings UI did take category into account, so it was possible for a user to set an application to automatically open web URIs without understanding that this also granted domains that were not visible in the app info UI. To resolve both this, this change makes it so that both auto verification and the Settings state can only consider the app as "always" open only if the Intent contains both BROWSABLE and DEFAULT. Bug: 175139501 Bug: 175319005 Test: manual, see bug for reproduction steps Merged-In: Ib957258735893bf2779bed19bd400c6726ee6478 Change-Id: Ib957258735893bf2779bed19bd400c6726ee6478 (cherry picked from commit 4266f938c6705466d3844385c2031d1e80ee7b2d) --- .../com/android/server/pm/PackageManagerService.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index df05b56bd0e06..84213092081d9 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -29,6 +29,8 @@ import static android.content.Intent.CATEGORY_DEFAULT; import static android.content.Intent.CATEGORY_HOME; import static android.content.pm.PackageManager.CERT_INPUT_RAW_X509; import static android.content.pm.PackageManager.CERT_INPUT_SHA256; +import static android.content.Intent.CATEGORY_BROWSABLE; +import static android.content.Intent.CATEGORY_DEFAULT; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED; @@ -7738,6 +7740,13 @@ public class PackageManagerService extends IPackageManager.Stub Slog.i(TAG, " + always: " + info.activityInfo.packageName + " : linkgen=" + linkGeneration); } + + if (!intent.hasCategory(CATEGORY_BROWSABLE) + || !intent.hasCategory(CATEGORY_DEFAULT)) { + undefinedList.add(info); + continue; + } + // Use link-enabled generation as preferredOrder, i.e. // prefer newly-enabled over earlier-enabled. info.preferredOrder = linkGeneration; From 2d067c33c0cda9f9467eb6a56bc4a27801e86ed1 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 12 Jan 2021 17:12:06 -0800 Subject: [PATCH 049/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I7d579a91209b6663d63f891cd6b6f4e6f24a89b4 --- packages/SettingsLib/res/values-or/strings.xml | 4 ++-- packages/SettingsLib/res/values-zh-rCN/strings.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml index 173ae1ccceff9..aec99fd3ab842 100644 --- a/packages/SettingsLib/res/values-or/strings.xml +++ b/packages/SettingsLib/res/values-or/strings.xml @@ -114,7 +114,7 @@ "ଶ୍ରବଣ ଯନ୍ତ୍ର ପାଇଁ ବ୍ୟବହାର କରନ୍ତୁ" "ପେୟାର୍‌" "ପେୟାର୍‌" - "କ୍ୟାନ୍ସଲ୍‌ କରନ୍ତୁ" + "ବାତିଲ୍‌ କରନ୍ତୁ" "ପେୟାରିଂ ଫଳରେ ସଂଯୁକ୍ତ ଥିବା ବେଳେ ଆପଣଙ୍କ ସମ୍ପର୍କଗୁଡ଼ିକୁ ଏବଂ କଲ୍‌ର ଇତିବୃତିକୁ ଆକସେସ୍‌ ମଞ୍ଜୁର ହୁଏ।" "%1$s ସହ ପେୟାର୍‌ କରିହେଲା ନାହିଁ।" "ଏକ ଭୁଲ୍‌ PIN କିମ୍ବା ପାସକୀ କାରଣରୁ %1$s ସହ ପେୟାର୍‌ କରିପାରିଲା ନାହିଁ।" @@ -493,7 +493,7 @@ "ଅଧିକ ସମୟ।" "କମ୍ ସମୟ।" - "କ୍ୟାନ୍ସଲ୍" + "ବାତିଲ୍" "ଠିକ୍‌ ଅଛି" "ଚାଲୁ କରନ୍ତୁ" "\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ଅନ୍ କରନ୍ତୁ" diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml index 5db88183c8e68..a3e1532ac8897 100644 --- a/packages/SettingsLib/res/values-zh-rCN/strings.xml +++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml @@ -214,7 +214,7 @@ "使用二维码配对设备" "使用二维码扫描器配对新设备" "使用配对码配对设备" - "使用六位数验证码配对新设备" + "使用六位数的配对码配对新设备" "已配对的设备" "当前已连接" "设备详细信息" From d348974ecd0570d5884ee033e5c180ed7447940e Mon Sep 17 00:00:00 2001 From: raylinhsu Date: Wed, 13 Jan 2021 13:06:15 +0800 Subject: [PATCH 050/288] DO NOT MERGE Revert "Fix the ambient lux which did not update for blocking zone" This reverts commit 400e7d5dda91c58690f8febba4132856e560663d. Bug: 176018998 Test: atest DisplayModeDirectorTest Change-Id: I58c60a3a124db11e9ae091831a84a704b3c4e6bf --- .../server/display/DisplayModeDirector.java | 35 ++++------------ .../display/DisplayModeDirectorTest.java | 42 +------------------ 2 files changed, 10 insertions(+), 67 deletions(-) diff --git a/services/core/java/com/android/server/display/DisplayModeDirector.java b/services/core/java/com/android/server/display/DisplayModeDirector.java index 29a77e2b6ef23..02ee059194ec3 100644 --- a/services/core/java/com/android/server/display/DisplayModeDirector.java +++ b/services/core/java/com/android/server/display/DisplayModeDirector.java @@ -52,12 +52,9 @@ import com.android.server.display.utils.AmbientFilterFactory; import com.android.server.utils.DeviceConfigInterface; import java.io.PrintWriter; -import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; -import java.util.Date; import java.util.List; -import java.util.Locale; import java.util.Objects; /** @@ -1163,8 +1160,7 @@ public class DisplayModeDirector { // mShouldObserveAmbientHighChange is true, screen is on, peak refresh rate // changeable and low power mode off. After initialization, these states will // be updated from the same handler thread. - private int mDefaultDisplayState = Display.STATE_UNKNOWN; - private boolean mIsDeviceActive = false; + private boolean mDefaultDisplayOn = false; private boolean mRefreshRateChangeable = false; private boolean mLowPowerModeEnabled = false; @@ -1345,8 +1341,7 @@ public class DisplayModeDirector { pw.println(" BrightnessObserver"); pw.println(" mAmbientLux: " + mAmbientLux); pw.println(" mBrightness: " + mBrightness); - pw.println(" mDefaultDisplayState: " + mDefaultDisplayState); - pw.println(" mIsDeviceActive: " + mIsDeviceActive); + pw.println(" mDefaultDisplayOn: " + mDefaultDisplayOn); pw.println(" mLowPowerModeEnabled: " + mLowPowerModeEnabled); pw.println(" mRefreshRateChangeable: " + mRefreshRateChangeable); pw.println(" mShouldObserveDisplayLowChange: " + mShouldObserveDisplayLowChange); @@ -1572,17 +1567,14 @@ public class DisplayModeDirector { private void updateDefaultDisplayState() { Display display = mContext.getSystemService(DisplayManager.class) .getDisplay(Display.DEFAULT_DISPLAY); - if (display == null) { - return; - } - - setDefaultDisplayState(display.getState()); + boolean defaultDisplayOn = display != null && display.getState() != Display.STATE_OFF; + setDefaultDisplayState(defaultDisplayOn); } @VisibleForTesting - public void setDefaultDisplayState(int state) { - if (mDefaultDisplayState != state) { - mDefaultDisplayState = state; + public void setDefaultDisplayState(boolean on) { + if (mDefaultDisplayOn != on) { + mDefaultDisplayOn = on; updateSensorStatus(); } } @@ -1603,19 +1595,15 @@ public class DisplayModeDirector { } private boolean isDeviceActive() { - mIsDeviceActive = mInjector.isDeviceInteractive(mContext); - return (mDefaultDisplayState == Display.STATE_ON) - && mIsDeviceActive; + return mDefaultDisplayOn && mInjector.isDeviceInteractive(mContext); } private final class LightSensorEventListener implements SensorEventListener { final private static int INJECT_EVENTS_INTERVAL_MS = LIGHT_SENSOR_RATE_MS; private float mLastSensorData; - private long mTimestamp; public void dumpLocked(PrintWriter pw) { pw.println(" mLastSensorData: " + mLastSensorData); - pw.println(" mTimestamp: " + formatTimestamp(mTimestamp)); } @Override @@ -1639,7 +1627,6 @@ public class DisplayModeDirector { } long now = SystemClock.uptimeMillis(); - mTimestamp = System.currentTimeMillis(); if (mAmbientFilter != null) { mAmbientFilter.addValue(now, mLastSensorData); } @@ -1666,12 +1653,6 @@ public class DisplayModeDirector { mHandler.removeCallbacks(mInjectSensorEventRunnable); } - private String formatTimestamp(long time) { - SimpleDateFormat dateFormat = - new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.US); - return dateFormat.format(new Date(time)); - } - private void processSensorData(long now) { if (mAmbientFilter != null) { mAmbientLux = mAmbientFilter.getEstimate(now); diff --git a/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java b/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java index e202145b7dbee..c467ee949aeba 100644 --- a/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java +++ b/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java @@ -34,7 +34,6 @@ import static org.mockito.Mockito.any; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static org.mockito.internal.verification.VerificationModeFactory.times; import android.annotation.NonNull; import android.content.ContentResolver; @@ -411,7 +410,7 @@ public class DisplayModeDirectorTest { createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0); setPeakRefreshRate(90); director.getSettingsObserver().setDefaultRefreshRate(90); - director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON); + director.getBrightnessObserver().setDefaultDisplayState(true); final FakeDeviceConfig config = mInjector.getDeviceConfig(); config.setRefreshRateInLowZone(90); @@ -454,7 +453,7 @@ public class DisplayModeDirectorTest { createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0); setPeakRefreshRate(90 /*fps*/); director.getSettingsObserver().setDefaultRefreshRate(90); - director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON); + director.getBrightnessObserver().setDefaultDisplayState(true); final FakeDeviceConfig config = mInjector.getDeviceConfig(); config.setRefreshRateInHighZone(60); @@ -491,43 +490,6 @@ public class DisplayModeDirectorTest { assertVoteForRefreshRateLocked(vote, 60 /*fps*/); } - @Test - public void testSensorRegistration() { - DisplayModeDirector director = - createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0); - setPeakRefreshRate(90 /*fps*/); - director.getSettingsObserver().setDefaultRefreshRate(90); - director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON); - - Sensor lightSensor = createLightSensor(); - SensorManager sensorManager = createMockSensorManager(lightSensor); - - director.start(sensorManager); - ArgumentCaptor listenerCaptor = - ArgumentCaptor.forClass(SensorEventListener.class); - Mockito.verify(sensorManager, Mockito.timeout(TimeUnit.SECONDS.toMillis(1))) - .registerListener( - listenerCaptor.capture(), - eq(lightSensor), - anyInt(), - any(Handler.class)); - - // Dispaly state changed from On to Doze - director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_DOZE); - Mockito.verify(sensorManager) - .unregisterListener(listenerCaptor.capture()); - - // Dispaly state changed from Doze to On - director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON); - Mockito.verify(sensorManager, times(2)) - .registerListener( - listenerCaptor.capture(), - eq(lightSensor), - anyInt(), - any(Handler.class)); - - } - private void assertVoteForRefreshRateLocked(Vote vote, float refreshRate) { assertThat(vote).isNotNull(); final DisplayModeDirector.RefreshRateRange expectedRange = From b14bed88c5aec64fef15b4e727fff4623bb8efe7 Mon Sep 17 00:00:00 2001 From: raylinhsu Date: Wed, 13 Jan 2021 13:13:02 +0800 Subject: [PATCH 051/288] DO NOT MERGE Revert "Allow DeviceConfig to change display settings for high zone" This reverts commit cf55c21064cd6f906ca7e64f66f1cc8e1346fda6. Bug: 176018998 Test: atest DisplayModeDirectorTest Change-Id: Ib576e16257d7903b39efa8015c2af3be8c0d0c40 --- .../hardware/display/DisplayManager.java | 57 ++------ .../server/display/DisplayModeDirector.java | 132 ++++-------------- .../display/DisplayModeDirectorTest.java | 53 +------ 3 files changed, 40 insertions(+), 202 deletions(-) diff --git a/core/java/android/hardware/display/DisplayManager.java b/core/java/android/hardware/display/DisplayManager.java index 0fa4ca8a574b5..c1ba2094d3cf6 100644 --- a/core/java/android/hardware/display/DisplayManager.java +++ b/core/java/android/hardware/display/DisplayManager.java @@ -875,52 +875,12 @@ public final class DisplayManager { public interface DeviceConfig { /** - * Key for refresh rate in the low zone defined by thresholds. + * Key for refresh rate in the zone defined by thresholds. * - * Note that the name and value don't match because they were added before we had a high - * zone to consider. * @see android.provider.DeviceConfig#NAMESPACE_DISPLAY_MANAGER * @see android.R.integer#config_defaultZoneBehavior */ - String KEY_REFRESH_RATE_IN_LOW_ZONE = "refresh_rate_in_zone"; - - /** - * Key for accessing the low display brightness thresholds for the configured refresh - * rate zone. - * The value will be a pair of comma separated integers representing the minimum and maximum - * thresholds of the zone, respectively, in display backlight units (i.e. [0, 255]). - * - * Note that the name and value don't match because they were added before we had a high - * zone to consider. - * - * @see android.provider.DeviceConfig#NAMESPACE_DISPLAY_MANAGER - * @see android.R.array#config_brightnessThresholdsOfPeakRefreshRate - * @hide - */ - String KEY_FIXED_REFRESH_RATE_LOW_DISPLAY_BRIGHTNESS_THRESHOLDS = - "peak_refresh_rate_brightness_thresholds"; - - /** - * Key for accessing the low ambient brightness thresholds for the configured refresh - * rate zone. The value will be a pair of comma separated integers representing the minimum - * and maximum thresholds of the zone, respectively, in lux. - * - * Note that the name and value don't match because they were added before we had a high - * zone to consider. - * - * @see android.provider.DeviceConfig#NAMESPACE_DISPLAY_MANAGER - * @see android.R.array#config_ambientThresholdsOfPeakRefreshRate - * @hide - */ - String KEY_FIXED_REFRESH_RATE_LOW_AMBIENT_BRIGHTNESS_THRESHOLDS = - "peak_refresh_rate_ambient_thresholds"; - /** - * Key for refresh rate in the high zone defined by thresholds. - * - * @see android.provider.DeviceConfig#NAMESPACE_DISPLAY_MANAGER - * @see android.R.integer#config_fixedRefreshRateInHighZone - */ - String KEY_REFRESH_RATE_IN_HIGH_ZONE = "refresh_rate_in_high_zone"; + String KEY_REFRESH_RATE_IN_ZONE = "refresh_rate_in_zone"; /** * Key for accessing the display brightness thresholds for the configured refresh rate zone. @@ -928,11 +888,11 @@ public final class DisplayManager { * thresholds of the zone, respectively, in display backlight units (i.e. [0, 255]). * * @see android.provider.DeviceConfig#NAMESPACE_DISPLAY_MANAGER - * @see android.R.array#config_brightnessHighThresholdsOfFixedRefreshRate + * @see android.R.array#config_brightnessThresholdsOfPeakRefreshRate * @hide */ - String KEY_FIXED_REFRESH_RATE_HIGH_DISPLAY_BRIGHTNESS_THRESHOLDS = - "fixed_refresh_rate_high_display_brightness_thresholds"; + String KEY_PEAK_REFRESH_RATE_DISPLAY_BRIGHTNESS_THRESHOLDS = + "peak_refresh_rate_brightness_thresholds"; /** * Key for accessing the ambient brightness thresholds for the configured refresh rate zone. @@ -940,11 +900,12 @@ public final class DisplayManager { * thresholds of the zone, respectively, in lux. * * @see android.provider.DeviceConfig#NAMESPACE_DISPLAY_MANAGER - * @see android.R.array#config_ambientHighThresholdsOfFixedRefreshRate + * @see android.R.array#config_ambientThresholdsOfPeakRefreshRate * @hide */ - String KEY_FIXED_REFRESH_RATE_HIGH_AMBIENT_BRIGHTNESS_THRESHOLDS = - "fixed_refresh_rate_high_ambient_brightness_thresholds"; + String KEY_PEAK_REFRESH_RATE_AMBIENT_BRIGHTNESS_THRESHOLDS = + "peak_refresh_rate_ambient_thresholds"; + /** * Key for default peak refresh rate * diff --git a/services/core/java/com/android/server/display/DisplayModeDirector.java b/services/core/java/com/android/server/display/DisplayModeDirector.java index 02ee059194ec3..2a60839ab702a 100644 --- a/services/core/java/com/android/server/display/DisplayModeDirector.java +++ b/services/core/java/com/android/server/display/DisplayModeDirector.java @@ -69,8 +69,6 @@ public class DisplayModeDirector { private static final int MSG_LOW_BRIGHTNESS_THRESHOLDS_CHANGED = 2; private static final int MSG_DEFAULT_PEAK_REFRESH_RATE_CHANGED = 3; private static final int MSG_REFRESH_RATE_IN_LOW_ZONE_CHANGED = 4; - private static final int MSG_REFRESH_RATE_IN_HIGH_ZONE_CHANGED = 5; - private static final int MSG_HIGH_BRIGHTNESS_THRESHOLDS_CHANGED = 6; // Special ID used to indicate that given vote is to be applied globally, rather than to a // specific display. @@ -517,6 +515,13 @@ public class DisplayModeDirector { } } + @VisibleForTesting + void updateSettingForHighZone(int refreshRate, int[] brightnessThresholds, + int[] ambientThresholds) { + mBrightnessObserver.updateThresholdsRefreshRateForHighZone(refreshRate, + brightnessThresholds, ambientThresholds); + } + /** * Listens for changes refresh rate coordination. */ @@ -535,35 +540,11 @@ public class DisplayModeDirector { @Override public void handleMessage(Message msg) { switch (msg.what) { - case MSG_LOW_BRIGHTNESS_THRESHOLDS_CHANGED: { + case MSG_LOW_BRIGHTNESS_THRESHOLDS_CHANGED: Pair thresholds = (Pair) msg.obj; mBrightnessObserver.onDeviceConfigLowBrightnessThresholdsChanged( thresholds.first, thresholds.second); break; - } - - case MSG_REFRESH_RATE_IN_LOW_ZONE_CHANGED: { - int refreshRateInZone = msg.arg1; - mBrightnessObserver.onDeviceConfigRefreshRateInLowZoneChanged( - refreshRateInZone); - break; - } - - case MSG_HIGH_BRIGHTNESS_THRESHOLDS_CHANGED: { - Pair thresholds = (Pair) msg.obj; - - mBrightnessObserver.onDeviceConfigHighBrightnessThresholdsChanged( - thresholds.first, thresholds.second); - - break; - } - - case MSG_REFRESH_RATE_IN_HIGH_ZONE_CHANGED: { - int refreshRateInZone = msg.arg1; - mBrightnessObserver.onDeviceConfigRefreshRateInHighZoneChanged( - refreshRateInZone); - break; - } case MSG_DEFAULT_PEAK_REFRESH_RATE_CHANGED: Float defaultPeakRefreshRate = (Float) msg.obj; @@ -571,6 +552,12 @@ public class DisplayModeDirector { defaultPeakRefreshRate); break; + case MSG_REFRESH_RATE_IN_LOW_ZONE_CHANGED: + int refreshRateInZone = msg.arg1; + mBrightnessObserver.onDeviceConfigRefreshRateInLowZoneChanged( + refreshRateInZone); + break; + case MSG_REFRESH_RATE_RANGE_CHANGED: DesiredDisplayModeSpecsListener desiredDisplayModeSpecsListener = (DesiredDisplayModeSpecsListener) msg.obj; @@ -1233,6 +1220,13 @@ public class DisplayModeDirector { mLightSensor, LIGHT_SENSOR_RATE_MS * 1000, mHandler); } + public void updateThresholdsRefreshRateForHighZone(int refreshRate, + int[] brightnessThresholds, int[] ambientThresholds) { + mRefreshRateInHighZone = refreshRate; + mHighDisplayBrightnessThresholds = brightnessThresholds; + mHighAmbientBrightnessThresholds = ambientThresholds; + } + public void observe(SensorManager sensorManager) { mSensorManager = sensorManager; final ContentResolver cr = mContext.getContentResolver(); @@ -1252,22 +1246,7 @@ public class DisplayModeDirector { mLowAmbientBrightnessThresholds = lowAmbientBrightnessThresholds; } - - int[] highDisplayBrightnessThresholds = - mDeviceConfigDisplaySettings.getHighDisplayBrightnessThresholds(); - int[] highAmbientBrightnessThresholds = - mDeviceConfigDisplaySettings.getHighAmbientBrightnessThresholds(); - - if (highDisplayBrightnessThresholds != null && highAmbientBrightnessThresholds != null - && highDisplayBrightnessThresholds.length - == highAmbientBrightnessThresholds.length) { - mHighDisplayBrightnessThresholds = highDisplayBrightnessThresholds; - mHighAmbientBrightnessThresholds = highAmbientBrightnessThresholds; - } - mRefreshRateInLowZone = mDeviceConfigDisplaySettings.getRefreshRateInLowZone(); - mRefreshRateInHighZone = mDeviceConfigDisplaySettings.getRefreshRateInHighZone(); - restartObserver(); mDeviceConfigDisplaySettings.startListening(); } @@ -1314,29 +1293,6 @@ public class DisplayModeDirector { } } - public void onDeviceConfigHighBrightnessThresholdsChanged(int[] displayThresholds, - int[] ambientThresholds) { - if (displayThresholds != null && ambientThresholds != null - && displayThresholds.length == ambientThresholds.length) { - mHighDisplayBrightnessThresholds = displayThresholds; - mHighAmbientBrightnessThresholds = ambientThresholds; - } else { - // Invalid or empty. Use device default. - mHighDisplayBrightnessThresholds = mContext.getResources().getIntArray( - R.array.config_highDisplayBrightnessThresholdsOfFixedRefreshRate); - mHighAmbientBrightnessThresholds = mContext.getResources().getIntArray( - R.array.config_highAmbientBrightnessThresholdsOfFixedRefreshRate); - } - restartObserver(); - } - - public void onDeviceConfigRefreshRateInHighZoneChanged(int refreshRate) { - if (refreshRate != mRefreshRateInHighZone) { - mRefreshRateInHighZone = refreshRate; - restartObserver(); - } - } - public void dumpLocked(PrintWriter pw) { pw.println(" BrightnessObserver"); pw.println(" mAmbientLux: " + mAmbientLux); @@ -1712,7 +1668,7 @@ public class DisplayModeDirector { public int[] getLowDisplayBrightnessThresholds() { return getIntArrayProperty( DisplayManager.DeviceConfig. - KEY_FIXED_REFRESH_RATE_LOW_DISPLAY_BRIGHTNESS_THRESHOLDS); + KEY_PEAK_REFRESH_RATE_DISPLAY_BRIGHTNESS_THRESHOLDS); } /* @@ -1721,7 +1677,7 @@ public class DisplayModeDirector { public int[] getLowAmbientBrightnessThresholds() { return getIntArrayProperty( DisplayManager.DeviceConfig. - KEY_FIXED_REFRESH_RATE_LOW_AMBIENT_BRIGHTNESS_THRESHOLDS); + KEY_PEAK_REFRESH_RATE_AMBIENT_BRIGHTNESS_THRESHOLDS); } public int getRefreshRateInLowZone() { @@ -1730,37 +1686,7 @@ public class DisplayModeDirector { int refreshRate = mDeviceConfig.getInt( DeviceConfig.NAMESPACE_DISPLAY_MANAGER, - DisplayManager.DeviceConfig.KEY_REFRESH_RATE_IN_LOW_ZONE, - defaultRefreshRateInZone); - - return refreshRate; - } - - /* - * Return null if no such property or wrong format (not comma separated integers). - */ - public int[] getHighDisplayBrightnessThresholds() { - return getIntArrayProperty( - DisplayManager.DeviceConfig - .KEY_FIXED_REFRESH_RATE_HIGH_DISPLAY_BRIGHTNESS_THRESHOLDS); - } - - /* - * Return null if no such property or wrong format (not comma separated integers). - */ - public int[] getHighAmbientBrightnessThresholds() { - return getIntArrayProperty( - DisplayManager.DeviceConfig - .KEY_FIXED_REFRESH_RATE_HIGH_AMBIENT_BRIGHTNESS_THRESHOLDS); - } - - public int getRefreshRateInHighZone() { - int defaultRefreshRateInZone = mContext.getResources().getInteger( - R.integer.config_fixedRefreshRateInHighZone); - - int refreshRate = mDeviceConfig.getInt( - DeviceConfig.NAMESPACE_DISPLAY_MANAGER, - DisplayManager.DeviceConfig.KEY_REFRESH_RATE_IN_HIGH_ZONE, + DisplayManager.DeviceConfig.KEY_REFRESH_RATE_IN_ZONE, defaultRefreshRateInZone); return refreshRate; @@ -1795,16 +1721,6 @@ public class DisplayModeDirector { .sendToTarget(); mHandler.obtainMessage(MSG_REFRESH_RATE_IN_LOW_ZONE_CHANGED, refreshRateInLowZone, 0) .sendToTarget(); - - int[] highDisplayBrightnessThresholds = getHighDisplayBrightnessThresholds(); - int[] highAmbientBrightnessThresholds = getHighAmbientBrightnessThresholds(); - int refreshRateInHighZone = getRefreshRateInHighZone(); - - mHandler.obtainMessage(MSG_HIGH_BRIGHTNESS_THRESHOLDS_CHANGED, - new Pair<>(highDisplayBrightnessThresholds, highAmbientBrightnessThresholds)) - .sendToTarget(); - mHandler.obtainMessage(MSG_REFRESH_RATE_IN_HIGH_ZONE_CHANGED, refreshRateInHighZone, 0) - .sendToTarget(); } private int[] getIntArrayProperty(String prop) { diff --git a/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java b/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java index c467ee949aeba..4ee6a553b9d15 100644 --- a/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java +++ b/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java @@ -16,12 +16,9 @@ package com.android.server.display; -import static android.hardware.display.DisplayManager.DeviceConfig.KEY_FIXED_REFRESH_RATE_HIGH_AMBIENT_BRIGHTNESS_THRESHOLDS; -import static android.hardware.display.DisplayManager.DeviceConfig.KEY_FIXED_REFRESH_RATE_HIGH_DISPLAY_BRIGHTNESS_THRESHOLDS; -import static android.hardware.display.DisplayManager.DeviceConfig.KEY_FIXED_REFRESH_RATE_LOW_AMBIENT_BRIGHTNESS_THRESHOLDS; -import static android.hardware.display.DisplayManager.DeviceConfig.KEY_FIXED_REFRESH_RATE_LOW_DISPLAY_BRIGHTNESS_THRESHOLDS; -import static android.hardware.display.DisplayManager.DeviceConfig.KEY_REFRESH_RATE_IN_HIGH_ZONE; -import static android.hardware.display.DisplayManager.DeviceConfig.KEY_REFRESH_RATE_IN_LOW_ZONE; +import static android.hardware.display.DisplayManager.DeviceConfig.KEY_PEAK_REFRESH_RATE_AMBIENT_BRIGHTNESS_THRESHOLDS; +import static android.hardware.display.DisplayManager.DeviceConfig.KEY_PEAK_REFRESH_RATE_DISPLAY_BRIGHTNESS_THRESHOLDS; +import static android.hardware.display.DisplayManager.DeviceConfig.KEY_REFRESH_RATE_IN_ZONE; import static com.android.server.display.DisplayModeDirector.Vote.PRIORITY_FLICKER; @@ -454,11 +451,7 @@ public class DisplayModeDirectorTest { setPeakRefreshRate(90 /*fps*/); director.getSettingsObserver().setDefaultRefreshRate(90); director.getBrightnessObserver().setDefaultDisplayState(true); - - final FakeDeviceConfig config = mInjector.getDeviceConfig(); - config.setRefreshRateInHighZone(60); - config.setHighDisplayBrightnessThresholds(new int[] { 255 }); - config.setHighAmbientBrightnessThresholds(new int[] { 8000 }); + director.updateSettingForHighZone(60, new int[] {255}, new int[] {8000}); Sensor lightSensor = createLightSensor(); SensorManager sensorManager = createMockSensorManager(lightSensor); @@ -515,7 +508,7 @@ public class DisplayModeDirectorTest { void setRefreshRateInLowZone(int fps) { putPropertyAndNotify( - DeviceConfig.NAMESPACE_DISPLAY_MANAGER, KEY_REFRESH_RATE_IN_LOW_ZONE, + DeviceConfig.NAMESPACE_DISPLAY_MANAGER, KEY_REFRESH_RATE_IN_ZONE, String.valueOf(fps)); } @@ -528,7 +521,7 @@ public class DisplayModeDirectorTest { putPropertyAndNotify( DeviceConfig.NAMESPACE_DISPLAY_MANAGER, - KEY_FIXED_REFRESH_RATE_LOW_DISPLAY_BRIGHTNESS_THRESHOLDS, + KEY_PEAK_REFRESH_RATE_DISPLAY_BRIGHTNESS_THRESHOLDS, thresholds); } @@ -541,39 +534,7 @@ public class DisplayModeDirectorTest { putPropertyAndNotify( DeviceConfig.NAMESPACE_DISPLAY_MANAGER, - KEY_FIXED_REFRESH_RATE_LOW_AMBIENT_BRIGHTNESS_THRESHOLDS, - thresholds); - } - - void setRefreshRateInHighZone(int fps) { - putPropertyAndNotify( - DeviceConfig.NAMESPACE_DISPLAY_MANAGER, KEY_REFRESH_RATE_IN_HIGH_ZONE, - String.valueOf(fps)); - } - - void setHighDisplayBrightnessThresholds(int[] brightnessThresholds) { - String thresholds = toPropertyValue(brightnessThresholds); - - if (DEBUG) { - Slog.e(TAG, "Brightness Thresholds = " + thresholds); - } - - putPropertyAndNotify( - DeviceConfig.NAMESPACE_DISPLAY_MANAGER, - KEY_FIXED_REFRESH_RATE_HIGH_DISPLAY_BRIGHTNESS_THRESHOLDS, - thresholds); - } - - void setHighAmbientBrightnessThresholds(int[] ambientThresholds) { - String thresholds = toPropertyValue(ambientThresholds); - - if (DEBUG) { - Slog.e(TAG, "Ambient Thresholds = " + thresholds); - } - - putPropertyAndNotify( - DeviceConfig.NAMESPACE_DISPLAY_MANAGER, - KEY_FIXED_REFRESH_RATE_HIGH_AMBIENT_BRIGHTNESS_THRESHOLDS, + KEY_PEAK_REFRESH_RATE_AMBIENT_BRIGHTNESS_THRESHOLDS, thresholds); } From b4bf83a7733d5334a2df829874684f896df4d3eb Mon Sep 17 00:00:00 2001 From: raylinhsu Date: Wed, 13 Jan 2021 13:27:25 +0800 Subject: [PATCH 052/288] DO NOT MERGE Revert "Set fixed fps when ambient or display brightness is high" This reverts commit 4a0a896accfc86dff48d867ee07239fb8b53c626. Bug: 176018998 Test: atest DisplayModeDirectorTest Change-Id: Ic9329c59c358742696adbbca9cc2b33f25787eb1 --- core/res/res/values/config.xml | 29 - core/res/res/values/symbols.xml | 5 - services/core/Android.bp | 7 - .../server/display/DisplayModeDirector.java | 573 +++++------------- .../server/wm/HighRefreshRateBlacklist.java | 2 +- .../server/wm/WindowManagerConstants.java | 2 +- .../server/wm/WindowManagerService.java | 2 +- .../{ => wm}/utils/DeviceConfigInterface.java | 13 +- services/tests/servicestests/Android.bp | 3 +- .../display/DisplayModeDirectorTest.java | 378 +----------- .../wm/HighRefreshRateBlacklistTest.java | 2 +- .../server/wm/WindowManagerConstantsTest.java | 2 +- .../wm/utils}/FakeDeviceConfigInterface.java | 16 +- 13 files changed, 169 insertions(+), 865 deletions(-) rename services/core/java/com/android/server/{ => wm}/utils/DeviceConfigInterface.java (90%) rename services/tests/{servicestests/utils/com/android/server/testutils => wmtests/src/com/android/server/wm/utils}/FakeDeviceConfigInterface.java (92%) diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 5f02eb6a6a37e..550601af0faa1 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -4138,35 +4138,6 @@ If non-positive, then the refresh rate is unchanged even if thresholds are configured. --> 0 - - - - - - - - - - - 0 - diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index b80e8e1cd9805..06f357e79a621 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -3783,11 +3783,6 @@ - - - - - diff --git a/services/core/Android.bp b/services/core/Android.bp index 7585d6ba9c60f..4bba0d892f3b2 100644 --- a/services/core/Android.bp +++ b/services/core/Android.bp @@ -1,10 +1,3 @@ -filegroup { - name: "services.core-sources-deviceconfig-interface", - srcs: [ - "java/com/android/server/utils/DeviceConfigInterface.java" - ], -} - filegroup { name: "services.core-sources", srcs: ["java/**/*.java"], diff --git a/services/core/java/com/android/server/display/DisplayModeDirector.java b/services/core/java/com/android/server/display/DisplayModeDirector.java index 2a60839ab702a..3c050804f01d9 100644 --- a/services/core/java/com/android/server/display/DisplayModeDirector.java +++ b/services/core/java/com/android/server/display/DisplayModeDirector.java @@ -46,10 +46,8 @@ import android.view.DisplayInfo; import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.os.BackgroundThread; -import com.android.internal.util.IndentingPrintWriter; import com.android.server.display.utils.AmbientFilter; import com.android.server.display.utils.AmbientFilterFactory; -import com.android.server.utils.DeviceConfigInterface; import java.io.PrintWriter; import java.util.ArrayList; @@ -66,9 +64,9 @@ public class DisplayModeDirector { private static final boolean DEBUG = false; private static final int MSG_REFRESH_RATE_RANGE_CHANGED = 1; - private static final int MSG_LOW_BRIGHTNESS_THRESHOLDS_CHANGED = 2; + private static final int MSG_BRIGHTNESS_THRESHOLDS_CHANGED = 2; private static final int MSG_DEFAULT_PEAK_REFRESH_RATE_CHANGED = 3; - private static final int MSG_REFRESH_RATE_IN_LOW_ZONE_CHANGED = 4; + private static final int MSG_REFRESH_RATE_IN_ZONE_CHANGED = 4; // Special ID used to indicate that given vote is to be applied globally, rather than to a // specific display. @@ -81,13 +79,6 @@ public class DisplayModeDirector { private final Context mContext; private final DisplayModeDirectorHandler mHandler; - private final Injector mInjector; - - private final AppRequestObserver mAppRequestObserver; - private final SettingsObserver mSettingsObserver; - private final DisplayObserver mDisplayObserver; - private final DeviceConfigInterface mDeviceConfig; - private final DeviceConfigDisplaySettings mDeviceConfigDisplaySettings; // A map from the display ID to the collection of votes and their priority. The latter takes // the form of another map from the priority to the vote itself so that each priority is @@ -98,19 +89,17 @@ public class DisplayModeDirector { // A map from the display ID to the default mode of that display. private SparseArray mDefaultModeByDisplay; + private final AppRequestObserver mAppRequestObserver; + private final SettingsObserver mSettingsObserver; + private final DisplayObserver mDisplayObserver; private BrightnessObserver mBrightnessObserver; + private final DeviceConfigDisplaySettings mDeviceConfigDisplaySettings; private DesiredDisplayModeSpecsListener mDesiredDisplayModeSpecsListener; public DisplayModeDirector(@NonNull Context context, @NonNull Handler handler) { - this(context, handler, new RealInjector()); - } - - public DisplayModeDirector(@NonNull Context context, @NonNull Handler handler, - @NonNull Injector injector) { mContext = context; mHandler = new DisplayModeDirectorHandler(handler.getLooper()); - mInjector = injector; mVotesByDisplay = new SparseArray<>(); mSupportedModesByDisplay = new SparseArray<>(); mDefaultModeByDisplay = new SparseArray<>(); @@ -119,7 +108,6 @@ public class DisplayModeDirector { mDisplayObserver = new DisplayObserver(context, handler); mBrightnessObserver = new BrightnessObserver(context, handler); mDeviceConfigDisplaySettings = new DeviceConfigDisplaySettings(); - mDeviceConfig = injector.getDeviceConfig(); } /** @@ -360,23 +348,6 @@ public class DisplayModeDirector { } } - /** - * Retrieve the Vote for the given display and priority. Intended only for testing purposes. - * - * @param displayId the display to query for - * @param priority the priority of the vote to return - * @return the vote corresponding to the given {@code displayId} and {@code priority}, - * or {@code null} if there isn't one - */ - @VisibleForTesting - @Nullable - Vote getVote(int displayId, int priority) { - synchronized (mLock) { - SparseArray votes = getVotesLocked(displayId); - return votes.get(priority); - } - } - /** * Print the object's state and debug information into the given stream. * @@ -494,17 +465,6 @@ public class DisplayModeDirector { mBrightnessObserver = brightnessObserver; } - @VisibleForTesting - BrightnessObserver getBrightnessObserver() { - return mBrightnessObserver; - } - - @VisibleForTesting - SettingsObserver getSettingsObserver() { - return mSettingsObserver; - } - - @VisibleForTesting DesiredDisplayModeSpecs getDesiredDisplayModeSpecsWithInjectedFpsSettings( float minRefreshRate, float peakRefreshRate, float defaultRefreshRate) { @@ -515,13 +475,6 @@ public class DisplayModeDirector { } } - @VisibleForTesting - void updateSettingForHighZone(int refreshRate, int[] brightnessThresholds, - int[] ambientThresholds) { - mBrightnessObserver.updateThresholdsRefreshRateForHighZone(refreshRate, - brightnessThresholds, ambientThresholds); - } - /** * Listens for changes refresh rate coordination. */ @@ -540,10 +493,15 @@ public class DisplayModeDirector { @Override public void handleMessage(Message msg) { switch (msg.what) { - case MSG_LOW_BRIGHTNESS_THRESHOLDS_CHANGED: + case MSG_BRIGHTNESS_THRESHOLDS_CHANGED: Pair thresholds = (Pair) msg.obj; - mBrightnessObserver.onDeviceConfigLowBrightnessThresholdsChanged( - thresholds.first, thresholds.second); + + if (thresholds != null) { + mBrightnessObserver.onDeviceConfigThresholdsChanged( + thresholds.first, thresholds.second); + } else { + mBrightnessObserver.onDeviceConfigThresholdsChanged(null, null); + } break; case MSG_DEFAULT_PEAK_REFRESH_RATE_CHANGED: @@ -552,9 +510,9 @@ public class DisplayModeDirector { defaultPeakRefreshRate); break; - case MSG_REFRESH_RATE_IN_LOW_ZONE_CHANGED: + case MSG_REFRESH_RATE_IN_ZONE_CHANGED: int refreshRateInZone = msg.arg1; - mBrightnessObserver.onDeviceConfigRefreshRateInLowZoneChanged( + mBrightnessObserver.onDeviceConfigRefreshRateInZoneChanged( refreshRateInZone); break; @@ -727,11 +685,10 @@ public class DisplayModeDirector { // by all other considerations. It acts to set a default frame rate for a device. public static final int PRIORITY_DEFAULT_REFRESH_RATE = 0; - // FLICKER votes for a single refresh rate like [60,60], [90,90] or null. + // LOW_BRIGHTNESS votes for a single refresh rate like [60,60], [90,90] or null. // If the higher voters result is a range, it will fix the rate to a single choice. - // It's used to avoid refresh rate switches in certain conditions which may result in the - // user seeing the display flickering when the switches occur. - public static final int PRIORITY_FLICKER = 1; + // It's used to avoid rate switch in certain conditions. + public static final int PRIORITY_LOW_BRIGHTNESS = 1; // SETTING_MIN_REFRESH_RATE is used to propose a lower bound of display refresh rate. // It votes [MIN_REFRESH_RATE, Float.POSITIVE_INFINITY] @@ -804,8 +761,8 @@ public class DisplayModeDirector { switch (priority) { case PRIORITY_DEFAULT_REFRESH_RATE: return "PRIORITY_DEFAULT_REFRESH_RATE"; - case PRIORITY_FLICKER: - return "PRIORITY_FLICKER"; + case PRIORITY_LOW_BRIGHTNESS: + return "PRIORITY_LOW_BRIGHTNESS"; case PRIORITY_USER_SETTING_MIN_REFRESH_RATE: return "PRIORITY_USER_SETTING_MIN_REFRESH_RATE"; case PRIORITY_APP_REQUEST_REFRESH_RATE: @@ -830,8 +787,7 @@ public class DisplayModeDirector { } } - @VisibleForTesting - final class SettingsObserver extends ContentObserver { + private final class SettingsObserver extends ContentObserver { private final Uri mPeakRefreshRateSetting = Settings.System.getUriFor(Settings.System.PEAK_REFRESH_RATE); private final Uri mMinRefreshRateSetting = @@ -854,7 +810,8 @@ public class DisplayModeDirector { public void observe() { final ContentResolver cr = mContext.getContentResolver(); - mInjector.registerPeakRefreshRateObserver(cr, this); + cr.registerContentObserver(mPeakRefreshRateSetting, false /*notifyDescendants*/, this, + UserHandle.USER_SYSTEM); cr.registerContentObserver(mMinRefreshRateSetting, false /*notifyDescendants*/, this, UserHandle.USER_SYSTEM); cr.registerContentObserver(mLowPowerModeSetting, false /*notifyDescendants*/, this, @@ -872,13 +829,6 @@ public class DisplayModeDirector { } } - public void setDefaultRefreshRate(float refreshRate) { - synchronized (mLock) { - mDefaultRefreshRate = refreshRate; - updateRefreshRateSettingLocked(); - } - } - public void onDeviceConfigDefaultPeakRefreshRateChanged(Float defaultPeakRefreshRate) { if (defaultPeakRefreshRate == null) { defaultPeakRefreshRate = (float) mContext.getResources().getInteger( @@ -1083,7 +1033,6 @@ public class DisplayModeDirector { @Override public void onDisplayChanged(int displayId) { updateDisplayModes(displayId); - // TODO: Break the coupling between DisplayObserver and BrightnessObserver. mBrightnessObserver.onDisplayChanged(displayId); } @@ -1122,16 +1071,15 @@ public class DisplayModeDirector { */ @VisibleForTesting public class BrightnessObserver extends ContentObserver { + // TODO: brightnessfloat: change this to the float setting + private final Uri mDisplayBrightnessSetting = + Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS); private final static int LIGHT_SENSOR_RATE_MS = 250; - private int[] mLowDisplayBrightnessThresholds; - private int[] mLowAmbientBrightnessThresholds; - private int[] mHighDisplayBrightnessThresholds; - private int[] mHighAmbientBrightnessThresholds; + private int[] mDisplayBrightnessThresholds; + private int[] mAmbientBrightnessThresholds; // valid threshold if any item from the array >= 0 - private boolean mShouldObserveDisplayLowChange; - private boolean mShouldObserveAmbientLowChange; - private boolean mShouldObserveDisplayHighChange; - private boolean mShouldObserveAmbientHighChange; + private boolean mShouldObserveDisplayChange; + private boolean mShouldObserveAmbientChange; private SensorManager mSensorManager; private Sensor mLightSensor; @@ -1139,114 +1087,46 @@ public class DisplayModeDirector { // Take it as low brightness before valid sensor data comes private float mAmbientLux = -1.0f; private AmbientFilter mAmbientFilter; - private int mBrightness = -1; private final Context mContext; - // Enable light sensor only when mShouldObserveAmbientLowChange is true or - // mShouldObserveAmbientHighChange is true, screen is on, peak refresh rate - // changeable and low power mode off. After initialization, these states will + // Enable light sensor only when mShouldObserveAmbientChange is true, screen is on, peak + // refresh rate changeable and low power mode off. After initialization, these states will // be updated from the same handler thread. - private boolean mDefaultDisplayOn = false; + private boolean mScreenOn = false; private boolean mRefreshRateChangeable = false; private boolean mLowPowerModeEnabled = false; - private int mRefreshRateInLowZone; - private int mRefreshRateInHighZone; + private int mRefreshRateInZone; BrightnessObserver(Context context, Handler handler) { super(handler); mContext = context; - mLowDisplayBrightnessThresholds = context.getResources().getIntArray( + mDisplayBrightnessThresholds = context.getResources().getIntArray( R.array.config_brightnessThresholdsOfPeakRefreshRate); - mLowAmbientBrightnessThresholds = context.getResources().getIntArray( + mAmbientBrightnessThresholds = context.getResources().getIntArray( R.array.config_ambientThresholdsOfPeakRefreshRate); - if (mLowDisplayBrightnessThresholds.length != mLowAmbientBrightnessThresholds.length) { - throw new RuntimeException("display low brightness threshold array and ambient " - + "brightness threshold array have different length: " - + "displayBrightnessThresholds=" - + Arrays.toString(mLowDisplayBrightnessThresholds) - + ", ambientBrightnessThresholds=" - + Arrays.toString(mLowAmbientBrightnessThresholds)); + if (mDisplayBrightnessThresholds.length != mAmbientBrightnessThresholds.length) { + throw new RuntimeException("display brightness threshold array and ambient " + + "brightness threshold array have different length"); } - - mHighDisplayBrightnessThresholds = context.getResources().getIntArray( - R.array.config_highDisplayBrightnessThresholdsOfFixedRefreshRate); - mHighAmbientBrightnessThresholds = context.getResources().getIntArray( - R.array.config_highAmbientBrightnessThresholdsOfFixedRefreshRate); - if (mHighDisplayBrightnessThresholds.length - != mHighAmbientBrightnessThresholds.length) { - throw new RuntimeException("display high brightness threshold array and ambient " - + "brightness threshold array have different length: " - + "displayBrightnessThresholds=" - + Arrays.toString(mHighDisplayBrightnessThresholds) - + ", ambientBrightnessThresholds=" - + Arrays.toString(mHighAmbientBrightnessThresholds)); - } - mRefreshRateInHighZone = context.getResources().getInteger( - R.integer.config_fixedRefreshRateInHighZone); - } - - /** - * @return the refresh to lock to when in a low brightness zone - */ - @VisibleForTesting - int getRefreshRateInLowZone() { - return mRefreshRateInLowZone; - } - - /** - * @return the display brightness thresholds for the low brightness zones - */ - @VisibleForTesting - int[] getLowDisplayBrightnessThresholds() { - return mLowDisplayBrightnessThresholds; - } - - /** - * @return the ambient brightness thresholds for the low brightness zones - */ - @VisibleForTesting - int[] getLowAmbientBrightnessThresholds() { - return mLowAmbientBrightnessThresholds; - } - - public void registerLightSensor(SensorManager sensorManager, Sensor lightSensor) { - mSensorManager = sensorManager; - mLightSensor = lightSensor; - - mSensorManager.registerListener(mLightSensorListener, - mLightSensor, LIGHT_SENSOR_RATE_MS * 1000, mHandler); - } - - public void updateThresholdsRefreshRateForHighZone(int refreshRate, - int[] brightnessThresholds, int[] ambientThresholds) { - mRefreshRateInHighZone = refreshRate; - mHighDisplayBrightnessThresholds = brightnessThresholds; - mHighAmbientBrightnessThresholds = ambientThresholds; } public void observe(SensorManager sensorManager) { mSensorManager = sensorManager; - final ContentResolver cr = mContext.getContentResolver(); - mBrightness = Settings.System.getIntForUser(cr, - Settings.System.SCREEN_BRIGHTNESS, -1 /*default*/, cr.getUserId()); // DeviceConfig is accessible after system ready. - int[] lowDisplayBrightnessThresholds = - mDeviceConfigDisplaySettings.getLowDisplayBrightnessThresholds(); - int[] lowAmbientBrightnessThresholds = - mDeviceConfigDisplaySettings.getLowAmbientBrightnessThresholds(); + int[] brightnessThresholds = mDeviceConfigDisplaySettings.getBrightnessThresholds(); + int[] ambientThresholds = mDeviceConfigDisplaySettings.getAmbientThresholds(); - if (lowDisplayBrightnessThresholds != null && lowAmbientBrightnessThresholds != null - && lowDisplayBrightnessThresholds.length - == lowAmbientBrightnessThresholds.length) { - mLowDisplayBrightnessThresholds = lowDisplayBrightnessThresholds; - mLowAmbientBrightnessThresholds = lowAmbientBrightnessThresholds; + if (brightnessThresholds != null && ambientThresholds != null + && brightnessThresholds.length == ambientThresholds.length) { + mDisplayBrightnessThresholds = brightnessThresholds; + mAmbientBrightnessThresholds = ambientThresholds; } - mRefreshRateInLowZone = mDeviceConfigDisplaySettings.getRefreshRateInLowZone(); + mRefreshRateInZone = mDeviceConfigDisplaySettings.getRefreshRateInZone(); restartObserver(); mDeviceConfigDisplaySettings.startListening(); } @@ -1258,7 +1138,7 @@ public class DisplayModeDirector { updateSensorStatus(); if (!changeable) { // Revoke previous vote from BrightnessObserver - updateVoteLocked(Vote.PRIORITY_FLICKER, null); + updateVoteLocked(Vote.PRIORITY_LOW_BRIGHTNESS, null); } } } @@ -1270,25 +1150,25 @@ public class DisplayModeDirector { } } - public void onDeviceConfigLowBrightnessThresholdsChanged(int[] displayThresholds, + public void onDeviceConfigThresholdsChanged(int[] brightnessThresholds, int[] ambientThresholds) { - if (displayThresholds != null && ambientThresholds != null - && displayThresholds.length == ambientThresholds.length) { - mLowDisplayBrightnessThresholds = displayThresholds; - mLowAmbientBrightnessThresholds = ambientThresholds; + if (brightnessThresholds != null && ambientThresholds != null + && brightnessThresholds.length == ambientThresholds.length) { + mDisplayBrightnessThresholds = brightnessThresholds; + mAmbientBrightnessThresholds = ambientThresholds; } else { // Invalid or empty. Use device default. - mLowDisplayBrightnessThresholds = mContext.getResources().getIntArray( + mDisplayBrightnessThresholds = mContext.getResources().getIntArray( R.array.config_brightnessThresholdsOfPeakRefreshRate); - mLowAmbientBrightnessThresholds = mContext.getResources().getIntArray( + mAmbientBrightnessThresholds = mContext.getResources().getIntArray( R.array.config_ambientThresholdsOfPeakRefreshRate); } restartObserver(); } - public void onDeviceConfigRefreshRateInLowZoneChanged(int refreshRate) { - if (refreshRate != mRefreshRateInLowZone) { - mRefreshRateInLowZone = refreshRate; + public void onDeviceConfigRefreshRateInZoneChanged(int refreshRate) { + if (refreshRate != mRefreshRateInZone) { + mRefreshRateInZone = refreshRate; restartObserver(); } } @@ -1296,95 +1176,48 @@ public class DisplayModeDirector { public void dumpLocked(PrintWriter pw) { pw.println(" BrightnessObserver"); pw.println(" mAmbientLux: " + mAmbientLux); - pw.println(" mBrightness: " + mBrightness); - pw.println(" mDefaultDisplayOn: " + mDefaultDisplayOn); - pw.println(" mLowPowerModeEnabled: " + mLowPowerModeEnabled); - pw.println(" mRefreshRateChangeable: " + mRefreshRateChangeable); - pw.println(" mShouldObserveDisplayLowChange: " + mShouldObserveDisplayLowChange); - pw.println(" mShouldObserveAmbientLowChange: " + mShouldObserveAmbientLowChange); - pw.println(" mRefreshRateInLowZone: " + mRefreshRateInLowZone); + pw.println(" mRefreshRateInZone: " + mRefreshRateInZone); - for (int d : mLowDisplayBrightnessThresholds) { - pw.println(" mDisplayLowBrightnessThreshold: " + d); + for (int d: mDisplayBrightnessThresholds) { + pw.println(" mDisplayBrightnessThreshold: " + d); } - for (int d : mLowAmbientBrightnessThresholds) { - pw.println(" mAmbientLowBrightnessThreshold: " + d); - } - - pw.println(" mShouldObserveDisplayHighChange: " + mShouldObserveDisplayHighChange); - pw.println(" mShouldObserveAmbientHighChange: " + mShouldObserveAmbientHighChange); - pw.println(" mRefreshRateInHighZone: " + mRefreshRateInHighZone); - - for (int d : mHighDisplayBrightnessThresholds) { - pw.println(" mDisplayHighBrightnessThresholds: " + d); - } - - for (int d : mHighAmbientBrightnessThresholds) { - pw.println(" mAmbientHighBrightnessThresholds: " + d); + for (int d: mAmbientBrightnessThresholds) { + pw.println(" mAmbientBrightnessThreshold: " + d); } mLightSensorListener.dumpLocked(pw); - - if (mAmbientFilter != null) { - IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " "); - ipw.setIndent(" "); - mAmbientFilter.dump(ipw); - } } public void onDisplayChanged(int displayId) { if (displayId == Display.DEFAULT_DISPLAY) { - updateDefaultDisplayState(); + onScreenOn(isDefaultDisplayOn()); } } @Override public void onChange(boolean selfChange, Uri uri, int userId) { synchronized (mLock) { - final ContentResolver cr = mContext.getContentResolver(); - int brightness = Settings.System.getIntForUser(cr, - Settings.System.SCREEN_BRIGHTNESS, -1 /*default*/, cr.getUserId()); - if (brightness != mBrightness) { - mBrightness = brightness; - onBrightnessChangedLocked(); - } + onBrightnessChangedLocked(); } } private void restartObserver() { + mShouldObserveDisplayChange = checkShouldObserve(mDisplayBrightnessThresholds); + mShouldObserveAmbientChange = checkShouldObserve(mAmbientBrightnessThresholds); + final ContentResolver cr = mContext.getContentResolver(); - - if (mRefreshRateInLowZone > 0) { - mShouldObserveDisplayLowChange = hasValidThreshold( - mLowDisplayBrightnessThresholds); - mShouldObserveAmbientLowChange = hasValidThreshold( - mLowAmbientBrightnessThresholds); - } else { - mShouldObserveDisplayLowChange = false; - mShouldObserveAmbientLowChange = false; - } - - if (mRefreshRateInHighZone > 0) { - mShouldObserveDisplayHighChange = hasValidThreshold( - mHighDisplayBrightnessThresholds); - mShouldObserveAmbientHighChange = hasValidThreshold( - mHighAmbientBrightnessThresholds); - } else { - mShouldObserveDisplayHighChange = false; - mShouldObserveAmbientHighChange = false; - } - - if (mShouldObserveDisplayLowChange || mShouldObserveDisplayHighChange) { + if (mShouldObserveDisplayChange) { // Content Service does not check if an listener has already been registered. // To ensure only one listener is registered, force an unregistration first. - mInjector.unregisterBrightnessObserver(cr, this); - mInjector.registerBrightnessObserver(cr, this); + cr.unregisterContentObserver(this); + cr.registerContentObserver(mDisplayBrightnessSetting, + false /*notifyDescendants*/, this, UserHandle.USER_SYSTEM); } else { - mInjector.unregisterBrightnessObserver(cr, this); + cr.unregisterContentObserver(this); } - if (mShouldObserveAmbientLowChange || mShouldObserveAmbientHighChange) { + if (mShouldObserveAmbientChange) { Resources resources = mContext.getResources(); String lightSensorType = resources.getString( com.android.internal.R.string.config_displayLightSensorType); @@ -1410,6 +1243,8 @@ public class DisplayModeDirector { mAmbientFilter = AmbientFilterFactory.createBrightnessFilter(TAG, res); mLightSensor = lightSensor; + + onScreenOn(isDefaultDisplayOn()); } } else { mAmbientFilter = null; @@ -1428,7 +1263,11 @@ public class DisplayModeDirector { * Checks to see if at least one value is positive, in which case it is necessary to listen * to value changes. */ - private boolean hasValidThreshold(int[] a) { + private boolean checkShouldObserve(int[] a) { + if (mRefreshRateInZone <= 0) { + return false; + } + for (int d: a) { if (d >= 0) { return true; @@ -1438,13 +1277,13 @@ public class DisplayModeDirector { return false; } - private boolean isInsideLowZone(int brightness, float lux) { - for (int i = 0; i < mLowDisplayBrightnessThresholds.length; i++) { - int disp = mLowDisplayBrightnessThresholds[i]; - int ambi = mLowAmbientBrightnessThresholds[i]; + private boolean isInsideZone(int brightness, float lux) { + for (int i = 0; i < mDisplayBrightnessThresholds.length; i++) { + int disp = mDisplayBrightnessThresholds[i]; + int ambi = mAmbientBrightnessThresholds[i]; if (disp >= 0 && ambi >= 0) { - if (brightness <= disp && lux <= ambi) { + if (brightness <= disp && mAmbientLux <= ambi) { return true; } } else if (disp >= 0) { @@ -1452,30 +1291,7 @@ public class DisplayModeDirector { return true; } } else if (ambi >= 0) { - if (lux <= ambi) { - return true; - } - } - } - - return false; - } - - private boolean isInsideHighZone(int brightness, float lux) { - for (int i = 0; i < mHighDisplayBrightnessThresholds.length; i++) { - int disp = mHighDisplayBrightnessThresholds[i]; - int ambi = mHighAmbientBrightnessThresholds[i]; - - if (disp >= 0 && ambi >= 0) { - if (brightness >= disp && lux >= ambi) { - return true; - } - } else if (disp >= 0) { - if (brightness >= disp) { - return true; - } - } else if (ambi >= 0) { - if (lux >= ambi) { + if (mAmbientLux <= ambi) { return true; } } @@ -1483,54 +1299,27 @@ public class DisplayModeDirector { return false; } + // TODO: brightnessfloat: make it use float not int private void onBrightnessChangedLocked() { + int brightness = Settings.System.getInt(mContext.getContentResolver(), + Settings.System.SCREEN_BRIGHTNESS, -1); + Vote vote = null; - - if (mBrightness < 0) { - // Either the setting isn't available or we shouldn't be observing yet anyways. - // Either way, just bail out since there's nothing we can do here. - return; - } - - boolean insideLowZone = hasValidLowZone() && isInsideLowZone(mBrightness, mAmbientLux); - if (insideLowZone) { - vote = Vote.forRefreshRates(mRefreshRateInLowZone, mRefreshRateInLowZone); - } - - boolean insideHighZone = hasValidHighZone() - && isInsideHighZone(mBrightness, mAmbientLux); - if (insideHighZone) { - vote = Vote.forRefreshRates(mRefreshRateInHighZone, mRefreshRateInHighZone); + boolean insideZone = isInsideZone(brightness, mAmbientLux); + if (insideZone) { + vote = Vote.forRefreshRates(mRefreshRateInZone, mRefreshRateInZone); } if (DEBUG) { - Slog.d(TAG, "Display brightness " + mBrightness + ", ambient lux " + mAmbientLux - + ", Vote " + vote); + Slog.d(TAG, "Display brightness " + brightness + ", ambient lux " + mAmbientLux + + ", Vote " + vote); } - updateVoteLocked(Vote.PRIORITY_FLICKER, vote); + updateVoteLocked(Vote.PRIORITY_LOW_BRIGHTNESS, vote); } - private boolean hasValidLowZone() { - return mRefreshRateInLowZone > 0 - && (mShouldObserveDisplayLowChange || mShouldObserveAmbientLowChange); - } - - private boolean hasValidHighZone() { - return mRefreshRateInHighZone > 0 - && (mShouldObserveDisplayHighChange || mShouldObserveAmbientHighChange); - } - - private void updateDefaultDisplayState() { - Display display = mContext.getSystemService(DisplayManager.class) - .getDisplay(Display.DEFAULT_DISPLAY); - boolean defaultDisplayOn = display != null && display.getState() != Display.STATE_OFF; - setDefaultDisplayState(defaultDisplayOn); - } - - @VisibleForTesting - public void setDefaultDisplayState(boolean on) { - if (mDefaultDisplayOn != on) { - mDefaultDisplayOn = on; + private void onScreenOn(boolean on) { + if (mScreenOn != on) { + mScreenOn = on; updateSensorStatus(); } } @@ -1540,8 +1329,8 @@ public class DisplayModeDirector { return; } - if ((mShouldObserveAmbientLowChange || mShouldObserveAmbientHighChange) - && isDeviceActive() && !mLowPowerModeEnabled && mRefreshRateChangeable) { + if (mShouldObserveAmbientChange && mScreenOn && !mLowPowerModeEnabled + && mRefreshRateChangeable) { mSensorManager.registerListener(mLightSensorListener, mLightSensor, LIGHT_SENSOR_RATE_MS * 1000, mHandler); } else { @@ -1550,8 +1339,11 @@ public class DisplayModeDirector { } } - private boolean isDeviceActive() { - return mDefaultDisplayOn && mInjector.isDeviceInteractive(mContext); + private boolean isDefaultDisplayOn() { + final Display display = mContext.getSystemService(DisplayManager.class) + .getDisplay(Display.DEFAULT_DISPLAY); + return display.getState() != Display.STATE_OFF + && mContext.getSystemService(PowerManager.class).isInteractive(); } private final class LightSensorEventListener implements SensorEventListener { @@ -1569,33 +1361,23 @@ public class DisplayModeDirector { Slog.d(TAG, "On sensor changed: " + mLastSensorData); } - boolean lowZoneChanged = isDifferentZone(mLastSensorData, mAmbientLux, - mLowAmbientBrightnessThresholds); - boolean highZoneChanged = isDifferentZone(mLastSensorData, mAmbientLux, - mHighAmbientBrightnessThresholds); - if ((lowZoneChanged && mLastSensorData < mAmbientLux) - || (highZoneChanged && mLastSensorData > mAmbientLux)) { - // Easier to see flicker at lower brightness environment or high brightness - // environment. Forget the history to get immediate response. - if (mAmbientFilter != null) { - mAmbientFilter.clear(); - } + boolean zoneChanged = isDifferentZone(mLastSensorData, mAmbientLux); + if (zoneChanged && mLastSensorData < mAmbientLux) { + // Easier to see flicker at lower brightness environment. Forget the history to + // get immediate response. + mAmbientFilter.clear(); } long now = SystemClock.uptimeMillis(); - if (mAmbientFilter != null) { - mAmbientFilter.addValue(now, mLastSensorData); - } + mAmbientFilter.addValue(now, mLastSensorData); mHandler.removeCallbacks(mInjectSensorEventRunnable); processSensorData(now); - if ((lowZoneChanged && mLastSensorData > mAmbientLux) - || (highZoneChanged && mLastSensorData < mAmbientLux)) { + if (zoneChanged && mLastSensorData > mAmbientLux) { // Sensor may not report new event if there is no brightness change. // Need to keep querying the temporal filter for the latest estimation, - // until sensor readout and filter estimation are in the same zone or - // is interrupted by a new sensor event. + // until enter in higher lux zone or is interrupted by a new sensor event. mHandler.postDelayed(mInjectSensorEventRunnable, INJECT_EVENTS_INTERVAL_MS); } } @@ -1610,19 +1392,17 @@ public class DisplayModeDirector { } private void processSensorData(long now) { - if (mAmbientFilter != null) { - mAmbientLux = mAmbientFilter.getEstimate(now); - } else { - mAmbientLux = mLastSensorData; - } + mAmbientLux = mAmbientFilter.getEstimate(now); synchronized (mLock) { onBrightnessChangedLocked(); } } - private boolean isDifferentZone(float lux1, float lux2, int[] luxThresholds) { - for (final float boundary : luxThresholds) { + private boolean isDifferentZone(float lux1, float lux2) { + for (int z = 0; z < mAmbientBrightnessThresholds.length; z++) { + final float boundary = mAmbientBrightnessThresholds[z]; + // Test each boundary. See if the current value and the new value are at // different sides. if ((lux1 <= boundary && lux2 > boundary) @@ -1642,10 +1422,7 @@ public class DisplayModeDirector { processSensorData(now); // Inject next event if there is a possible zone change. - if (isDifferentZone(mLastSensorData, mAmbientLux, - mLowAmbientBrightnessThresholds) - || isDifferentZone(mLastSensorData, mAmbientLux, - mHighAmbientBrightnessThresholds)) { + if (isDifferentZone(mLastSensorData, mAmbientLux)) { mHandler.postDelayed(mInjectSensorEventRunnable, INJECT_EVENTS_INTERVAL_MS); } } @@ -1658,14 +1435,14 @@ public class DisplayModeDirector { } public void startListening() { - mDeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_DISPLAY_MANAGER, + DeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_DISPLAY_MANAGER, BackgroundThread.getExecutor(), this); } /* * Return null if no such property or wrong format (not comma separated integers). */ - public int[] getLowDisplayBrightnessThresholds() { + public int[] getBrightnessThresholds() { return getIntArrayProperty( DisplayManager.DeviceConfig. KEY_PEAK_REFRESH_RATE_DISPLAY_BRIGHTNESS_THRESHOLDS); @@ -1674,29 +1451,17 @@ public class DisplayModeDirector { /* * Return null if no such property or wrong format (not comma separated integers). */ - public int[] getLowAmbientBrightnessThresholds() { + public int[] getAmbientThresholds() { return getIntArrayProperty( DisplayManager.DeviceConfig. KEY_PEAK_REFRESH_RATE_AMBIENT_BRIGHTNESS_THRESHOLDS); } - public int getRefreshRateInLowZone() { - int defaultRefreshRateInZone = mContext.getResources().getInteger( - R.integer.config_defaultRefreshRateInZone); - - int refreshRate = mDeviceConfig.getInt( - DeviceConfig.NAMESPACE_DISPLAY_MANAGER, - DisplayManager.DeviceConfig.KEY_REFRESH_RATE_IN_ZONE, - defaultRefreshRateInZone); - - return refreshRate; - } - /* * Return null if no such property */ public Float getDefaultPeakRefreshRate() { - float defaultPeakRefreshRate = mDeviceConfig.getFloat( + float defaultPeakRefreshRate = DeviceConfig.getFloat( DeviceConfig.NAMESPACE_DISPLAY_MANAGER, DisplayManager.DeviceConfig.KEY_PEAK_REFRESH_RATE_DEFAULT, -1); @@ -1706,25 +1471,36 @@ public class DisplayModeDirector { return defaultPeakRefreshRate; } + public int getRefreshRateInZone() { + int defaultRefreshRateInZone = mContext.getResources().getInteger( + R.integer.config_defaultRefreshRateInZone); + + int refreshRate = DeviceConfig.getInt( + DeviceConfig.NAMESPACE_DISPLAY_MANAGER, + DisplayManager.DeviceConfig.KEY_REFRESH_RATE_IN_ZONE, + defaultRefreshRateInZone); + + return refreshRate; + } + @Override public void onPropertiesChanged(@NonNull DeviceConfig.Properties properties) { + int[] brightnessThresholds = getBrightnessThresholds(); + int[] ambientThresholds = getAmbientThresholds(); Float defaultPeakRefreshRate = getDefaultPeakRefreshRate(); + int refreshRateInZone = getRefreshRateInZone(); + + mHandler.obtainMessage(MSG_BRIGHTNESS_THRESHOLDS_CHANGED, + new Pair(brightnessThresholds, ambientThresholds)) + .sendToTarget(); mHandler.obtainMessage(MSG_DEFAULT_PEAK_REFRESH_RATE_CHANGED, defaultPeakRefreshRate).sendToTarget(); - - int[] lowDisplayBrightnessThresholds = getLowDisplayBrightnessThresholds(); - int[] lowAmbientBrightnessThresholds = getLowAmbientBrightnessThresholds(); - int refreshRateInLowZone = getRefreshRateInLowZone(); - - mHandler.obtainMessage(MSG_LOW_BRIGHTNESS_THRESHOLDS_CHANGED, - new Pair<>(lowDisplayBrightnessThresholds, lowAmbientBrightnessThresholds)) - .sendToTarget(); - mHandler.obtainMessage(MSG_REFRESH_RATE_IN_LOW_ZONE_CHANGED, refreshRateInLowZone, 0) - .sendToTarget(); + mHandler.obtainMessage(MSG_REFRESH_RATE_IN_ZONE_CHANGED, refreshRateInZone, + 0).sendToTarget(); } private int[] getIntArrayProperty(String prop) { - String strArray = mDeviceConfig.getString(DeviceConfig.NAMESPACE_DISPLAY_MANAGER, prop, + String strArray = DeviceConfig.getString(DeviceConfig.NAMESPACE_DISPLAY_MANAGER, prop, null); if (strArray != null) { @@ -1751,59 +1527,4 @@ public class DisplayModeDirector { } } - interface Injector { - // TODO: brightnessfloat: change this to the float setting - Uri DISPLAY_BRIGHTNESS_URI = Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS); - Uri PEAK_REFRESH_RATE_URI = Settings.System.getUriFor(Settings.System.PEAK_REFRESH_RATE); - - @NonNull - DeviceConfigInterface getDeviceConfig(); - - void registerBrightnessObserver(@NonNull ContentResolver cr, - @NonNull ContentObserver observer); - - void unregisterBrightnessObserver(@NonNull ContentResolver cr, - @NonNull ContentObserver observer); - - void registerPeakRefreshRateObserver(@NonNull ContentResolver cr, - @NonNull ContentObserver observer); - - boolean isDeviceInteractive(@NonNull Context context); - } - - @VisibleForTesting - static class RealInjector implements Injector { - - @Override - @NonNull - public DeviceConfigInterface getDeviceConfig() { - return DeviceConfigInterface.REAL; - } - - @Override - public void registerBrightnessObserver(@NonNull ContentResolver cr, - @NonNull ContentObserver observer) { - cr.registerContentObserver(DISPLAY_BRIGHTNESS_URI, false /*notifyDescendants*/, - observer, UserHandle.USER_SYSTEM); - } - - @Override - public void unregisterBrightnessObserver(@NonNull ContentResolver cr, - @NonNull ContentObserver observer) { - cr.unregisterContentObserver(observer); - } - - @Override - public void registerPeakRefreshRateObserver(@NonNull ContentResolver cr, - @NonNull ContentObserver observer) { - cr.registerContentObserver(PEAK_REFRESH_RATE_URI, false /*notifyDescendants*/, - observer, UserHandle.USER_SYSTEM); - } - - @Override - public boolean isDeviceInteractive(@NonNull Context ctx) { - return ctx.getSystemService(PowerManager.class).isInteractive(); - } - } - } diff --git a/services/core/java/com/android/server/wm/HighRefreshRateBlacklist.java b/services/core/java/com/android/server/wm/HighRefreshRateBlacklist.java index 09ab004b4b3bc..d9cf637ffaf8f 100644 --- a/services/core/java/com/android/server/wm/HighRefreshRateBlacklist.java +++ b/services/core/java/com/android/server/wm/HighRefreshRateBlacklist.java @@ -27,7 +27,7 @@ import android.util.ArraySet; import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.os.BackgroundThread; -import com.android.server.utils.DeviceConfigInterface; +import com.android.server.wm.utils.DeviceConfigInterface; import java.io.PrintWriter; diff --git a/services/core/java/com/android/server/wm/WindowManagerConstants.java b/services/core/java/com/android/server/wm/WindowManagerConstants.java index a5ebf9ac74b9b..b0c5dbc6cca38 100644 --- a/services/core/java/com/android/server/wm/WindowManagerConstants.java +++ b/services/core/java/com/android/server/wm/WindowManagerConstants.java @@ -23,7 +23,7 @@ import android.provider.AndroidDeviceConfig; import android.provider.DeviceConfig; import com.android.internal.annotations.VisibleForTesting; -import com.android.server.utils.DeviceConfigInterface; +import com.android.server.wm.utils.DeviceConfigInterface; import java.io.PrintWriter; import java.util.Objects; diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index d9594a40bde31..b7a2eb3c705d3 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -282,8 +282,8 @@ import com.android.server.policy.WindowManagerPolicy.ScreenOffListener; import com.android.server.power.ShutdownThread; import com.android.server.protolog.ProtoLogImpl; import com.android.server.protolog.common.ProtoLog; -import com.android.server.utils.DeviceConfigInterface; import com.android.server.utils.PriorityDump; +import com.android.server.wm.utils.DeviceConfigInterface; import java.io.BufferedWriter; import java.io.DataInputStream; diff --git a/services/core/java/com/android/server/utils/DeviceConfigInterface.java b/services/core/java/com/android/server/wm/utils/DeviceConfigInterface.java similarity index 90% rename from services/core/java/com/android/server/utils/DeviceConfigInterface.java rename to services/core/java/com/android/server/wm/utils/DeviceConfigInterface.java index ff609031b57c5..ab7e7f63cafd4 100644 --- a/services/core/java/com/android/server/utils/DeviceConfigInterface.java +++ b/services/core/java/com/android/server/wm/utils/DeviceConfigInterface.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.server.utils; +package com.android.server.wm.utils; import android.annotation.NonNull; import android.annotation.Nullable; @@ -53,11 +53,6 @@ public interface DeviceConfigInterface { */ boolean getBoolean(@NonNull String namespace, @NonNull String name, boolean defaultValue); - /** - * @see DeviceConfig#getFloat - */ - float getFloat(@NonNull String namespace, @NonNull String name, float defaultValue); - /** * @see DeviceConfig#addOnPropertiesChangedListener */ @@ -100,12 +95,6 @@ public interface DeviceConfigInterface { return DeviceConfig.getBoolean(namespace, name, defaultValue); } - @Override - public float getFloat(@NonNull String namespace, @NonNull String name, - float defaultValue) { - return DeviceConfig.getFloat(namespace, name, defaultValue); - } - @Override public void addOnPropertiesChangedListener(String namespace, Executor executor, DeviceConfig.OnPropertiesChangedListener listener) { diff --git a/services/tests/servicestests/Android.bp b/services/tests/servicestests/Android.bp index e57097e488811..979f4e179e95d 100644 --- a/services/tests/servicestests/Android.bp +++ b/services/tests/servicestests/Android.bp @@ -48,6 +48,7 @@ android_test { // TODO: remove once Android migrates to JUnit 4.12, // which provides assertThrows "testng", + ], aidl: { @@ -109,7 +110,6 @@ java_library { "utils/**/*.java", "utils/**/*.kt", "utils-mockito/**/*.kt", - ":services.core-sources-deviceconfig-interface", ], static_libs: [ "junit", @@ -126,7 +126,6 @@ java_library { "utils/**/*.java", "utils/**/*.kt", "utils-mockito/**/*.kt", - ":services.core-sources-deviceconfig-interface", ], static_libs: [ "junit", diff --git a/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java b/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java index 4ee6a553b9d15..43a396d8e5d7d 100644 --- a/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java +++ b/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java @@ -16,96 +16,49 @@ package com.android.server.display; -import static android.hardware.display.DisplayManager.DeviceConfig.KEY_PEAK_REFRESH_RATE_AMBIENT_BRIGHTNESS_THRESHOLDS; -import static android.hardware.display.DisplayManager.DeviceConfig.KEY_PEAK_REFRESH_RATE_DISPLAY_BRIGHTNESS_THRESHOLDS; -import static android.hardware.display.DisplayManager.DeviceConfig.KEY_REFRESH_RATE_IN_ZONE; - -import static com.android.server.display.DisplayModeDirector.Vote.PRIORITY_FLICKER; - -import static com.google.common.truth.Truth.assertThat; - import static org.junit.Assert.assertTrue; -import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.any; -import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; -import android.annotation.NonNull; -import android.content.ContentResolver; import android.content.Context; -import android.content.ContextWrapper; -import android.database.ContentObserver; -import android.hardware.Sensor; -import android.hardware.SensorEventListener; -import android.hardware.SensorManager; import android.os.Handler; import android.os.Looper; -import android.provider.DeviceConfig; -import android.provider.Settings; -import android.test.mock.MockContentResolver; -import android.util.Slog; import android.util.SparseArray; import android.view.Display; -import androidx.test.core.app.ApplicationProvider; +import androidx.test.InstrumentationRegistry; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; -import com.android.internal.util.Preconditions; -import com.android.internal.util.test.FakeSettingsProvider; -import com.android.internal.util.test.FakeSettingsProviderRule; import com.android.server.display.DisplayModeDirector.BrightnessObserver; import com.android.server.display.DisplayModeDirector.DesiredDisplayModeSpecs; import com.android.server.display.DisplayModeDirector.Vote; -import com.android.server.testutils.FakeDeviceConfigInterface; import com.google.common.truth.Truth; import org.junit.Before; -import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.ArgumentCaptor; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.Executor; -import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; - @SmallTest @RunWith(AndroidJUnit4.class) public class DisplayModeDirectorTest { // The tolerance within which we consider something approximately equals. - private static final String TAG = "DisplayModeDirectorTest"; - private static final boolean DEBUG = false; private static final float FLOAT_TOLERANCE = 0.01f; private Context mContext; - private FakesInjector mInjector; - private Handler mHandler; - @Rule - public FakeSettingsProviderRule mSettingsProviderRule = FakeSettingsProvider.rule(); @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); - mContext = spy(new ContextWrapper(ApplicationProvider.getApplicationContext())); - final MockContentResolver resolver = mSettingsProviderRule.mockContentResolver(mContext); - when(mContext.getContentResolver()).thenReturn(resolver); - mInjector = new FakesInjector(); - mHandler = new Handler(Looper.getMainLooper()); + mContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); } private DisplayModeDirector createDirectorFromRefreshRateArray( float[] refreshRates, int baseModeId) { DisplayModeDirector director = - new DisplayModeDirector(mContext, mHandler, mInjector); + new DisplayModeDirector(mContext, new Handler(Looper.getMainLooper())); int displayId = 0; Display.Mode[] modes = new Display.Mode[refreshRates.length]; for (int i = 0; i < refreshRates.length; i++) { @@ -206,9 +159,9 @@ public class DisplayModeDirectorTest { } @Test - public void testFlickerHasLowerPriorityThanUser() { - assertTrue(PRIORITY_FLICKER < Vote.PRIORITY_APP_REQUEST_REFRESH_RATE); - assertTrue(PRIORITY_FLICKER < Vote.PRIORITY_APP_REQUEST_SIZE); + public void testBrightnessHasLowerPriorityThanUser() { + assertTrue(Vote.PRIORITY_LOW_BRIGHTNESS < Vote.PRIORITY_APP_REQUEST_REFRESH_RATE); + assertTrue(Vote.PRIORITY_LOW_BRIGHTNESS < Vote.PRIORITY_APP_REQUEST_SIZE); int displayId = 0; DisplayModeDirector director = createDirectorFromFpsRange(60, 90); @@ -216,7 +169,7 @@ public class DisplayModeDirectorTest { SparseArray> votesByDisplay = new SparseArray<>(); votesByDisplay.put(displayId, votes); votes.put(Vote.PRIORITY_APP_REQUEST_REFRESH_RATE, Vote.forRefreshRates(60, 90)); - votes.put(PRIORITY_FLICKER, Vote.forRefreshRates(60, 60)); + votes.put(Vote.PRIORITY_LOW_BRIGHTNESS, Vote.forRefreshRates(60, 60)); director.injectVotesByDisplay(votesByDisplay); DesiredDisplayModeSpecs desiredSpecs = director.getDesiredDisplayModeSpecs(displayId); Truth.assertThat(desiredSpecs.primaryRefreshRateRange.min).isWithin(FLOAT_TOLERANCE).of(60); @@ -224,7 +177,7 @@ public class DisplayModeDirectorTest { votes.clear(); votes.put(Vote.PRIORITY_APP_REQUEST_REFRESH_RATE, Vote.forRefreshRates(60, 90)); - votes.put(PRIORITY_FLICKER, Vote.forRefreshRates(90, 90)); + votes.put(Vote.PRIORITY_LOW_BRIGHTNESS, Vote.forRefreshRates(90, 90)); director.injectVotesByDisplay(votesByDisplay); desiredSpecs = director.getDesiredDisplayModeSpecs(displayId); Truth.assertThat(desiredSpecs.primaryRefreshRateRange.min).isWithin(FLOAT_TOLERANCE).of(90); @@ -232,7 +185,7 @@ public class DisplayModeDirectorTest { votes.clear(); votes.put(Vote.PRIORITY_APP_REQUEST_REFRESH_RATE, Vote.forRefreshRates(90, 90)); - votes.put(PRIORITY_FLICKER, Vote.forRefreshRates(60, 60)); + votes.put(Vote.PRIORITY_LOW_BRIGHTNESS, Vote.forRefreshRates(60, 60)); director.injectVotesByDisplay(votesByDisplay); desiredSpecs = director.getDesiredDisplayModeSpecs(displayId); Truth.assertThat(desiredSpecs.primaryRefreshRateRange.min).isWithin(FLOAT_TOLERANCE).of(90); @@ -240,7 +193,7 @@ public class DisplayModeDirectorTest { votes.clear(); votes.put(Vote.PRIORITY_APP_REQUEST_REFRESH_RATE, Vote.forRefreshRates(60, 60)); - votes.put(PRIORITY_FLICKER, Vote.forRefreshRates(90, 90)); + votes.put(Vote.PRIORITY_LOW_BRIGHTNESS, Vote.forRefreshRates(90, 90)); director.injectVotesByDisplay(votesByDisplay); desiredSpecs = director.getDesiredDisplayModeSpecs(displayId); Truth.assertThat(desiredSpecs.primaryRefreshRateRange.min).isWithin(FLOAT_TOLERANCE).of(60); @@ -249,10 +202,10 @@ public class DisplayModeDirectorTest { @Test public void testAppRequestRefreshRateRange() { - // Confirm that the app request range doesn't include flicker or min refresh rate settings, - // but does include everything else. + // Confirm that the app request range doesn't include low brightness or min refresh rate + // settings, but does include everything else. assertTrue( - PRIORITY_FLICKER < Vote.APP_REQUEST_REFRESH_RATE_RANGE_PRIORITY_CUTOFF); + Vote.PRIORITY_LOW_BRIGHTNESS < Vote.APP_REQUEST_REFRESH_RATE_RANGE_PRIORITY_CUTOFF); assertTrue(Vote.PRIORITY_USER_SETTING_MIN_REFRESH_RATE < Vote.APP_REQUEST_REFRESH_RATE_RANGE_PRIORITY_CUTOFF); assertTrue(Vote.PRIORITY_APP_REQUEST_REFRESH_RATE @@ -263,7 +216,7 @@ public class DisplayModeDirectorTest { SparseArray votes = new SparseArray<>(); SparseArray> votesByDisplay = new SparseArray<>(); votesByDisplay.put(displayId, votes); - votes.put(PRIORITY_FLICKER, Vote.forRefreshRates(60, 60)); + votes.put(Vote.PRIORITY_LOW_BRIGHTNESS, Vote.forRefreshRates(60, 60)); director.injectVotesByDisplay(votesByDisplay); DesiredDisplayModeSpecs desiredSpecs = director.getDesiredDisplayModeSpecs(displayId); Truth.assertThat(desiredSpecs.primaryRefreshRateRange.min).isWithin(FLOAT_TOLERANCE).of(60); @@ -349,307 +302,4 @@ public class DisplayModeDirectorTest { verifyBrightnessObserverCall(director, 90, 90, 0, 90, 90); verifyBrightnessObserverCall(director, 120, 90, 0, 120, 90); } - - @Test - public void testBrightnessObserverGetsUpdatedRefreshRatesForZone() { - DisplayModeDirector director = - createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, /* baseModeId= */ 0); - SensorManager sensorManager = createMockSensorManager(createLightSensor()); - - final int initialRefreshRate = 60; - mInjector.getDeviceConfig().setRefreshRateInLowZone(initialRefreshRate); - director.start(sensorManager); - assertThat(director.getBrightnessObserver().getRefreshRateInLowZone()) - .isEqualTo(initialRefreshRate); - - final int updatedRefreshRate = 90; - mInjector.getDeviceConfig().setRefreshRateInLowZone(updatedRefreshRate); - // Need to wait for the property change to propagate to the main thread. - waitForIdleSync(); - assertThat(director.getBrightnessObserver().getRefreshRateInLowZone()) - .isEqualTo(updatedRefreshRate); - } - - @Test - public void testBrightnessObserverThresholdsInZone() { - DisplayModeDirector director = - createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, /* baseModeId= */ 0); - SensorManager sensorManager = createMockSensorManager(createLightSensor()); - - final int[] initialDisplayThresholds = { 10 }; - final int[] initialAmbientThresholds = { 20 }; - - final FakeDeviceConfig config = mInjector.getDeviceConfig(); - config.setLowDisplayBrightnessThresholds(initialDisplayThresholds); - config.setLowAmbientBrightnessThresholds(initialAmbientThresholds); - director.start(sensorManager); - - assertThat(director.getBrightnessObserver().getLowDisplayBrightnessThresholds()) - .isEqualTo(initialDisplayThresholds); - assertThat(director.getBrightnessObserver().getLowAmbientBrightnessThresholds()) - .isEqualTo(initialAmbientThresholds); - - final int[] updatedDisplayThresholds = { 9, 14 }; - final int[] updatedAmbientThresholds = { -1, 19 }; - config.setLowDisplayBrightnessThresholds(updatedDisplayThresholds); - config.setLowAmbientBrightnessThresholds(updatedAmbientThresholds); - // Need to wait for the property change to propagate to the main thread. - waitForIdleSync(); - assertThat(director.getBrightnessObserver().getLowDisplayBrightnessThresholds()) - .isEqualTo(updatedDisplayThresholds); - assertThat(director.getBrightnessObserver().getLowAmbientBrightnessThresholds()) - .isEqualTo(updatedAmbientThresholds); - } - - @Test - public void testLockFpsForLowZone() throws Exception { - DisplayModeDirector director = - createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0); - setPeakRefreshRate(90); - director.getSettingsObserver().setDefaultRefreshRate(90); - director.getBrightnessObserver().setDefaultDisplayState(true); - - final FakeDeviceConfig config = mInjector.getDeviceConfig(); - config.setRefreshRateInLowZone(90); - config.setLowDisplayBrightnessThresholds(new int[] { 10 }); - config.setLowAmbientBrightnessThresholds(new int[] { 20 }); - - Sensor lightSensor = createLightSensor(); - SensorManager sensorManager = createMockSensorManager(lightSensor); - - director.start(sensorManager); - - ArgumentCaptor listenerCaptor = - ArgumentCaptor.forClass(SensorEventListener.class); - Mockito.verify(sensorManager, Mockito.timeout(TimeUnit.SECONDS.toMillis(1))) - .registerListener( - listenerCaptor.capture(), - eq(lightSensor), - anyInt(), - any(Handler.class)); - SensorEventListener listener = listenerCaptor.getValue(); - - setBrightness(10); - // Sensor reads 20 lux, - listener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, 20 /*lux*/)); - - Vote vote = director.getVote(Display.DEFAULT_DISPLAY, PRIORITY_FLICKER); - assertVoteForRefreshRateLocked(vote, 90 /*fps*/); - - setBrightness(125); - // Sensor reads 1000 lux, - listener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, 1000 /*lux*/)); - - vote = director.getVote(Display.DEFAULT_DISPLAY, PRIORITY_FLICKER); - assertThat(vote).isNull(); - } - - @Test - public void testLockFpsForHighZone() throws Exception { - DisplayModeDirector director = - createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0); - setPeakRefreshRate(90 /*fps*/); - director.getSettingsObserver().setDefaultRefreshRate(90); - director.getBrightnessObserver().setDefaultDisplayState(true); - director.updateSettingForHighZone(60, new int[] {255}, new int[] {8000}); - - Sensor lightSensor = createLightSensor(); - SensorManager sensorManager = createMockSensorManager(lightSensor); - - director.start(sensorManager); - - ArgumentCaptor listenerCaptor = - ArgumentCaptor.forClass(SensorEventListener.class); - Mockito.verify(sensorManager, Mockito.timeout(TimeUnit.SECONDS.toMillis(1))) - .registerListener( - listenerCaptor.capture(), - eq(lightSensor), - anyInt(), - any(Handler.class)); - SensorEventListener listener = listenerCaptor.getValue(); - - setBrightness(100); - // Sensor reads 2000 lux, - listener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, 2000)); - - Vote vote = director.getVote(Display.DEFAULT_DISPLAY, PRIORITY_FLICKER); - assertThat(vote).isNull(); - - setBrightness(255); - // Sensor reads 9000 lux, - listener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, 9000)); - - vote = director.getVote(Display.DEFAULT_DISPLAY, PRIORITY_FLICKER); - assertVoteForRefreshRateLocked(vote, 60 /*fps*/); - } - - private void assertVoteForRefreshRateLocked(Vote vote, float refreshRate) { - assertThat(vote).isNotNull(); - final DisplayModeDirector.RefreshRateRange expectedRange = - new DisplayModeDirector.RefreshRateRange(refreshRate, refreshRate); - assertThat(vote.refreshRateRange).isEqualTo(expectedRange); - } - - private static class FakeDeviceConfig extends FakeDeviceConfigInterface { - @Override - public String getProperty(String namespace, String name) { - Preconditions.checkArgument(DeviceConfig.NAMESPACE_DISPLAY_MANAGER.equals(namespace)); - return super.getProperty(namespace, name); - } - - @Override - public void addOnPropertiesChangedListener( - String namespace, - Executor executor, - DeviceConfig.OnPropertiesChangedListener listener) { - Preconditions.checkArgument(DeviceConfig.NAMESPACE_DISPLAY_MANAGER.equals(namespace)); - super.addOnPropertiesChangedListener(namespace, executor, listener); - } - - void setRefreshRateInLowZone(int fps) { - putPropertyAndNotify( - DeviceConfig.NAMESPACE_DISPLAY_MANAGER, KEY_REFRESH_RATE_IN_ZONE, - String.valueOf(fps)); - } - - void setLowDisplayBrightnessThresholds(int[] brightnessThresholds) { - String thresholds = toPropertyValue(brightnessThresholds); - - if (DEBUG) { - Slog.e(TAG, "Brightness Thresholds = " + thresholds); - } - - putPropertyAndNotify( - DeviceConfig.NAMESPACE_DISPLAY_MANAGER, - KEY_PEAK_REFRESH_RATE_DISPLAY_BRIGHTNESS_THRESHOLDS, - thresholds); - } - - void setLowAmbientBrightnessThresholds(int[] ambientThresholds) { - String thresholds = toPropertyValue(ambientThresholds); - - if (DEBUG) { - Slog.e(TAG, "Ambient Thresholds = " + thresholds); - } - - putPropertyAndNotify( - DeviceConfig.NAMESPACE_DISPLAY_MANAGER, - KEY_PEAK_REFRESH_RATE_AMBIENT_BRIGHTNESS_THRESHOLDS, - thresholds); - } - - @NonNull - private static String toPropertyValue(@NonNull int[] intArray) { - return Arrays.stream(intArray) - .mapToObj(Integer::toString) - .collect(Collectors.joining(",")); - } - } - - private void setBrightness(int brightness) { - Settings.System.putInt(mContext.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, - brightness); - mInjector.notifyBrightnessChanged(); - waitForIdleSync(); - } - - private void setPeakRefreshRate(float fps) { - Settings.System.putFloat(mContext.getContentResolver(), Settings.System.PEAK_REFRESH_RATE, - fps); - mInjector.notifyPeakRefreshRateChanged(); - waitForIdleSync(); - } - - private static SensorManager createMockSensorManager(Sensor... sensors) { - SensorManager sensorManager = Mockito.mock(SensorManager.class); - when(sensorManager.getSensorList(anyInt())).then((invocation) -> { - List requestedSensors = new ArrayList<>(); - int type = invocation.getArgument(0); - for (Sensor sensor : sensors) { - if (sensor.getType() == type || type == Sensor.TYPE_ALL) { - requestedSensors.add(sensor); - } - } - return requestedSensors; - }); - - when(sensorManager.getDefaultSensor(anyInt())).then((invocation) -> { - int type = invocation.getArgument(0); - for (Sensor sensor : sensors) { - if (sensor.getType() == type) { - return sensor; - } - } - return null; - }); - return sensorManager; - } - - private static Sensor createLightSensor() { - try { - return TestUtils.createSensor(Sensor.TYPE_LIGHT, Sensor.STRING_TYPE_LIGHT); - } catch (Exception e) { - // There's nothing we can do if this fails, just throw a RuntimeException so that we - // don't have to mark every function that might call this as throwing Exception - throw new RuntimeException("Failed to create a light sensor", e); - } - } - - private void waitForIdleSync() { - mHandler.runWithScissors(() -> { }, 500 /*timeout*/); - } - - static class FakesInjector implements DisplayModeDirector.Injector { - private final FakeDeviceConfig mDeviceConfig; - private ContentObserver mBrightnessObserver; - private ContentObserver mPeakRefreshRateObserver; - - FakesInjector() { - mDeviceConfig = new FakeDeviceConfig(); - } - - @NonNull - public FakeDeviceConfig getDeviceConfig() { - return mDeviceConfig; - } - - @Override - public void registerBrightnessObserver(@NonNull ContentResolver cr, - @NonNull ContentObserver observer) { - if (mBrightnessObserver != null) { - throw new IllegalStateException("Tried to register a second brightness observer"); - } - mBrightnessObserver = observer; - } - - @Override - public void unregisterBrightnessObserver(@NonNull ContentResolver cr, - @NonNull ContentObserver observer) { - mBrightnessObserver = null; - } - - void notifyBrightnessChanged() { - if (mBrightnessObserver != null) { - mBrightnessObserver.dispatchChange(false /*selfChange*/, DISPLAY_BRIGHTNESS_URI); - } - } - - @Override - public void registerPeakRefreshRateObserver(@NonNull ContentResolver cr, - @NonNull ContentObserver observer) { - mPeakRefreshRateObserver = observer; - } - - void notifyPeakRefreshRateChanged() { - if (mPeakRefreshRateObserver != null) { - mPeakRefreshRateObserver.dispatchChange(false /*selfChange*/, - PEAK_REFRESH_RATE_URI); - } - } - - @Override - public boolean isDeviceInteractive(@NonNull Context context) { - return true; - } - } } diff --git a/services/tests/wmtests/src/com/android/server/wm/HighRefreshRateBlacklistTest.java b/services/tests/wmtests/src/com/android/server/wm/HighRefreshRateBlacklistTest.java index a85e1db32ce51..56cb447e65b0b 100644 --- a/services/tests/wmtests/src/com/android/server/wm/HighRefreshRateBlacklistTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/HighRefreshRateBlacklistTest.java @@ -31,7 +31,7 @@ import androidx.test.filters.SmallTest; import com.android.internal.R; import com.android.internal.util.Preconditions; -import com.android.server.testutils.FakeDeviceConfigInterface; +import com.android.server.wm.utils.FakeDeviceConfigInterface; import org.junit.After; import org.junit.Test; diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowManagerConstantsTest.java b/services/tests/wmtests/src/com/android/server/wm/WindowManagerConstantsTest.java index 7a0ef0d7d7a98..52100116df531 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowManagerConstantsTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowManagerConstantsTest.java @@ -32,7 +32,7 @@ import android.platform.test.annotations.Presubmit; import androidx.test.filters.SmallTest; -import com.android.server.testutils.FakeDeviceConfigInterface; +import com.android.server.wm.utils.FakeDeviceConfigInterface; import org.junit.After; import org.junit.Before; diff --git a/services/tests/servicestests/utils/com/android/server/testutils/FakeDeviceConfigInterface.java b/services/tests/wmtests/src/com/android/server/wm/utils/FakeDeviceConfigInterface.java similarity index 92% rename from services/tests/servicestests/utils/com/android/server/testutils/FakeDeviceConfigInterface.java rename to services/tests/wmtests/src/com/android/server/wm/utils/FakeDeviceConfigInterface.java index a67f64596ef51..2904a5b736463 100644 --- a/services/tests/servicestests/utils/com/android/server/testutils/FakeDeviceConfigInterface.java +++ b/services/tests/wmtests/src/com/android/server/wm/utils/FakeDeviceConfigInterface.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.server.testutils; +package com.android.server.wm.utils; import android.annotation.NonNull; import android.provider.DeviceConfig; @@ -22,7 +22,6 @@ import android.util.ArrayMap; import android.util.Pair; import com.android.internal.util.Preconditions; -import com.android.server.utils.DeviceConfigInterface; import java.lang.reflect.Constructor; import java.util.HashMap; @@ -122,19 +121,6 @@ public class FakeDeviceConfigInterface implements DeviceConfigInterface { } } - @Override - public float getFloat(String namespace, String name, float defaultValue) { - String value = getProperty(namespace, name); - if (value == null) { - return defaultValue; - } - try { - return Float.parseFloat(value); - } catch (NumberFormatException e) { - return defaultValue; - } - } - @Override public boolean getBoolean(String namespace, String name, boolean defaultValue) { String value = getProperty(namespace, name); From 7c963eaa6e45802bf87e345e64f757403645d588 Mon Sep 17 00:00:00 2001 From: Heemin Seog Date: Tue, 12 Jan 2021 15:35:13 -0800 Subject: [PATCH 053/288] DO NOT MERGE Remove floating cards launcher Bug: 177364704 Test: none Change-Id: I8f19d7d58ee78b64d93de265739a7a880b6a52df --- data/etc/car/Android.bp | 7 ------ .../com.android.car.floatingcardslauncher.xml | 25 ------------------- 2 files changed, 32 deletions(-) delete mode 100644 data/etc/car/com.android.car.floatingcardslauncher.xml diff --git a/data/etc/car/Android.bp b/data/etc/car/Android.bp index 5010c537a66e6..70c3be61009c6 100644 --- a/data/etc/car/Android.bp +++ b/data/etc/car/Android.bp @@ -150,13 +150,6 @@ prebuilt_etc { system_ext_specific: true, } -prebuilt_etc { - name: "privapp_whitelist_com.android.car.floatingcardslauncher", - sub_dir: "permissions", - src: "com.android.car.floatingcardslauncher.xml", - filename_from_src: true, -} - prebuilt_etc { name: "privapp_allowlist_com.google.android.car.networking.preferenceupdater", sub_dir: "permissions", diff --git a/data/etc/car/com.android.car.floatingcardslauncher.xml b/data/etc/car/com.android.car.floatingcardslauncher.xml deleted file mode 100644 index 2755fee4eb557..0000000000000 --- a/data/etc/car/com.android.car.floatingcardslauncher.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - From d26253e6f5df806c7cf328d294f86617eb35cd1f Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 14 Jan 2021 15:48:56 -0800 Subject: [PATCH 054/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I26837872bece6c11b9f8b302919edbffa3d4441e --- packages/SettingsLib/res/values-kk/strings.xml | 2 +- packages/SettingsLib/res/values-mr/strings.xml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml index 32d8091dd01c8..991d936ac8012 100644 --- a/packages/SettingsLib/res/values-kk/strings.xml +++ b/packages/SettingsLib/res/values-kk/strings.xml @@ -359,7 +359,7 @@ "GPU жөндеу қабаттарын қосу" "GPU жөндеу қабаттарының жүктелуіне рұқсат ету" "Жеткізушілерді журналға тіркеу" - "Қате туралы есепте қызмет көрсетушінің құрылғыға қатысты қосымша ақпаратын қамту. Мұнда жеке ақпарат көрсетілуі, батарея шығыны артуы және/немесе қосымша жад пайдаланылуы мүмкін." + "Қате туралы есепте жеткізушінің құрылғыға қатысты қосымша ақпараты қамтылады. Мұнда жеке ақпарат көрсетілуі, батарея шығыны артуы және/немесе қосымша жад пайдаланылуы мүмкін." "Терезе анимациясының өлшемі" "Ауысу анимациясының өлшемі" "Аниматор ұзақтығы" diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml index c473a60adde29..4a8a6b241831c 100644 --- a/packages/SettingsLib/res/values-mr/strings.xml +++ b/packages/SettingsLib/res/values-mr/strings.xml @@ -168,7 +168,7 @@ "उच्चार संश्लेषणाचे एक छोटेसे प्रात्यक्षिक प्ले करा" "व्हॉइस डेटा इंस्टॉल करा" "उच्चार संश्लेषणासाठी आवश्यक आवाज डेटा इंस्टॉल करा" - "हे उच्चार संश्लेषण इंजिन पासवर्ड आणि क्रेडिट कार्ड नंबर यासारख्या वैयक्तिक मजकुरासह, बोलला जाणारा सर्व मजकूर संकलित करण्यात सक्षम होऊ शकते. हे %s इंजिनवरून येते. या उच्चार संश्लेषण इंजिनचा वापर सक्षम करायचा?" + "हे उच्चार संश्लेषण इंजीन पासवर्ड आणि क्रेडिट कार्ड नंबर यासारख्या वैयक्तिक मजकुरासह, बोलला जाणारा सर्व मजकूर संकलित करण्यात सक्षम होऊ शकते. हे %s इंजीनवरून येते. या उच्चार संश्लेषण इंजीनचा वापर सक्षम करायचा?" "या भाषेस टेक्‍स्‍ट टू स्‍पीचसाठी एका नेटवर्क कनेक्शनची आवश्यकता आहे." "हे उच्चार संश्लेषणाचे एक उदाहरण आहे" "डीफॉल्ट भाषा स्थिती" @@ -177,8 +177,8 @@ "%1$s समर्थित नाही" "तपासत आहे..." "%s साठी सेटिंग्ज" - "इंजिन सेटिंग्ज लाँच करा" - "प्राधान्य इंजिन" + "इंजीन सेटिंग्ज लाँच करा" + "प्राधान्य इंजीन" "सामान्य" "उच्चार पिच रीसेट करा" "डीफॉल्टवर मजकूर ज्या पिचवर बोलला जातो तो रीसेट करा." From d96bcfcdf2f8e9dffaec3a7f12dcee8ea831a99d Mon Sep 17 00:00:00 2001 From: Joanne Chung Date: Wed, 30 Dec 2020 19:25:39 +0800 Subject: [PATCH 055/288] Get ApplicationInfo using usr id Use ApplicationInfoAsUser() to get the application information by user id to make sure we have correct permission, othewise we will get the SecurityException due to lack of INTERACT_ACROSS_USERS. Bug: 176313819 Test: atest CtsVoiceRecognitionTestCases Test: manual. 1.create profile user 2.Install sample recognizer app 3.Function works fine and no security exception occurred after apply the change Change-Id: I6958dbf661373606fb9dba55e386aaea4399a146 Merged-In: Iaf485537b8082d2109d2134ff987dc7244e31218 --- core/java/android/app/AppOpsManager.java | 12 ++++++------ .../java/com/android/server/appop/AppOpsService.java | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index c494781d1eeb8..7bfc4603f060b 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -7623,8 +7623,8 @@ public class AppOpsManager { } else if (collectionMode == COLLECT_SYNC // Only collect app-ops when the proxy is trusted && (mContext.checkPermission(Manifest.permission.UPDATE_APP_OPS_STATS, -1, - myUid) == PackageManager.PERMISSION_GRANTED - || isTrustedVoiceServiceProxy(mContext, mContext.getOpPackageName(), op))) { + myUid) == PackageManager.PERMISSION_GRANTED || isTrustedVoiceServiceProxy( + mContext, mContext.getOpPackageName(), op, mContext.getUserId()))) { collectNotedOpSync(op, proxiedAttributionTag); } } @@ -7642,7 +7642,7 @@ public class AppOpsManager { * @hide */ public static boolean isTrustedVoiceServiceProxy(Context context, String packageName, - int code) { + int code, int userId) { // This is a workaround for R QPR, new API change is not allowed. We only allow the current // voice recognizer is also the voice interactor to noteproxy op. if (code != OP_RECORD_AUDIO) { @@ -7654,7 +7654,7 @@ public class AppOpsManager { final String voiceRecognitionServicePackageName = getComponentPackageNameFromString(voiceRecognitionComponent); return (Objects.equals(packageName, voiceRecognitionServicePackageName)) - && isPackagePreInstalled(context, packageName); + && isPackagePreInstalled(context, packageName, userId); } private static String getComponentPackageNameFromString(String from) { @@ -7662,10 +7662,10 @@ public class AppOpsManager { return componentName != null ? componentName.getPackageName() : ""; } - private static boolean isPackagePreInstalled(Context context, String packageName) { + private static boolean isPackagePreInstalled(Context context, String packageName, int userId) { try { final PackageManager pm = context.getPackageManager(); - final ApplicationInfo info = pm.getApplicationInfo(packageName, 0); + final ApplicationInfo info = pm.getApplicationInfoAsUser(packageName, 0, userId); return ((info.flags & ApplicationInfo.FLAG_SYSTEM) != 0); } catch (PackageManager.NameNotFoundException e) { return false; diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java index 4e194e2e495aa..902b2e2228f88 100644 --- a/services/core/java/com/android/server/appop/AppOpsService.java +++ b/services/core/java/com/android/server/appop/AppOpsService.java @@ -3014,8 +3014,8 @@ public class AppOpsService extends IAppOpsService.Stub { // This is a workaround for R QPR, new API change is not allowed. We only allow the current // voice recognizer is also the voice interactor to noteproxy op. - final boolean isTrustVoiceServiceProxy = - AppOpsManager.isTrustedVoiceServiceProxy(mContext, proxyPackageName, code); + final boolean isTrustVoiceServiceProxy = AppOpsManager.isTrustedVoiceServiceProxy(mContext, + proxyPackageName, code, UserHandle.getUserId(proxyUid)); final boolean isSelfBlame = Binder.getCallingUid() == proxiedUid; final boolean isProxyTrusted = mContext.checkPermission( Manifest.permission.UPDATE_APP_OPS_STATS, -1, proxyUid) From c45278479f5c84b84606a6040d2a8ad03f57e0f7 Mon Sep 17 00:00:00 2001 From: Heemin Seog Date: Tue, 12 Jan 2021 15:35:13 -0800 Subject: [PATCH 056/288] DO NOT MERGE Remove floating cards launcher Bug: 177364704 Test: none Change-Id: I8f19d7d58ee78b64d93de265739a7a880b6a52df Merged-In: I8f19d7d58ee78b64d93de265739a7a880b6a52df --- data/etc/car/Android.bp | 7 ------ .../com.android.car.floatingcardslauncher.xml | 25 ------------------- 2 files changed, 32 deletions(-) delete mode 100644 data/etc/car/com.android.car.floatingcardslauncher.xml diff --git a/data/etc/car/Android.bp b/data/etc/car/Android.bp index 3c990abaec871..d6df64f3295db 100644 --- a/data/etc/car/Android.bp +++ b/data/etc/car/Android.bp @@ -150,13 +150,6 @@ prebuilt_etc { system_ext_specific: true, } -prebuilt_etc { - name: "privapp_whitelist_com.android.car.floatingcardslauncher", - sub_dir: "permissions", - src: "com.android.car.floatingcardslauncher.xml", - filename_from_src: true, -} - prebuilt_etc { name: "privapp_whitelist_com.android.car.ui.paintbooth", sub_dir: "permissions", diff --git a/data/etc/car/com.android.car.floatingcardslauncher.xml b/data/etc/car/com.android.car.floatingcardslauncher.xml deleted file mode 100644 index 2755fee4eb557..0000000000000 --- a/data/etc/car/com.android.car.floatingcardslauncher.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - From c0f0e1b235828c88ab945ea159d32352ff613c58 Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Thu, 14 Jan 2021 18:09:32 +0800 Subject: [PATCH 057/288] Do not abort launch logger by invisible drawn activity For a special complex case: A no-display trampoline activity launches main activity in the same task (no starting window), and then the main activity launches trampoline and main again consecutively. If the drawn event of main is reported before the 2nd launch of main, the launch event log will be canceled by seeing the drawn state before transition. Because there will be a transition to commit window visibility, the case can be addressed by allowing invisible drawn activity as a valid launch event. Then the launch time can be reported when notifying transition starting. Bug: 176687862 Test: ActivityMetricsLaunchObserverTests#testActivityDrawnBeforeTransition Change-Id: I81ec1695038216490537bdac6defcd9e6d75e1f8 Merged-In: I81ec1695038216490537bdac6defcd9e6d75e1f8 (cherry picked from commit dc21a33a80fedffe332e1347bde8c1933dd4f4c2) --- .../android/server/wm/ActivityMetricsLogger.java | 4 ++-- .../wm/ActivityMetricsLaunchObserverTests.java | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/wm/ActivityMetricsLogger.java b/services/core/java/com/android/server/wm/ActivityMetricsLogger.java index 8f59eef495167..eec2e41eb5db5 100644 --- a/services/core/java/com/android/server/wm/ActivityMetricsLogger.java +++ b/services/core/java/com/android/server/wm/ActivityMetricsLogger.java @@ -264,7 +264,7 @@ class ActivityMetricsLogger { return; } mLastLaunchedActivity = r; - if (!r.noDisplay) { + if (!r.noDisplay && !r.mDrawn) { if (DEBUG_METRICS) Slog.i(TAG, "Add pending draw " + r); mPendingDrawActivities.add(r); } @@ -546,7 +546,7 @@ class ActivityMetricsLogger { + " processSwitch=" + processSwitch + " info=" + info); } - if (launchedActivity.mDrawn) { + if (launchedActivity.mDrawn && launchedActivity.isVisible()) { // Launched activity is already visible. We cannot measure windows drawn delay. abort(info, "launched activity already visible"); return; diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java index 5b516a9de350d..53a6d3ff599fc 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java @@ -311,6 +311,22 @@ public class ActivityMetricsLaunchObserverTests extends ActivityTestsBase { verifyNoMoreInteractions(mLaunchObserver); } + @Test + public void testActivityDrawnBeforeTransition() { + mTopActivity.setVisible(false); + notifyActivityLaunching(mTopActivity.intent); + // Assume the activity is launched the second time consecutively. The drawn event is from + // the first time (omitted in test) launch that is earlier than transition. + mTopActivity.mDrawn = true; + notifyWindowsDrawn(mTopActivity); + notifyActivityLaunched(START_SUCCESS, mTopActivity); + // If the launching activity was drawn when starting transition, the launch event should + // be reported successfully. + notifyTransitionStarting(mTopActivity); + + verifyOnActivityLaunchFinished(mTopActivity); + } + @Test public void testActivityRecordProtoIsNotTooBig() { // The ActivityRecordProto must not be too big, otherwise converting it at runtime From 2268cafb1c6dc6c3a3478366a68d9f6f7d3e830d Mon Sep 17 00:00:00 2001 From: Jordan Liu Date: Mon, 11 Jan 2021 11:54:18 -0800 Subject: [PATCH 058/288] Allow CBR when device owners is set up Bug: 169758206 Test: manual Change-Id: I98ac9eecd8a497541d9ce0761920db1252eb72e0 Merged-In: I98ac9eecd8a497541d9ce0761920db1252eb72e0 --- core/res/res/values/required_apps_managed_device.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/core/res/res/values/required_apps_managed_device.xml b/core/res/res/values/required_apps_managed_device.xml index 40db9dfbcd2c6..4c5cd6861601e 100644 --- a/core/res/res/values/required_apps_managed_device.xml +++ b/core/res/res/values/required_apps_managed_device.xml @@ -27,5 +27,6 @@ com.android.providers.downloads com.android.providers.downloads.ui com.android.documentsui + com.android.cellbroadcastreceiver From 5d0e3a340448c350f6919378787f912adf039673 Mon Sep 17 00:00:00 2001 From: Jack Yu Date: Fri, 15 Jan 2021 10:19:38 -0800 Subject: [PATCH 059/288] Temporary fix to prevent TEMPORARILY_NOT_METERED leak Currently we are seeing TEMPORARILY_NOT_METERED occurs on non-5G devices. This fix adds more checks to prevent incorrect TEMPORARILY_NOT_METERED being set. Before we root cause the issue, we only allow this bit when all of the following conditions met. 1. Devices should support 5G. 2. Carriers should support 5G unmetered data. 3. Device should camp on 5G network. This temporary fix should be removed after we root cause the issue. Bug: 176119724 Test: Manual Merged-In: I2b987d24851cdb16d8457b0ec5c546ace5485ed0 Change-Id: I2b987d24851cdb16d8457b0ec5c546ace5485ed0 --- .../java/android/telephony/CarrierConfigManager.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index 757939df0134b..6f10af1940a2c 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -3928,6 +3928,13 @@ public class CarrierConfigManager { public static final String KEY_USE_LOWER_MTU_VALUE_IF_BOTH_RECEIVED = "use_lower_mtu_value_if_both_received"; + /** + * Indicates temporarily unmetered mobile data is supported by the carrier. + * @hide + */ + public static final String KEY_NETWORK_TEMP_NOT_METERED_SUPPORTED_BOOL = + "network_temp_not_metered_supported_bool"; + /** The default value for every variable. */ private final static PersistableBundle sDefaults; @@ -4466,6 +4473,7 @@ public class CarrierConfigManager { sDefaults.putBoolean(KEY_DISABLE_DUN_APN_WHILE_ROAMING_WITH_PRESET_APN_BOOL, false); sDefaults.putString(KEY_DEFAULT_PREFERRED_APN_NAME_STRING, ""); sDefaults.putBoolean(KEY_USE_LOWER_MTU_VALUE_IF_BOTH_RECEIVED, false); + sDefaults.putBoolean(KEY_NETWORK_TEMP_NOT_METERED_SUPPORTED_BOOL, false); } /** From 53251a491faab1fb88e28b7cafe5913842b8d71d Mon Sep 17 00:00:00 2001 From: Muhammad Qureshi Date: Fri, 15 Jan 2021 12:58:50 -0800 Subject: [PATCH 060/288] [RESTRICT AUTOMERGE] Fix potential out of bounds writes in LogEvent. mUidFieldIndex, mExclusiveStateFieldIndex, mAttributionChain{Start|End}Index are stored using int8_t. These values can overflow when mValues.size() exceeds INT8_MAX. Add proper bounds checking to ensure these values don't exceed INT8_MAX. Bug: 174488848 Bug: 174485572 Test: m Test: statsd_test Test: TreeHugger Change-Id: I416e2de06ca2935017e15d4e91000652831e6b6c --- cmds/statsd/src/logd/LogEvent.cpp | 27 ++++++- cmds/statsd/tests/LogEvent_test.cpp | 110 ++++++++++++++++++++++++++++ 2 files changed, 133 insertions(+), 4 deletions(-) diff --git a/cmds/statsd/src/logd/LogEvent.cpp b/cmds/statsd/src/logd/LogEvent.cpp index f56fa6221bc99..4f031724763f9 100644 --- a/cmds/statsd/src/logd/LogEvent.cpp +++ b/cmds/statsd/src/logd/LogEvent.cpp @@ -19,6 +19,7 @@ #include #include +#include #include #include "annotations.h" @@ -216,13 +217,18 @@ void LogEvent::parseAttributionChain(int32_t* pos, int32_t depth, bool* last, last[2] = true; parseString(pos, /*depth=*/2, last, /*numAnnotations=*/0); } - // Check if at least one node was successfully parsed. - if (mValues.size() - 1 > firstUidInChainIndex) { + + if (mValues.size() - 1 > INT8_MAX) { + mValid = false; + } else if (mValues.size() - 1 > firstUidInChainIndex) { + // At least one node was successfully parsed. mAttributionChainStartIndex = static_cast(firstUidInChainIndex); mAttributionChainEndIndex = static_cast(mValues.size() - 1); } - parseAnnotations(numAnnotations, firstUidInChainIndex); + if (mValid) { + parseAnnotations(numAnnotations, firstUidInChainIndex); + } pos[1] = pos[2] = 1; last[1] = last[2] = false; @@ -234,7 +240,8 @@ bool LogEvent::checkPreviousValueType(Type expected) { } void LogEvent::parseIsUidAnnotation(uint8_t annotationType) { - if (mValues.empty() || !checkPreviousValueType(INT) || annotationType != BOOL_TYPE) { + if (mValues.empty() || mValues.size() - 1 > INT8_MAX || !checkPreviousValueType(INT) + || annotationType != BOOL_TYPE) { mValid = false; return; } @@ -270,6 +277,12 @@ void LogEvent::parsePrimaryFieldFirstUidAnnotation(uint8_t annotationType, return; } + if (static_cast(mValues.size() - 1) < firstUidInChainIndex) { // AttributionChain is empty. + mValid = false; + android_errorWriteLog(0x534e4554, "174485572"); + return; + } + const bool primaryField = readNextValue(); mValues[firstUidInChainIndex].mAnnotations.setPrimaryField(primaryField); } @@ -280,6 +293,12 @@ void LogEvent::parseExclusiveStateAnnotation(uint8_t annotationType) { return; } + if (mValues.size() - 1 > INT8_MAX) { + android_errorWriteLog(0x534e4554, "174488848"); + mValid = false; + return; + } + const bool exclusiveState = readNextValue(); mExclusiveStateFieldIndex = static_cast(mValues.size() - 1); mValues[getExclusiveStateFieldIndex()].mAnnotations.setExclusiveState(exclusiveState); diff --git a/cmds/statsd/tests/LogEvent_test.cpp b/cmds/statsd/tests/LogEvent_test.cpp index 5c170c07eb7d9..aed25475da113 100644 --- a/cmds/statsd/tests/LogEvent_test.cpp +++ b/cmds/statsd/tests/LogEvent_test.cpp @@ -363,6 +363,116 @@ TEST(LogEventTest, TestResetStateAnnotation) { EXPECT_EQ(event.getResetState(), resetState); } +TEST(LogEventTest, TestExclusiveStateAnnotationAfterTooManyFields) { + AStatsEvent* event = AStatsEvent_obtain(); + AStatsEvent_setAtomId(event, 100); + + const unsigned int numAttributionNodes = 64; + + uint32_t uids[numAttributionNodes]; + const char* tags[numAttributionNodes]; + + for (unsigned int i = 1; i <= numAttributionNodes; i++) { + uids[i-1] = i; + tags[i-1] = std::to_string(i).c_str(); + } + + AStatsEvent_writeAttributionChain(event, uids, tags, numAttributionNodes); + AStatsEvent_writeInt32(event, 1); + AStatsEvent_addBoolAnnotation(event, ANNOTATION_ID_EXCLUSIVE_STATE, true); + + AStatsEvent_build(event); + + size_t size; + uint8_t* buf = AStatsEvent_getBuffer(event, &size); + + LogEvent logEvent(/*uid=*/1000, /*pid=*/1001); + EXPECT_FALSE(logEvent.parseBuffer(buf, size)); + EXPECT_EQ(-1, logEvent.getExclusiveStateFieldIndex()); + + AStatsEvent_release(event); +} + +TEST(LogEventTest, TestUidAnnotationAfterTooManyFields) { + AStatsEvent* event = AStatsEvent_obtain(); + AStatsEvent_setAtomId(event, 100); + + const unsigned int numAttributionNodes = 64; + + uint32_t uids[numAttributionNodes]; + const char* tags[numAttributionNodes]; + + for (unsigned int i = 1; i <= numAttributionNodes; i++) { + uids[i-1] = i; + tags[i-1] = std::to_string(i).c_str(); + } + + AStatsEvent_writeAttributionChain(event, uids, tags, numAttributionNodes); + AStatsEvent_writeInt32(event, 1); + AStatsEvent_addBoolAnnotation(event, ANNOTATION_ID_IS_UID, true); + + AStatsEvent_build(event); + + size_t size; + uint8_t* buf = AStatsEvent_getBuffer(event, &size); + + LogEvent logEvent(/*uid=*/1000, /*pid=*/1001); + EXPECT_FALSE(logEvent.parseBuffer(buf, size)); + EXPECT_EQ(-1, logEvent.getUidFieldIndex()); + + AStatsEvent_release(event); +} + +TEST(LogEventTest, TestAttributionChainEndIndexAfterTooManyFields) { + AStatsEvent* event = AStatsEvent_obtain(); + AStatsEvent_setAtomId(event, 100); + + const unsigned int numAttributionNodes = 65; + + uint32_t uids[numAttributionNodes]; + const char* tags[numAttributionNodes]; + + for (unsigned int i = 1; i <= numAttributionNodes; i++) { + uids[i-1] = i; + tags[i-1] = std::to_string(i).c_str(); + } + + AStatsEvent_writeAttributionChain(event, uids, tags, numAttributionNodes); + + AStatsEvent_build(event); + + size_t size; + uint8_t* buf = AStatsEvent_getBuffer(event, &size); + + LogEvent logEvent(/*uid=*/1000, /*pid=*/1001); + EXPECT_FALSE(logEvent.parseBuffer(buf, size)); + EXPECT_FALSE(logEvent.hasAttributionChain()); + + AStatsEvent_release(event); +} + +TEST(LogEventTest, TestEmptyAttributionChainWithPrimaryFieldFirstUidAnnotation) { + AStatsEvent* event = AStatsEvent_obtain(); + AStatsEvent_setAtomId(event, 100); + + uint32_t uids[] = {}; + const char* tags[] = {}; + + AStatsEvent_writeInt32(event, 10); + AStatsEvent_writeAttributionChain(event, uids, tags, 0); + AStatsEvent_addBoolAnnotation(event, ANNOTATION_ID_PRIMARY_FIELD_FIRST_UID, true); + + AStatsEvent_build(event); + + size_t size; + uint8_t* buf = AStatsEvent_getBuffer(event, &size); + + LogEvent logEvent(/*uid=*/1000, /*pid=*/1001); + EXPECT_FALSE(logEvent.parseBuffer(buf, size)); + + AStatsEvent_release(event); +} + } // namespace statsd } // namespace os } // namespace android From e8212659b95b8a68ce32a82d8548d88aaeb4608a Mon Sep 17 00:00:00 2001 From: Yu-Han Yang Date: Fri, 15 Jan 2021 14:24:09 -0800 Subject: [PATCH 061/288] DO NOT MERGE: Do not inject mock location to chipset Bug: 177561690 Test: on device Change-Id: Icafbdf54fe807f8779377b13cb4e4eb265db692e --- .../android/server/location/gnss/GnssLocationProvider.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/services/core/java/com/android/server/location/gnss/GnssLocationProvider.java b/services/core/java/com/android/server/location/gnss/GnssLocationProvider.java index a6a607e4ce66f..8d1d3afab5c5f 100644 --- a/services/core/java/com/android/server/location/gnss/GnssLocationProvider.java +++ b/services/core/java/com/android/server/location/gnss/GnssLocationProvider.java @@ -841,6 +841,9 @@ public class GnssLocationProvider extends AbstractLocationProvider implements } private void injectBestLocation(Location location) { + if (location.isFromMockProvider()) { + return; + } if (DEBUG) { Log.d(TAG, "injectBestLocation: " + location); } @@ -942,6 +945,9 @@ public class GnssLocationProvider extends AbstractLocationProvider implements } private void injectLocation(Location location) { + if (location.isFromMockProvider()) { + return; + } if (location.hasAccuracy()) { if (DEBUG) { Log.d(TAG, "injectLocation: " + location); From c59cbd13f62586bf1eaeb75767859ed08f3adeb1 Mon Sep 17 00:00:00 2001 From: Yu-Han Yang Date: Fri, 15 Jan 2021 15:23:52 -0800 Subject: [PATCH 062/288] DO NOT MERGE: Do not inject mock location to chipset Bug: 177561690 Test: on device Change-Id: Icafbdf54fe807f8779377b13cb4e4eb265db692e --- .../com/android/server/location/GnssLocationProvider.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/services/core/java/com/android/server/location/GnssLocationProvider.java b/services/core/java/com/android/server/location/GnssLocationProvider.java index c312b76cc4634..184e53deb69bc 100644 --- a/services/core/java/com/android/server/location/GnssLocationProvider.java +++ b/services/core/java/com/android/server/location/GnssLocationProvider.java @@ -772,6 +772,9 @@ public class GnssLocationProvider extends AbstractLocationProvider implements } private void injectBestLocation(Location location) { + if (location.isFromMockProvider()) { + return; + } if (DEBUG) { Log.d(TAG, "injectBestLocation: " + location); } @@ -878,6 +881,9 @@ public class GnssLocationProvider extends AbstractLocationProvider implements } private void handleUpdateLocation(Location location) { + if (location.isFromMockProvider()) { + return; + } if (location.hasAccuracy()) { if (DEBUG) { Log.d(TAG, "injectLocation: " + location); From 20a39b541c6045837662a569e075eb0176bc16c2 Mon Sep 17 00:00:00 2001 From: jimsun Date: Fri, 15 Jan 2021 15:10:59 +0800 Subject: [PATCH 063/288] Add a new reason code for IMS call failed due to network congestion Bug: 175370724 Test: Simulate call end reason from vendor code and check IMS call end reason is correctly mapped. Change-Id: Iea0a5115548530350c5a2645cdf5487870943f72 --- telephony/java/android/telephony/ims/ImsReasonInfo.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/telephony/java/android/telephony/ims/ImsReasonInfo.java b/telephony/java/android/telephony/ims/ImsReasonInfo.java index 0d6b31d349e11..4cace2fecdf70 100644 --- a/telephony/java/android/telephony/ims/ImsReasonInfo.java +++ b/telephony/java/android/telephony/ims/ImsReasonInfo.java @@ -889,6 +889,13 @@ public final class ImsReasonInfo implements Parcelable { */ public static final int CODE_WFC_SERVICE_NOT_AVAILABLE_IN_THIS_LOCATION = 1623; + /** + * Call failed because of network congestion, resource is not available, + * or no circuit or channel available, etc. + * @hide + */ + public static final int CODE_NETWORK_CONGESTION = 1624; + /** * The dialed RTT call should be retried without RTT * @hide @@ -1075,6 +1082,7 @@ public final class ImsReasonInfo implements Parcelable { CODE_REJECT_VT_AVPF_NOT_ALLOWED, CODE_REJECT_ONGOING_ENCRYPTED_CALL, CODE_REJECT_ONGOING_CS_CALL, + CODE_NETWORK_CONGESTION, CODE_RETRY_ON_IMS_WITHOUT_RTT, CODE_OEM_CAUSE_1, CODE_OEM_CAUSE_2, From 0ecd3e13e7aa3dfbcd96564b9c3444152e3a1532 Mon Sep 17 00:00:00 2001 From: raylinhsu Date: Fri, 15 Jan 2021 02:43:59 +0800 Subject: [PATCH 064/288] DO NOT MERGE "Set fixed fps when ambient or display brightness is high" Force the display to stay at fixed fps when ambient and display brightness are high. Bug: 177636374 Test: atest DisplayModeDirectorTest Test: no fps transition in the blocking zone when the display state change Test: check if the lux will update when the display state change Change-Id: I7d8ed657544bd1423ca8b9afefc87e58530c44dc --- core/res/res/values/config.xml | 29 + core/res/res/values/symbols.xml | 5 + services/core/Android.bp | 7 + .../server/display/DisplayModeDirector.java | 577 +++++++++++++----- .../{wm => }/utils/DeviceConfigInterface.java | 13 +- .../server/wm/HighRefreshRateBlacklist.java | 2 +- .../server/wm/WindowManagerConstants.java | 2 +- .../server/wm/WindowManagerService.java | 2 +- services/tests/servicestests/Android.bp | 3 +- .../display/DisplayModeDirectorTest.java | 382 +++++++++++- .../testutils}/FakeDeviceConfigInterface.java | 16 +- .../wm/HighRefreshRateBlacklistTest.java | 2 +- .../server/wm/WindowManagerConstantsTest.java | 2 +- 13 files changed, 869 insertions(+), 173 deletions(-) rename services/core/java/com/android/server/{wm => }/utils/DeviceConfigInterface.java (90%) rename services/tests/{wmtests/src/com/android/server/wm/utils => servicestests/utils/com/android/server/testutils}/FakeDeviceConfigInterface.java (92%) diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 550601af0faa1..5f02eb6a6a37e 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -4138,6 +4138,35 @@ If non-positive, then the refresh rate is unchanged even if thresholds are configured. --> 0 + + + + + + + + + + + 0 + diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 06f357e79a621..b80e8e1cd9805 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -3783,6 +3783,11 @@ + + + + + diff --git a/services/core/Android.bp b/services/core/Android.bp index 4bba0d892f3b2..7585d6ba9c60f 100644 --- a/services/core/Android.bp +++ b/services/core/Android.bp @@ -1,3 +1,10 @@ +filegroup { + name: "services.core-sources-deviceconfig-interface", + srcs: [ + "java/com/android/server/utils/DeviceConfigInterface.java" + ], +} + filegroup { name: "services.core-sources", srcs: ["java/**/*.java"], diff --git a/services/core/java/com/android/server/display/DisplayModeDirector.java b/services/core/java/com/android/server/display/DisplayModeDirector.java index 3c050804f01d9..2a60839ab702a 100644 --- a/services/core/java/com/android/server/display/DisplayModeDirector.java +++ b/services/core/java/com/android/server/display/DisplayModeDirector.java @@ -46,8 +46,10 @@ import android.view.DisplayInfo; import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.os.BackgroundThread; +import com.android.internal.util.IndentingPrintWriter; import com.android.server.display.utils.AmbientFilter; import com.android.server.display.utils.AmbientFilterFactory; +import com.android.server.utils.DeviceConfigInterface; import java.io.PrintWriter; import java.util.ArrayList; @@ -64,9 +66,9 @@ public class DisplayModeDirector { private static final boolean DEBUG = false; private static final int MSG_REFRESH_RATE_RANGE_CHANGED = 1; - private static final int MSG_BRIGHTNESS_THRESHOLDS_CHANGED = 2; + private static final int MSG_LOW_BRIGHTNESS_THRESHOLDS_CHANGED = 2; private static final int MSG_DEFAULT_PEAK_REFRESH_RATE_CHANGED = 3; - private static final int MSG_REFRESH_RATE_IN_ZONE_CHANGED = 4; + private static final int MSG_REFRESH_RATE_IN_LOW_ZONE_CHANGED = 4; // Special ID used to indicate that given vote is to be applied globally, rather than to a // specific display. @@ -79,6 +81,13 @@ public class DisplayModeDirector { private final Context mContext; private final DisplayModeDirectorHandler mHandler; + private final Injector mInjector; + + private final AppRequestObserver mAppRequestObserver; + private final SettingsObserver mSettingsObserver; + private final DisplayObserver mDisplayObserver; + private final DeviceConfigInterface mDeviceConfig; + private final DeviceConfigDisplaySettings mDeviceConfigDisplaySettings; // A map from the display ID to the collection of votes and their priority. The latter takes // the form of another map from the priority to the vote itself so that each priority is @@ -89,17 +98,19 @@ public class DisplayModeDirector { // A map from the display ID to the default mode of that display. private SparseArray mDefaultModeByDisplay; - private final AppRequestObserver mAppRequestObserver; - private final SettingsObserver mSettingsObserver; - private final DisplayObserver mDisplayObserver; private BrightnessObserver mBrightnessObserver; - private final DeviceConfigDisplaySettings mDeviceConfigDisplaySettings; private DesiredDisplayModeSpecsListener mDesiredDisplayModeSpecsListener; public DisplayModeDirector(@NonNull Context context, @NonNull Handler handler) { + this(context, handler, new RealInjector()); + } + + public DisplayModeDirector(@NonNull Context context, @NonNull Handler handler, + @NonNull Injector injector) { mContext = context; mHandler = new DisplayModeDirectorHandler(handler.getLooper()); + mInjector = injector; mVotesByDisplay = new SparseArray<>(); mSupportedModesByDisplay = new SparseArray<>(); mDefaultModeByDisplay = new SparseArray<>(); @@ -108,6 +119,7 @@ public class DisplayModeDirector { mDisplayObserver = new DisplayObserver(context, handler); mBrightnessObserver = new BrightnessObserver(context, handler); mDeviceConfigDisplaySettings = new DeviceConfigDisplaySettings(); + mDeviceConfig = injector.getDeviceConfig(); } /** @@ -348,6 +360,23 @@ public class DisplayModeDirector { } } + /** + * Retrieve the Vote for the given display and priority. Intended only for testing purposes. + * + * @param displayId the display to query for + * @param priority the priority of the vote to return + * @return the vote corresponding to the given {@code displayId} and {@code priority}, + * or {@code null} if there isn't one + */ + @VisibleForTesting + @Nullable + Vote getVote(int displayId, int priority) { + synchronized (mLock) { + SparseArray votes = getVotesLocked(displayId); + return votes.get(priority); + } + } + /** * Print the object's state and debug information into the given stream. * @@ -465,6 +494,17 @@ public class DisplayModeDirector { mBrightnessObserver = brightnessObserver; } + @VisibleForTesting + BrightnessObserver getBrightnessObserver() { + return mBrightnessObserver; + } + + @VisibleForTesting + SettingsObserver getSettingsObserver() { + return mSettingsObserver; + } + + @VisibleForTesting DesiredDisplayModeSpecs getDesiredDisplayModeSpecsWithInjectedFpsSettings( float minRefreshRate, float peakRefreshRate, float defaultRefreshRate) { @@ -475,6 +515,13 @@ public class DisplayModeDirector { } } + @VisibleForTesting + void updateSettingForHighZone(int refreshRate, int[] brightnessThresholds, + int[] ambientThresholds) { + mBrightnessObserver.updateThresholdsRefreshRateForHighZone(refreshRate, + brightnessThresholds, ambientThresholds); + } + /** * Listens for changes refresh rate coordination. */ @@ -493,15 +540,10 @@ public class DisplayModeDirector { @Override public void handleMessage(Message msg) { switch (msg.what) { - case MSG_BRIGHTNESS_THRESHOLDS_CHANGED: + case MSG_LOW_BRIGHTNESS_THRESHOLDS_CHANGED: Pair thresholds = (Pair) msg.obj; - - if (thresholds != null) { - mBrightnessObserver.onDeviceConfigThresholdsChanged( - thresholds.first, thresholds.second); - } else { - mBrightnessObserver.onDeviceConfigThresholdsChanged(null, null); - } + mBrightnessObserver.onDeviceConfigLowBrightnessThresholdsChanged( + thresholds.first, thresholds.second); break; case MSG_DEFAULT_PEAK_REFRESH_RATE_CHANGED: @@ -510,9 +552,9 @@ public class DisplayModeDirector { defaultPeakRefreshRate); break; - case MSG_REFRESH_RATE_IN_ZONE_CHANGED: + case MSG_REFRESH_RATE_IN_LOW_ZONE_CHANGED: int refreshRateInZone = msg.arg1; - mBrightnessObserver.onDeviceConfigRefreshRateInZoneChanged( + mBrightnessObserver.onDeviceConfigRefreshRateInLowZoneChanged( refreshRateInZone); break; @@ -685,10 +727,11 @@ public class DisplayModeDirector { // by all other considerations. It acts to set a default frame rate for a device. public static final int PRIORITY_DEFAULT_REFRESH_RATE = 0; - // LOW_BRIGHTNESS votes for a single refresh rate like [60,60], [90,90] or null. + // FLICKER votes for a single refresh rate like [60,60], [90,90] or null. // If the higher voters result is a range, it will fix the rate to a single choice. - // It's used to avoid rate switch in certain conditions. - public static final int PRIORITY_LOW_BRIGHTNESS = 1; + // It's used to avoid refresh rate switches in certain conditions which may result in the + // user seeing the display flickering when the switches occur. + public static final int PRIORITY_FLICKER = 1; // SETTING_MIN_REFRESH_RATE is used to propose a lower bound of display refresh rate. // It votes [MIN_REFRESH_RATE, Float.POSITIVE_INFINITY] @@ -761,8 +804,8 @@ public class DisplayModeDirector { switch (priority) { case PRIORITY_DEFAULT_REFRESH_RATE: return "PRIORITY_DEFAULT_REFRESH_RATE"; - case PRIORITY_LOW_BRIGHTNESS: - return "PRIORITY_LOW_BRIGHTNESS"; + case PRIORITY_FLICKER: + return "PRIORITY_FLICKER"; case PRIORITY_USER_SETTING_MIN_REFRESH_RATE: return "PRIORITY_USER_SETTING_MIN_REFRESH_RATE"; case PRIORITY_APP_REQUEST_REFRESH_RATE: @@ -787,7 +830,8 @@ public class DisplayModeDirector { } } - private final class SettingsObserver extends ContentObserver { + @VisibleForTesting + final class SettingsObserver extends ContentObserver { private final Uri mPeakRefreshRateSetting = Settings.System.getUriFor(Settings.System.PEAK_REFRESH_RATE); private final Uri mMinRefreshRateSetting = @@ -810,8 +854,7 @@ public class DisplayModeDirector { public void observe() { final ContentResolver cr = mContext.getContentResolver(); - cr.registerContentObserver(mPeakRefreshRateSetting, false /*notifyDescendants*/, this, - UserHandle.USER_SYSTEM); + mInjector.registerPeakRefreshRateObserver(cr, this); cr.registerContentObserver(mMinRefreshRateSetting, false /*notifyDescendants*/, this, UserHandle.USER_SYSTEM); cr.registerContentObserver(mLowPowerModeSetting, false /*notifyDescendants*/, this, @@ -829,6 +872,13 @@ public class DisplayModeDirector { } } + public void setDefaultRefreshRate(float refreshRate) { + synchronized (mLock) { + mDefaultRefreshRate = refreshRate; + updateRefreshRateSettingLocked(); + } + } + public void onDeviceConfigDefaultPeakRefreshRateChanged(Float defaultPeakRefreshRate) { if (defaultPeakRefreshRate == null) { defaultPeakRefreshRate = (float) mContext.getResources().getInteger( @@ -1033,6 +1083,7 @@ public class DisplayModeDirector { @Override public void onDisplayChanged(int displayId) { updateDisplayModes(displayId); + // TODO: Break the coupling between DisplayObserver and BrightnessObserver. mBrightnessObserver.onDisplayChanged(displayId); } @@ -1071,15 +1122,16 @@ public class DisplayModeDirector { */ @VisibleForTesting public class BrightnessObserver extends ContentObserver { - // TODO: brightnessfloat: change this to the float setting - private final Uri mDisplayBrightnessSetting = - Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS); private final static int LIGHT_SENSOR_RATE_MS = 250; - private int[] mDisplayBrightnessThresholds; - private int[] mAmbientBrightnessThresholds; + private int[] mLowDisplayBrightnessThresholds; + private int[] mLowAmbientBrightnessThresholds; + private int[] mHighDisplayBrightnessThresholds; + private int[] mHighAmbientBrightnessThresholds; // valid threshold if any item from the array >= 0 - private boolean mShouldObserveDisplayChange; - private boolean mShouldObserveAmbientChange; + private boolean mShouldObserveDisplayLowChange; + private boolean mShouldObserveAmbientLowChange; + private boolean mShouldObserveDisplayHighChange; + private boolean mShouldObserveAmbientHighChange; private SensorManager mSensorManager; private Sensor mLightSensor; @@ -1087,46 +1139,114 @@ public class DisplayModeDirector { // Take it as low brightness before valid sensor data comes private float mAmbientLux = -1.0f; private AmbientFilter mAmbientFilter; + private int mBrightness = -1; private final Context mContext; - // Enable light sensor only when mShouldObserveAmbientChange is true, screen is on, peak - // refresh rate changeable and low power mode off. After initialization, these states will + // Enable light sensor only when mShouldObserveAmbientLowChange is true or + // mShouldObserveAmbientHighChange is true, screen is on, peak refresh rate + // changeable and low power mode off. After initialization, these states will // be updated from the same handler thread. - private boolean mScreenOn = false; + private boolean mDefaultDisplayOn = false; private boolean mRefreshRateChangeable = false; private boolean mLowPowerModeEnabled = false; - private int mRefreshRateInZone; + private int mRefreshRateInLowZone; + private int mRefreshRateInHighZone; BrightnessObserver(Context context, Handler handler) { super(handler); mContext = context; - mDisplayBrightnessThresholds = context.getResources().getIntArray( + mLowDisplayBrightnessThresholds = context.getResources().getIntArray( R.array.config_brightnessThresholdsOfPeakRefreshRate); - mAmbientBrightnessThresholds = context.getResources().getIntArray( + mLowAmbientBrightnessThresholds = context.getResources().getIntArray( R.array.config_ambientThresholdsOfPeakRefreshRate); - if (mDisplayBrightnessThresholds.length != mAmbientBrightnessThresholds.length) { - throw new RuntimeException("display brightness threshold array and ambient " - + "brightness threshold array have different length"); + if (mLowDisplayBrightnessThresholds.length != mLowAmbientBrightnessThresholds.length) { + throw new RuntimeException("display low brightness threshold array and ambient " + + "brightness threshold array have different length: " + + "displayBrightnessThresholds=" + + Arrays.toString(mLowDisplayBrightnessThresholds) + + ", ambientBrightnessThresholds=" + + Arrays.toString(mLowAmbientBrightnessThresholds)); } + + mHighDisplayBrightnessThresholds = context.getResources().getIntArray( + R.array.config_highDisplayBrightnessThresholdsOfFixedRefreshRate); + mHighAmbientBrightnessThresholds = context.getResources().getIntArray( + R.array.config_highAmbientBrightnessThresholdsOfFixedRefreshRate); + if (mHighDisplayBrightnessThresholds.length + != mHighAmbientBrightnessThresholds.length) { + throw new RuntimeException("display high brightness threshold array and ambient " + + "brightness threshold array have different length: " + + "displayBrightnessThresholds=" + + Arrays.toString(mHighDisplayBrightnessThresholds) + + ", ambientBrightnessThresholds=" + + Arrays.toString(mHighAmbientBrightnessThresholds)); + } + mRefreshRateInHighZone = context.getResources().getInteger( + R.integer.config_fixedRefreshRateInHighZone); + } + + /** + * @return the refresh to lock to when in a low brightness zone + */ + @VisibleForTesting + int getRefreshRateInLowZone() { + return mRefreshRateInLowZone; + } + + /** + * @return the display brightness thresholds for the low brightness zones + */ + @VisibleForTesting + int[] getLowDisplayBrightnessThresholds() { + return mLowDisplayBrightnessThresholds; + } + + /** + * @return the ambient brightness thresholds for the low brightness zones + */ + @VisibleForTesting + int[] getLowAmbientBrightnessThresholds() { + return mLowAmbientBrightnessThresholds; + } + + public void registerLightSensor(SensorManager sensorManager, Sensor lightSensor) { + mSensorManager = sensorManager; + mLightSensor = lightSensor; + + mSensorManager.registerListener(mLightSensorListener, + mLightSensor, LIGHT_SENSOR_RATE_MS * 1000, mHandler); + } + + public void updateThresholdsRefreshRateForHighZone(int refreshRate, + int[] brightnessThresholds, int[] ambientThresholds) { + mRefreshRateInHighZone = refreshRate; + mHighDisplayBrightnessThresholds = brightnessThresholds; + mHighAmbientBrightnessThresholds = ambientThresholds; } public void observe(SensorManager sensorManager) { mSensorManager = sensorManager; + final ContentResolver cr = mContext.getContentResolver(); + mBrightness = Settings.System.getIntForUser(cr, + Settings.System.SCREEN_BRIGHTNESS, -1 /*default*/, cr.getUserId()); // DeviceConfig is accessible after system ready. - int[] brightnessThresholds = mDeviceConfigDisplaySettings.getBrightnessThresholds(); - int[] ambientThresholds = mDeviceConfigDisplaySettings.getAmbientThresholds(); + int[] lowDisplayBrightnessThresholds = + mDeviceConfigDisplaySettings.getLowDisplayBrightnessThresholds(); + int[] lowAmbientBrightnessThresholds = + mDeviceConfigDisplaySettings.getLowAmbientBrightnessThresholds(); - if (brightnessThresholds != null && ambientThresholds != null - && brightnessThresholds.length == ambientThresholds.length) { - mDisplayBrightnessThresholds = brightnessThresholds; - mAmbientBrightnessThresholds = ambientThresholds; + if (lowDisplayBrightnessThresholds != null && lowAmbientBrightnessThresholds != null + && lowDisplayBrightnessThresholds.length + == lowAmbientBrightnessThresholds.length) { + mLowDisplayBrightnessThresholds = lowDisplayBrightnessThresholds; + mLowAmbientBrightnessThresholds = lowAmbientBrightnessThresholds; } - mRefreshRateInZone = mDeviceConfigDisplaySettings.getRefreshRateInZone(); + mRefreshRateInLowZone = mDeviceConfigDisplaySettings.getRefreshRateInLowZone(); restartObserver(); mDeviceConfigDisplaySettings.startListening(); } @@ -1138,7 +1258,7 @@ public class DisplayModeDirector { updateSensorStatus(); if (!changeable) { // Revoke previous vote from BrightnessObserver - updateVoteLocked(Vote.PRIORITY_LOW_BRIGHTNESS, null); + updateVoteLocked(Vote.PRIORITY_FLICKER, null); } } } @@ -1150,25 +1270,25 @@ public class DisplayModeDirector { } } - public void onDeviceConfigThresholdsChanged(int[] brightnessThresholds, + public void onDeviceConfigLowBrightnessThresholdsChanged(int[] displayThresholds, int[] ambientThresholds) { - if (brightnessThresholds != null && ambientThresholds != null - && brightnessThresholds.length == ambientThresholds.length) { - mDisplayBrightnessThresholds = brightnessThresholds; - mAmbientBrightnessThresholds = ambientThresholds; + if (displayThresholds != null && ambientThresholds != null + && displayThresholds.length == ambientThresholds.length) { + mLowDisplayBrightnessThresholds = displayThresholds; + mLowAmbientBrightnessThresholds = ambientThresholds; } else { // Invalid or empty. Use device default. - mDisplayBrightnessThresholds = mContext.getResources().getIntArray( + mLowDisplayBrightnessThresholds = mContext.getResources().getIntArray( R.array.config_brightnessThresholdsOfPeakRefreshRate); - mAmbientBrightnessThresholds = mContext.getResources().getIntArray( + mLowAmbientBrightnessThresholds = mContext.getResources().getIntArray( R.array.config_ambientThresholdsOfPeakRefreshRate); } restartObserver(); } - public void onDeviceConfigRefreshRateInZoneChanged(int refreshRate) { - if (refreshRate != mRefreshRateInZone) { - mRefreshRateInZone = refreshRate; + public void onDeviceConfigRefreshRateInLowZoneChanged(int refreshRate) { + if (refreshRate != mRefreshRateInLowZone) { + mRefreshRateInLowZone = refreshRate; restartObserver(); } } @@ -1176,48 +1296,95 @@ public class DisplayModeDirector { public void dumpLocked(PrintWriter pw) { pw.println(" BrightnessObserver"); pw.println(" mAmbientLux: " + mAmbientLux); - pw.println(" mRefreshRateInZone: " + mRefreshRateInZone); + pw.println(" mBrightness: " + mBrightness); + pw.println(" mDefaultDisplayOn: " + mDefaultDisplayOn); + pw.println(" mLowPowerModeEnabled: " + mLowPowerModeEnabled); + pw.println(" mRefreshRateChangeable: " + mRefreshRateChangeable); + pw.println(" mShouldObserveDisplayLowChange: " + mShouldObserveDisplayLowChange); + pw.println(" mShouldObserveAmbientLowChange: " + mShouldObserveAmbientLowChange); + pw.println(" mRefreshRateInLowZone: " + mRefreshRateInLowZone); - for (int d: mDisplayBrightnessThresholds) { - pw.println(" mDisplayBrightnessThreshold: " + d); + for (int d : mLowDisplayBrightnessThresholds) { + pw.println(" mDisplayLowBrightnessThreshold: " + d); } - for (int d: mAmbientBrightnessThresholds) { - pw.println(" mAmbientBrightnessThreshold: " + d); + for (int d : mLowAmbientBrightnessThresholds) { + pw.println(" mAmbientLowBrightnessThreshold: " + d); + } + + pw.println(" mShouldObserveDisplayHighChange: " + mShouldObserveDisplayHighChange); + pw.println(" mShouldObserveAmbientHighChange: " + mShouldObserveAmbientHighChange); + pw.println(" mRefreshRateInHighZone: " + mRefreshRateInHighZone); + + for (int d : mHighDisplayBrightnessThresholds) { + pw.println(" mDisplayHighBrightnessThresholds: " + d); + } + + for (int d : mHighAmbientBrightnessThresholds) { + pw.println(" mAmbientHighBrightnessThresholds: " + d); } mLightSensorListener.dumpLocked(pw); + + if (mAmbientFilter != null) { + IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " "); + ipw.setIndent(" "); + mAmbientFilter.dump(ipw); + } } public void onDisplayChanged(int displayId) { if (displayId == Display.DEFAULT_DISPLAY) { - onScreenOn(isDefaultDisplayOn()); + updateDefaultDisplayState(); } } @Override public void onChange(boolean selfChange, Uri uri, int userId) { synchronized (mLock) { - onBrightnessChangedLocked(); + final ContentResolver cr = mContext.getContentResolver(); + int brightness = Settings.System.getIntForUser(cr, + Settings.System.SCREEN_BRIGHTNESS, -1 /*default*/, cr.getUserId()); + if (brightness != mBrightness) { + mBrightness = brightness; + onBrightnessChangedLocked(); + } } } private void restartObserver() { - mShouldObserveDisplayChange = checkShouldObserve(mDisplayBrightnessThresholds); - mShouldObserveAmbientChange = checkShouldObserve(mAmbientBrightnessThresholds); - final ContentResolver cr = mContext.getContentResolver(); - if (mShouldObserveDisplayChange) { - // Content Service does not check if an listener has already been registered. - // To ensure only one listener is registered, force an unregistration first. - cr.unregisterContentObserver(this); - cr.registerContentObserver(mDisplayBrightnessSetting, - false /*notifyDescendants*/, this, UserHandle.USER_SYSTEM); + + if (mRefreshRateInLowZone > 0) { + mShouldObserveDisplayLowChange = hasValidThreshold( + mLowDisplayBrightnessThresholds); + mShouldObserveAmbientLowChange = hasValidThreshold( + mLowAmbientBrightnessThresholds); } else { - cr.unregisterContentObserver(this); + mShouldObserveDisplayLowChange = false; + mShouldObserveAmbientLowChange = false; } - if (mShouldObserveAmbientChange) { + if (mRefreshRateInHighZone > 0) { + mShouldObserveDisplayHighChange = hasValidThreshold( + mHighDisplayBrightnessThresholds); + mShouldObserveAmbientHighChange = hasValidThreshold( + mHighAmbientBrightnessThresholds); + } else { + mShouldObserveDisplayHighChange = false; + mShouldObserveAmbientHighChange = false; + } + + if (mShouldObserveDisplayLowChange || mShouldObserveDisplayHighChange) { + // Content Service does not check if an listener has already been registered. + // To ensure only one listener is registered, force an unregistration first. + mInjector.unregisterBrightnessObserver(cr, this); + mInjector.registerBrightnessObserver(cr, this); + } else { + mInjector.unregisterBrightnessObserver(cr, this); + } + + if (mShouldObserveAmbientLowChange || mShouldObserveAmbientHighChange) { Resources resources = mContext.getResources(); String lightSensorType = resources.getString( com.android.internal.R.string.config_displayLightSensorType); @@ -1243,8 +1410,6 @@ public class DisplayModeDirector { mAmbientFilter = AmbientFilterFactory.createBrightnessFilter(TAG, res); mLightSensor = lightSensor; - - onScreenOn(isDefaultDisplayOn()); } } else { mAmbientFilter = null; @@ -1263,11 +1428,7 @@ public class DisplayModeDirector { * Checks to see if at least one value is positive, in which case it is necessary to listen * to value changes. */ - private boolean checkShouldObserve(int[] a) { - if (mRefreshRateInZone <= 0) { - return false; - } - + private boolean hasValidThreshold(int[] a) { for (int d: a) { if (d >= 0) { return true; @@ -1277,13 +1438,13 @@ public class DisplayModeDirector { return false; } - private boolean isInsideZone(int brightness, float lux) { - for (int i = 0; i < mDisplayBrightnessThresholds.length; i++) { - int disp = mDisplayBrightnessThresholds[i]; - int ambi = mAmbientBrightnessThresholds[i]; + private boolean isInsideLowZone(int brightness, float lux) { + for (int i = 0; i < mLowDisplayBrightnessThresholds.length; i++) { + int disp = mLowDisplayBrightnessThresholds[i]; + int ambi = mLowAmbientBrightnessThresholds[i]; if (disp >= 0 && ambi >= 0) { - if (brightness <= disp && mAmbientLux <= ambi) { + if (brightness <= disp && lux <= ambi) { return true; } } else if (disp >= 0) { @@ -1291,7 +1452,7 @@ public class DisplayModeDirector { return true; } } else if (ambi >= 0) { - if (mAmbientLux <= ambi) { + if (lux <= ambi) { return true; } } @@ -1299,27 +1460,77 @@ public class DisplayModeDirector { return false; } - // TODO: brightnessfloat: make it use float not int - private void onBrightnessChangedLocked() { - int brightness = Settings.System.getInt(mContext.getContentResolver(), - Settings.System.SCREEN_BRIGHTNESS, -1); + private boolean isInsideHighZone(int brightness, float lux) { + for (int i = 0; i < mHighDisplayBrightnessThresholds.length; i++) { + int disp = mHighDisplayBrightnessThresholds[i]; + int ambi = mHighAmbientBrightnessThresholds[i]; + + if (disp >= 0 && ambi >= 0) { + if (brightness >= disp && lux >= ambi) { + return true; + } + } else if (disp >= 0) { + if (brightness >= disp) { + return true; + } + } else if (ambi >= 0) { + if (lux >= ambi) { + return true; + } + } + } + + return false; + } + private void onBrightnessChangedLocked() { Vote vote = null; - boolean insideZone = isInsideZone(brightness, mAmbientLux); - if (insideZone) { - vote = Vote.forRefreshRates(mRefreshRateInZone, mRefreshRateInZone); + + if (mBrightness < 0) { + // Either the setting isn't available or we shouldn't be observing yet anyways. + // Either way, just bail out since there's nothing we can do here. + return; + } + + boolean insideLowZone = hasValidLowZone() && isInsideLowZone(mBrightness, mAmbientLux); + if (insideLowZone) { + vote = Vote.forRefreshRates(mRefreshRateInLowZone, mRefreshRateInLowZone); + } + + boolean insideHighZone = hasValidHighZone() + && isInsideHighZone(mBrightness, mAmbientLux); + if (insideHighZone) { + vote = Vote.forRefreshRates(mRefreshRateInHighZone, mRefreshRateInHighZone); } if (DEBUG) { - Slog.d(TAG, "Display brightness " + brightness + ", ambient lux " + mAmbientLux + - ", Vote " + vote); + Slog.d(TAG, "Display brightness " + mBrightness + ", ambient lux " + mAmbientLux + + ", Vote " + vote); } - updateVoteLocked(Vote.PRIORITY_LOW_BRIGHTNESS, vote); + updateVoteLocked(Vote.PRIORITY_FLICKER, vote); } - private void onScreenOn(boolean on) { - if (mScreenOn != on) { - mScreenOn = on; + private boolean hasValidLowZone() { + return mRefreshRateInLowZone > 0 + && (mShouldObserveDisplayLowChange || mShouldObserveAmbientLowChange); + } + + private boolean hasValidHighZone() { + return mRefreshRateInHighZone > 0 + && (mShouldObserveDisplayHighChange || mShouldObserveAmbientHighChange); + } + + private void updateDefaultDisplayState() { + Display display = mContext.getSystemService(DisplayManager.class) + .getDisplay(Display.DEFAULT_DISPLAY); + boolean defaultDisplayOn = display != null && display.getState() != Display.STATE_OFF; + setDefaultDisplayState(defaultDisplayOn); + } + + @VisibleForTesting + public void setDefaultDisplayState(boolean on) { + if (mDefaultDisplayOn != on) { + mDefaultDisplayOn = on; updateSensorStatus(); } } @@ -1329,8 +1540,8 @@ public class DisplayModeDirector { return; } - if (mShouldObserveAmbientChange && mScreenOn && !mLowPowerModeEnabled - && mRefreshRateChangeable) { + if ((mShouldObserveAmbientLowChange || mShouldObserveAmbientHighChange) + && isDeviceActive() && !mLowPowerModeEnabled && mRefreshRateChangeable) { mSensorManager.registerListener(mLightSensorListener, mLightSensor, LIGHT_SENSOR_RATE_MS * 1000, mHandler); } else { @@ -1339,11 +1550,8 @@ public class DisplayModeDirector { } } - private boolean isDefaultDisplayOn() { - final Display display = mContext.getSystemService(DisplayManager.class) - .getDisplay(Display.DEFAULT_DISPLAY); - return display.getState() != Display.STATE_OFF - && mContext.getSystemService(PowerManager.class).isInteractive(); + private boolean isDeviceActive() { + return mDefaultDisplayOn && mInjector.isDeviceInteractive(mContext); } private final class LightSensorEventListener implements SensorEventListener { @@ -1361,23 +1569,33 @@ public class DisplayModeDirector { Slog.d(TAG, "On sensor changed: " + mLastSensorData); } - boolean zoneChanged = isDifferentZone(mLastSensorData, mAmbientLux); - if (zoneChanged && mLastSensorData < mAmbientLux) { - // Easier to see flicker at lower brightness environment. Forget the history to - // get immediate response. - mAmbientFilter.clear(); + boolean lowZoneChanged = isDifferentZone(mLastSensorData, mAmbientLux, + mLowAmbientBrightnessThresholds); + boolean highZoneChanged = isDifferentZone(mLastSensorData, mAmbientLux, + mHighAmbientBrightnessThresholds); + if ((lowZoneChanged && mLastSensorData < mAmbientLux) + || (highZoneChanged && mLastSensorData > mAmbientLux)) { + // Easier to see flicker at lower brightness environment or high brightness + // environment. Forget the history to get immediate response. + if (mAmbientFilter != null) { + mAmbientFilter.clear(); + } } long now = SystemClock.uptimeMillis(); - mAmbientFilter.addValue(now, mLastSensorData); + if (mAmbientFilter != null) { + mAmbientFilter.addValue(now, mLastSensorData); + } mHandler.removeCallbacks(mInjectSensorEventRunnable); processSensorData(now); - if (zoneChanged && mLastSensorData > mAmbientLux) { + if ((lowZoneChanged && mLastSensorData > mAmbientLux) + || (highZoneChanged && mLastSensorData < mAmbientLux)) { // Sensor may not report new event if there is no brightness change. // Need to keep querying the temporal filter for the latest estimation, - // until enter in higher lux zone or is interrupted by a new sensor event. + // until sensor readout and filter estimation are in the same zone or + // is interrupted by a new sensor event. mHandler.postDelayed(mInjectSensorEventRunnable, INJECT_EVENTS_INTERVAL_MS); } } @@ -1392,17 +1610,19 @@ public class DisplayModeDirector { } private void processSensorData(long now) { - mAmbientLux = mAmbientFilter.getEstimate(now); + if (mAmbientFilter != null) { + mAmbientLux = mAmbientFilter.getEstimate(now); + } else { + mAmbientLux = mLastSensorData; + } synchronized (mLock) { onBrightnessChangedLocked(); } } - private boolean isDifferentZone(float lux1, float lux2) { - for (int z = 0; z < mAmbientBrightnessThresholds.length; z++) { - final float boundary = mAmbientBrightnessThresholds[z]; - + private boolean isDifferentZone(float lux1, float lux2, int[] luxThresholds) { + for (final float boundary : luxThresholds) { // Test each boundary. See if the current value and the new value are at // different sides. if ((lux1 <= boundary && lux2 > boundary) @@ -1422,7 +1642,10 @@ public class DisplayModeDirector { processSensorData(now); // Inject next event if there is a possible zone change. - if (isDifferentZone(mLastSensorData, mAmbientLux)) { + if (isDifferentZone(mLastSensorData, mAmbientLux, + mLowAmbientBrightnessThresholds) + || isDifferentZone(mLastSensorData, mAmbientLux, + mHighAmbientBrightnessThresholds)) { mHandler.postDelayed(mInjectSensorEventRunnable, INJECT_EVENTS_INTERVAL_MS); } } @@ -1435,14 +1658,14 @@ public class DisplayModeDirector { } public void startListening() { - DeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_DISPLAY_MANAGER, + mDeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_DISPLAY_MANAGER, BackgroundThread.getExecutor(), this); } /* * Return null if no such property or wrong format (not comma separated integers). */ - public int[] getBrightnessThresholds() { + public int[] getLowDisplayBrightnessThresholds() { return getIntArrayProperty( DisplayManager.DeviceConfig. KEY_PEAK_REFRESH_RATE_DISPLAY_BRIGHTNESS_THRESHOLDS); @@ -1451,17 +1674,29 @@ public class DisplayModeDirector { /* * Return null if no such property or wrong format (not comma separated integers). */ - public int[] getAmbientThresholds() { + public int[] getLowAmbientBrightnessThresholds() { return getIntArrayProperty( DisplayManager.DeviceConfig. KEY_PEAK_REFRESH_RATE_AMBIENT_BRIGHTNESS_THRESHOLDS); } + public int getRefreshRateInLowZone() { + int defaultRefreshRateInZone = mContext.getResources().getInteger( + R.integer.config_defaultRefreshRateInZone); + + int refreshRate = mDeviceConfig.getInt( + DeviceConfig.NAMESPACE_DISPLAY_MANAGER, + DisplayManager.DeviceConfig.KEY_REFRESH_RATE_IN_ZONE, + defaultRefreshRateInZone); + + return refreshRate; + } + /* * Return null if no such property */ public Float getDefaultPeakRefreshRate() { - float defaultPeakRefreshRate = DeviceConfig.getFloat( + float defaultPeakRefreshRate = mDeviceConfig.getFloat( DeviceConfig.NAMESPACE_DISPLAY_MANAGER, DisplayManager.DeviceConfig.KEY_PEAK_REFRESH_RATE_DEFAULT, -1); @@ -1471,36 +1706,25 @@ public class DisplayModeDirector { return defaultPeakRefreshRate; } - public int getRefreshRateInZone() { - int defaultRefreshRateInZone = mContext.getResources().getInteger( - R.integer.config_defaultRefreshRateInZone); - - int refreshRate = DeviceConfig.getInt( - DeviceConfig.NAMESPACE_DISPLAY_MANAGER, - DisplayManager.DeviceConfig.KEY_REFRESH_RATE_IN_ZONE, - defaultRefreshRateInZone); - - return refreshRate; - } - @Override public void onPropertiesChanged(@NonNull DeviceConfig.Properties properties) { - int[] brightnessThresholds = getBrightnessThresholds(); - int[] ambientThresholds = getAmbientThresholds(); Float defaultPeakRefreshRate = getDefaultPeakRefreshRate(); - int refreshRateInZone = getRefreshRateInZone(); - - mHandler.obtainMessage(MSG_BRIGHTNESS_THRESHOLDS_CHANGED, - new Pair(brightnessThresholds, ambientThresholds)) - .sendToTarget(); mHandler.obtainMessage(MSG_DEFAULT_PEAK_REFRESH_RATE_CHANGED, defaultPeakRefreshRate).sendToTarget(); - mHandler.obtainMessage(MSG_REFRESH_RATE_IN_ZONE_CHANGED, refreshRateInZone, - 0).sendToTarget(); + + int[] lowDisplayBrightnessThresholds = getLowDisplayBrightnessThresholds(); + int[] lowAmbientBrightnessThresholds = getLowAmbientBrightnessThresholds(); + int refreshRateInLowZone = getRefreshRateInLowZone(); + + mHandler.obtainMessage(MSG_LOW_BRIGHTNESS_THRESHOLDS_CHANGED, + new Pair<>(lowDisplayBrightnessThresholds, lowAmbientBrightnessThresholds)) + .sendToTarget(); + mHandler.obtainMessage(MSG_REFRESH_RATE_IN_LOW_ZONE_CHANGED, refreshRateInLowZone, 0) + .sendToTarget(); } private int[] getIntArrayProperty(String prop) { - String strArray = DeviceConfig.getString(DeviceConfig.NAMESPACE_DISPLAY_MANAGER, prop, + String strArray = mDeviceConfig.getString(DeviceConfig.NAMESPACE_DISPLAY_MANAGER, prop, null); if (strArray != null) { @@ -1527,4 +1751,59 @@ public class DisplayModeDirector { } } + interface Injector { + // TODO: brightnessfloat: change this to the float setting + Uri DISPLAY_BRIGHTNESS_URI = Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS); + Uri PEAK_REFRESH_RATE_URI = Settings.System.getUriFor(Settings.System.PEAK_REFRESH_RATE); + + @NonNull + DeviceConfigInterface getDeviceConfig(); + + void registerBrightnessObserver(@NonNull ContentResolver cr, + @NonNull ContentObserver observer); + + void unregisterBrightnessObserver(@NonNull ContentResolver cr, + @NonNull ContentObserver observer); + + void registerPeakRefreshRateObserver(@NonNull ContentResolver cr, + @NonNull ContentObserver observer); + + boolean isDeviceInteractive(@NonNull Context context); + } + + @VisibleForTesting + static class RealInjector implements Injector { + + @Override + @NonNull + public DeviceConfigInterface getDeviceConfig() { + return DeviceConfigInterface.REAL; + } + + @Override + public void registerBrightnessObserver(@NonNull ContentResolver cr, + @NonNull ContentObserver observer) { + cr.registerContentObserver(DISPLAY_BRIGHTNESS_URI, false /*notifyDescendants*/, + observer, UserHandle.USER_SYSTEM); + } + + @Override + public void unregisterBrightnessObserver(@NonNull ContentResolver cr, + @NonNull ContentObserver observer) { + cr.unregisterContentObserver(observer); + } + + @Override + public void registerPeakRefreshRateObserver(@NonNull ContentResolver cr, + @NonNull ContentObserver observer) { + cr.registerContentObserver(PEAK_REFRESH_RATE_URI, false /*notifyDescendants*/, + observer, UserHandle.USER_SYSTEM); + } + + @Override + public boolean isDeviceInteractive(@NonNull Context ctx) { + return ctx.getSystemService(PowerManager.class).isInteractive(); + } + } + } diff --git a/services/core/java/com/android/server/wm/utils/DeviceConfigInterface.java b/services/core/java/com/android/server/utils/DeviceConfigInterface.java similarity index 90% rename from services/core/java/com/android/server/wm/utils/DeviceConfigInterface.java rename to services/core/java/com/android/server/utils/DeviceConfigInterface.java index ab7e7f63cafd4..ff609031b57c5 100644 --- a/services/core/java/com/android/server/wm/utils/DeviceConfigInterface.java +++ b/services/core/java/com/android/server/utils/DeviceConfigInterface.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.server.wm.utils; +package com.android.server.utils; import android.annotation.NonNull; import android.annotation.Nullable; @@ -53,6 +53,11 @@ public interface DeviceConfigInterface { */ boolean getBoolean(@NonNull String namespace, @NonNull String name, boolean defaultValue); + /** + * @see DeviceConfig#getFloat + */ + float getFloat(@NonNull String namespace, @NonNull String name, float defaultValue); + /** * @see DeviceConfig#addOnPropertiesChangedListener */ @@ -95,6 +100,12 @@ public interface DeviceConfigInterface { return DeviceConfig.getBoolean(namespace, name, defaultValue); } + @Override + public float getFloat(@NonNull String namespace, @NonNull String name, + float defaultValue) { + return DeviceConfig.getFloat(namespace, name, defaultValue); + } + @Override public void addOnPropertiesChangedListener(String namespace, Executor executor, DeviceConfig.OnPropertiesChangedListener listener) { diff --git a/services/core/java/com/android/server/wm/HighRefreshRateBlacklist.java b/services/core/java/com/android/server/wm/HighRefreshRateBlacklist.java index d9cf637ffaf8f..09ab004b4b3bc 100644 --- a/services/core/java/com/android/server/wm/HighRefreshRateBlacklist.java +++ b/services/core/java/com/android/server/wm/HighRefreshRateBlacklist.java @@ -27,7 +27,7 @@ import android.util.ArraySet; import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.os.BackgroundThread; -import com.android.server.wm.utils.DeviceConfigInterface; +import com.android.server.utils.DeviceConfigInterface; import java.io.PrintWriter; diff --git a/services/core/java/com/android/server/wm/WindowManagerConstants.java b/services/core/java/com/android/server/wm/WindowManagerConstants.java index b0c5dbc6cca38..a5ebf9ac74b9b 100644 --- a/services/core/java/com/android/server/wm/WindowManagerConstants.java +++ b/services/core/java/com/android/server/wm/WindowManagerConstants.java @@ -23,7 +23,7 @@ import android.provider.AndroidDeviceConfig; import android.provider.DeviceConfig; import com.android.internal.annotations.VisibleForTesting; -import com.android.server.wm.utils.DeviceConfigInterface; +import com.android.server.utils.DeviceConfigInterface; import java.io.PrintWriter; import java.util.Objects; diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index b7a2eb3c705d3..d9594a40bde31 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -282,8 +282,8 @@ import com.android.server.policy.WindowManagerPolicy.ScreenOffListener; import com.android.server.power.ShutdownThread; import com.android.server.protolog.ProtoLogImpl; import com.android.server.protolog.common.ProtoLog; +import com.android.server.utils.DeviceConfigInterface; import com.android.server.utils.PriorityDump; -import com.android.server.wm.utils.DeviceConfigInterface; import java.io.BufferedWriter; import java.io.DataInputStream; diff --git a/services/tests/servicestests/Android.bp b/services/tests/servicestests/Android.bp index 979f4e179e95d..e57097e488811 100644 --- a/services/tests/servicestests/Android.bp +++ b/services/tests/servicestests/Android.bp @@ -48,7 +48,6 @@ android_test { // TODO: remove once Android migrates to JUnit 4.12, // which provides assertThrows "testng", - ], aidl: { @@ -110,6 +109,7 @@ java_library { "utils/**/*.java", "utils/**/*.kt", "utils-mockito/**/*.kt", + ":services.core-sources-deviceconfig-interface", ], static_libs: [ "junit", @@ -126,6 +126,7 @@ java_library { "utils/**/*.java", "utils/**/*.kt", "utils-mockito/**/*.kt", + ":services.core-sources-deviceconfig-interface", ], static_libs: [ "junit", diff --git a/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java b/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java index 43a396d8e5d7d..4ee6a553b9d15 100644 --- a/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java +++ b/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java @@ -16,49 +16,96 @@ package com.android.server.display; -import static org.junit.Assert.assertTrue; -import static org.mockito.Mockito.verify; +import static android.hardware.display.DisplayManager.DeviceConfig.KEY_PEAK_REFRESH_RATE_AMBIENT_BRIGHTNESS_THRESHOLDS; +import static android.hardware.display.DisplayManager.DeviceConfig.KEY_PEAK_REFRESH_RATE_DISPLAY_BRIGHTNESS_THRESHOLDS; +import static android.hardware.display.DisplayManager.DeviceConfig.KEY_REFRESH_RATE_IN_ZONE; +import static com.android.server.display.DisplayModeDirector.Vote.PRIORITY_FLICKER; + +import static com.google.common.truth.Truth.assertThat; + +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.annotation.NonNull; +import android.content.ContentResolver; import android.content.Context; +import android.content.ContextWrapper; +import android.database.ContentObserver; +import android.hardware.Sensor; +import android.hardware.SensorEventListener; +import android.hardware.SensorManager; import android.os.Handler; import android.os.Looper; +import android.provider.DeviceConfig; +import android.provider.Settings; +import android.test.mock.MockContentResolver; +import android.util.Slog; import android.util.SparseArray; import android.view.Display; -import androidx.test.InstrumentationRegistry; +import androidx.test.core.app.ApplicationProvider; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; +import com.android.internal.util.Preconditions; +import com.android.internal.util.test.FakeSettingsProvider; +import com.android.internal.util.test.FakeSettingsProviderRule; import com.android.server.display.DisplayModeDirector.BrightnessObserver; import com.android.server.display.DisplayModeDirector.DesiredDisplayModeSpecs; import com.android.server.display.DisplayModeDirector.Vote; +import com.android.server.testutils.FakeDeviceConfigInterface; import com.google.common.truth.Truth; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.Executor; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + @SmallTest @RunWith(AndroidJUnit4.class) public class DisplayModeDirectorTest { // The tolerance within which we consider something approximately equals. + private static final String TAG = "DisplayModeDirectorTest"; + private static final boolean DEBUG = false; private static final float FLOAT_TOLERANCE = 0.01f; private Context mContext; + private FakesInjector mInjector; + private Handler mHandler; + @Rule + public FakeSettingsProviderRule mSettingsProviderRule = FakeSettingsProvider.rule(); @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); - mContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + mContext = spy(new ContextWrapper(ApplicationProvider.getApplicationContext())); + final MockContentResolver resolver = mSettingsProviderRule.mockContentResolver(mContext); + when(mContext.getContentResolver()).thenReturn(resolver); + mInjector = new FakesInjector(); + mHandler = new Handler(Looper.getMainLooper()); } private DisplayModeDirector createDirectorFromRefreshRateArray( float[] refreshRates, int baseModeId) { DisplayModeDirector director = - new DisplayModeDirector(mContext, new Handler(Looper.getMainLooper())); + new DisplayModeDirector(mContext, mHandler, mInjector); int displayId = 0; Display.Mode[] modes = new Display.Mode[refreshRates.length]; for (int i = 0; i < refreshRates.length; i++) { @@ -159,9 +206,9 @@ public class DisplayModeDirectorTest { } @Test - public void testBrightnessHasLowerPriorityThanUser() { - assertTrue(Vote.PRIORITY_LOW_BRIGHTNESS < Vote.PRIORITY_APP_REQUEST_REFRESH_RATE); - assertTrue(Vote.PRIORITY_LOW_BRIGHTNESS < Vote.PRIORITY_APP_REQUEST_SIZE); + public void testFlickerHasLowerPriorityThanUser() { + assertTrue(PRIORITY_FLICKER < Vote.PRIORITY_APP_REQUEST_REFRESH_RATE); + assertTrue(PRIORITY_FLICKER < Vote.PRIORITY_APP_REQUEST_SIZE); int displayId = 0; DisplayModeDirector director = createDirectorFromFpsRange(60, 90); @@ -169,7 +216,7 @@ public class DisplayModeDirectorTest { SparseArray> votesByDisplay = new SparseArray<>(); votesByDisplay.put(displayId, votes); votes.put(Vote.PRIORITY_APP_REQUEST_REFRESH_RATE, Vote.forRefreshRates(60, 90)); - votes.put(Vote.PRIORITY_LOW_BRIGHTNESS, Vote.forRefreshRates(60, 60)); + votes.put(PRIORITY_FLICKER, Vote.forRefreshRates(60, 60)); director.injectVotesByDisplay(votesByDisplay); DesiredDisplayModeSpecs desiredSpecs = director.getDesiredDisplayModeSpecs(displayId); Truth.assertThat(desiredSpecs.primaryRefreshRateRange.min).isWithin(FLOAT_TOLERANCE).of(60); @@ -177,7 +224,7 @@ public class DisplayModeDirectorTest { votes.clear(); votes.put(Vote.PRIORITY_APP_REQUEST_REFRESH_RATE, Vote.forRefreshRates(60, 90)); - votes.put(Vote.PRIORITY_LOW_BRIGHTNESS, Vote.forRefreshRates(90, 90)); + votes.put(PRIORITY_FLICKER, Vote.forRefreshRates(90, 90)); director.injectVotesByDisplay(votesByDisplay); desiredSpecs = director.getDesiredDisplayModeSpecs(displayId); Truth.assertThat(desiredSpecs.primaryRefreshRateRange.min).isWithin(FLOAT_TOLERANCE).of(90); @@ -185,7 +232,7 @@ public class DisplayModeDirectorTest { votes.clear(); votes.put(Vote.PRIORITY_APP_REQUEST_REFRESH_RATE, Vote.forRefreshRates(90, 90)); - votes.put(Vote.PRIORITY_LOW_BRIGHTNESS, Vote.forRefreshRates(60, 60)); + votes.put(PRIORITY_FLICKER, Vote.forRefreshRates(60, 60)); director.injectVotesByDisplay(votesByDisplay); desiredSpecs = director.getDesiredDisplayModeSpecs(displayId); Truth.assertThat(desiredSpecs.primaryRefreshRateRange.min).isWithin(FLOAT_TOLERANCE).of(90); @@ -193,7 +240,7 @@ public class DisplayModeDirectorTest { votes.clear(); votes.put(Vote.PRIORITY_APP_REQUEST_REFRESH_RATE, Vote.forRefreshRates(60, 60)); - votes.put(Vote.PRIORITY_LOW_BRIGHTNESS, Vote.forRefreshRates(90, 90)); + votes.put(PRIORITY_FLICKER, Vote.forRefreshRates(90, 90)); director.injectVotesByDisplay(votesByDisplay); desiredSpecs = director.getDesiredDisplayModeSpecs(displayId); Truth.assertThat(desiredSpecs.primaryRefreshRateRange.min).isWithin(FLOAT_TOLERANCE).of(60); @@ -202,10 +249,10 @@ public class DisplayModeDirectorTest { @Test public void testAppRequestRefreshRateRange() { - // Confirm that the app request range doesn't include low brightness or min refresh rate - // settings, but does include everything else. + // Confirm that the app request range doesn't include flicker or min refresh rate settings, + // but does include everything else. assertTrue( - Vote.PRIORITY_LOW_BRIGHTNESS < Vote.APP_REQUEST_REFRESH_RATE_RANGE_PRIORITY_CUTOFF); + PRIORITY_FLICKER < Vote.APP_REQUEST_REFRESH_RATE_RANGE_PRIORITY_CUTOFF); assertTrue(Vote.PRIORITY_USER_SETTING_MIN_REFRESH_RATE < Vote.APP_REQUEST_REFRESH_RATE_RANGE_PRIORITY_CUTOFF); assertTrue(Vote.PRIORITY_APP_REQUEST_REFRESH_RATE @@ -216,7 +263,7 @@ public class DisplayModeDirectorTest { SparseArray votes = new SparseArray<>(); SparseArray> votesByDisplay = new SparseArray<>(); votesByDisplay.put(displayId, votes); - votes.put(Vote.PRIORITY_LOW_BRIGHTNESS, Vote.forRefreshRates(60, 60)); + votes.put(PRIORITY_FLICKER, Vote.forRefreshRates(60, 60)); director.injectVotesByDisplay(votesByDisplay); DesiredDisplayModeSpecs desiredSpecs = director.getDesiredDisplayModeSpecs(displayId); Truth.assertThat(desiredSpecs.primaryRefreshRateRange.min).isWithin(FLOAT_TOLERANCE).of(60); @@ -302,4 +349,307 @@ public class DisplayModeDirectorTest { verifyBrightnessObserverCall(director, 90, 90, 0, 90, 90); verifyBrightnessObserverCall(director, 120, 90, 0, 120, 90); } + + @Test + public void testBrightnessObserverGetsUpdatedRefreshRatesForZone() { + DisplayModeDirector director = + createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, /* baseModeId= */ 0); + SensorManager sensorManager = createMockSensorManager(createLightSensor()); + + final int initialRefreshRate = 60; + mInjector.getDeviceConfig().setRefreshRateInLowZone(initialRefreshRate); + director.start(sensorManager); + assertThat(director.getBrightnessObserver().getRefreshRateInLowZone()) + .isEqualTo(initialRefreshRate); + + final int updatedRefreshRate = 90; + mInjector.getDeviceConfig().setRefreshRateInLowZone(updatedRefreshRate); + // Need to wait for the property change to propagate to the main thread. + waitForIdleSync(); + assertThat(director.getBrightnessObserver().getRefreshRateInLowZone()) + .isEqualTo(updatedRefreshRate); + } + + @Test + public void testBrightnessObserverThresholdsInZone() { + DisplayModeDirector director = + createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, /* baseModeId= */ 0); + SensorManager sensorManager = createMockSensorManager(createLightSensor()); + + final int[] initialDisplayThresholds = { 10 }; + final int[] initialAmbientThresholds = { 20 }; + + final FakeDeviceConfig config = mInjector.getDeviceConfig(); + config.setLowDisplayBrightnessThresholds(initialDisplayThresholds); + config.setLowAmbientBrightnessThresholds(initialAmbientThresholds); + director.start(sensorManager); + + assertThat(director.getBrightnessObserver().getLowDisplayBrightnessThresholds()) + .isEqualTo(initialDisplayThresholds); + assertThat(director.getBrightnessObserver().getLowAmbientBrightnessThresholds()) + .isEqualTo(initialAmbientThresholds); + + final int[] updatedDisplayThresholds = { 9, 14 }; + final int[] updatedAmbientThresholds = { -1, 19 }; + config.setLowDisplayBrightnessThresholds(updatedDisplayThresholds); + config.setLowAmbientBrightnessThresholds(updatedAmbientThresholds); + // Need to wait for the property change to propagate to the main thread. + waitForIdleSync(); + assertThat(director.getBrightnessObserver().getLowDisplayBrightnessThresholds()) + .isEqualTo(updatedDisplayThresholds); + assertThat(director.getBrightnessObserver().getLowAmbientBrightnessThresholds()) + .isEqualTo(updatedAmbientThresholds); + } + + @Test + public void testLockFpsForLowZone() throws Exception { + DisplayModeDirector director = + createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0); + setPeakRefreshRate(90); + director.getSettingsObserver().setDefaultRefreshRate(90); + director.getBrightnessObserver().setDefaultDisplayState(true); + + final FakeDeviceConfig config = mInjector.getDeviceConfig(); + config.setRefreshRateInLowZone(90); + config.setLowDisplayBrightnessThresholds(new int[] { 10 }); + config.setLowAmbientBrightnessThresholds(new int[] { 20 }); + + Sensor lightSensor = createLightSensor(); + SensorManager sensorManager = createMockSensorManager(lightSensor); + + director.start(sensorManager); + + ArgumentCaptor listenerCaptor = + ArgumentCaptor.forClass(SensorEventListener.class); + Mockito.verify(sensorManager, Mockito.timeout(TimeUnit.SECONDS.toMillis(1))) + .registerListener( + listenerCaptor.capture(), + eq(lightSensor), + anyInt(), + any(Handler.class)); + SensorEventListener listener = listenerCaptor.getValue(); + + setBrightness(10); + // Sensor reads 20 lux, + listener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, 20 /*lux*/)); + + Vote vote = director.getVote(Display.DEFAULT_DISPLAY, PRIORITY_FLICKER); + assertVoteForRefreshRateLocked(vote, 90 /*fps*/); + + setBrightness(125); + // Sensor reads 1000 lux, + listener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, 1000 /*lux*/)); + + vote = director.getVote(Display.DEFAULT_DISPLAY, PRIORITY_FLICKER); + assertThat(vote).isNull(); + } + + @Test + public void testLockFpsForHighZone() throws Exception { + DisplayModeDirector director = + createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0); + setPeakRefreshRate(90 /*fps*/); + director.getSettingsObserver().setDefaultRefreshRate(90); + director.getBrightnessObserver().setDefaultDisplayState(true); + director.updateSettingForHighZone(60, new int[] {255}, new int[] {8000}); + + Sensor lightSensor = createLightSensor(); + SensorManager sensorManager = createMockSensorManager(lightSensor); + + director.start(sensorManager); + + ArgumentCaptor listenerCaptor = + ArgumentCaptor.forClass(SensorEventListener.class); + Mockito.verify(sensorManager, Mockito.timeout(TimeUnit.SECONDS.toMillis(1))) + .registerListener( + listenerCaptor.capture(), + eq(lightSensor), + anyInt(), + any(Handler.class)); + SensorEventListener listener = listenerCaptor.getValue(); + + setBrightness(100); + // Sensor reads 2000 lux, + listener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, 2000)); + + Vote vote = director.getVote(Display.DEFAULT_DISPLAY, PRIORITY_FLICKER); + assertThat(vote).isNull(); + + setBrightness(255); + // Sensor reads 9000 lux, + listener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, 9000)); + + vote = director.getVote(Display.DEFAULT_DISPLAY, PRIORITY_FLICKER); + assertVoteForRefreshRateLocked(vote, 60 /*fps*/); + } + + private void assertVoteForRefreshRateLocked(Vote vote, float refreshRate) { + assertThat(vote).isNotNull(); + final DisplayModeDirector.RefreshRateRange expectedRange = + new DisplayModeDirector.RefreshRateRange(refreshRate, refreshRate); + assertThat(vote.refreshRateRange).isEqualTo(expectedRange); + } + + private static class FakeDeviceConfig extends FakeDeviceConfigInterface { + @Override + public String getProperty(String namespace, String name) { + Preconditions.checkArgument(DeviceConfig.NAMESPACE_DISPLAY_MANAGER.equals(namespace)); + return super.getProperty(namespace, name); + } + + @Override + public void addOnPropertiesChangedListener( + String namespace, + Executor executor, + DeviceConfig.OnPropertiesChangedListener listener) { + Preconditions.checkArgument(DeviceConfig.NAMESPACE_DISPLAY_MANAGER.equals(namespace)); + super.addOnPropertiesChangedListener(namespace, executor, listener); + } + + void setRefreshRateInLowZone(int fps) { + putPropertyAndNotify( + DeviceConfig.NAMESPACE_DISPLAY_MANAGER, KEY_REFRESH_RATE_IN_ZONE, + String.valueOf(fps)); + } + + void setLowDisplayBrightnessThresholds(int[] brightnessThresholds) { + String thresholds = toPropertyValue(brightnessThresholds); + + if (DEBUG) { + Slog.e(TAG, "Brightness Thresholds = " + thresholds); + } + + putPropertyAndNotify( + DeviceConfig.NAMESPACE_DISPLAY_MANAGER, + KEY_PEAK_REFRESH_RATE_DISPLAY_BRIGHTNESS_THRESHOLDS, + thresholds); + } + + void setLowAmbientBrightnessThresholds(int[] ambientThresholds) { + String thresholds = toPropertyValue(ambientThresholds); + + if (DEBUG) { + Slog.e(TAG, "Ambient Thresholds = " + thresholds); + } + + putPropertyAndNotify( + DeviceConfig.NAMESPACE_DISPLAY_MANAGER, + KEY_PEAK_REFRESH_RATE_AMBIENT_BRIGHTNESS_THRESHOLDS, + thresholds); + } + + @NonNull + private static String toPropertyValue(@NonNull int[] intArray) { + return Arrays.stream(intArray) + .mapToObj(Integer::toString) + .collect(Collectors.joining(",")); + } + } + + private void setBrightness(int brightness) { + Settings.System.putInt(mContext.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, + brightness); + mInjector.notifyBrightnessChanged(); + waitForIdleSync(); + } + + private void setPeakRefreshRate(float fps) { + Settings.System.putFloat(mContext.getContentResolver(), Settings.System.PEAK_REFRESH_RATE, + fps); + mInjector.notifyPeakRefreshRateChanged(); + waitForIdleSync(); + } + + private static SensorManager createMockSensorManager(Sensor... sensors) { + SensorManager sensorManager = Mockito.mock(SensorManager.class); + when(sensorManager.getSensorList(anyInt())).then((invocation) -> { + List requestedSensors = new ArrayList<>(); + int type = invocation.getArgument(0); + for (Sensor sensor : sensors) { + if (sensor.getType() == type || type == Sensor.TYPE_ALL) { + requestedSensors.add(sensor); + } + } + return requestedSensors; + }); + + when(sensorManager.getDefaultSensor(anyInt())).then((invocation) -> { + int type = invocation.getArgument(0); + for (Sensor sensor : sensors) { + if (sensor.getType() == type) { + return sensor; + } + } + return null; + }); + return sensorManager; + } + + private static Sensor createLightSensor() { + try { + return TestUtils.createSensor(Sensor.TYPE_LIGHT, Sensor.STRING_TYPE_LIGHT); + } catch (Exception e) { + // There's nothing we can do if this fails, just throw a RuntimeException so that we + // don't have to mark every function that might call this as throwing Exception + throw new RuntimeException("Failed to create a light sensor", e); + } + } + + private void waitForIdleSync() { + mHandler.runWithScissors(() -> { }, 500 /*timeout*/); + } + + static class FakesInjector implements DisplayModeDirector.Injector { + private final FakeDeviceConfig mDeviceConfig; + private ContentObserver mBrightnessObserver; + private ContentObserver mPeakRefreshRateObserver; + + FakesInjector() { + mDeviceConfig = new FakeDeviceConfig(); + } + + @NonNull + public FakeDeviceConfig getDeviceConfig() { + return mDeviceConfig; + } + + @Override + public void registerBrightnessObserver(@NonNull ContentResolver cr, + @NonNull ContentObserver observer) { + if (mBrightnessObserver != null) { + throw new IllegalStateException("Tried to register a second brightness observer"); + } + mBrightnessObserver = observer; + } + + @Override + public void unregisterBrightnessObserver(@NonNull ContentResolver cr, + @NonNull ContentObserver observer) { + mBrightnessObserver = null; + } + + void notifyBrightnessChanged() { + if (mBrightnessObserver != null) { + mBrightnessObserver.dispatchChange(false /*selfChange*/, DISPLAY_BRIGHTNESS_URI); + } + } + + @Override + public void registerPeakRefreshRateObserver(@NonNull ContentResolver cr, + @NonNull ContentObserver observer) { + mPeakRefreshRateObserver = observer; + } + + void notifyPeakRefreshRateChanged() { + if (mPeakRefreshRateObserver != null) { + mPeakRefreshRateObserver.dispatchChange(false /*selfChange*/, + PEAK_REFRESH_RATE_URI); + } + } + + @Override + public boolean isDeviceInteractive(@NonNull Context context) { + return true; + } + } } diff --git a/services/tests/wmtests/src/com/android/server/wm/utils/FakeDeviceConfigInterface.java b/services/tests/servicestests/utils/com/android/server/testutils/FakeDeviceConfigInterface.java similarity index 92% rename from services/tests/wmtests/src/com/android/server/wm/utils/FakeDeviceConfigInterface.java rename to services/tests/servicestests/utils/com/android/server/testutils/FakeDeviceConfigInterface.java index 2904a5b736463..a67f64596ef51 100644 --- a/services/tests/wmtests/src/com/android/server/wm/utils/FakeDeviceConfigInterface.java +++ b/services/tests/servicestests/utils/com/android/server/testutils/FakeDeviceConfigInterface.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.server.wm.utils; +package com.android.server.testutils; import android.annotation.NonNull; import android.provider.DeviceConfig; @@ -22,6 +22,7 @@ import android.util.ArrayMap; import android.util.Pair; import com.android.internal.util.Preconditions; +import com.android.server.utils.DeviceConfigInterface; import java.lang.reflect.Constructor; import java.util.HashMap; @@ -121,6 +122,19 @@ public class FakeDeviceConfigInterface implements DeviceConfigInterface { } } + @Override + public float getFloat(String namespace, String name, float defaultValue) { + String value = getProperty(namespace, name); + if (value == null) { + return defaultValue; + } + try { + return Float.parseFloat(value); + } catch (NumberFormatException e) { + return defaultValue; + } + } + @Override public boolean getBoolean(String namespace, String name, boolean defaultValue) { String value = getProperty(namespace, name); diff --git a/services/tests/wmtests/src/com/android/server/wm/HighRefreshRateBlacklistTest.java b/services/tests/wmtests/src/com/android/server/wm/HighRefreshRateBlacklistTest.java index 56cb447e65b0b..a85e1db32ce51 100644 --- a/services/tests/wmtests/src/com/android/server/wm/HighRefreshRateBlacklistTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/HighRefreshRateBlacklistTest.java @@ -31,7 +31,7 @@ import androidx.test.filters.SmallTest; import com.android.internal.R; import com.android.internal.util.Preconditions; -import com.android.server.wm.utils.FakeDeviceConfigInterface; +import com.android.server.testutils.FakeDeviceConfigInterface; import org.junit.After; import org.junit.Test; diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowManagerConstantsTest.java b/services/tests/wmtests/src/com/android/server/wm/WindowManagerConstantsTest.java index 52100116df531..7a0ef0d7d7a98 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowManagerConstantsTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowManagerConstantsTest.java @@ -32,7 +32,7 @@ import android.platform.test.annotations.Presubmit; import androidx.test.filters.SmallTest; -import com.android.server.wm.utils.FakeDeviceConfigInterface; +import com.android.server.testutils.FakeDeviceConfigInterface; import org.junit.After; import org.junit.Before; From 58515946ac0f3700c10353a2b4d9e87f0048efd5 Mon Sep 17 00:00:00 2001 From: Michael Wright Date: Fri, 15 Jan 2021 02:47:05 +0800 Subject: [PATCH 065/288] DO NOT MERGE "Allow DeviceConfig to change display settings for high zone" Allow DeviceConfig to change the high zone behavior including refresh rate and brightness thresholds. Bug: 177636374 Test: atest DisplayModeDirectorTest Test: adb shell device_config put display_manager refresh_rate_in_high_zone "90" Test: adb shell device_config put display_manager fixed_refresh_rate_high_display_brightness_thresholds "200" Test: adb shell device_config put display_manager fixed_refresh_rate_high_ambient_brightness_thresholds "8000" Change-Id: I1463d6c5daaee46a87a193e98e7f63cad9274b49 --- .../hardware/display/DisplayManager.java | 57 ++++++-- .../server/display/DisplayModeDirector.java | 132 ++++++++++++++---- .../display/DisplayModeDirectorTest.java | 53 ++++++- 3 files changed, 202 insertions(+), 40 deletions(-) diff --git a/core/java/android/hardware/display/DisplayManager.java b/core/java/android/hardware/display/DisplayManager.java index c1ba2094d3cf6..0fa4ca8a574b5 100644 --- a/core/java/android/hardware/display/DisplayManager.java +++ b/core/java/android/hardware/display/DisplayManager.java @@ -875,12 +875,52 @@ public final class DisplayManager { public interface DeviceConfig { /** - * Key for refresh rate in the zone defined by thresholds. + * Key for refresh rate in the low zone defined by thresholds. * + * Note that the name and value don't match because they were added before we had a high + * zone to consider. * @see android.provider.DeviceConfig#NAMESPACE_DISPLAY_MANAGER * @see android.R.integer#config_defaultZoneBehavior */ - String KEY_REFRESH_RATE_IN_ZONE = "refresh_rate_in_zone"; + String KEY_REFRESH_RATE_IN_LOW_ZONE = "refresh_rate_in_zone"; + + /** + * Key for accessing the low display brightness thresholds for the configured refresh + * rate zone. + * The value will be a pair of comma separated integers representing the minimum and maximum + * thresholds of the zone, respectively, in display backlight units (i.e. [0, 255]). + * + * Note that the name and value don't match because they were added before we had a high + * zone to consider. + * + * @see android.provider.DeviceConfig#NAMESPACE_DISPLAY_MANAGER + * @see android.R.array#config_brightnessThresholdsOfPeakRefreshRate + * @hide + */ + String KEY_FIXED_REFRESH_RATE_LOW_DISPLAY_BRIGHTNESS_THRESHOLDS = + "peak_refresh_rate_brightness_thresholds"; + + /** + * Key for accessing the low ambient brightness thresholds for the configured refresh + * rate zone. The value will be a pair of comma separated integers representing the minimum + * and maximum thresholds of the zone, respectively, in lux. + * + * Note that the name and value don't match because they were added before we had a high + * zone to consider. + * + * @see android.provider.DeviceConfig#NAMESPACE_DISPLAY_MANAGER + * @see android.R.array#config_ambientThresholdsOfPeakRefreshRate + * @hide + */ + String KEY_FIXED_REFRESH_RATE_LOW_AMBIENT_BRIGHTNESS_THRESHOLDS = + "peak_refresh_rate_ambient_thresholds"; + /** + * Key for refresh rate in the high zone defined by thresholds. + * + * @see android.provider.DeviceConfig#NAMESPACE_DISPLAY_MANAGER + * @see android.R.integer#config_fixedRefreshRateInHighZone + */ + String KEY_REFRESH_RATE_IN_HIGH_ZONE = "refresh_rate_in_high_zone"; /** * Key for accessing the display brightness thresholds for the configured refresh rate zone. @@ -888,11 +928,11 @@ public final class DisplayManager { * thresholds of the zone, respectively, in display backlight units (i.e. [0, 255]). * * @see android.provider.DeviceConfig#NAMESPACE_DISPLAY_MANAGER - * @see android.R.array#config_brightnessThresholdsOfPeakRefreshRate + * @see android.R.array#config_brightnessHighThresholdsOfFixedRefreshRate * @hide */ - String KEY_PEAK_REFRESH_RATE_DISPLAY_BRIGHTNESS_THRESHOLDS = - "peak_refresh_rate_brightness_thresholds"; + String KEY_FIXED_REFRESH_RATE_HIGH_DISPLAY_BRIGHTNESS_THRESHOLDS = + "fixed_refresh_rate_high_display_brightness_thresholds"; /** * Key for accessing the ambient brightness thresholds for the configured refresh rate zone. @@ -900,12 +940,11 @@ public final class DisplayManager { * thresholds of the zone, respectively, in lux. * * @see android.provider.DeviceConfig#NAMESPACE_DISPLAY_MANAGER - * @see android.R.array#config_ambientThresholdsOfPeakRefreshRate + * @see android.R.array#config_ambientHighThresholdsOfFixedRefreshRate * @hide */ - String KEY_PEAK_REFRESH_RATE_AMBIENT_BRIGHTNESS_THRESHOLDS = - "peak_refresh_rate_ambient_thresholds"; - + String KEY_FIXED_REFRESH_RATE_HIGH_AMBIENT_BRIGHTNESS_THRESHOLDS = + "fixed_refresh_rate_high_ambient_brightness_thresholds"; /** * Key for default peak refresh rate * diff --git a/services/core/java/com/android/server/display/DisplayModeDirector.java b/services/core/java/com/android/server/display/DisplayModeDirector.java index 2a60839ab702a..02ee059194ec3 100644 --- a/services/core/java/com/android/server/display/DisplayModeDirector.java +++ b/services/core/java/com/android/server/display/DisplayModeDirector.java @@ -69,6 +69,8 @@ public class DisplayModeDirector { private static final int MSG_LOW_BRIGHTNESS_THRESHOLDS_CHANGED = 2; private static final int MSG_DEFAULT_PEAK_REFRESH_RATE_CHANGED = 3; private static final int MSG_REFRESH_RATE_IN_LOW_ZONE_CHANGED = 4; + private static final int MSG_REFRESH_RATE_IN_HIGH_ZONE_CHANGED = 5; + private static final int MSG_HIGH_BRIGHTNESS_THRESHOLDS_CHANGED = 6; // Special ID used to indicate that given vote is to be applied globally, rather than to a // specific display. @@ -515,13 +517,6 @@ public class DisplayModeDirector { } } - @VisibleForTesting - void updateSettingForHighZone(int refreshRate, int[] brightnessThresholds, - int[] ambientThresholds) { - mBrightnessObserver.updateThresholdsRefreshRateForHighZone(refreshRate, - brightnessThresholds, ambientThresholds); - } - /** * Listens for changes refresh rate coordination. */ @@ -540,11 +535,35 @@ public class DisplayModeDirector { @Override public void handleMessage(Message msg) { switch (msg.what) { - case MSG_LOW_BRIGHTNESS_THRESHOLDS_CHANGED: + case MSG_LOW_BRIGHTNESS_THRESHOLDS_CHANGED: { Pair thresholds = (Pair) msg.obj; mBrightnessObserver.onDeviceConfigLowBrightnessThresholdsChanged( thresholds.first, thresholds.second); break; + } + + case MSG_REFRESH_RATE_IN_LOW_ZONE_CHANGED: { + int refreshRateInZone = msg.arg1; + mBrightnessObserver.onDeviceConfigRefreshRateInLowZoneChanged( + refreshRateInZone); + break; + } + + case MSG_HIGH_BRIGHTNESS_THRESHOLDS_CHANGED: { + Pair thresholds = (Pair) msg.obj; + + mBrightnessObserver.onDeviceConfigHighBrightnessThresholdsChanged( + thresholds.first, thresholds.second); + + break; + } + + case MSG_REFRESH_RATE_IN_HIGH_ZONE_CHANGED: { + int refreshRateInZone = msg.arg1; + mBrightnessObserver.onDeviceConfigRefreshRateInHighZoneChanged( + refreshRateInZone); + break; + } case MSG_DEFAULT_PEAK_REFRESH_RATE_CHANGED: Float defaultPeakRefreshRate = (Float) msg.obj; @@ -552,12 +571,6 @@ public class DisplayModeDirector { defaultPeakRefreshRate); break; - case MSG_REFRESH_RATE_IN_LOW_ZONE_CHANGED: - int refreshRateInZone = msg.arg1; - mBrightnessObserver.onDeviceConfigRefreshRateInLowZoneChanged( - refreshRateInZone); - break; - case MSG_REFRESH_RATE_RANGE_CHANGED: DesiredDisplayModeSpecsListener desiredDisplayModeSpecsListener = (DesiredDisplayModeSpecsListener) msg.obj; @@ -1220,13 +1233,6 @@ public class DisplayModeDirector { mLightSensor, LIGHT_SENSOR_RATE_MS * 1000, mHandler); } - public void updateThresholdsRefreshRateForHighZone(int refreshRate, - int[] brightnessThresholds, int[] ambientThresholds) { - mRefreshRateInHighZone = refreshRate; - mHighDisplayBrightnessThresholds = brightnessThresholds; - mHighAmbientBrightnessThresholds = ambientThresholds; - } - public void observe(SensorManager sensorManager) { mSensorManager = sensorManager; final ContentResolver cr = mContext.getContentResolver(); @@ -1246,7 +1252,22 @@ public class DisplayModeDirector { mLowAmbientBrightnessThresholds = lowAmbientBrightnessThresholds; } + + int[] highDisplayBrightnessThresholds = + mDeviceConfigDisplaySettings.getHighDisplayBrightnessThresholds(); + int[] highAmbientBrightnessThresholds = + mDeviceConfigDisplaySettings.getHighAmbientBrightnessThresholds(); + + if (highDisplayBrightnessThresholds != null && highAmbientBrightnessThresholds != null + && highDisplayBrightnessThresholds.length + == highAmbientBrightnessThresholds.length) { + mHighDisplayBrightnessThresholds = highDisplayBrightnessThresholds; + mHighAmbientBrightnessThresholds = highAmbientBrightnessThresholds; + } + mRefreshRateInLowZone = mDeviceConfigDisplaySettings.getRefreshRateInLowZone(); + mRefreshRateInHighZone = mDeviceConfigDisplaySettings.getRefreshRateInHighZone(); + restartObserver(); mDeviceConfigDisplaySettings.startListening(); } @@ -1293,6 +1314,29 @@ public class DisplayModeDirector { } } + public void onDeviceConfigHighBrightnessThresholdsChanged(int[] displayThresholds, + int[] ambientThresholds) { + if (displayThresholds != null && ambientThresholds != null + && displayThresholds.length == ambientThresholds.length) { + mHighDisplayBrightnessThresholds = displayThresholds; + mHighAmbientBrightnessThresholds = ambientThresholds; + } else { + // Invalid or empty. Use device default. + mHighDisplayBrightnessThresholds = mContext.getResources().getIntArray( + R.array.config_highDisplayBrightnessThresholdsOfFixedRefreshRate); + mHighAmbientBrightnessThresholds = mContext.getResources().getIntArray( + R.array.config_highAmbientBrightnessThresholdsOfFixedRefreshRate); + } + restartObserver(); + } + + public void onDeviceConfigRefreshRateInHighZoneChanged(int refreshRate) { + if (refreshRate != mRefreshRateInHighZone) { + mRefreshRateInHighZone = refreshRate; + restartObserver(); + } + } + public void dumpLocked(PrintWriter pw) { pw.println(" BrightnessObserver"); pw.println(" mAmbientLux: " + mAmbientLux); @@ -1668,7 +1712,7 @@ public class DisplayModeDirector { public int[] getLowDisplayBrightnessThresholds() { return getIntArrayProperty( DisplayManager.DeviceConfig. - KEY_PEAK_REFRESH_RATE_DISPLAY_BRIGHTNESS_THRESHOLDS); + KEY_FIXED_REFRESH_RATE_LOW_DISPLAY_BRIGHTNESS_THRESHOLDS); } /* @@ -1677,7 +1721,7 @@ public class DisplayModeDirector { public int[] getLowAmbientBrightnessThresholds() { return getIntArrayProperty( DisplayManager.DeviceConfig. - KEY_PEAK_REFRESH_RATE_AMBIENT_BRIGHTNESS_THRESHOLDS); + KEY_FIXED_REFRESH_RATE_LOW_AMBIENT_BRIGHTNESS_THRESHOLDS); } public int getRefreshRateInLowZone() { @@ -1686,7 +1730,37 @@ public class DisplayModeDirector { int refreshRate = mDeviceConfig.getInt( DeviceConfig.NAMESPACE_DISPLAY_MANAGER, - DisplayManager.DeviceConfig.KEY_REFRESH_RATE_IN_ZONE, + DisplayManager.DeviceConfig.KEY_REFRESH_RATE_IN_LOW_ZONE, + defaultRefreshRateInZone); + + return refreshRate; + } + + /* + * Return null if no such property or wrong format (not comma separated integers). + */ + public int[] getHighDisplayBrightnessThresholds() { + return getIntArrayProperty( + DisplayManager.DeviceConfig + .KEY_FIXED_REFRESH_RATE_HIGH_DISPLAY_BRIGHTNESS_THRESHOLDS); + } + + /* + * Return null if no such property or wrong format (not comma separated integers). + */ + public int[] getHighAmbientBrightnessThresholds() { + return getIntArrayProperty( + DisplayManager.DeviceConfig + .KEY_FIXED_REFRESH_RATE_HIGH_AMBIENT_BRIGHTNESS_THRESHOLDS); + } + + public int getRefreshRateInHighZone() { + int defaultRefreshRateInZone = mContext.getResources().getInteger( + R.integer.config_fixedRefreshRateInHighZone); + + int refreshRate = mDeviceConfig.getInt( + DeviceConfig.NAMESPACE_DISPLAY_MANAGER, + DisplayManager.DeviceConfig.KEY_REFRESH_RATE_IN_HIGH_ZONE, defaultRefreshRateInZone); return refreshRate; @@ -1721,6 +1795,16 @@ public class DisplayModeDirector { .sendToTarget(); mHandler.obtainMessage(MSG_REFRESH_RATE_IN_LOW_ZONE_CHANGED, refreshRateInLowZone, 0) .sendToTarget(); + + int[] highDisplayBrightnessThresholds = getHighDisplayBrightnessThresholds(); + int[] highAmbientBrightnessThresholds = getHighAmbientBrightnessThresholds(); + int refreshRateInHighZone = getRefreshRateInHighZone(); + + mHandler.obtainMessage(MSG_HIGH_BRIGHTNESS_THRESHOLDS_CHANGED, + new Pair<>(highDisplayBrightnessThresholds, highAmbientBrightnessThresholds)) + .sendToTarget(); + mHandler.obtainMessage(MSG_REFRESH_RATE_IN_HIGH_ZONE_CHANGED, refreshRateInHighZone, 0) + .sendToTarget(); } private int[] getIntArrayProperty(String prop) { diff --git a/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java b/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java index 4ee6a553b9d15..c467ee949aeba 100644 --- a/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java +++ b/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java @@ -16,9 +16,12 @@ package com.android.server.display; -import static android.hardware.display.DisplayManager.DeviceConfig.KEY_PEAK_REFRESH_RATE_AMBIENT_BRIGHTNESS_THRESHOLDS; -import static android.hardware.display.DisplayManager.DeviceConfig.KEY_PEAK_REFRESH_RATE_DISPLAY_BRIGHTNESS_THRESHOLDS; -import static android.hardware.display.DisplayManager.DeviceConfig.KEY_REFRESH_RATE_IN_ZONE; +import static android.hardware.display.DisplayManager.DeviceConfig.KEY_FIXED_REFRESH_RATE_HIGH_AMBIENT_BRIGHTNESS_THRESHOLDS; +import static android.hardware.display.DisplayManager.DeviceConfig.KEY_FIXED_REFRESH_RATE_HIGH_DISPLAY_BRIGHTNESS_THRESHOLDS; +import static android.hardware.display.DisplayManager.DeviceConfig.KEY_FIXED_REFRESH_RATE_LOW_AMBIENT_BRIGHTNESS_THRESHOLDS; +import static android.hardware.display.DisplayManager.DeviceConfig.KEY_FIXED_REFRESH_RATE_LOW_DISPLAY_BRIGHTNESS_THRESHOLDS; +import static android.hardware.display.DisplayManager.DeviceConfig.KEY_REFRESH_RATE_IN_HIGH_ZONE; +import static android.hardware.display.DisplayManager.DeviceConfig.KEY_REFRESH_RATE_IN_LOW_ZONE; import static com.android.server.display.DisplayModeDirector.Vote.PRIORITY_FLICKER; @@ -451,7 +454,11 @@ public class DisplayModeDirectorTest { setPeakRefreshRate(90 /*fps*/); director.getSettingsObserver().setDefaultRefreshRate(90); director.getBrightnessObserver().setDefaultDisplayState(true); - director.updateSettingForHighZone(60, new int[] {255}, new int[] {8000}); + + final FakeDeviceConfig config = mInjector.getDeviceConfig(); + config.setRefreshRateInHighZone(60); + config.setHighDisplayBrightnessThresholds(new int[] { 255 }); + config.setHighAmbientBrightnessThresholds(new int[] { 8000 }); Sensor lightSensor = createLightSensor(); SensorManager sensorManager = createMockSensorManager(lightSensor); @@ -508,7 +515,7 @@ public class DisplayModeDirectorTest { void setRefreshRateInLowZone(int fps) { putPropertyAndNotify( - DeviceConfig.NAMESPACE_DISPLAY_MANAGER, KEY_REFRESH_RATE_IN_ZONE, + DeviceConfig.NAMESPACE_DISPLAY_MANAGER, KEY_REFRESH_RATE_IN_LOW_ZONE, String.valueOf(fps)); } @@ -521,7 +528,7 @@ public class DisplayModeDirectorTest { putPropertyAndNotify( DeviceConfig.NAMESPACE_DISPLAY_MANAGER, - KEY_PEAK_REFRESH_RATE_DISPLAY_BRIGHTNESS_THRESHOLDS, + KEY_FIXED_REFRESH_RATE_LOW_DISPLAY_BRIGHTNESS_THRESHOLDS, thresholds); } @@ -534,7 +541,39 @@ public class DisplayModeDirectorTest { putPropertyAndNotify( DeviceConfig.NAMESPACE_DISPLAY_MANAGER, - KEY_PEAK_REFRESH_RATE_AMBIENT_BRIGHTNESS_THRESHOLDS, + KEY_FIXED_REFRESH_RATE_LOW_AMBIENT_BRIGHTNESS_THRESHOLDS, + thresholds); + } + + void setRefreshRateInHighZone(int fps) { + putPropertyAndNotify( + DeviceConfig.NAMESPACE_DISPLAY_MANAGER, KEY_REFRESH_RATE_IN_HIGH_ZONE, + String.valueOf(fps)); + } + + void setHighDisplayBrightnessThresholds(int[] brightnessThresholds) { + String thresholds = toPropertyValue(brightnessThresholds); + + if (DEBUG) { + Slog.e(TAG, "Brightness Thresholds = " + thresholds); + } + + putPropertyAndNotify( + DeviceConfig.NAMESPACE_DISPLAY_MANAGER, + KEY_FIXED_REFRESH_RATE_HIGH_DISPLAY_BRIGHTNESS_THRESHOLDS, + thresholds); + } + + void setHighAmbientBrightnessThresholds(int[] ambientThresholds) { + String thresholds = toPropertyValue(ambientThresholds); + + if (DEBUG) { + Slog.e(TAG, "Ambient Thresholds = " + thresholds); + } + + putPropertyAndNotify( + DeviceConfig.NAMESPACE_DISPLAY_MANAGER, + KEY_FIXED_REFRESH_RATE_HIGH_AMBIENT_BRIGHTNESS_THRESHOLDS, thresholds); } From 73ba11e97b3b31b0423fa37223d1bd13e9ecb4f2 Mon Sep 17 00:00:00 2001 From: raylinhsu Date: Fri, 15 Jan 2021 02:48:14 +0800 Subject: [PATCH 066/288] DO NOT MERGE "Fix the ambient lux which did not update for blocking zone" When the display enters doze mode, it should unregister the light sensor. It should register light sensor again when the display state change from doze to on otherwise we will lost lux information and then the refresh rate could not be locked. Bug: 177636374 Test: atest DisplayModeDirectorTest Test: no fps transition in the blocking zone when the display state change Test: check if the lux will update when the display state change Change-Id: Ib69314aaf716be38af605f8abcca139c4bdd33f1 --- .../server/display/DisplayModeDirector.java | 35 ++++++++++++---- .../display/DisplayModeDirectorTest.java | 42 ++++++++++++++++++- 2 files changed, 67 insertions(+), 10 deletions(-) diff --git a/services/core/java/com/android/server/display/DisplayModeDirector.java b/services/core/java/com/android/server/display/DisplayModeDirector.java index 02ee059194ec3..29a77e2b6ef23 100644 --- a/services/core/java/com/android/server/display/DisplayModeDirector.java +++ b/services/core/java/com/android/server/display/DisplayModeDirector.java @@ -52,9 +52,12 @@ import com.android.server.display.utils.AmbientFilterFactory; import com.android.server.utils.DeviceConfigInterface; import java.io.PrintWriter; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; +import java.util.Date; import java.util.List; +import java.util.Locale; import java.util.Objects; /** @@ -1160,7 +1163,8 @@ public class DisplayModeDirector { // mShouldObserveAmbientHighChange is true, screen is on, peak refresh rate // changeable and low power mode off. After initialization, these states will // be updated from the same handler thread. - private boolean mDefaultDisplayOn = false; + private int mDefaultDisplayState = Display.STATE_UNKNOWN; + private boolean mIsDeviceActive = false; private boolean mRefreshRateChangeable = false; private boolean mLowPowerModeEnabled = false; @@ -1341,7 +1345,8 @@ public class DisplayModeDirector { pw.println(" BrightnessObserver"); pw.println(" mAmbientLux: " + mAmbientLux); pw.println(" mBrightness: " + mBrightness); - pw.println(" mDefaultDisplayOn: " + mDefaultDisplayOn); + pw.println(" mDefaultDisplayState: " + mDefaultDisplayState); + pw.println(" mIsDeviceActive: " + mIsDeviceActive); pw.println(" mLowPowerModeEnabled: " + mLowPowerModeEnabled); pw.println(" mRefreshRateChangeable: " + mRefreshRateChangeable); pw.println(" mShouldObserveDisplayLowChange: " + mShouldObserveDisplayLowChange); @@ -1567,14 +1572,17 @@ public class DisplayModeDirector { private void updateDefaultDisplayState() { Display display = mContext.getSystemService(DisplayManager.class) .getDisplay(Display.DEFAULT_DISPLAY); - boolean defaultDisplayOn = display != null && display.getState() != Display.STATE_OFF; - setDefaultDisplayState(defaultDisplayOn); + if (display == null) { + return; + } + + setDefaultDisplayState(display.getState()); } @VisibleForTesting - public void setDefaultDisplayState(boolean on) { - if (mDefaultDisplayOn != on) { - mDefaultDisplayOn = on; + public void setDefaultDisplayState(int state) { + if (mDefaultDisplayState != state) { + mDefaultDisplayState = state; updateSensorStatus(); } } @@ -1595,15 +1603,19 @@ public class DisplayModeDirector { } private boolean isDeviceActive() { - return mDefaultDisplayOn && mInjector.isDeviceInteractive(mContext); + mIsDeviceActive = mInjector.isDeviceInteractive(mContext); + return (mDefaultDisplayState == Display.STATE_ON) + && mIsDeviceActive; } private final class LightSensorEventListener implements SensorEventListener { final private static int INJECT_EVENTS_INTERVAL_MS = LIGHT_SENSOR_RATE_MS; private float mLastSensorData; + private long mTimestamp; public void dumpLocked(PrintWriter pw) { pw.println(" mLastSensorData: " + mLastSensorData); + pw.println(" mTimestamp: " + formatTimestamp(mTimestamp)); } @Override @@ -1627,6 +1639,7 @@ public class DisplayModeDirector { } long now = SystemClock.uptimeMillis(); + mTimestamp = System.currentTimeMillis(); if (mAmbientFilter != null) { mAmbientFilter.addValue(now, mLastSensorData); } @@ -1653,6 +1666,12 @@ public class DisplayModeDirector { mHandler.removeCallbacks(mInjectSensorEventRunnable); } + private String formatTimestamp(long time) { + SimpleDateFormat dateFormat = + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.US); + return dateFormat.format(new Date(time)); + } + private void processSensorData(long now) { if (mAmbientFilter != null) { mAmbientLux = mAmbientFilter.getEstimate(now); diff --git a/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java b/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java index c467ee949aeba..e202145b7dbee 100644 --- a/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java +++ b/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java @@ -34,6 +34,7 @@ import static org.mockito.Mockito.any; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import static org.mockito.internal.verification.VerificationModeFactory.times; import android.annotation.NonNull; import android.content.ContentResolver; @@ -410,7 +411,7 @@ public class DisplayModeDirectorTest { createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0); setPeakRefreshRate(90); director.getSettingsObserver().setDefaultRefreshRate(90); - director.getBrightnessObserver().setDefaultDisplayState(true); + director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON); final FakeDeviceConfig config = mInjector.getDeviceConfig(); config.setRefreshRateInLowZone(90); @@ -453,7 +454,7 @@ public class DisplayModeDirectorTest { createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0); setPeakRefreshRate(90 /*fps*/); director.getSettingsObserver().setDefaultRefreshRate(90); - director.getBrightnessObserver().setDefaultDisplayState(true); + director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON); final FakeDeviceConfig config = mInjector.getDeviceConfig(); config.setRefreshRateInHighZone(60); @@ -490,6 +491,43 @@ public class DisplayModeDirectorTest { assertVoteForRefreshRateLocked(vote, 60 /*fps*/); } + @Test + public void testSensorRegistration() { + DisplayModeDirector director = + createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0); + setPeakRefreshRate(90 /*fps*/); + director.getSettingsObserver().setDefaultRefreshRate(90); + director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON); + + Sensor lightSensor = createLightSensor(); + SensorManager sensorManager = createMockSensorManager(lightSensor); + + director.start(sensorManager); + ArgumentCaptor listenerCaptor = + ArgumentCaptor.forClass(SensorEventListener.class); + Mockito.verify(sensorManager, Mockito.timeout(TimeUnit.SECONDS.toMillis(1))) + .registerListener( + listenerCaptor.capture(), + eq(lightSensor), + anyInt(), + any(Handler.class)); + + // Dispaly state changed from On to Doze + director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_DOZE); + Mockito.verify(sensorManager) + .unregisterListener(listenerCaptor.capture()); + + // Dispaly state changed from Doze to On + director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON); + Mockito.verify(sensorManager, times(2)) + .registerListener( + listenerCaptor.capture(), + eq(lightSensor), + anyInt(), + any(Handler.class)); + + } + private void assertVoteForRefreshRateLocked(Vote vote, float refreshRate) { assertThat(vote).isNotNull(); final DisplayModeDirector.RefreshRateRange expectedRange = From 9c4853d363603f44adbc7a257f5f5fbc7a2de880 Mon Sep 17 00:00:00 2001 From: Sungsoo Lim Date: Wed, 6 Jan 2021 02:59:37 +0000 Subject: [PATCH 067/288] Prevent multiple calls of ActivityThread.systemMain() Bug: 170591440 Test: manually Change-Id: Iba6d10e5203fa1c1f96c85e39a57483ee26e8111 (cherry picked from commit 8f2c59c0cba7a40adc6a8dac613566b1c43f9f6c) --- .../core/java/com/android/server/media/MediaShellCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/media/MediaShellCommand.java b/services/core/java/com/android/server/media/MediaShellCommand.java index 20df271a1de2a..b199325798f4b 100644 --- a/services/core/java/com/android/server/media/MediaShellCommand.java +++ b/services/core/java/com/android/server/media/MediaShellCommand.java @@ -64,7 +64,7 @@ public class MediaShellCommand extends ShellCommand { } if (sThread == null) { Looper.prepare(); - sThread = ActivityThread.systemMain(); + sThread = ActivityThread.currentActivityThread(); Context context = sThread.getSystemContext(); sMediaSessionManager = (MediaSessionManager) context.getSystemService(Context.MEDIA_SESSION_SERVICE); From 1f610b73f3114e8c675aea310b3121faee6acdaa Mon Sep 17 00:00:00 2001 From: Jack Yu Date: Fri, 15 Jan 2021 10:19:38 -0800 Subject: [PATCH 068/288] Temporary fix to prevent TEMPORARILY_NOT_METERED leak Currently we are seeing TEMPORARILY_NOT_METERED occurs on non-5G devices. This fix adds more checks to prevent incorrect TEMPORARILY_NOT_METERED being set. Before we root cause the issue, we only allow this bit when all of the following conditions met. 1. Devices should support 5G. 2. Carriers should support 5G unmetered data. 3. Device should camp on 5G network. This temporary fix should be removed after we root cause the issue. Bug: 176119724 Test: Manual Merged-In: I2b987d24851cdb16d8457b0ec5c546ace5485ed0 Change-Id: I2b987d24851cdb16d8457b0ec5c546ace5485ed0 --- .../java/android/telephony/CarrierConfigManager.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index 74b2aad5293e2..111ffe084ef1d 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -4082,6 +4082,13 @@ public class CarrierConfigManager { */ public static final String KEY_USE_ACS_FOR_RCS_BOOL = "use_acs_for_rcs_bool"; + /** + * Indicates temporarily unmetered mobile data is supported by the carrier. + * @hide + */ + public static final String KEY_NETWORK_TEMP_NOT_METERED_SUPPORTED_BOOL = + "network_temp_not_metered_supported_bool"; + /** The default value for every variable. */ private final static PersistableBundle sDefaults; @@ -4628,6 +4635,7 @@ public class CarrierConfigManager { sDefaults.putString(KEY_CALL_COMPOSER_PICTURE_SERVER_URL_STRING, ""); sDefaults.putBoolean(KEY_USE_LOWER_MTU_VALUE_IF_BOTH_RECEIVED, false); sDefaults.putBoolean(KEY_USE_ACS_FOR_RCS_BOOL, false); + sDefaults.putBoolean(KEY_NETWORK_TEMP_NOT_METERED_SUPPORTED_BOOL, false); } /** From 44f2b9a27b7522bfe73df816604691a8246caaca Mon Sep 17 00:00:00 2001 From: Yu-Han Yang Date: Fri, 15 Jan 2021 15:23:52 -0800 Subject: [PATCH 069/288] DO NOT MERGE: Do not inject mock location to chipset Bug: 177561690 Test: on device Change-Id: Icafbdf54fe807f8779377b13cb4e4eb265db692e --- .../com/android/server/location/GnssLocationProvider.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/services/core/java/com/android/server/location/GnssLocationProvider.java b/services/core/java/com/android/server/location/GnssLocationProvider.java index 342e9b8c3006b..491bba2272adc 100644 --- a/services/core/java/com/android/server/location/GnssLocationProvider.java +++ b/services/core/java/com/android/server/location/GnssLocationProvider.java @@ -805,6 +805,9 @@ public class GnssLocationProvider extends AbstractLocationProvider implements } private void injectBestLocation(Location location) { + if (location.isFromMockProvider()) { + return; + } if (DEBUG) { Log.d(TAG, "injectBestLocation: " + location); } @@ -911,6 +914,9 @@ public class GnssLocationProvider extends AbstractLocationProvider implements } private void handleUpdateLocation(Location location) { + if (location.isFromMockProvider()) { + return; + } if (location.hasAccuracy()) { if (DEBUG) { Log.d(TAG, "injectLocation: " + location); From abccd8f7bc76e19e92d2dfebe2247e97619f7234 Mon Sep 17 00:00:00 2001 From: Yu-Han Yang Date: Fri, 15 Jan 2021 14:24:09 -0800 Subject: [PATCH 070/288] DO NOT MERGE: Do not inject mock location to chipset Bug: 177561690 Test: on device Change-Id: Icafbdf54fe807f8779377b13cb4e4eb265db692e --- .../android/server/location/gnss/GnssLocationProvider.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/services/core/java/com/android/server/location/gnss/GnssLocationProvider.java b/services/core/java/com/android/server/location/gnss/GnssLocationProvider.java index a6a607e4ce66f..8d1d3afab5c5f 100644 --- a/services/core/java/com/android/server/location/gnss/GnssLocationProvider.java +++ b/services/core/java/com/android/server/location/gnss/GnssLocationProvider.java @@ -841,6 +841,9 @@ public class GnssLocationProvider extends AbstractLocationProvider implements } private void injectBestLocation(Location location) { + if (location.isFromMockProvider()) { + return; + } if (DEBUG) { Log.d(TAG, "injectBestLocation: " + location); } @@ -942,6 +945,9 @@ public class GnssLocationProvider extends AbstractLocationProvider implements } private void injectLocation(Location location) { + if (location.isFromMockProvider()) { + return; + } if (location.hasAccuracy()) { if (DEBUG) { Log.d(TAG, "injectLocation: " + location); From 2a8ab5efe7719336d46761f3fcc925c7fe43b440 Mon Sep 17 00:00:00 2001 From: Curtis Belmonte Date: Tue, 19 Jan 2021 16:07:30 -0800 Subject: [PATCH 071/288] Fix fingerprint dialog color contrast for dark theme The code to set the color of the help text shown on the fingerprint dialog does not currently check the context theme. This means that the wrong color is used when the system is using a dark theme. This commit fixes the issue by ensuring the appropriate themed color is used. Test: Manual 1. Turn on system dark theme (Settings > Display > Dark theme) 2. Trigger the fingerprint dialog (e.g. Wi-Fi > Network details > Share) Bug: 174831630 Change-Id: I41dfb536e72063ae8ea84d51fa0e50613f920090 Merged-In: I41dfb536e72063ae8ea84d51fa0e50613f920090 --- .../systemui/biometrics/AuthBiometricFaceView.java | 13 ++++++------- .../biometrics/AuthBiometricFingerprintView.java | 2 +- .../systemui/biometrics/AuthBiometricView.java | 8 ++++---- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFaceView.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFaceView.java index 1d47fc520ec2a..7daad1ca7e79d 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFaceView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFaceView.java @@ -160,12 +160,12 @@ public class AuthBiometricFaceView extends AuthBiometricView { @Override protected void handleResetAfterError() { - resetErrorView(mContext, mIndicatorView); + resetErrorView(); } @Override protected void handleResetAfterHelp() { - resetErrorView(mContext, mIndicatorView); + resetErrorView(); } @Override @@ -185,7 +185,7 @@ public class AuthBiometricFaceView extends AuthBiometricView { if (newState == STATE_AUTHENTICATING_ANIMATING_IN || (newState == STATE_AUTHENTICATING && mSize == AuthDialog.SIZE_MEDIUM)) { - resetErrorView(mContext, mIndicatorView); + resetErrorView(); } // Do this last since the state variable gets updated. @@ -204,9 +204,8 @@ public class AuthBiometricFaceView extends AuthBiometricView { super.onAuthenticationFailed(failureReason); } - static void resetErrorView(Context context, TextView textView) { - textView.setTextColor(context.getResources().getColor( - R.color.biometric_dialog_gray, context.getTheme())); - textView.setVisibility(View.INVISIBLE); + private void resetErrorView() { + mIndicatorView.setTextColor(mTextColorHint); + mIndicatorView.setVisibility(View.INVISIBLE); } } diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFingerprintView.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFingerprintView.java index 176e9e6b1c9bc..45ee4ad9ae501 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFingerprintView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFingerprintView.java @@ -78,7 +78,7 @@ public class AuthBiometricFingerprintView extends AuthBiometricView { private void showTouchSensorString() { mIndicatorView.setText(R.string.fingerprint_dialog_touch_sensor); - mIndicatorView.setTextColor(R.color.biometric_dialog_gray); + mIndicatorView.setTextColor(mTextColorHint); } private void updateIcon(int lastState, int newState) { diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricView.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricView.java index 7c25d28117939..f9c6d32d1d19b 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricView.java @@ -82,7 +82,7 @@ public abstract class AuthBiometricView extends LinearLayout { * Authenticated, dialog animating away soon. */ protected static final int STATE_AUTHENTICATED = 6; - + @Retention(RetentionPolicy.SOURCE) @IntDef({STATE_IDLE, STATE_AUTHENTICATING_ANIMATING_IN, STATE_AUTHENTICATING, STATE_HELP, STATE_ERROR, STATE_PENDING_CONFIRMATION, STATE_AUTHENTICATED}) @@ -155,8 +155,8 @@ public abstract class AuthBiometricView extends LinearLayout { private final Injector mInjector; private final Handler mHandler; private final AccessibilityManager mAccessibilityManager; - private final int mTextColorError; - private final int mTextColorHint; + protected final int mTextColorError; + protected final int mTextColorHint; private AuthPanelController mPanelController; private Bundle mBiometricPromptBundle; @@ -169,7 +169,7 @@ public abstract class AuthBiometricView extends LinearLayout { private TextView mSubtitleView; private TextView mDescriptionView; protected ImageView mIconView; - @VisibleForTesting protected TextView mIndicatorView; + protected TextView mIndicatorView; @VisibleForTesting Button mNegativeButton; @VisibleForTesting Button mPositiveButton; @VisibleForTesting Button mTryAgainButton; From 6e3806fc3417b29c1e33d908d150dcd737c5944e Mon Sep 17 00:00:00 2001 From: Beverly Date: Fri, 15 Jan 2021 12:17:02 -0500 Subject: [PATCH 072/288] Don't release WakeLock w/o active client Once we see the WakeLock isn't held, we should return before attempting to release a non-existent WakeLock. Bug: 168002974 Test: manual Change-Id: I0172c637d7f6f22888c126da42d4fd1fe45fe0db (cherry picked from commit 386c3fcc8f6678d330f72e900c40f890db9b76f4) --- .../src/com/android/systemui/util/wakelock/WakeLock.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/util/wakelock/WakeLock.java b/packages/SystemUI/src/com/android/systemui/util/wakelock/WakeLock.java index 08cd6e383897a..8d77c4a194a95 100644 --- a/packages/SystemUI/src/com/android/systemui/util/wakelock/WakeLock.java +++ b/packages/SystemUI/src/com/android/systemui/util/wakelock/WakeLock.java @@ -33,7 +33,7 @@ public interface WakeLock { static final String REASON_WRAP = "wrap"; /** - * Default wake-lock timeout, to avoid battery regressions. + * Default wake-lock timeout in milliseconds, to avoid battery regressions. */ long DEFAULT_MAX_TIMEOUT = 20000; @@ -104,6 +104,7 @@ public interface WakeLock { if (count == null) { Log.wtf(TAG, "Releasing WakeLock with invalid reason: " + why, new Throwable()); + return; } else if (count == 1) { mActiveClients.remove(why); } else { From bd6fc820a677f5d128149e1152c15ebb20780d33 Mon Sep 17 00:00:00 2001 From: Songchun Fan Date: Fri, 15 Jan 2021 16:15:00 -0800 Subject: [PATCH 073/288] [SettingsProvider] extend font size scale range As per requested in b/176940932#comment3 and b/156260178#comment32, extending the valid font size scale range to [0.25, 5]. Existing CTS tests still pass. BUG: 156260178 Test: atest android.provider.cts.settings.Settings_SystemTest Test: atest android.app.cts.ApplicationTest Change-Id: Icff82d727d63da4353342b0f9a5ca3c2ae1671c1 (cherry picked from commit df8852a0b596f28a4588f553a631fd7122fefac1) Merged-In: Icff82d727d63da4353342b0f9a5ca3c2ae1671c1 --- .../provider/settings/validators/SystemSettingsValidators.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java b/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java index cb610fc611421..bcde58494838a 100644 --- a/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java +++ b/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java @@ -89,7 +89,7 @@ public class SystemSettingsValidators { return value == null || value.length() < MAX_LENGTH; } }); - VALIDATORS.put(System.FONT_SCALE, new InclusiveFloatRangeValidator(0.85f, 1.3f)); + VALIDATORS.put(System.FONT_SCALE, new InclusiveFloatRangeValidator(0.25f, 5.0f)); VALIDATORS.put(System.DIM_SCREEN, BOOLEAN_VALIDATOR); VALIDATORS.put( System.DISPLAY_COLOR_MODE, From c0b28414d5cd686bf621fd71978699ec28177b21 Mon Sep 17 00:00:00 2001 From: Songchun Fan Date: Fri, 15 Jan 2021 16:15:00 -0800 Subject: [PATCH 074/288] [SettingsProvider] extend font size scale range As per requested in b/176940932#comment3 and b/156260178#comment32, extending the valid font size scale range to [0.25, 5]. Existing CTS tests still pass. BUG: 156260178 Test: atest android.provider.cts.settings.Settings_SystemTest Test: atest android.app.cts.ApplicationTest Change-Id: Icff82d727d63da4353342b0f9a5ca3c2ae1671c1 (cherry picked from commit df8852a0b596f28a4588f553a631fd7122fefac1) Merged-In: Icff82d727d63da4353342b0f9a5ca3c2ae1671c1 --- core/java/android/provider/Settings.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 344b053af2d82..c35cfcd4bbaa5 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -3401,7 +3401,7 @@ public final class Settings { public static final String FONT_SCALE = "font_scale"; private static final Validator FONT_SCALE_VALIDATOR = - new SettingsValidators.InclusiveFloatRangeValidator(0.85f, 1.3f); + new SettingsValidators.InclusiveFloatRangeValidator(0.25f, 5.0f); /** * The serialized system locale value. From 9b6c0faca38117dcc75ee1763f5488c9d92e4375 Mon Sep 17 00:00:00 2001 From: Songchun Fan Date: Fri, 15 Jan 2021 16:15:00 -0800 Subject: [PATCH 075/288] [SettingsProvider] extend font size scale range As per requested in b/176940932#comment3 and b/156260178#comment32, extending the valid font size scale range to [0.25, 5]. Existing CTS tests still pass. BUG: 156260178 Test: atest android.provider.cts.settings.Settings_SystemTest Test: atest android.app.cts.ApplicationTest Change-Id: Icff82d727d63da4353342b0f9a5ca3c2ae1671c1 (cherry picked from commit df8852a0b596f28a4588f553a631fd7122fefac1) Merged-In: Icff82d727d63da4353342b0f9a5ca3c2ae1671c1 --- .../provider/settings/validators/SystemSettingsValidators.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java b/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java index cb610fc611421..bcde58494838a 100644 --- a/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java +++ b/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java @@ -89,7 +89,7 @@ public class SystemSettingsValidators { return value == null || value.length() < MAX_LENGTH; } }); - VALIDATORS.put(System.FONT_SCALE, new InclusiveFloatRangeValidator(0.85f, 1.3f)); + VALIDATORS.put(System.FONT_SCALE, new InclusiveFloatRangeValidator(0.25f, 5.0f)); VALIDATORS.put(System.DIM_SCREEN, BOOLEAN_VALIDATOR); VALIDATORS.put( System.DISPLAY_COLOR_MODE, From b7d4c8098dfaf30ce6f4f4ea57a83457dcfbffb6 Mon Sep 17 00:00:00 2001 From: Songchun Fan Date: Fri, 15 Jan 2021 16:15:00 -0800 Subject: [PATCH 076/288] [SettingsProvider] extend font size scale range As per requested in b/176940932#comment3 and b/156260178#comment32, extending the valid font size scale range to [0.25, 5]. Existing CTS tests still pass. BUG: 156260178 Test: atest android.provider.cts.settings.Settings_SystemTest Test: atest android.app.cts.ApplicationTest Change-Id: Icff82d727d63da4353342b0f9a5ca3c2ae1671c1 (cherry picked from commit df8852a0b596f28a4588f553a631fd7122fefac1) Merged-In: Icff82d727d63da4353342b0f9a5ca3c2ae1671c1 --- core/java/android/provider/Settings.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index e8e25fafddad2..6f8088db5edd6 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -3418,7 +3418,7 @@ public final class Settings { public static final String FONT_SCALE = "font_scale"; private static final Validator FONT_SCALE_VALIDATOR = - new SettingsValidators.InclusiveFloatRangeValidator(0.85f, 1.3f); + new SettingsValidators.InclusiveFloatRangeValidator(0.25f, 5.0f); /** * The serialized system locale value. From 80a05232a04a5ef8df9f5e5fb0afd7471ea7eb38 Mon Sep 17 00:00:00 2001 From: Marco Ballesio Date: Wed, 6 Jan 2021 15:25:50 -0800 Subject: [PATCH 077/288] ActivityManager: don't freeze processes holding file locks As a temporary measure waiting for the more robust b/176927978 to be implemented, query the file lock status of processes prior freezing them, and skip freeze if any locks are held. Test: verified form the logs that processes holding file locks are not frozen Bug: 176928302 Change-Id: Ib7e1715effb63c1b304ce22a9451294fd9f7b10d Merged-In: Ib7e1715effb63c1b304ce22a9451294fd9f7b10d --- core/java/android/os/Process.java | 38 ++++++++ .../android/server/am/CachedAppOptimizer.java | 86 +++++++++++++------ 2 files changed, 97 insertions(+), 27 deletions(-) diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java index efea9537c4cfe..47598cf35974e 100644 --- a/core/java/android/os/Process.java +++ b/core/java/android/os/Process.java @@ -31,8 +31,12 @@ import dalvik.system.VMRuntime; import libcore.io.IoUtils; +import java.io.BufferedReader; import java.io.FileDescriptor; +import java.io.FileReader; +import java.io.IOException; import java.util.Map; +import java.util.StringTokenizer; import java.util.concurrent.TimeoutException; /** @@ -1393,4 +1397,38 @@ public class Process { } private static native int nativePidFdOpen(int pid, int flags) throws ErrnoException; + + /** + * Checks if a process corresponding to a specific pid owns any file locks. + * @param pid The process ID for which we want to know the existence of file locks. + * @return true If the process holds any file locks, false otherwise. + * @throws IOException if /proc/locks can't be accessed. + * + * @hide + */ + public static boolean hasFileLocks(int pid) throws IOException { + BufferedReader br = null; + + try { + br = new BufferedReader(new FileReader("/proc/locks")); + String line; + + while ((line = br.readLine()) != null) { + StringTokenizer st = new StringTokenizer(line); + + for (int i = 0; i < 5 && st.hasMoreTokens(); i++) { + String str = st.nextToken(); + if (i == 4 && Integer.parseInt(str) == pid) { + return true; + } + } + } + + return false; + } finally { + if (br != null) { + br.close(); + } + } + } } diff --git a/services/core/java/com/android/server/am/CachedAppOptimizer.java b/services/core/java/com/android/server/am/CachedAppOptimizer.java index 36d4a38c1624f..9eb7c07baaed3 100644 --- a/services/core/java/com/android/server/am/CachedAppOptimizer.java +++ b/services/core/java/com/android/server/am/CachedAppOptimizer.java @@ -1101,15 +1101,26 @@ public final class CachedAppOptimizer { } private void freezeProcess(ProcessRecord proc) { - final int pid; - final String name; + final int pid = proc.pid; + final String name = proc.processName; final long unfrozenDuration; final boolean frozen; - synchronized (mAm) { - pid = proc.pid; - name = proc.processName; + try { + // pre-check for locks to avoid unnecessary freeze/unfreeze operations + if (Process.hasFileLocks(pid)) { + if (DEBUG_FREEZER) { + Slog.d(TAG_AM, name + " (" + pid + ") holds file locks, not freezing"); + } + return; + } + } catch (IOException e) { + Slog.e(TAG_AM, "Not freezing. Unable to check file locks for " + name + "(" + pid + + "): " + e); + return; + } + synchronized (mAm) { if (proc.curAdj < ProcessList.CACHED_APP_MIN_ADJ || proc.shouldNotFreeze) { if (DEBUG_FREEZER) { @@ -1141,29 +1152,50 @@ public final class CachedAppOptimizer { frozen = proc.frozen; } - if (frozen) { - if (DEBUG_FREEZER) { - Slog.d(TAG_AM, "froze " + pid + " " + name); + if (!frozen) { + return; + } + + + if (DEBUG_FREEZER) { + Slog.d(TAG_AM, "froze " + pid + " " + name); + } + + EventLog.writeEvent(EventLogTags.AM_FREEZE, pid, name); + + try { + freezeBinder(pid, true); + } catch (RuntimeException e) { + Slog.e(TAG_AM, "Unable to freeze binder for " + pid + " " + name); + proc.kill("Unable to freeze binder interface", + ApplicationExitInfo.REASON_OTHER, + ApplicationExitInfo.SUBREASON_INVALID_STATE, true); + } + + // See above for why we're not taking mPhenotypeFlagLock here + if (mRandom.nextFloat() < mFreezerStatsdSampleRate) { + FrameworkStatsLog.write(FrameworkStatsLog.APP_FREEZE_CHANGED, + FrameworkStatsLog.APP_FREEZE_CHANGED__ACTION__FREEZE_APP, + pid, + name, + unfrozenDuration); + } + + try { + // post-check to prevent races + if (Process.hasFileLocks(pid)) { + if (DEBUG_FREEZER) { + Slog.d(TAG_AM, name + " (" + pid + ") holds file locks, reverting freeze"); + } + + synchronized (mAm) { + unfreezeAppLocked(proc); + } } - - EventLog.writeEvent(EventLogTags.AM_FREEZE, pid, name); - - try { - freezeBinder(pid, true); - } catch (RuntimeException e) { - Slog.e(TAG_AM, "Unable to freeze binder for " + pid + " " + name); - proc.kill("Unable to freeze binder interface", - ApplicationExitInfo.REASON_OTHER, - ApplicationExitInfo.SUBREASON_INVALID_STATE, true); - } - - // See above for why we're not taking mPhenotypeFlagLock here - if (mRandom.nextFloat() < mFreezerStatsdSampleRate) { - FrameworkStatsLog.write(FrameworkStatsLog.APP_FREEZE_CHANGED, - FrameworkStatsLog.APP_FREEZE_CHANGED__ACTION__FREEZE_APP, - pid, - name, - unfrozenDuration); + } catch (IOException e) { + Slog.e(TAG_AM, "Unable to check file locks for " + name + "(" + pid + "): " + e); + synchronized (mAm) { + unfreezeAppLocked(proc); } } } From c7f94ac6347aaa77f890d1b382177968d2581894 Mon Sep 17 00:00:00 2001 From: Tej Singh Date: Thu, 10 Sep 2020 23:20:58 -0700 Subject: [PATCH 078/288] Fix thread safety issue on clearing cache Historically, we havent held a lock on ForceClearCache and ClearCacheIfNecessary. This is not thread safe because kAllPullAtomInfo must be accessed in a lock, especially now that pullers can be registered/unregistered. Test: atest statsd_test, wrote a repro cl. Bug: 168156854 Bug: 173552790 Change-Id: I47d53a6d9d274bca4c78dbfd87e0097091b7b8cb Merged-In: I47d53a6d9d274bca4c78dbfd87e0097091b7b8cb (cherry picked from commit f9a4bb18ffa1605cced3ee4b161675a0c88941be) --- cmds/statsd/src/external/StatsPullerManager.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmds/statsd/src/external/StatsPullerManager.cpp b/cmds/statsd/src/external/StatsPullerManager.cpp index 8a9ec7456e557..99c39f6017b18 100644 --- a/cmds/statsd/src/external/StatsPullerManager.cpp +++ b/cmds/statsd/src/external/StatsPullerManager.cpp @@ -334,6 +334,7 @@ void StatsPullerManager::OnAlarmFired(int64_t elapsedTimeNs) { } int StatsPullerManager::ForceClearPullerCache() { + std::lock_guard _l(mLock); int totalCleared = 0; for (const auto& pulledAtom : kAllPullAtomInfo) { totalCleared += pulledAtom.second->ForceClearCache(); @@ -342,6 +343,7 @@ int StatsPullerManager::ForceClearPullerCache() { } int StatsPullerManager::ClearPullerCacheIfNecessary(int64_t timestampNs) { + std::lock_guard _l(mLock); int totalCleared = 0; for (const auto& pulledAtom : kAllPullAtomInfo) { totalCleared += pulledAtom.second->ClearCacheIfNecessary(timestampNs); From db097214b109be7ca1b3ae470d4a8354c98a5b62 Mon Sep 17 00:00:00 2001 From: Tej Singh Date: Thu, 10 Sep 2020 23:20:58 -0700 Subject: [PATCH 079/288] Fix thread safety issue on clearing cache Historically, we havent held a lock on ForceClearCache and ClearCacheIfNecessary. This is not thread safe because kAllPullAtomInfo must be accessed in a lock, especially now that pullers can be registered/unregistered. Test: atest statsd_test, wrote a repro cl. Bug: 168156854 Bug: 173552790 Change-Id: I47d53a6d9d274bca4c78dbfd87e0097091b7b8cb Merged-In: I47d53a6d9d274bca4c78dbfd87e0097091b7b8cb Merged-In: I8bee7a0a6acecc1274d5acc0adb44c5dde8862e4 (cherry picked from commit f9a4bb18ffa1605cced3ee4b161675a0c88941be) --- cmds/statsd/src/external/StatsPullerManager.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmds/statsd/src/external/StatsPullerManager.cpp b/cmds/statsd/src/external/StatsPullerManager.cpp index 8a9ec7456e557..99c39f6017b18 100644 --- a/cmds/statsd/src/external/StatsPullerManager.cpp +++ b/cmds/statsd/src/external/StatsPullerManager.cpp @@ -334,6 +334,7 @@ void StatsPullerManager::OnAlarmFired(int64_t elapsedTimeNs) { } int StatsPullerManager::ForceClearPullerCache() { + std::lock_guard _l(mLock); int totalCleared = 0; for (const auto& pulledAtom : kAllPullAtomInfo) { totalCleared += pulledAtom.second->ForceClearCache(); @@ -342,6 +343,7 @@ int StatsPullerManager::ForceClearPullerCache() { } int StatsPullerManager::ClearPullerCacheIfNecessary(int64_t timestampNs) { + std::lock_guard _l(mLock); int totalCleared = 0; for (const auto& pulledAtom : kAllPullAtomInfo) { totalCleared += pulledAtom.second->ClearCacheIfNecessary(timestampNs); From ea53b4ef65b4294bcc248bfbc02ed252726e0bab Mon Sep 17 00:00:00 2001 From: Jack Yu Date: Tue, 19 Jan 2021 11:09:32 -0800 Subject: [PATCH 080/288] Enabled TEMP_NOT_METERED support for carriers Enabled TEMP_NOT_METERED support for carriers by default. Bug: 176119724 Test: Manual Change-Id: Ie0323a354c89abf1a0effa0b65cde3b4d010115e --- telephony/java/android/telephony/CarrierConfigManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index ec7a20c5ca3f9..17467ec65fd2e 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -4647,7 +4647,7 @@ public class CarrierConfigManager { sDefaults.putString(KEY_CALL_COMPOSER_PICTURE_SERVER_URL_STRING, ""); sDefaults.putBoolean(KEY_USE_LOWER_MTU_VALUE_IF_BOTH_RECEIVED, false); sDefaults.putBoolean(KEY_USE_ACS_FOR_RCS_BOOL, false); - sDefaults.putBoolean(KEY_NETWORK_TEMP_NOT_METERED_SUPPORTED_BOOL, false); + sDefaults.putBoolean(KEY_NETWORK_TEMP_NOT_METERED_SUPPORTED_BOOL, true); sDefaults.putInt(KEY_DEFAULT_RTT_MODE_INT, 0); } From ffdc3f06340b81efeab012867ca0c0b94709a96c Mon Sep 17 00:00:00 2001 From: Keun young Park Date: Mon, 11 Jan 2021 15:30:52 -0800 Subject: [PATCH 081/288] Change target package for com.android.car.shell - It now overrides shell package itself Bug: 177099512 Test: Check if shell package has all necessary permissions Change-Id: I139b47fcb2992e42da020aaac8680ae8dd2efac0 Merged-In: I139b47fcb2992e42da020aaac8680ae8dd2efac0 (cherry picked from commit 2bd010b7e5782b13e19de189fca3e836b83b6e17) --- data/etc/car/com.android.car.shell.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/data/etc/car/com.android.car.shell.xml b/data/etc/car/com.android.car.shell.xml index 32666c8d9f68b..6132d53b4651c 100644 --- a/data/etc/car/com.android.car.shell.xml +++ b/data/etc/car/com.android.car.shell.xml @@ -15,7 +15,9 @@ ~ limitations under the License --> - + + From 47bc43a414e6c4ec4effd01802591b59410a16ab Mon Sep 17 00:00:00 2001 From: Keun young Park Date: Fri, 8 Jan 2021 17:21:36 -0800 Subject: [PATCH 082/288] add Shell-package-library to allow product type level update - Car proeducts add additional car permissions to shell package for use cases like CTS - This CL will allow overriding the Shell package rather than adding one more package with shared shell uid Bug: 177099512 Test: Check added package when built in car product. Change-Id: I6e9103c3275cb2e6df5dc586588eccd7d2ab6b06 Merged-In: I6e9103c3275cb2e6df5dc586588eccd7d2ab6b06 (cherry picked from commit bd16eb5267759cbf0727536d437eee52f7693f33) --- packages/Shell/Android.bp | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/packages/Shell/Android.bp b/packages/Shell/Android.bp index aaaf0448fc317..c51fb56464b08 100644 --- a/packages/Shell/Android.bp +++ b/packages/Shell/Android.bp @@ -1,10 +1,14 @@ +// used both for the android_app and android_library +shell_srcs = ["src/**/*.java",":dumpstate_aidl"] +shell_static_libs = ["androidx.legacy_legacy-support-v4"] + android_app { name: "Shell", - srcs: ["src/**/*.java",":dumpstate_aidl"], + srcs: shell_srcs, aidl: { include_dirs: ["frameworks/native/cmds/dumpstate/binder"], }, - static_libs: ["androidx.legacy_legacy-support-v4"], + static_libs: shell_static_libs, platform_apis: true, certificate: "platform", privileged: true, @@ -12,3 +16,17 @@ android_app { include_filter: ["com.android.shell.*"], }, } + +// A library for product type like auto to create a new shell package +// with product specific permissions. +android_library { + name: "Shell-package-library", + srcs: shell_srcs, + aidl: { + include_dirs: ["frameworks/native/cmds/dumpstate/binder"], + }, + resource_dirs: ["res"], + static_libs: shell_static_libs, + platform_apis: true, + manifest: "AndroidManifest.xml", +} From 8cfbb12fd4f6ef909ce1af8668990ad5625a224d Mon Sep 17 00:00:00 2001 From: Jack Yu Date: Tue, 19 Jan 2021 11:09:32 -0800 Subject: [PATCH 083/288] Enabled TEMP_NOT_METERED support for carriers Enabled TEMP_NOT_METERED support for carriers by default. Bug: 176119724 Test: Manual Merged-In: Ie0323a354c89abf1a0effa0b65cde3b4d010115e Change-Id: Ie0323a354c89abf1a0effa0b65cde3b4d010115e --- telephony/java/android/telephony/CarrierConfigManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index 6f10af1940a2c..1762eb7ee7835 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -4473,7 +4473,7 @@ public class CarrierConfigManager { sDefaults.putBoolean(KEY_DISABLE_DUN_APN_WHILE_ROAMING_WITH_PRESET_APN_BOOL, false); sDefaults.putString(KEY_DEFAULT_PREFERRED_APN_NAME_STRING, ""); sDefaults.putBoolean(KEY_USE_LOWER_MTU_VALUE_IF_BOTH_RECEIVED, false); - sDefaults.putBoolean(KEY_NETWORK_TEMP_NOT_METERED_SUPPORTED_BOOL, false); + sDefaults.putBoolean(KEY_NETWORK_TEMP_NOT_METERED_SUPPORTED_BOOL, true); } /** From 344efe80a96ba804533f0fc7c17a02ee8ffaaf2d Mon Sep 17 00:00:00 2001 From: Heemin Seog Date: Thu, 3 Dec 2020 09:48:33 -0800 Subject: [PATCH 084/288] DO NOT MERGE Do not update bar control target when application is starting Handling the bar control target even when the application is starting causes there to be a flicker in system bar visibility when switching from one immersive mode app to another immersive mode app. Bug: 149312861 Test: manual Change-Id: If5de2ff97d4ad177e5fc58baa82b3f43ed118c2e --- services/core/java/com/android/server/wm/InsetsPolicy.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/services/core/java/com/android/server/wm/InsetsPolicy.java b/services/core/java/com/android/server/wm/InsetsPolicy.java index fd67db1d5cc9f..a6a44a9f68e69 100644 --- a/services/core/java/com/android/server/wm/InsetsPolicy.java +++ b/services/core/java/com/android/server/wm/InsetsPolicy.java @@ -27,6 +27,7 @@ import static android.view.InsetsState.ITYPE_STATUS_BAR; import static android.view.SyncRtSurfaceTransactionApplier.applyParams; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_SHOW_STATUS_BAR; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_STATUS_FORCE_SHOW_NAVIGATION; +import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING; import android.annotation.Nullable; import android.app.StatusBarManager; @@ -127,6 +128,9 @@ class InsetsPolicy { /** Updates the target which can control system bars. */ void updateBarControlTarget(@Nullable WindowState focusedWin) { + if (focusedWin != null && (focusedWin.mAttrs.type == TYPE_APPLICATION_STARTING)) { + return; + } if (mFocusedWin != focusedWin){ abortTransient(); } From 0eea704510c873d1a6160d57c4d09d11cf080879 Mon Sep 17 00:00:00 2001 From: Marco Ballesio Date: Wed, 20 Jan 2021 17:26:43 -0800 Subject: [PATCH 085/288] freezer: increase timeout to 5 mins Some apps might still be performing leftover work after being backgrounded. Considering possible latencies due to CPU preemption, and in the effort to reduce the impact the app freezer has on legacy apps by allowing them to a significant grace period, extend the freezer timeout to 5 mins. Bug: 178023335 Test: manually verified that freeze time is increased to 5 minutes Change-Id: I74c14288a66e9a54850c0ea2b70ef3b915c2ca82 --- .../core/java/com/android/server/am/CachedAppOptimizer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/am/CachedAppOptimizer.java b/services/core/java/com/android/server/am/CachedAppOptimizer.java index 9eb7c07baaed3..dd09a1c856826 100644 --- a/services/core/java/com/android/server/am/CachedAppOptimizer.java +++ b/services/core/java/com/android/server/am/CachedAppOptimizer.java @@ -133,7 +133,7 @@ public final class CachedAppOptimizer { static final int REPORT_UNFREEZE_MSG = 4; //TODO:change this static definition into a configurable flag. - static final int FREEZE_TIMEOUT_MS = 10000; + static final long FREEZE_TIMEOUT_MS = 600000; static final int DO_FREEZE = 1; static final int REPORT_UNFREEZE = 2; From 25aa649c3e29720466aa467fbed2a317fa78379d Mon Sep 17 00:00:00 2001 From: Dan Harms Date: Wed, 20 Jan 2021 12:27:36 -0800 Subject: [PATCH 086/288] Remove bundled CompanionDeviceSupport permissions Bug: 160037666 Test: Compiles Change-Id: I955916f97815fb55a4e701f69a01a975e0d0c205 Merged-In: Ib96198a39c18a0b9c3cf64c0c58c89b1a5b62c19 --- data/etc/car/Android.bp | 7 ------ ...com.android.car.companiondevicesupport.xml | 24 ------------------- 2 files changed, 31 deletions(-) delete mode 100644 data/etc/car/com.android.car.companiondevicesupport.xml diff --git a/data/etc/car/Android.bp b/data/etc/car/Android.bp index 3c990abaec871..458ac128b196c 100644 --- a/data/etc/car/Android.bp +++ b/data/etc/car/Android.bp @@ -128,13 +128,6 @@ prebuilt_etc { filename_from_src: true, } -prebuilt_etc { - name: "privapp_whitelist_com.android.car.companiondevicesupport", - sub_dir: "permissions", - src: "com.android.car.companiondevicesupport.xml", - filename_from_src: true, -} - prebuilt_etc { name: "privapp_whitelist_com.google.android.car.kitchensink", sub_dir: "permissions", diff --git a/data/etc/car/com.android.car.companiondevicesupport.xml b/data/etc/car/com.android.car.companiondevicesupport.xml deleted file mode 100644 index 2067bab20d3d5..0000000000000 --- a/data/etc/car/com.android.car.companiondevicesupport.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - From 579b74d5cbb08b8dd3461f484cdebcbd9e64c656 Mon Sep 17 00:00:00 2001 From: Yu-Han Yang Date: Fri, 15 Jan 2021 16:11:40 -0800 Subject: [PATCH 087/288] DO NOT MERGE: Do not inject mock location to chipset Bug: 177561690 Test: on device Change-Id: Icafbdf54fe807f8779377b13cb4e4eb265db692e --- .../com/android/server/location/GnssLocationProvider.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/services/core/java/com/android/server/location/GnssLocationProvider.java b/services/core/java/com/android/server/location/GnssLocationProvider.java index 59a7cc8c04cb5..7d6b4026b6a73 100644 --- a/services/core/java/com/android/server/location/GnssLocationProvider.java +++ b/services/core/java/com/android/server/location/GnssLocationProvider.java @@ -1047,6 +1047,9 @@ public class GnssLocationProvider implements LocationProviderInterface, InjectNt } private void injectBestLocation(Location location) { + if (location.isFromMockProvider()) { + return; + } int gnssLocationFlags = LOCATION_HAS_LAT_LONG | (location.hasAltitude() ? LOCATION_HAS_ALTITUDE : 0) | (location.hasSpeed() ? LOCATION_HAS_SPEED : 0) | @@ -1141,6 +1144,9 @@ public class GnssLocationProvider implements LocationProviderInterface, InjectNt } private void handleUpdateLocation(Location location) { + if (location.isFromMockProvider()) { + return; + } if (location.hasAccuracy()) { native_inject_location(location.getLatitude(), location.getLongitude(), location.getAccuracy()); From 03fb6e49ae0abbf844f080d484efc837bab69c52 Mon Sep 17 00:00:00 2001 From: Hall Liu Date: Fri, 22 Jan 2021 16:06:50 -0800 Subject: [PATCH 088/288] Allow carriers to configure RTT while roaming Add a carrier config key that makes RTT supported even if roaming. Fixes: 168676696 Test: manual Change-Id: Ied2418cdec57d2d405d4ed0f0227a251ecd626cf Merged-In: Ied2418cdec57d2d405d4ed0f0227a251ecd626cf --- .../java/android/telephony/CarrierConfigManager.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index 1762eb7ee7835..3eedce6523105 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -3935,6 +3935,13 @@ public class CarrierConfigManager { public static final String KEY_NETWORK_TEMP_NOT_METERED_SUPPORTED_BOOL = "network_temp_not_metered_supported_bool"; + /** + * Indicates whether RTT is supported while roaming. + * @hide + */ + public static final String KEY_RTT_SUPPORTED_WHILE_ROAMING_BOOL = + "rtt_supported_while_roaming_bool"; + /** The default value for every variable. */ private final static PersistableBundle sDefaults; @@ -4290,6 +4297,7 @@ public class CarrierConfigManager { sDefaults.putBoolean(KEY_RTT_SUPPORTED_BOOL, false); sDefaults.putBoolean(KEY_TTY_SUPPORTED_BOOL, true); sDefaults.putBoolean(KEY_HIDE_TTY_HCO_VCO_WITH_RTT_BOOL, false); + sDefaults.putBoolean(KEY_RTT_SUPPORTED_WHILE_ROAMING_BOOL, false); sDefaults.putBoolean(KEY_DISABLE_CHARGE_INDICATION_BOOL, false); sDefaults.putBoolean(KEY_SUPPORT_NO_REPLY_TIMER_FOR_CFNRY_BOOL, true); sDefaults.putStringArray(KEY_FEATURE_ACCESS_CODES_STRING_ARRAY, null); From bbebaf7a10f1974318adfa7c923b068c96d164bf Mon Sep 17 00:00:00 2001 From: Marco Ballesio Date: Tue, 26 Jan 2021 09:49:23 -0800 Subject: [PATCH 089/288] ActivityManagerService: all users can handle freezer state in debug builds Processes whose proxy maps exceed CRASH_AT_SIZE might need to disable the freezer prior dumping their binding for debug purposes. This happens on builds with the IS_DEBUGGABLE flag set, so ActivityManager needs to allow freezer state toggling from any user in this case. Bug: 178037173 Test: booted device with userdebug, forced interface dumps from all binder proxies with no crashes. Change-Id: Ib1f5c7f6ad2b404d56fef566b3d9f17730592762 --- .../core/java/com/android/server/am/ActivityManagerService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 3f4878e380291..0f6c8fe55d144 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -20367,7 +20367,7 @@ public class ActivityManagerService extends IActivityManager.Stub int callerUid = Binder.getCallingUid(); // Only system can toggle the freezer state - if (callerUid == SYSTEM_UID) { + if (callerUid == SYSTEM_UID || Build.IS_DEBUGGABLE) { return mOomAdjuster.mCachedAppOptimizer.enableFreezer(enable); } else { throw new SecurityException("Caller uid " + callerUid + " cannot set freezer state "); From 2cd616165c6de4d523637cd84eb0c7490415beb6 Mon Sep 17 00:00:00 2001 From: Dmitry Dementyev Date: Wed, 9 Dec 2020 16:21:32 -0800 Subject: [PATCH 090/288] Add IMMUTABLE flag to AccountManager pending intents. Bug: 174189215,177931355 Test: none Change-Id: I11c81ce4cfb0f51a2fabf92a45d8425647df2121 (cherry picked from commit 7e615a523cd5dae44a7d2b949319f53e6480194e) --- .../com/android/server/accounts/AccountManagerService.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/accounts/AccountManagerService.java b/services/core/java/com/android/server/accounts/AccountManagerService.java index 27c3ff1b4c096..2e04f9c2bcd1b 100644 --- a/services/core/java/com/android/server/accounts/AccountManagerService.java +++ b/services/core/java/com/android/server/accounts/AccountManagerService.java @@ -3071,7 +3071,8 @@ public class AccountManagerService .setContentTitle(title) .setContentText(subtitle) .setContentIntent(PendingIntent.getActivityAsUser(mContext, 0, intent, - PendingIntent.FLAG_CANCEL_CURRENT, null, user)) + PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE, + null, user)) .build(); installNotification(getCredentialPermissionNotificationId( account, authTokenType, uid), n, packageName, user.getIdentifier()); @@ -5293,7 +5294,8 @@ public class AccountManagerService .setContentTitle(String.format(notificationTitleFormat, account.name)) .setContentText(message) .setContentIntent(PendingIntent.getActivityAsUser( - mContext, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT, + mContext, 0, intent, + PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE, null, new UserHandle(userId))) .build(); installNotification(id, n, packageName, userId); From 2f5e1b400449eee83ae87e0a5a9d9a509196d3d9 Mon Sep 17 00:00:00 2001 From: Heemin Seog Date: Tue, 26 Jan 2021 18:10:56 -0800 Subject: [PATCH 091/288] DO NOT MERGE Handle back button for notification panel Bug: 178504029 Test: manual Change-Id: If44048ab1772b85d13aa1f96a23eded896c53883 --- .../NotificationPanelViewController.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java index fd804c71c9d0a..b83fcf4bf8b5c 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java @@ -28,6 +28,7 @@ import android.os.IBinder; import android.os.RemoteException; import android.util.Log; import android.view.GestureDetector; +import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; @@ -245,6 +246,17 @@ public class NotificationPanelViewController extends OverlayPanelViewController mNotificationView = (CarNotificationView) LayoutInflater.from(mContext).inflate( R.layout.notification_center_activity, container, /* attachToRoot= */ false); + mNotificationView.setKeyEventHandler( + event -> { + if (event.getKeyCode() != KeyEvent.KEYCODE_BACK) { + return false; + } + + if (event.getAction() == KeyEvent.ACTION_UP && isPanelExpanded()) { + toggle(); + } + return true; + }); container.addView(mNotificationView); onNotificationViewInflated(); From 05f7aef1b07665aa10aab535613a8457296279a3 Mon Sep 17 00:00:00 2001 From: Miranda Kephart Date: Mon, 16 Nov 2020 11:22:13 -0500 Subject: [PATCH 092/288] [DO NOT MERGE] Close screenshot process on user switched Currently, we keep the process up even if the user switches, meaning that in some cases (if the user is switched while the screenshot UI is up) we will save images to the wrong profile. This change makes ScreenshotHelper listen for user switches and close the screenshot service, so that a new screenshot is guaranteed to be constructed with the correct user's context. Bug: 170474245 Fix: 170474245 Test: manual -- verified bad state occurs if user switches within the timeout period, ensured that screenshots work immediately after switching with this change. Change-Id: I9d32d0928e6c2bda161d04555438d0dd7afef0ba (cherry picked from commit 7ef1a5dd1506075507412626f2533283d9520144) --- .../internal/util/ScreenshotHelper.java | 42 ++++++++++++++----- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/core/java/com/android/internal/util/ScreenshotHelper.java b/core/java/com/android/internal/util/ScreenshotHelper.java index a23fc4b57b457..7ee846e9d8c11 100644 --- a/core/java/com/android/internal/util/ScreenshotHelper.java +++ b/core/java/com/android/internal/util/ScreenshotHelper.java @@ -1,12 +1,15 @@ package com.android.internal.util; +import static android.content.Intent.ACTION_USER_SWITCHED; import static android.view.WindowManager.ScreenshotSource.SCREENSHOT_OTHER; import android.annotation.NonNull; import android.annotation.Nullable; +import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.content.ServiceConnection; import android.graphics.Insets; import android.graphics.Rect; @@ -161,8 +164,21 @@ public class ScreenshotHelper { private ServiceConnection mScreenshotConnection = null; private final Context mContext; + private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + synchronized (mScreenshotLock) { + if (ACTION_USER_SWITCHED.equals(intent.getAction())) { + resetConnection(); + } + } + } + }; + public ScreenshotHelper(Context context) { mContext = context; + IntentFilter filter = new IntentFilter(ACTION_USER_SWITCHED); + mContext.registerReceiver(mBroadcastReceiver, filter); } /** @@ -279,9 +295,8 @@ public class ScreenshotHelper { final Runnable mScreenshotTimeout = () -> { synchronized (mScreenshotLock) { if (mScreenshotConnection != null) { - mContext.unbindService(mScreenshotConnection); - mScreenshotConnection = null; - mScreenshotService = null; + Log.e(TAG, "Timed out before getting screenshot capture response"); + resetConnection(); notifyScreenshotError(); } } @@ -304,11 +319,7 @@ public class ScreenshotHelper { break; case SCREENSHOT_MSG_PROCESS_COMPLETE: synchronized (mScreenshotLock) { - if (mScreenshotConnection != null) { - mContext.unbindService(mScreenshotConnection); - mScreenshotConnection = null; - mScreenshotService = null; - } + resetConnection(); } break; } @@ -348,9 +359,7 @@ public class ScreenshotHelper { public void onServiceDisconnected(ComponentName name) { synchronized (mScreenshotLock) { if (mScreenshotConnection != null) { - mContext.unbindService(mScreenshotConnection); - mScreenshotConnection = null; - mScreenshotService = null; + resetConnection(); // only log an error if we're still within the timeout period if (handler.hasCallbacks(mScreenshotTimeout)) { handler.removeCallbacks(mScreenshotTimeout); @@ -382,6 +391,17 @@ public class ScreenshotHelper { } } + /** + * Unbinds the current screenshot connection (if any). + */ + private void resetConnection() { + if (mScreenshotConnection != null) { + mContext.unbindService(mScreenshotConnection); + mScreenshotConnection = null; + mScreenshotService = null; + } + } + /** * Notifies the screenshot service to show an error. */ From 334a66342c799018f25c015c54a2c2c017e1ec36 Mon Sep 17 00:00:00 2001 From: Lorenzo Colitti Date: Mon, 16 Nov 2020 10:11:12 +0900 Subject: [PATCH 093/288] Test a VPN with an underlying network that does not yet exist. This test checks that if a VPN declares an underlying network that does not exist, the capabilities of that network are applied to the VPN as soon as the network starts to exist. Bug: 172870110 Test: test-only change Change-Id: Icc0701cb4cea7d91f7738c1e426e94cd26686b74 Merged-In: Icc0701cb4cea7d91f7738c1e426e94cd26686b74 --- .../com/android/server/TestNetIdManager.kt | 1 + .../server/ConnectivityServiceTest.java | 57 ++++++++++++++++++- 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/tests/net/integration/util/com/android/server/TestNetIdManager.kt b/tests/net/integration/util/com/android/server/TestNetIdManager.kt index eb290dc7d24ad..938a694e8ba98 100644 --- a/tests/net/integration/util/com/android/server/TestNetIdManager.kt +++ b/tests/net/integration/util/com/android/server/TestNetIdManager.kt @@ -35,4 +35,5 @@ class TestNetIdManager : NetIdManager() { private val nextId = AtomicInteger(MAX_NET_ID) override fun reserveNetId() = nextId.decrementAndGet() override fun releaseNetId(id: Int) = Unit + fun peekNextNetId() = nextId.get() - 1 } diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index 385005f90c3be..0c1bf548db6dc 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -336,6 +336,7 @@ public class ConnectivityServiceTest { private INetworkPolicyListener mPolicyListener; private WrappedMultinetworkPolicyTracker mPolicyTracker; private HandlerThread mAlarmManagerThread; + private TestNetIdManager mNetIdManager; @Mock IIpConnectivityMetrics mIpConnectivityMetrics; @Mock IpConnectivityMetrics.Logger mMetricsService; @@ -1194,6 +1195,8 @@ public class ConnectivityServiceTest { @Before public void setUp() throws Exception { + mNetIdManager = new TestNetIdManager(); + mContext = InstrumentationRegistry.getContext(); MockitoAnnotations.initMocks(this); @@ -1264,7 +1267,7 @@ public class ConnectivityServiceTest { final ConnectivityService.Dependencies deps = mock(ConnectivityService.Dependencies.class); doReturn(mCsHandlerThread).when(deps).makeHandlerThread(); - doReturn(new TestNetIdManager()).when(deps).makeNetIdManager(); + doReturn(mNetIdManager).when(deps).makeNetIdManager(); doReturn(mNetworkStack).when(deps).getNetworkStack(); doReturn(systemProperties).when(deps).getSystemProperties(); doReturn(mock(ProxyTracker.class)).when(deps).makeProxyTracker(any(), any()); @@ -5186,6 +5189,58 @@ public class ConnectivityServiceTest { assertTrue(lp.getDnsServers().containsAll(dnsServers)); } + @Test + public void testVpnConnectDisconnectUnderlyingNetwork() throws Exception { + final TestNetworkCallback callback = new TestNetworkCallback(); + final NetworkRequest request = new NetworkRequest.Builder() + .removeCapability(NET_CAPABILITY_NOT_VPN).build(); + + mCm.registerNetworkCallback(request, callback); + + // Bring up a VPN that specifies an underlying network that does not exist yet. + // Note: it's sort of meaningless for a VPN app to declare a network that doesn't exist yet, + // (and doing so is difficult without using reflection) but it's good to test that the code + // behaves approximately correctly. + final int uid = Process.myUid(); + final TestNetworkAgentWrapper + vpnNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_VPN); + final ArraySet ranges = new ArraySet<>(); + ranges.add(new UidRange(uid, uid)); + + final Network wifiNetwork = new Network(mNetIdManager.peekNextNetId()); + mMockVpn.setNetworkAgent(vpnNetworkAgent); + mMockVpn.setUids(ranges); + mMockVpn.setUnderlyingNetworks(new Network[]{wifiNetwork}); + vpnNetworkAgent.connect(false); + mMockVpn.connect(); + callback.expectAvailableCallbacksUnvalidated(vpnNetworkAgent); + assertTrue(mCm.getNetworkCapabilities(vpnNetworkAgent.getNetwork()) + .hasTransport(TRANSPORT_VPN)); + assertFalse(mCm.getNetworkCapabilities(vpnNetworkAgent.getNetwork()) + .hasTransport(TRANSPORT_WIFI)); + + // Make that underlying network connect, and expect to see its capabilities immediately + // reflected in the VPN's capabilities. + mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); + assertEquals(wifiNetwork, mWiFiNetworkAgent.getNetwork()); + mWiFiNetworkAgent.connect(false); + callback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); + callback.expectCallback(CallbackEntry.NETWORK_CAPS_UPDATED, vpnNetworkAgent); + assertTrue(mCm.getNetworkCapabilities(vpnNetworkAgent.getNetwork()) + .hasTransport(TRANSPORT_VPN)); + assertTrue(mCm.getNetworkCapabilities(vpnNetworkAgent.getNetwork()) + .hasTransport(TRANSPORT_WIFI)); + + // Disconnect the network, and expect to see the VPN capabilities change accordingly. + mWiFiNetworkAgent.disconnect(); + callback.expectCallback(CallbackEntry.LOST, mWiFiNetworkAgent); + callback.expectCapabilitiesThat(vpnNetworkAgent, (nc) -> + nc.getTransportTypes().length == 1 && nc.hasTransport(TRANSPORT_VPN)); + + vpnNetworkAgent.disconnect(); + mCm.unregisterNetworkCallback(callback); + } + @Test public void testVpnNetworkActive() throws Exception { final int uid = Process.myUid(); From 7c4ae16b94ce8f36e4e047ac4c825794d1c21db2 Mon Sep 17 00:00:00 2001 From: Lorenzo Colitti Date: Mon, 16 Nov 2020 16:05:44 +0900 Subject: [PATCH 094/288] Simplify MockVpn. This CL removes four methods in MockVpn by slightly changing the test code to leverage the actual methods implemented by the (production) Vpn superclass. This works because setting mInterface results in isRunningLocked() returning true, which makes a number of methods behave as if the VPN is connected (which is what the test expects). The more realistic behaviour exposes a minor bug in the treatment of underlying networks. Add a TODO to fix it. Bug: 172870110 Test: test-only change Change-Id: I49421183538ba61ca790af71e309ece36b653bf9 Merged-In: I49421183538ba61ca790af71e309ece36b653bf9 --- .../com/android/server/connectivity/Vpn.java | 3 +- .../server/ConnectivityServiceTest.java | 53 ++++++++----------- 2 files changed, 25 insertions(+), 31 deletions(-) diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java index dbb91a58369dc..af4df1a0f8d16 100644 --- a/services/core/java/com/android/server/connectivity/Vpn.java +++ b/services/core/java/com/android/server/connectivity/Vpn.java @@ -194,7 +194,8 @@ public class Vpn { @VisibleForTesting protected String mPackage; private int mOwnerUID; private boolean mIsPackageTargetingAtLeastQ; - private String mInterface; + @VisibleForTesting + protected String mInterface; private Connection mConnection; /** Tracks the runners for all VPN types managed by the platform (eg. LegacyVpn, PlatformVpn) */ diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index 0c1bf548db6dc..572ea12358ec1 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -319,6 +319,7 @@ public class ConnectivityServiceTest { private static final String MOBILE_IFNAME = "test_rmnet_data0"; private static final String WIFI_IFNAME = "test_wlan0"; private static final String WIFI_WOL_IFNAME = "test_wlan_wol"; + private static final String VPN_IFNAME = "tun10042"; private static final String TEST_PACKAGE_NAME = "com.android.test.package"; private static final String[] EMPTY_STRING_ARRAY = new String[0]; @@ -1033,12 +1034,14 @@ public class ConnectivityServiceTest { public MockVpn(int userId) { super(startHandlerThreadAndReturnLooper(), mServiceContext, mNetworkManagementService, userId, mock(KeyStore.class)); + mConfig = new VpnConfig(); } public void setNetworkAgent(TestNetworkAgentWrapper agent) { agent.waitForIdle(TIMEOUT_MS); mMockNetworkAgent = agent; mNetworkAgent = agent.getNetworkAgent(); + mInterface = VPN_IFNAME; mNetworkCapabilities.set(agent.getNetworkCapabilities()); } @@ -1059,16 +1062,6 @@ public class ConnectivityServiceTest { return mMockNetworkAgent.getNetwork().netId; } - @Override - public boolean appliesToUid(int uid) { - return mConnected; // Trickery to simplify testing. - } - - @Override - protected boolean isCallerEstablishedOwnerLocked() { - return mConnected; // Similar trickery - } - @Override public int getActiveAppVpnType() { return mVpnType; @@ -1077,7 +1070,6 @@ public class ConnectivityServiceTest { private void connect(boolean isAlwaysMetered) { mNetworkCapabilities.set(mMockNetworkAgent.getNetworkCapabilities()); mConnected = true; - mConfig = new VpnConfig(); mConfig.isMetered = isAlwaysMetered; } @@ -1108,7 +1100,6 @@ public class ConnectivityServiceTest { public void disconnect() { mConnected = false; - mConfig = null; } @Override @@ -1121,18 +1112,6 @@ public class ConnectivityServiceTest { private synchronized void setVpnInfo(VpnInfo vpnInfo) { mVpnInfo = vpnInfo; } - - @Override - public synchronized Network[] getUnderlyingNetworks() { - if (mUnderlyingNetworks != null) return mUnderlyingNetworks; - - return super.getUnderlyingNetworks(); - } - - /** Don't override behavior for {@link Vpn#setUnderlyingNetworks}. */ - private synchronized void overrideUnderlyingNetworks(Network[] underlyingNetworks) { - mUnderlyingNetworks = underlyingNetworks; - } } private void mockVpn(int uid) { @@ -5210,7 +5189,7 @@ public class ConnectivityServiceTest { final Network wifiNetwork = new Network(mNetIdManager.peekNextNetId()); mMockVpn.setNetworkAgent(vpnNetworkAgent); mMockVpn.setUids(ranges); - mMockVpn.setUnderlyingNetworks(new Network[]{wifiNetwork}); + mService.setUnderlyingNetworksForVpn(new Network[]{wifiNetwork}); vpnNetworkAgent.connect(false); mMockVpn.connect(); callback.expectAvailableCallbacksUnvalidated(vpnNetworkAgent); @@ -5224,8 +5203,17 @@ public class ConnectivityServiceTest { mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); assertEquals(wifiNetwork, mWiFiNetworkAgent.getNetwork()); mWiFiNetworkAgent.connect(false); - callback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); + // TODO: the callback for the VPN happens before any callbacks are called for the wifi + // network that has just connected. There appear to be two issues here: + // 1. The VPN code will accept an underlying network as soon as getNetworkCapabilities() for + // it returns non-null (which happens very early, during handleRegisterNetworkAgent). + // This is not correct because that that point the network is not connected and cannot + // pass any traffic. + // 2. When a network connects, updateNetworkInfo propagates underlying network capabilities + // before rematching networks. + // Given that this scenario can't really happen, this is probably fine for now. callback.expectCallback(CallbackEntry.NETWORK_CAPS_UPDATED, vpnNetworkAgent); + callback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); assertTrue(mCm.getNetworkCapabilities(vpnNetworkAgent.getNetwork()) .hasTransport(TRANSPORT_VPN)); assertTrue(mCm.getNetworkCapabilities(vpnNetworkAgent.getNetwork()) @@ -5289,7 +5277,7 @@ public class ConnectivityServiceTest { vpnNetworkAgent.connect(false); mMockVpn.connect(); - mMockVpn.setUnderlyingNetworks(new Network[0]); + mService.setUnderlyingNetworksForVpn(new Network[0]); genericNetworkCallback.expectAvailableCallbacksUnvalidated(vpnNetworkAgent); genericNotVpnNetworkCallback.assertNoCallback(); @@ -7249,16 +7237,21 @@ public class ConnectivityServiceTest { // active final VpnInfo info = new VpnInfo(); info.ownerUid = Process.myUid(); - info.vpnIface = "interface"; + info.vpnIface = VPN_IFNAME; mMockVpn.setVpnInfo(info); - mMockVpn.overrideUnderlyingNetworks(new Network[] {network}); + + final TestNetworkAgentWrapper vpnNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_VPN); + mMockVpn.setNetworkAgent(vpnNetworkAgent); + mMockVpn.connect(); + + assertTrue(mService.setUnderlyingNetworksForVpn(new Network[] {network})); assertTrue( "Active VPN permission not applied", mService.checkConnectivityDiagnosticsPermissions( Process.myPid(), Process.myUid(), naiWithoutUid, mContext.getOpPackageName())); - mMockVpn.overrideUnderlyingNetworks(null); + assertTrue(mService.setUnderlyingNetworksForVpn(null)); assertFalse( "VPN shouldn't receive callback on non-underlying network", mService.checkConnectivityDiagnosticsPermissions( From d10299582ae9965c0ff70b5fceb4ce8ee591734e Mon Sep 17 00:00:00 2001 From: Lorenzo Colitti Date: Tue, 17 Nov 2020 23:23:58 +0900 Subject: [PATCH 095/288] Increase test coverage for VPN info sent to NetworkStatsService. Bug: 172870110 Test: test-only change Change-Id: I3711b362f31cb92b759e9f5c9d244fb88d9bd5e7 Merged-In: I3711b362f31cb92b759e9f5c9d244fb88d9bd5e7 --- .../server/ConnectivityServiceTest.java | 169 +++++++++++++++--- 1 file changed, 149 insertions(+), 20 deletions(-) diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index 572ea12358ec1..c0293c157c277 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -4745,13 +4745,52 @@ public class ConnectivityServiceTest { mCm.unregisterNetworkCallback(networkCallback); } + private void assertSameElementsNoDuplicates(T[] expected, T[] actual) { + // Easier to implement than a proper "assertSameElements" method that also correctly deals + // with duplicates. + final String msg = Arrays.toString(expected) + " != " + Arrays.toString(actual); + assertEquals(msg, expected.length, actual.length); + Set expectedSet = new ArraySet<>(Arrays.asList(expected)); + assertEquals("expected contains duplicates", expectedSet.size(), expected.length); + // actual cannot have duplicates because it's the same length and has the same elements. + Set actualSet = new ArraySet<>(Arrays.asList(actual)); + assertEquals(expectedSet, actualSet); + } + + private void expectForceUpdateIfaces(Network[] networks, String defaultIface, + Integer vpnUid, String vpnIfname, String[] underlyingIfaces) throws Exception { + ArgumentCaptor networksCaptor = ArgumentCaptor.forClass(Network[].class); + ArgumentCaptor vpnInfosCaptor = ArgumentCaptor.forClass(VpnInfo[].class); + + verify(mStatsService, atLeastOnce()).forceUpdateIfaces(networksCaptor.capture(), + any(NetworkState[].class), eq(defaultIface), vpnInfosCaptor.capture()); + + assertSameElementsNoDuplicates(networksCaptor.getValue(), networks); + + VpnInfo[] infos = vpnInfosCaptor.getValue(); + if (vpnUid != null) { + assertEquals("Should have exactly one VPN:", 1, infos.length); + VpnInfo info = infos[0]; + assertEquals("Unexpected VPN owner:", (int) vpnUid, info.ownerUid); + assertEquals("Unexpected VPN interface:", vpnIfname, info.vpnIface); + assertSameElementsNoDuplicates(underlyingIfaces, info.underlyingIfaces); + } else { + assertEquals(0, infos.length); + return; + } + } + + private void expectForceUpdateIfaces(Network[] networks, String defaultIface) throws Exception { + expectForceUpdateIfaces(networks, defaultIface, null, null, new String[0]); + } + @Test public void testStatsIfacesChanged() throws Exception { mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR); mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); - Network[] onlyCell = new Network[] {mCellNetworkAgent.getNetwork()}; - Network[] onlyWifi = new Network[] {mWiFiNetworkAgent.getNetwork()}; + final Network[] onlyCell = new Network[] {mCellNetworkAgent.getNetwork()}; + final Network[] onlyWifi = new Network[] {mWiFiNetworkAgent.getNetwork()}; LinkProperties cellLp = new LinkProperties(); cellLp.setInterfaceName(MOBILE_IFNAME); @@ -4762,9 +4801,7 @@ public class ConnectivityServiceTest { mCellNetworkAgent.connect(false); mCellNetworkAgent.sendLinkProperties(cellLp); waitForIdle(); - verify(mStatsService, atLeastOnce()) - .forceUpdateIfaces(eq(onlyCell), any(NetworkState[].class), eq(MOBILE_IFNAME), - eq(new VpnInfo[0])); + expectForceUpdateIfaces(onlyCell, MOBILE_IFNAME); reset(mStatsService); // Default network switch should update ifaces. @@ -4772,32 +4809,24 @@ public class ConnectivityServiceTest { mWiFiNetworkAgent.sendLinkProperties(wifiLp); waitForIdle(); assertEquals(wifiLp, mService.getActiveLinkProperties()); - verify(mStatsService, atLeastOnce()) - .forceUpdateIfaces(eq(onlyWifi), any(NetworkState[].class), eq(WIFI_IFNAME), - eq(new VpnInfo[0])); + expectForceUpdateIfaces(onlyWifi, WIFI_IFNAME); reset(mStatsService); // Disconnect should update ifaces. mWiFiNetworkAgent.disconnect(); waitForIdle(); - verify(mStatsService, atLeastOnce()) - .forceUpdateIfaces(eq(onlyCell), any(NetworkState[].class), - eq(MOBILE_IFNAME), eq(new VpnInfo[0])); + expectForceUpdateIfaces(onlyCell, MOBILE_IFNAME); reset(mStatsService); // Metered change should update ifaces mCellNetworkAgent.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED); waitForIdle(); - verify(mStatsService, atLeastOnce()) - .forceUpdateIfaces(eq(onlyCell), any(NetworkState[].class), eq(MOBILE_IFNAME), - eq(new VpnInfo[0])); + expectForceUpdateIfaces(onlyCell, MOBILE_IFNAME); reset(mStatsService); mCellNetworkAgent.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED); waitForIdle(); - verify(mStatsService, atLeastOnce()) - .forceUpdateIfaces(eq(onlyCell), any(NetworkState[].class), eq(MOBILE_IFNAME), - eq(new VpnInfo[0])); + expectForceUpdateIfaces(onlyCell, MOBILE_IFNAME); reset(mStatsService); // Captive portal change shouldn't update ifaces @@ -4811,9 +4840,101 @@ public class ConnectivityServiceTest { // Roaming change should update ifaces mCellNetworkAgent.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING); waitForIdle(); - verify(mStatsService, atLeastOnce()) - .forceUpdateIfaces(eq(onlyCell), any(NetworkState[].class), eq(MOBILE_IFNAME), - eq(new VpnInfo[0])); + expectForceUpdateIfaces(onlyCell, MOBILE_IFNAME); + reset(mStatsService); + + // Test VPNs. + final LinkProperties lp = new LinkProperties(); + lp.setInterfaceName(VPN_IFNAME); + + final NetworkAgentWrapper vpnNetworkAgent = establishVpnForMyUid(lp); + final Network[] cellAndVpn = new Network[] { + mCellNetworkAgent.getNetwork(), vpnNetworkAgent.getNetwork()}; + Network[] cellAndWifi = new Network[] { + mCellNetworkAgent.getNetwork(), mWiFiNetworkAgent.getNetwork()}; + + // A VPN with default (null) underlying networks sets the underlying network's interfaces... + expectForceUpdateIfaces(cellAndVpn, MOBILE_IFNAME, Process.myUid(), VPN_IFNAME, + new String[]{MOBILE_IFNAME}); + + // ...and updates them as the default network switches. + mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); + mWiFiNetworkAgent.connect(false); + mWiFiNetworkAgent.sendLinkProperties(wifiLp); + final Network[] wifiAndVpn = new Network[] { + mWiFiNetworkAgent.getNetwork(), vpnNetworkAgent.getNetwork()}; + cellAndWifi = new Network[] { + mCellNetworkAgent.getNetwork(), mWiFiNetworkAgent.getNetwork()}; + + waitForIdle(); + assertEquals(wifiLp, mService.getActiveLinkProperties()); + expectForceUpdateIfaces(wifiAndVpn, WIFI_IFNAME, Process.myUid(), VPN_IFNAME, + new String[]{WIFI_IFNAME}); + reset(mStatsService); + + // A VPN that sets its underlying networks passes the underlying interfaces, and influences + // the default interface sent to NetworkStatsService by virtue of applying to the system + // server UID (or, in this test, to the test's UID). This is the reason for sending + // MOBILE_IFNAME even though the default network is wifi. + // TODO: fix this to pass in the actual default network interface. Whether or not the VPN + // applies to the system server UID should not have any bearing on network stats. + mService.setUnderlyingNetworksForVpn(onlyCell); + waitForIdle(); + expectForceUpdateIfaces(wifiAndVpn, MOBILE_IFNAME, Process.myUid(), VPN_IFNAME, + new String[]{MOBILE_IFNAME}); + reset(mStatsService); + + mService.setUnderlyingNetworksForVpn(cellAndWifi); + waitForIdle(); + expectForceUpdateIfaces(wifiAndVpn, MOBILE_IFNAME, Process.myUid(), VPN_IFNAME, + new String[]{MOBILE_IFNAME, WIFI_IFNAME}); + reset(mStatsService); + + // If an underlying network disconnects, that interface should no longer be underlying. + // This doesn't actually work because disconnectAndDestroyNetwork only notifies + // NetworkStatsService before the underlying network is actually removed. So the underlying + // network will only be removed if notifyIfacesChangedForNetworkStats is called again. This + // could result in incorrect data usage measurements if the interface used by the + // disconnected network is reused by a system component that does not register an agent for + // it (e.g., tethering). + mCellNetworkAgent.disconnect(); + waitForIdle(); + assertNull(mService.getLinkProperties(mCellNetworkAgent.getNetwork())); + expectForceUpdateIfaces(wifiAndVpn, MOBILE_IFNAME, Process.myUid(), VPN_IFNAME, + new String[]{MOBILE_IFNAME, WIFI_IFNAME}); + + // Confirm that we never tell NetworkStatsService that cell is no longer the underlying + // network for the VPN... + verify(mStatsService, never()).forceUpdateIfaces(any(Network[].class), + any(NetworkState[].class), any() /* anyString() doesn't match null */, + argThat(infos -> infos[0].underlyingIfaces.length == 1 + && WIFI_IFNAME.equals(infos[0].underlyingIfaces[0]))); + verifyNoMoreInteractions(mStatsService); + reset(mStatsService); + + // ... but if something else happens that causes notifyIfacesChangedForNetworkStats to be + // called again, it does. For example, connect Ethernet, but with a low score, such that it + // does not become the default network. + mEthernetNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_ETHERNET); + mEthernetNetworkAgent.adjustScore(-40); + mEthernetNetworkAgent.connect(false); + waitForIdle(); + verify(mStatsService).forceUpdateIfaces(any(Network[].class), + any(NetworkState[].class), any() /* anyString() doesn't match null */, + argThat(vpnInfos -> vpnInfos[0].underlyingIfaces.length == 1 + && WIFI_IFNAME.equals(vpnInfos[0].underlyingIfaces[0]))); + mEthernetNetworkAgent.disconnect(); + reset(mStatsService); + + // When a VPN declares no underlying networks (i.e., no connectivity), getAllVpnInfo + // does not return the VPN, so CS does not pass it to NetworkStatsService. This causes + // NetworkStatsFactory#adjustForTunAnd464Xlat not to attempt any VPN data migration, which + // is probably a performance improvement (though it's very unlikely that a VPN would declare + // no underlying networks). + // Also, for the same reason as above, the active interface passed in is null. + mService.setUnderlyingNetworksForVpn(new Network[0]); + waitForIdle(); + expectForceUpdateIfaces(wifiAndVpn, null); reset(mStatsService); } @@ -7052,6 +7173,14 @@ public class ConnectivityServiceTest { return vpnNetworkAgent; } + private TestNetworkAgentWrapper establishVpnForMyUid(LinkProperties lp) + throws Exception { + final int uid = Process.myUid(); + final ArraySet ranges = new ArraySet<>(); + ranges.add(new UidRange(uid, uid)); + return establishVpn(lp, uid, ranges); + } + private static PackageInfo buildPackageInfo(boolean hasSystemPermission, int uid) { final PackageInfo packageInfo = new PackageInfo(); if (hasSystemPermission) { From f3d35fdeaab97b8f2646fbcadcc50413138d369a Mon Sep 17 00:00:00 2001 From: Lorenzo Colitti Date: Wed, 18 Nov 2020 22:50:57 +0900 Subject: [PATCH 096/288] Make MockVpn more realistic and easier to use. MockVpn is very difficult to use because it requires the test caller keeping track of both the MockVpn object and an accompanying TestNetworkAgentWrapper. It's also not very realistic: for example, connect() doesn't actually connect anything, it just makes it so that if ConnectivityService tries to update the capabilities, the attempt will not be ignored. Also, unlike the real code in Vpn, it connects with empty NetworkCapabilities (in particular, with empty UID ranges). Make this easier to use and a bit more realistic by: - Allowing TestNetworkAgentWrapper to take a "NetworkCapabilities template" that will form the initial capabilities sent when the agent registers with ConnectivityService. This allows the VPN to register its agent with its UID ranges already set, like the production code does. - Providing separate methods to register the NetworkAgent and mark it connected for cases where the test needs to make changes to the NetworkAgent before connecting (e.g., poking NetworkMonitor). - Putting the TestNetworkAgentWrapper inside MockVpn and driving it through MockVpn's methods. In order not to have too many wrapper functions (and because we can't delegate like in Kotlin), there's still an agent() method that returns the TestNetworkAgentWrapper. Bug: 172870110 Test: test-only change Change-Id: I749ff325bc13ac96f512270b86d1f67686eec378 Merged-In: I749ff325bc13ac96f512270b86d1f67686eec378 --- .../ConnectivityServiceIntegrationTest.kt | 5 +- .../android/server/NetworkAgentWrapper.java | 6 +- .../server/ConnectivityServiceTest.java | 514 ++++++++---------- 3 files changed, 227 insertions(+), 298 deletions(-) diff --git a/tests/net/integration/src/com/android/server/net/integrationtests/ConnectivityServiceIntegrationTest.kt b/tests/net/integration/src/com/android/server/net/integrationtests/ConnectivityServiceIntegrationTest.kt index c4801aab5c321..344d0c3260c9a 100644 --- a/tests/net/integration/src/com/android/server/net/integrationtests/ConnectivityServiceIntegrationTest.kt +++ b/tests/net/integration/src/com/android/server/net/integrationtests/ConnectivityServiceIntegrationTest.kt @@ -195,7 +195,8 @@ class ConnectivityServiceIntegrationTest { "https://secure.test.android.com", responseCode = 204, contentLength = 42, redirectUrl = null)) - val na = NetworkAgentWrapper(TRANSPORT_CELLULAR, LinkProperties(), context) + val na = NetworkAgentWrapper(TRANSPORT_CELLULAR, LinkProperties(), null /* ncTemplate */, + context) networkStackClient.verifyNetworkMonitorCreated(na.network, TEST_TIMEOUT_MS) na.addCapability(NET_CAPABILITY_INTERNET) @@ -204,4 +205,4 @@ class ConnectivityServiceIntegrationTest { testCallback.expectAvailableThenValidatedCallbacks(na.network, TEST_TIMEOUT_MS) assertEquals(2, nsInstrumentation.getRequestUrls().size) } -} \ No newline at end of file +} diff --git a/tests/net/integration/util/com/android/server/NetworkAgentWrapper.java b/tests/net/integration/util/com/android/server/NetworkAgentWrapper.java index 0ffafd45613a8..03954de984386 100644 --- a/tests/net/integration/util/com/android/server/NetworkAgentWrapper.java +++ b/tests/net/integration/util/com/android/server/NetworkAgentWrapper.java @@ -69,12 +69,12 @@ public class NetworkAgentWrapper implements TestableNetworkCallback.HasNetwork { private int mStopKeepaliveError = SocketKeepalive.NO_KEEPALIVE; private Integer mExpectedKeepaliveSlot = null; - public NetworkAgentWrapper(int transport, LinkProperties linkProperties, Context context) - throws Exception { + public NetworkAgentWrapper(int transport, LinkProperties linkProperties, + NetworkCapabilities ncTemplate, Context context) throws Exception { final int type = transportToLegacyType(transport); final String typeName = ConnectivityManager.getNetworkTypeName(type); mNetworkInfo = new NetworkInfo(type, 0, typeName, "Mock"); - mNetworkCapabilities = new NetworkCapabilities(); + mNetworkCapabilities = (ncTemplate != null) ? ncTemplate : new NetworkCapabilities(); mNetworkCapabilities.addCapability(NET_CAPABILITY_NOT_SUSPENDED); mNetworkCapabilities.addTransportType(transport); switch (transport) { diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index c0293c157c277..810ccbe252ca0 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -606,12 +606,17 @@ public class ConnectivityServiceTest { private String mRedirectUrl; TestNetworkAgentWrapper(int transport) throws Exception { - this(transport, new LinkProperties()); + this(transport, new LinkProperties(), null); } TestNetworkAgentWrapper(int transport, LinkProperties linkProperties) throws Exception { - super(transport, linkProperties, mServiceContext); + this(transport, linkProperties, null); + } + + private TestNetworkAgentWrapper(int transport, LinkProperties linkProperties, + NetworkCapabilities ncTemplate) throws Exception { + super(transport, linkProperties, ncTemplate, mServiceContext); // Waits for the NetworkAgent to be registered, which includes the creation of the // NetworkMonitor. @@ -1006,30 +1011,26 @@ public class ConnectivityServiceTest { } } + private Set uidRangesForUid(int uid) { + final ArraySet ranges = new ArraySet<>(); + ranges.add(new UidRange(uid, uid)); + return ranges; + } + private static Looper startHandlerThreadAndReturnLooper() { final HandlerThread handlerThread = new HandlerThread("MockVpnThread"); handlerThread.start(); return handlerThread.getLooper(); } - private class MockVpn extends Vpn { - // TODO : the interactions between this mock and the mock network agent are too - // hard to get right at this moment, because it's unclear in which case which - // target needs to get a method call or both, and in what order. It's because - // MockNetworkAgent wants to manage its own NetworkCapabilities, but the Vpn - // parent class of MockVpn agent wants that responsibility. - // That being said inside the test it should be possible to make the interactions - // harder to get wrong with precise speccing, judicious comments, helper methods - // and a few sprinkled assertions. - - private boolean mConnected = false; + private class MockVpn extends Vpn implements TestableNetworkCallback.HasNetwork { // Careful ! This is different from mNetworkAgent, because MockNetworkAgent does // not inherit from NetworkAgent. private TestNetworkAgentWrapper mMockNetworkAgent; - private int mVpnType = VpnManager.TYPE_VPN_SERVICE; + private boolean mAgentRegistered = false; + private int mVpnType = VpnManager.TYPE_VPN_SERVICE; private VpnInfo mVpnInfo; - private Network[] mUnderlyingNetworks; public MockVpn(int userId) { super(startHandlerThreadAndReturnLooper(), mServiceContext, mNetworkManagementService, @@ -1037,29 +1038,23 @@ public class ConnectivityServiceTest { mConfig = new VpnConfig(); } - public void setNetworkAgent(TestNetworkAgentWrapper agent) { - agent.waitForIdle(TIMEOUT_MS); - mMockNetworkAgent = agent; - mNetworkAgent = agent.getNetworkAgent(); - mInterface = VPN_IFNAME; - mNetworkCapabilities.set(agent.getNetworkCapabilities()); - } - public void setUids(Set uids) { mNetworkCapabilities.setUids(uids); - updateCapabilities(null /* defaultNetwork */); + updateCapabilitiesInternal(null /* defaultNetwork */, true); } public void setVpnType(int vpnType) { mVpnType = vpnType; } + @Override + public Network getNetwork() { + return (mMockNetworkAgent == null) ? null : mMockNetworkAgent.getNetwork(); + } + @Override public int getNetId() { - if (mMockNetworkAgent == null) { - return NETID_UNSET; - } - return mMockNetworkAgent.getNetwork().netId; + return (mMockNetworkAgent == null) ? NETID_UNSET : mMockNetworkAgent.getNetwork().netId; } @Override @@ -1067,39 +1062,94 @@ public class ConnectivityServiceTest { return mVpnType; } - private void connect(boolean isAlwaysMetered) { - mNetworkCapabilities.set(mMockNetworkAgent.getNetworkCapabilities()); - mConnected = true; + private void registerAgent(boolean isAlwaysMetered, Set uids, LinkProperties lp) + throws Exception { + if (mAgentRegistered) throw new IllegalStateException("already registered"); + setUids(uids); mConfig.isMetered = isAlwaysMetered; + mInterface = VPN_IFNAME; + mMockNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_VPN, lp, + mNetworkCapabilities); + mMockNetworkAgent.waitForIdle(TIMEOUT_MS); + mAgentRegistered = true; + mNetworkCapabilities.set(mMockNetworkAgent.getNetworkCapabilities()); + mNetworkAgent = mMockNetworkAgent.getNetworkAgent(); } - public void connectAsAlwaysMetered() { - connect(true /* isAlwaysMetered */); + private void registerAgent(Set uids) throws Exception { + registerAgent(false /* isAlwaysMetered */, uids, new LinkProperties()); } - public void connect() { - connect(false /* isAlwaysMetered */); + private void connect(boolean validated, boolean hasInternet, boolean isStrictMode) { + mMockNetworkAgent.connect(validated, hasInternet, isStrictMode); + } + + private void connect(boolean validated) { + mMockNetworkAgent.connect(validated); + } + + private TestNetworkAgentWrapper getAgent() { + return mMockNetworkAgent; + } + + public void establish(LinkProperties lp, int uid, Set ranges, boolean validated, + boolean hasInternet, boolean isStrictMode) throws Exception { + mNetworkCapabilities.setOwnerUid(uid); + mNetworkCapabilities.setAdministratorUids(new int[]{uid}); + registerAgent(false, ranges, lp); + connect(validated, hasInternet, isStrictMode); + waitForIdle(); + } + + public void establish(LinkProperties lp, int uid, Set ranges) throws Exception { + establish(lp, uid, ranges, true, true, false); + } + + public void establishForMyUid(LinkProperties lp) throws Exception { + final int uid = Process.myUid(); + establish(lp, uid, uidRangesForUid(uid), true, true, false); + } + + public void establishForMyUid(boolean validated, boolean hasInternet, boolean isStrictMode) + throws Exception { + final int uid = Process.myUid(); + establish(new LinkProperties(), uid, uidRangesForUid(uid), validated, hasInternet, + isStrictMode); + } + + public void establishForMyUid() throws Exception { + establishForMyUid(new LinkProperties()); + } + + public void sendLinkProperties(LinkProperties lp) { + mMockNetworkAgent.sendLinkProperties(lp); + } + + private NetworkCapabilities updateCapabilitiesInternal(Network defaultNetwork, + boolean sendToConnectivityService) { + if (!mAgentRegistered) return null; + super.updateCapabilities(defaultNetwork); + // Because super.updateCapabilities will update the capabilities of the agent but + // not the mock agent, the mock agent needs to know about them. + copyCapabilitiesToNetworkAgent(sendToConnectivityService); + return new NetworkCapabilities(mNetworkCapabilities); + } + + private void copyCapabilitiesToNetworkAgent(boolean sendToConnectivityService) { + if (null != mMockNetworkAgent) { + mMockNetworkAgent.setNetworkCapabilities(mNetworkCapabilities, + sendToConnectivityService); + } } @Override public NetworkCapabilities updateCapabilities(Network defaultNetwork) { - if (!mConnected) return null; - super.updateCapabilities(defaultNetwork); - // Because super.updateCapabilities will update the capabilities of the agent but - // not the mock agent, the mock agent needs to know about them. - copyCapabilitiesToNetworkAgent(); - return new NetworkCapabilities(mNetworkCapabilities); - } - - private void copyCapabilitiesToNetworkAgent() { - if (null != mMockNetworkAgent) { - mMockNetworkAgent.setNetworkCapabilities(mNetworkCapabilities, - false /* sendToConnectivityService */); - } + return updateCapabilitiesInternal(defaultNetwork, false); } public void disconnect() { - mConnected = false; + if (mMockNetworkAgent != null) mMockNetworkAgent.disconnect(); + mAgentRegistered = false; } @Override @@ -1305,6 +1355,9 @@ public class ConnectivityServiceTest { mEthernetNetworkAgent.disconnect(); mEthernetNetworkAgent = null; } + mMockVpn.disconnect(); + waitForIdle(); + FakeSettingsProvider.clearSettingsProvider(); mCsHandlerThread.quitSafely(); @@ -3180,20 +3233,12 @@ public class ConnectivityServiceTest { waitForIdle(); assertEquals(null, mCm.getActiveNetwork()); - final int uid = Process.myUid(); - final TestNetworkAgentWrapper - vpnNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_VPN); - final ArraySet ranges = new ArraySet<>(); - ranges.add(new UidRange(uid, uid)); - mMockVpn.setNetworkAgent(vpnNetworkAgent); - mMockVpn.setUids(ranges); - vpnNetworkAgent.connect(true); - mMockVpn.connect(); - defaultNetworkCallback.expectAvailableThenValidatedCallbacks(vpnNetworkAgent); + mMockVpn.establishForMyUid(); + defaultNetworkCallback.expectAvailableThenValidatedCallbacks(mMockVpn); assertEquals(defaultNetworkCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); - vpnNetworkAgent.disconnect(); - defaultNetworkCallback.expectCallback(CallbackEntry.LOST, vpnNetworkAgent); + mMockVpn.disconnect(); + defaultNetworkCallback.expectCallback(CallbackEntry.LOST, mMockVpn); waitForIdle(); assertEquals(null, mCm.getActiveNetwork()); } @@ -4847,9 +4892,10 @@ public class ConnectivityServiceTest { final LinkProperties lp = new LinkProperties(); lp.setInterfaceName(VPN_IFNAME); - final NetworkAgentWrapper vpnNetworkAgent = establishVpnForMyUid(lp); + mMockVpn.establishForMyUid(lp); + final Network[] cellAndVpn = new Network[] { - mCellNetworkAgent.getNetwork(), vpnNetworkAgent.getNetwork()}; + mCellNetworkAgent.getNetwork(), mMockVpn.getNetwork()}; Network[] cellAndWifi = new Network[] { mCellNetworkAgent.getNetwork(), mWiFiNetworkAgent.getNetwork()}; @@ -4862,7 +4908,7 @@ public class ConnectivityServiceTest { mWiFiNetworkAgent.connect(false); mWiFiNetworkAgent.sendLinkProperties(wifiLp); final Network[] wifiAndVpn = new Network[] { - mWiFiNetworkAgent.getNetwork(), vpnNetworkAgent.getNetwork()}; + mWiFiNetworkAgent.getNetwork(), mMockVpn.getNetwork()}; cellAndWifi = new Network[] { mCellNetworkAgent.getNetwork(), mWiFiNetworkAgent.getNetwork()}; @@ -5301,22 +5347,13 @@ public class ConnectivityServiceTest { // Note: it's sort of meaningless for a VPN app to declare a network that doesn't exist yet, // (and doing so is difficult without using reflection) but it's good to test that the code // behaves approximately correctly. - final int uid = Process.myUid(); - final TestNetworkAgentWrapper - vpnNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_VPN); - final ArraySet ranges = new ArraySet<>(); - ranges.add(new UidRange(uid, uid)); - + mMockVpn.establishForMyUid(false, true, false); final Network wifiNetwork = new Network(mNetIdManager.peekNextNetId()); - mMockVpn.setNetworkAgent(vpnNetworkAgent); - mMockVpn.setUids(ranges); mService.setUnderlyingNetworksForVpn(new Network[]{wifiNetwork}); - vpnNetworkAgent.connect(false); - mMockVpn.connect(); - callback.expectAvailableCallbacksUnvalidated(vpnNetworkAgent); - assertTrue(mCm.getNetworkCapabilities(vpnNetworkAgent.getNetwork()) + callback.expectAvailableCallbacksUnvalidated(mMockVpn); + assertTrue(mCm.getNetworkCapabilities(mMockVpn.getNetwork()) .hasTransport(TRANSPORT_VPN)); - assertFalse(mCm.getNetworkCapabilities(vpnNetworkAgent.getNetwork()) + assertFalse(mCm.getNetworkCapabilities(mMockVpn.getNetwork()) .hasTransport(TRANSPORT_WIFI)); // Make that underlying network connect, and expect to see its capabilities immediately @@ -5333,20 +5370,20 @@ public class ConnectivityServiceTest { // 2. When a network connects, updateNetworkInfo propagates underlying network capabilities // before rematching networks. // Given that this scenario can't really happen, this is probably fine for now. - callback.expectCallback(CallbackEntry.NETWORK_CAPS_UPDATED, vpnNetworkAgent); + callback.expectCallback(CallbackEntry.NETWORK_CAPS_UPDATED, mMockVpn); callback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); - assertTrue(mCm.getNetworkCapabilities(vpnNetworkAgent.getNetwork()) + assertTrue(mCm.getNetworkCapabilities(mMockVpn.getNetwork()) .hasTransport(TRANSPORT_VPN)); - assertTrue(mCm.getNetworkCapabilities(vpnNetworkAgent.getNetwork()) + assertTrue(mCm.getNetworkCapabilities(mMockVpn.getNetwork()) .hasTransport(TRANSPORT_WIFI)); // Disconnect the network, and expect to see the VPN capabilities change accordingly. mWiFiNetworkAgent.disconnect(); callback.expectCallback(CallbackEntry.LOST, mWiFiNetworkAgent); - callback.expectCapabilitiesThat(vpnNetworkAgent, (nc) -> + callback.expectCapabilitiesThat(mMockVpn, (nc) -> nc.getTransportTypes().length == 1 && nc.hasTransport(TRANSPORT_VPN)); - vpnNetworkAgent.disconnect(); + mMockVpn.disconnect(); mCm.unregisterNetworkCallback(callback); } @@ -5384,42 +5421,38 @@ public class ConnectivityServiceTest { vpnNetworkCallback.assertNoCallback(); assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); - final TestNetworkAgentWrapper - vpnNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_VPN); - final ArraySet ranges = new ArraySet<>(); - ranges.add(new UidRange(uid, uid)); - mMockVpn.setNetworkAgent(vpnNetworkAgent); - mMockVpn.setUids(ranges); + final Set ranges = uidRangesForUid(uid); + mMockVpn.registerAgent(ranges); + // VPN networks do not satisfy the default request and are automatically validated // by NetworkMonitor assertFalse(NetworkMonitorUtils.isValidationRequired( - vpnNetworkAgent.getNetworkCapabilities())); - vpnNetworkAgent.setNetworkValid(false /* isStrictMode */); + mMockVpn.getAgent().getNetworkCapabilities())); + mMockVpn.getAgent().setNetworkValid(false /* isStrictMode */); - vpnNetworkAgent.connect(false); - mMockVpn.connect(); + mMockVpn.connect(false); mService.setUnderlyingNetworksForVpn(new Network[0]); - genericNetworkCallback.expectAvailableCallbacksUnvalidated(vpnNetworkAgent); + genericNetworkCallback.expectAvailableCallbacksUnvalidated(mMockVpn); genericNotVpnNetworkCallback.assertNoCallback(); wifiNetworkCallback.assertNoCallback(); - vpnNetworkCallback.expectAvailableCallbacksUnvalidated(vpnNetworkAgent); - defaultCallback.expectAvailableCallbacksUnvalidated(vpnNetworkAgent); + vpnNetworkCallback.expectAvailableCallbacksUnvalidated(mMockVpn); + defaultCallback.expectAvailableCallbacksUnvalidated(mMockVpn); assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); - genericNetworkCallback.expectCallback(CallbackEntry.NETWORK_CAPS_UPDATED, vpnNetworkAgent); + genericNetworkCallback.expectCallback(CallbackEntry.NETWORK_CAPS_UPDATED, mMockVpn); genericNotVpnNetworkCallback.assertNoCallback(); - vpnNetworkCallback.expectCapabilitiesThat(vpnNetworkAgent, nc -> null == nc.getUids()); - defaultCallback.expectCallback(CallbackEntry.NETWORK_CAPS_UPDATED, vpnNetworkAgent); + vpnNetworkCallback.expectCapabilitiesThat(mMockVpn, nc -> null == nc.getUids()); + defaultCallback.expectCallback(CallbackEntry.NETWORK_CAPS_UPDATED, mMockVpn); assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); ranges.clear(); - vpnNetworkAgent.setUids(ranges); + mMockVpn.setUids(ranges); - genericNetworkCallback.expectCallback(CallbackEntry.LOST, vpnNetworkAgent); + genericNetworkCallback.expectCallback(CallbackEntry.LOST, mMockVpn); genericNotVpnNetworkCallback.assertNoCallback(); wifiNetworkCallback.assertNoCallback(); - vpnNetworkCallback.expectCallback(CallbackEntry.LOST, vpnNetworkAgent); + vpnNetworkCallback.expectCallback(CallbackEntry.LOST, mMockVpn); // TODO : The default network callback should actually get a LOST call here (also see the // comment below for AVAILABLE). This is because ConnectivityService does not look at UID @@ -5427,19 +5460,18 @@ public class ConnectivityServiceTest { // can't currently update their UIDs without disconnecting, so this does not matter too // much, but that is the reason the test here has to check for an update to the // capabilities instead of the expected LOST then AVAILABLE. - defaultCallback.expectCallback(CallbackEntry.NETWORK_CAPS_UPDATED, vpnNetworkAgent); + defaultCallback.expectCallback(CallbackEntry.NETWORK_CAPS_UPDATED, mMockVpn); ranges.add(new UidRange(uid, uid)); mMockVpn.setUids(ranges); - vpnNetworkAgent.setUids(ranges); - genericNetworkCallback.expectAvailableCallbacksValidated(vpnNetworkAgent); + genericNetworkCallback.expectAvailableCallbacksValidated(mMockVpn); genericNotVpnNetworkCallback.assertNoCallback(); wifiNetworkCallback.assertNoCallback(); - vpnNetworkCallback.expectAvailableCallbacksValidated(vpnNetworkAgent); + vpnNetworkCallback.expectAvailableCallbacksValidated(mMockVpn); // TODO : Here like above, AVAILABLE would be correct, but because this can't actually // happen outside of the test, ConnectivityService does not rematch callbacks. - defaultCallback.expectCallback(CallbackEntry.NETWORK_CAPS_UPDATED, vpnNetworkAgent); + defaultCallback.expectCallback(CallbackEntry.NETWORK_CAPS_UPDATED, mMockVpn); mWiFiNetworkAgent.disconnect(); @@ -5449,13 +5481,13 @@ public class ConnectivityServiceTest { vpnNetworkCallback.assertNoCallback(); defaultCallback.assertNoCallback(); - vpnNetworkAgent.disconnect(); + mMockVpn.disconnect(); - genericNetworkCallback.expectCallback(CallbackEntry.LOST, vpnNetworkAgent); + genericNetworkCallback.expectCallback(CallbackEntry.LOST, mMockVpn); genericNotVpnNetworkCallback.assertNoCallback(); wifiNetworkCallback.assertNoCallback(); - vpnNetworkCallback.expectCallback(CallbackEntry.LOST, vpnNetworkAgent); - defaultCallback.expectCallback(CallbackEntry.LOST, vpnNetworkAgent); + vpnNetworkCallback.expectCallback(CallbackEntry.LOST, mMockVpn); + defaultCallback.expectCallback(CallbackEntry.LOST, mMockVpn); assertEquals(null, mCm.getActiveNetwork()); mCm.unregisterNetworkCallback(genericNetworkCallback); @@ -5477,20 +5509,13 @@ public class ConnectivityServiceTest { defaultCallback.expectAvailableThenValidatedCallbacks(mWiFiNetworkAgent); assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); - TestNetworkAgentWrapper - vpnNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_VPN); - final ArraySet ranges = new ArraySet<>(); - ranges.add(new UidRange(uid, uid)); - mMockVpn.setNetworkAgent(vpnNetworkAgent); - mMockVpn.setUids(ranges); - vpnNetworkAgent.connect(true /* validated */, false /* hasInternet */, + mMockVpn.establishForMyUid(true /* validated */, false /* hasInternet */, false /* isStrictMode */); - mMockVpn.connect(); defaultCallback.assertNoCallback(); assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); - vpnNetworkAgent.disconnect(); + mMockVpn.disconnect(); defaultCallback.assertNoCallback(); mCm.unregisterNetworkCallback(defaultCallback); @@ -5509,21 +5534,14 @@ public class ConnectivityServiceTest { defaultCallback.expectAvailableThenValidatedCallbacks(mWiFiNetworkAgent); assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); - TestNetworkAgentWrapper - vpnNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_VPN); - final ArraySet ranges = new ArraySet<>(); - ranges.add(new UidRange(uid, uid)); - mMockVpn.setNetworkAgent(vpnNetworkAgent); - mMockVpn.setUids(ranges); - vpnNetworkAgent.connect(true /* validated */, true /* hasInternet */, + mMockVpn.establishForMyUid(true /* validated */, true /* hasInternet */, false /* isStrictMode */); - mMockVpn.connect(); - defaultCallback.expectAvailableThenValidatedCallbacks(vpnNetworkAgent); + defaultCallback.expectAvailableThenValidatedCallbacks(mMockVpn); assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); - vpnNetworkAgent.disconnect(); - defaultCallback.expectCallback(CallbackEntry.LOST, vpnNetworkAgent); + mMockVpn.disconnect(); + defaultCallback.expectCallback(CallbackEntry.LOST, mMockVpn); defaultCallback.expectAvailableCallbacksValidated(mWiFiNetworkAgent); mCm.unregisterNetworkCallback(defaultCallback); @@ -5541,44 +5559,36 @@ public class ConnectivityServiceTest { callback.assertNoCallback(); // Bring up a VPN that has the INTERNET capability, initially unvalidated. - final int uid = Process.myUid(); - final TestNetworkAgentWrapper - vpnNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_VPN); - final ArraySet ranges = new ArraySet<>(); - ranges.add(new UidRange(uid, uid)); - mMockVpn.setNetworkAgent(vpnNetworkAgent); - mMockVpn.setUids(ranges); - vpnNetworkAgent.connect(false /* validated */, true /* hasInternet */, + mMockVpn.establishForMyUid(false /* validated */, true /* hasInternet */, false /* isStrictMode */); - mMockVpn.connect(); // Even though the VPN is unvalidated, it becomes the default network for our app. - callback.expectAvailableCallbacksUnvalidated(vpnNetworkAgent); + callback.expectAvailableCallbacksUnvalidated(mMockVpn); callback.assertNoCallback(); - assertTrue(vpnNetworkAgent.getScore() > mEthernetNetworkAgent.getScore()); - assertEquals(ConnectivityConstants.VPN_DEFAULT_SCORE, vpnNetworkAgent.getScore()); - assertEquals(vpnNetworkAgent.getNetwork(), mCm.getActiveNetwork()); + assertTrue(mMockVpn.getAgent().getScore() > mEthernetNetworkAgent.getScore()); + assertEquals(ConnectivityConstants.VPN_DEFAULT_SCORE, mMockVpn.getAgent().getScore()); + assertEquals(mMockVpn.getNetwork(), mCm.getActiveNetwork()); - NetworkCapabilities nc = mCm.getNetworkCapabilities(vpnNetworkAgent.getNetwork()); + NetworkCapabilities nc = mCm.getNetworkCapabilities(mMockVpn.getNetwork()); assertFalse(nc.hasCapability(NET_CAPABILITY_VALIDATED)); assertTrue(nc.hasCapability(NET_CAPABILITY_INTERNET)); assertFalse(NetworkMonitorUtils.isValidationRequired( - vpnNetworkAgent.getNetworkCapabilities())); + mMockVpn.getAgent().getNetworkCapabilities())); assertTrue(NetworkMonitorUtils.isPrivateDnsValidationRequired( - vpnNetworkAgent.getNetworkCapabilities())); + mMockVpn.getAgent().getNetworkCapabilities())); // Pretend that the VPN network validates. - vpnNetworkAgent.setNetworkValid(false /* isStrictMode */); - vpnNetworkAgent.mNetworkMonitor.forceReevaluation(Process.myUid()); + mMockVpn.getAgent().setNetworkValid(false /* isStrictMode */); + mMockVpn.getAgent().mNetworkMonitor.forceReevaluation(Process.myUid()); // Expect to see the validated capability, but no other changes, because the VPN is already // the default network for the app. - callback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, vpnNetworkAgent); + callback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mMockVpn); callback.assertNoCallback(); - vpnNetworkAgent.disconnect(); - callback.expectCallback(CallbackEntry.LOST, vpnNetworkAgent); + mMockVpn.disconnect(); + callback.expectCallback(CallbackEntry.LOST, mMockVpn); callback.expectAvailableCallbacksValidated(mEthernetNetworkAgent); } @@ -5600,21 +5610,15 @@ public class ConnectivityServiceTest { mCellNetworkAgent.addCapability(NET_CAPABILITY_NOT_SUSPENDED); mCellNetworkAgent.connect(true); - final TestNetworkAgentWrapper vpnNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_VPN); - final ArraySet ranges = new ArraySet<>(); - ranges.add(new UidRange(uid, uid)); - mMockVpn.setNetworkAgent(vpnNetworkAgent); - mMockVpn.connect(); - mMockVpn.setUids(ranges); - vpnNetworkAgent.connect(true /* validated */, false /* hasInternet */, + mMockVpn.establishForMyUid(true /* validated */, false /* hasInternet */, false /* isStrictMode */); - vpnNetworkCallback.expectAvailableCallbacks(vpnNetworkAgent.getNetwork(), + vpnNetworkCallback.expectAvailableCallbacks(mMockVpn.getNetwork(), false /* suspended */, false /* validated */, false /* blocked */, TIMEOUT_MS); - vpnNetworkCallback.expectCapabilitiesThat(vpnNetworkAgent.getNetwork(), TIMEOUT_MS, + vpnNetworkCallback.expectCapabilitiesThat(mMockVpn.getNetwork(), TIMEOUT_MS, nc -> nc.hasCapability(NET_CAPABILITY_VALIDATED)); - final NetworkCapabilities nc = mCm.getNetworkCapabilities(vpnNetworkAgent.getNetwork()); + final NetworkCapabilities nc = mCm.getNetworkCapabilities(mMockVpn.getNetwork()); assertTrue(nc.hasTransport(TRANSPORT_VPN)); assertTrue(nc.hasTransport(TRANSPORT_CELLULAR)); assertFalse(nc.hasTransport(TRANSPORT_WIFI)); @@ -5636,18 +5640,11 @@ public class ConnectivityServiceTest { mCm.registerNetworkCallback(vpnNetworkRequest, vpnNetworkCallback); vpnNetworkCallback.assertNoCallback(); - final TestNetworkAgentWrapper - vpnNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_VPN); - final ArraySet ranges = new ArraySet<>(); - ranges.add(new UidRange(uid, uid)); - mMockVpn.setNetworkAgent(vpnNetworkAgent); - mMockVpn.connect(); - mMockVpn.setUids(ranges); - vpnNetworkAgent.connect(true /* validated */, false /* hasInternet */, + mMockVpn.establishForMyUid(true /* validated */, false /* hasInternet */, false /* isStrictMode */); - vpnNetworkCallback.expectAvailableThenValidatedCallbacks(vpnNetworkAgent); - nc = mCm.getNetworkCapabilities(vpnNetworkAgent.getNetwork()); + vpnNetworkCallback.expectAvailableThenValidatedCallbacks(mMockVpn); + nc = mCm.getNetworkCapabilities(mMockVpn.getNetwork()); assertTrue(nc.hasTransport(TRANSPORT_VPN)); assertFalse(nc.hasTransport(TRANSPORT_CELLULAR)); assertFalse(nc.hasTransport(TRANSPORT_WIFI)); @@ -5664,7 +5661,7 @@ public class ConnectivityServiceTest { mService.setUnderlyingNetworksForVpn( new Network[] { mCellNetworkAgent.getNetwork() }); - vpnNetworkCallback.expectCapabilitiesThat(vpnNetworkAgent, + vpnNetworkCallback.expectCapabilitiesThat(mMockVpn, (caps) -> caps.hasTransport(TRANSPORT_VPN) && caps.hasTransport(TRANSPORT_CELLULAR) && !caps.hasTransport(TRANSPORT_WIFI) && !caps.hasCapability(NET_CAPABILITY_NOT_METERED) @@ -5678,7 +5675,7 @@ public class ConnectivityServiceTest { mService.setUnderlyingNetworksForVpn( new Network[] { mCellNetworkAgent.getNetwork(), mWiFiNetworkAgent.getNetwork() }); - vpnNetworkCallback.expectCapabilitiesThat(vpnNetworkAgent, + vpnNetworkCallback.expectCapabilitiesThat(mMockVpn, (caps) -> caps.hasTransport(TRANSPORT_VPN) && caps.hasTransport(TRANSPORT_CELLULAR) && caps.hasTransport(TRANSPORT_WIFI) && !caps.hasCapability(NET_CAPABILITY_NOT_METERED) @@ -5688,7 +5685,7 @@ public class ConnectivityServiceTest { mService.setUnderlyingNetworksForVpn( new Network[] { mCellNetworkAgent.getNetwork() }); - vpnNetworkCallback.expectCapabilitiesThat(vpnNetworkAgent, + vpnNetworkCallback.expectCapabilitiesThat(mMockVpn, (caps) -> caps.hasTransport(TRANSPORT_VPN) && caps.hasTransport(TRANSPORT_CELLULAR) && !caps.hasTransport(TRANSPORT_WIFI) && !caps.hasCapability(NET_CAPABILITY_NOT_METERED) @@ -5696,27 +5693,27 @@ public class ConnectivityServiceTest { // Remove NOT_SUSPENDED from the only network and observe VPN is now suspended. mCellNetworkAgent.removeCapability(NET_CAPABILITY_NOT_SUSPENDED); - vpnNetworkCallback.expectCapabilitiesThat(vpnNetworkAgent, + vpnNetworkCallback.expectCapabilitiesThat(mMockVpn, (caps) -> caps.hasTransport(TRANSPORT_VPN) && caps.hasTransport(TRANSPORT_CELLULAR) && !caps.hasTransport(TRANSPORT_WIFI) && !caps.hasCapability(NET_CAPABILITY_NOT_METERED) && !caps.hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); - vpnNetworkCallback.expectCallback(CallbackEntry.SUSPENDED, vpnNetworkAgent); + vpnNetworkCallback.expectCallback(CallbackEntry.SUSPENDED, mMockVpn); // Add NOT_SUSPENDED again and observe VPN is no longer suspended. mCellNetworkAgent.addCapability(NET_CAPABILITY_NOT_SUSPENDED); - vpnNetworkCallback.expectCapabilitiesThat(vpnNetworkAgent, + vpnNetworkCallback.expectCapabilitiesThat(mMockVpn, (caps) -> caps.hasTransport(TRANSPORT_VPN) && caps.hasTransport(TRANSPORT_CELLULAR) && !caps.hasTransport(TRANSPORT_WIFI) && !caps.hasCapability(NET_CAPABILITY_NOT_METERED) && caps.hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); - vpnNetworkCallback.expectCallback(CallbackEntry.RESUMED, vpnNetworkAgent); + vpnNetworkCallback.expectCallback(CallbackEntry.RESUMED, mMockVpn); // Use Wifi but not cell. Note the VPN is now unmetered and not suspended. mService.setUnderlyingNetworksForVpn( new Network[] { mWiFiNetworkAgent.getNetwork() }); - vpnNetworkCallback.expectCapabilitiesThat(vpnNetworkAgent, + vpnNetworkCallback.expectCapabilitiesThat(mMockVpn, (caps) -> caps.hasTransport(TRANSPORT_VPN) && !caps.hasTransport(TRANSPORT_CELLULAR) && caps.hasTransport(TRANSPORT_WIFI) && caps.hasCapability(NET_CAPABILITY_NOT_METERED) @@ -5726,7 +5723,7 @@ public class ConnectivityServiceTest { mService.setUnderlyingNetworksForVpn( new Network[] { mCellNetworkAgent.getNetwork(), mWiFiNetworkAgent.getNetwork() }); - vpnNetworkCallback.expectCapabilitiesThat(vpnNetworkAgent, + vpnNetworkCallback.expectCapabilitiesThat(mMockVpn, (caps) -> caps.hasTransport(TRANSPORT_VPN) && caps.hasTransport(TRANSPORT_CELLULAR) && caps.hasTransport(TRANSPORT_WIFI) && !caps.hasCapability(NET_CAPABILITY_NOT_METERED) @@ -5739,7 +5736,7 @@ public class ConnectivityServiceTest { // Stop using WiFi. The VPN is suspended again. mService.setUnderlyingNetworksForVpn( new Network[] { mCellNetworkAgent.getNetwork() }); - vpnNetworkCallback.expectCapabilitiesThat(vpnNetworkAgent, + vpnNetworkCallback.expectCapabilitiesThat(mMockVpn, (caps) -> caps.hasTransport(TRANSPORT_VPN) && caps.hasTransport(TRANSPORT_CELLULAR) && !caps.hasCapability(NET_CAPABILITY_NOT_METERED) @@ -5753,7 +5750,7 @@ public class ConnectivityServiceTest { mService.setUnderlyingNetworksForVpn( new Network[] { mCellNetworkAgent.getNetwork(), mWiFiNetworkAgent.getNetwork() }); - vpnNetworkCallback.expectCapabilitiesThat(vpnNetworkAgent, + vpnNetworkCallback.expectCapabilitiesThat(mMockVpn, (caps) -> caps.hasTransport(TRANSPORT_VPN) && caps.hasTransport(TRANSPORT_CELLULAR) && caps.hasTransport(TRANSPORT_WIFI) && !caps.hasCapability(NET_CAPABILITY_NOT_METERED) @@ -5764,14 +5761,14 @@ public class ConnectivityServiceTest { // Disconnect cell. Receive update without even removing the dead network from the // underlying networks – it's dead anyway. Not metered any more. mCellNetworkAgent.disconnect(); - vpnNetworkCallback.expectCapabilitiesThat(vpnNetworkAgent, + vpnNetworkCallback.expectCapabilitiesThat(mMockVpn, (caps) -> caps.hasTransport(TRANSPORT_VPN) && !caps.hasTransport(TRANSPORT_CELLULAR) && caps.hasTransport(TRANSPORT_WIFI) && caps.hasCapability(NET_CAPABILITY_NOT_METERED)); // Disconnect wifi too. No underlying networks means this is now metered. mWiFiNetworkAgent.disconnect(); - vpnNetworkCallback.expectCapabilitiesThat(vpnNetworkAgent, + vpnNetworkCallback.expectCapabilitiesThat(mMockVpn, (caps) -> caps.hasTransport(TRANSPORT_VPN) && !caps.hasTransport(TRANSPORT_CELLULAR) && !caps.hasTransport(TRANSPORT_WIFI) && !caps.hasCapability(NET_CAPABILITY_NOT_METERED)); @@ -5792,18 +5789,11 @@ public class ConnectivityServiceTest { mCm.registerNetworkCallback(vpnNetworkRequest, vpnNetworkCallback); vpnNetworkCallback.assertNoCallback(); - final TestNetworkAgentWrapper - vpnNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_VPN); - final ArraySet ranges = new ArraySet<>(); - ranges.add(new UidRange(uid, uid)); - mMockVpn.setNetworkAgent(vpnNetworkAgent); - mMockVpn.connect(); - mMockVpn.setUids(ranges); - vpnNetworkAgent.connect(true /* validated */, false /* hasInternet */, + mMockVpn.establishForMyUid(true /* validated */, false /* hasInternet */, false /* isStrictMode */); - vpnNetworkCallback.expectAvailableThenValidatedCallbacks(vpnNetworkAgent); - nc = mCm.getNetworkCapabilities(vpnNetworkAgent.getNetwork()); + vpnNetworkCallback.expectAvailableThenValidatedCallbacks(mMockVpn); + nc = mCm.getNetworkCapabilities(mMockVpn.getNetwork()); assertTrue(nc.hasTransport(TRANSPORT_VPN)); assertFalse(nc.hasTransport(TRANSPORT_CELLULAR)); assertFalse(nc.hasTransport(TRANSPORT_WIFI)); @@ -5815,7 +5805,7 @@ public class ConnectivityServiceTest { mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR); mCellNetworkAgent.connect(true); - vpnNetworkCallback.expectCapabilitiesThat(vpnNetworkAgent, + vpnNetworkCallback.expectCapabilitiesThat(mMockVpn, (caps) -> caps.hasTransport(TRANSPORT_VPN) && caps.hasTransport(TRANSPORT_CELLULAR) && !caps.hasTransport(TRANSPORT_WIFI) && !caps.hasCapability(NET_CAPABILITY_NOT_METERED)); @@ -5825,7 +5815,7 @@ public class ConnectivityServiceTest { mWiFiNetworkAgent.addCapability(NET_CAPABILITY_NOT_METERED); mWiFiNetworkAgent.connect(true); - vpnNetworkCallback.expectCapabilitiesThat(vpnNetworkAgent, + vpnNetworkCallback.expectCapabilitiesThat(mMockVpn, (caps) -> caps.hasTransport(TRANSPORT_VPN) && !caps.hasTransport(TRANSPORT_CELLULAR) && caps.hasTransport(TRANSPORT_WIFI) && caps.hasCapability(NET_CAPABILITY_NOT_METERED)); @@ -5837,7 +5827,7 @@ public class ConnectivityServiceTest { // Disconnect wifi too. Now we have no default network. mWiFiNetworkAgent.disconnect(); - vpnNetworkCallback.expectCapabilitiesThat(vpnNetworkAgent, + vpnNetworkCallback.expectCapabilitiesThat(mMockVpn, (caps) -> caps.hasTransport(TRANSPORT_VPN) && !caps.hasTransport(TRANSPORT_CELLULAR) && !caps.hasTransport(TRANSPORT_WIFI) && !caps.hasCapability(NET_CAPABILITY_NOT_METERED)); @@ -5880,18 +5870,10 @@ public class ConnectivityServiceTest { assertTrue(mCm.isActiveNetworkMetered()); // Connect VPN network. By default it is using current default network (Cell). - TestNetworkAgentWrapper - vpnNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_VPN); - final ArraySet ranges = new ArraySet<>(); - final int uid = Process.myUid(); - ranges.add(new UidRange(uid, uid)); - mMockVpn.setNetworkAgent(vpnNetworkAgent); - mMockVpn.setUids(ranges); - vpnNetworkAgent.connect(true); - mMockVpn.connect(); - waitForIdle(); + mMockVpn.establishForMyUid(); + // Ensure VPN is now the active network. - assertEquals(vpnNetworkAgent.getNetwork(), mCm.getActiveNetwork()); + assertEquals(mMockVpn.getNetwork(), mCm.getActiveNetwork()); // Expect VPN to be metered. assertTrue(mCm.isActiveNetworkMetered()); @@ -5902,7 +5884,7 @@ public class ConnectivityServiceTest { mWiFiNetworkAgent.connect(true); waitForIdle(); // VPN should still be the active network. - assertEquals(vpnNetworkAgent.getNetwork(), mCm.getActiveNetwork()); + assertEquals(mMockVpn.getNetwork(), mCm.getActiveNetwork()); // Expect VPN to be unmetered as it should now be using WiFi (new default). assertFalse(mCm.isActiveNetworkMetered()); @@ -5920,7 +5902,6 @@ public class ConnectivityServiceTest { // VPN without any underlying networks is treated as metered. assertTrue(mCm.isActiveNetworkMetered()); - vpnNetworkAgent.disconnect(); mMockVpn.disconnect(); } @@ -5941,18 +5922,10 @@ public class ConnectivityServiceTest { assertFalse(mCm.isActiveNetworkMetered()); // Connect VPN network. - TestNetworkAgentWrapper - vpnNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_VPN); - final ArraySet ranges = new ArraySet<>(); - final int uid = Process.myUid(); - ranges.add(new UidRange(uid, uid)); - mMockVpn.setNetworkAgent(vpnNetworkAgent); - mMockVpn.setUids(ranges); - vpnNetworkAgent.connect(true); - mMockVpn.connect(); - waitForIdle(); + mMockVpn.establishForMyUid(); + // Ensure VPN is now the active network. - assertEquals(vpnNetworkAgent.getNetwork(), mCm.getActiveNetwork()); + assertEquals(mMockVpn.getNetwork(), mCm.getActiveNetwork()); // VPN is using Cell mService.setUnderlyingNetworksForVpn( new Network[] { mCellNetworkAgent.getNetwork() }); @@ -5992,7 +5965,6 @@ public class ConnectivityServiceTest { // VPN without underlying networks is treated as metered. assertTrue(mCm.isActiveNetworkMetered()); - vpnNetworkAgent.disconnect(); mMockVpn.disconnect(); } @@ -6007,17 +5979,11 @@ public class ConnectivityServiceTest { assertFalse(mCm.isActiveNetworkMetered()); // Connect VPN network. - TestNetworkAgentWrapper - vpnNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_VPN); - final ArraySet ranges = new ArraySet<>(); - final int uid = Process.myUid(); - ranges.add(new UidRange(uid, uid)); - mMockVpn.setNetworkAgent(vpnNetworkAgent); - mMockVpn.setUids(ranges); - vpnNetworkAgent.connect(true); - mMockVpn.connectAsAlwaysMetered(); + mMockVpn.registerAgent(true /* isAlwaysMetered */, uidRangesForUid(Process.myUid()), + new LinkProperties()); + mMockVpn.connect(true); waitForIdle(); - assertEquals(vpnNetworkAgent.getNetwork(), mCm.getActiveNetwork()); + assertEquals(mMockVpn.getNetwork(), mCm.getActiveNetwork()); // VPN is tracking current platform default (WiFi). mService.setUnderlyingNetworksForVpn(null); @@ -6041,7 +6007,7 @@ public class ConnectivityServiceTest { assertTrue(mCm.isActiveNetworkMetered()); - vpnNetworkAgent.disconnect(); + mMockVpn.disconnect(); } @Test @@ -6766,34 +6732,21 @@ public class ConnectivityServiceTest { waitForIdle(); assertNull(mService.getProxyForNetwork(null)); - // Set up a VPN network with a proxy - final int uid = Process.myUid(); - final TestNetworkAgentWrapper - vpnNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_VPN); - final ArraySet ranges = new ArraySet<>(); - ranges.add(new UidRange(uid, uid)); - mMockVpn.setUids(ranges); + // Connect a VPN network with a proxy. LinkProperties testLinkProperties = new LinkProperties(); testLinkProperties.setHttpProxy(testProxyInfo); - vpnNetworkAgent.sendLinkProperties(testLinkProperties); - waitForIdle(); - - // Connect to VPN with proxy - mMockVpn.setNetworkAgent(vpnNetworkAgent); - vpnNetworkAgent.connect(true); - mMockVpn.connect(); - waitForIdle(); + mMockVpn.establishForMyUid(testLinkProperties); // Test that the VPN network returns a proxy, and the WiFi does not. - assertEquals(testProxyInfo, mService.getProxyForNetwork(vpnNetworkAgent.getNetwork())); + assertEquals(testProxyInfo, mService.getProxyForNetwork(mMockVpn.getNetwork())); assertEquals(testProxyInfo, mService.getProxyForNetwork(null)); assertNull(mService.getProxyForNetwork(mWiFiNetworkAgent.getNetwork())); // Test that the VPN network returns no proxy when it is set to null. testLinkProperties.setHttpProxy(null); - vpnNetworkAgent.sendLinkProperties(testLinkProperties); + mMockVpn.sendLinkProperties(testLinkProperties); waitForIdle(); - assertNull(mService.getProxyForNetwork(vpnNetworkAgent.getNetwork())); + assertNull(mService.getProxyForNetwork(mMockVpn.getNetwork())); assertNull(mService.getProxyForNetwork(null)); // Set WiFi proxy and check that the vpn proxy is still null. @@ -6804,7 +6757,7 @@ public class ConnectivityServiceTest { // Disconnect from VPN and check that the active network, which is now the WiFi, has the // correct proxy setting. - vpnNetworkAgent.disconnect(); + mMockVpn.disconnect(); waitForIdle(); assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); assertEquals(testProxyInfo, mService.getProxyForNetwork(mWiFiNetworkAgent.getNetwork())); @@ -6819,7 +6772,7 @@ public class ConnectivityServiceTest { lp.addRoute(new RouteInfo(new IpPrefix(Inet6Address.ANY, 0), RTN_UNREACHABLE)); // The uid range needs to cover the test app so the network is visible to it. final Set vpnRange = Collections.singleton(UidRange.createForUser(VPN_USER)); - final TestNetworkAgentWrapper vpnNetworkAgent = establishVpn(lp, VPN_UID, vpnRange); + mMockVpn.establish(lp, VPN_UID, vpnRange); // Connected VPN should have interface rules set up. There are two expected invocations, // one during VPN uid update, one during VPN LinkProperties update @@ -6829,7 +6782,7 @@ public class ConnectivityServiceTest { assertContainsExactly(uidCaptor.getAllValues().get(1), APP1_UID, APP2_UID); assertTrue(mService.mPermissionMonitor.getVpnUidRanges("tun0").equals(vpnRange)); - vpnNetworkAgent.disconnect(); + mMockVpn.disconnect(); waitForIdle(); // Disconnected VPN should have interface rules removed @@ -6846,8 +6799,7 @@ public class ConnectivityServiceTest { lp.addRoute(new RouteInfo(new IpPrefix(Inet4Address.ANY, 0), null)); // The uid range needs to cover the test app so the network is visible to it. final Set vpnRange = Collections.singleton(UidRange.createForUser(VPN_USER)); - final TestNetworkAgentWrapper vpnNetworkAgent = establishVpn( - lp, Process.SYSTEM_UID, vpnRange); + mMockVpn.establish(lp, Process.SYSTEM_UID, vpnRange); // Legacy VPN should not have interface rules set up verify(mMockNetd, never()).firewallAddUidInterfaceRules(any(), any()); @@ -6862,8 +6814,7 @@ public class ConnectivityServiceTest { lp.addRoute(new RouteInfo(new IpPrefix(Inet6Address.ANY, 0), RTN_UNREACHABLE)); // The uid range needs to cover the test app so the network is visible to it. final Set vpnRange = Collections.singleton(UidRange.createForUser(VPN_USER)); - final TestNetworkAgentWrapper vpnNetworkAgent = establishVpn( - lp, Process.SYSTEM_UID, vpnRange); + mMockVpn.establish(lp, Process.SYSTEM_UID, vpnRange); // IPv6 unreachable route should not be misinterpreted as a default route verify(mMockNetd, never()).firewallAddUidInterfaceRules(any(), any()); @@ -6877,7 +6828,7 @@ public class ConnectivityServiceTest { lp.addRoute(new RouteInfo(new IpPrefix(Inet6Address.ANY, 0), null)); // The uid range needs to cover the test app so the network is visible to it. final Set vpnRange = Collections.singleton(UidRange.createForUser(VPN_USER)); - final TestNetworkAgentWrapper vpnNetworkAgent = establishVpn(lp, VPN_UID, vpnRange); + mMockVpn.establish(lp, VPN_UID, vpnRange); // Connected VPN should have interface rules set up. There are two expected invocations, // one during VPN uid update, one during VPN LinkProperties update @@ -6889,7 +6840,7 @@ public class ConnectivityServiceTest { reset(mMockNetd); InOrder inOrder = inOrder(mMockNetd); lp.setInterfaceName("tun1"); - vpnNetworkAgent.sendLinkProperties(lp); + mMockVpn.sendLinkProperties(lp); waitForIdle(); // VPN handover (switch to a new interface) should result in rules being updated (old rules // removed first, then new rules added) @@ -6902,7 +6853,7 @@ public class ConnectivityServiceTest { lp = new LinkProperties(); lp.setInterfaceName("tun1"); lp.addRoute(new RouteInfo(new IpPrefix("192.0.2.0/24"), null, "tun1")); - vpnNetworkAgent.sendLinkProperties(lp); + mMockVpn.sendLinkProperties(lp); waitForIdle(); // VPN not routing everything should no longer have interface filtering rules verify(mMockNetd).firewallRemoveUidInterfaceRules(uidCaptor.capture()); @@ -6913,7 +6864,7 @@ public class ConnectivityServiceTest { lp.setInterfaceName("tun1"); lp.addRoute(new RouteInfo(new IpPrefix(Inet4Address.ANY, 0), RTN_UNREACHABLE)); lp.addRoute(new RouteInfo(new IpPrefix(Inet6Address.ANY, 0), null)); - vpnNetworkAgent.sendLinkProperties(lp); + mMockVpn.sendLinkProperties(lp); waitForIdle(); // Back to routing all IPv6 traffic should have filtering rules verify(mMockNetd).firewallAddUidInterfaceRules(eq("tun1"), uidCaptor.capture()); @@ -6928,8 +6879,7 @@ public class ConnectivityServiceTest { lp.addRoute(new RouteInfo(new IpPrefix(Inet6Address.ANY, 0), null)); // The uid range needs to cover the test app so the network is visible to it. final UidRange vpnRange = UidRange.createForUser(VPN_USER); - final TestNetworkAgentWrapper vpnNetworkAgent = establishVpn(lp, VPN_UID, - Collections.singleton(vpnRange)); + mMockVpn.establish(lp, VPN_UID, Collections.singleton(vpnRange)); reset(mMockNetd); InOrder inOrder = inOrder(mMockNetd); @@ -6938,7 +6888,7 @@ public class ConnectivityServiceTest { final Set newRanges = new HashSet<>(Arrays.asList( new UidRange(vpnRange.start, APP1_UID - 1), new UidRange(APP1_UID + 1, vpnRange.stop))); - vpnNetworkAgent.setUids(newRanges); + mMockVpn.setUids(newRanges); waitForIdle(); ArgumentCaptor uidCaptor = ArgumentCaptor.forClass(int[].class); @@ -7079,7 +7029,7 @@ public class ConnectivityServiceTest { private void setupConnectionOwnerUid(int vpnOwnerUid, @VpnManager.VpnType int vpnType) throws Exception { final Set vpnRange = Collections.singleton(UidRange.createForUser(VPN_USER)); - establishVpn(new LinkProperties(), vpnOwnerUid, vpnRange); + mMockVpn.establish(new LinkProperties(), vpnOwnerUid, vpnRange); mMockVpn.setVpnType(vpnType); final VpnInfo vpnInfo = new VpnInfo(); @@ -7160,27 +7110,6 @@ public class ConnectivityServiceTest { mService.getConnectionOwnerUid(getTestConnectionInfo()); } - private TestNetworkAgentWrapper establishVpn( - LinkProperties lp, int ownerUid, Set vpnRange) throws Exception { - final TestNetworkAgentWrapper - vpnNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_VPN, lp); - vpnNetworkAgent.getNetworkCapabilities().setOwnerUid(ownerUid); - mMockVpn.setNetworkAgent(vpnNetworkAgent); - mMockVpn.connect(); - mMockVpn.setUids(vpnRange); - vpnNetworkAgent.connect(true); - waitForIdle(); - return vpnNetworkAgent; - } - - private TestNetworkAgentWrapper establishVpnForMyUid(LinkProperties lp) - throws Exception { - final int uid = Process.myUid(); - final ArraySet ranges = new ArraySet<>(); - ranges.add(new UidRange(uid, uid)); - return establishVpn(lp, uid, ranges); - } - private static PackageInfo buildPackageInfo(boolean hasSystemPermission, int uid) { final PackageInfo packageInfo = new PackageInfo(); if (hasSystemPermission) { @@ -7360,7 +7289,6 @@ public class ConnectivityServiceTest { setupLocationPermissions(Build.VERSION_CODES.Q, true, AppOpsManager.OPSTR_FINE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION); - mServiceContext.setPermission(android.Manifest.permission.NETWORK_STACK, PERMISSION_DENIED); // setUp() calls mockVpn() which adds a VPN with the Test Runner's uid. Configure it to be // active @@ -7369,9 +7297,11 @@ public class ConnectivityServiceTest { info.vpnIface = VPN_IFNAME; mMockVpn.setVpnInfo(info); - final TestNetworkAgentWrapper vpnNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_VPN); - mMockVpn.setNetworkAgent(vpnNetworkAgent); - mMockVpn.connect(); + mMockVpn.establishForMyUid(); + waitForIdle(); + + mServiceContext.setPermission(android.Manifest.permission.NETWORK_STACK, PERMISSION_DENIED); + assertTrue(mService.setUnderlyingNetworksForVpn(new Network[] {network})); assertTrue( @@ -7401,8 +7331,6 @@ public class ConnectivityServiceTest { Manifest.permission.ACCESS_FINE_LOCATION); mServiceContext.setPermission(android.Manifest.permission.NETWORK_STACK, PERMISSION_DENIED); - // Disconnect mock vpn so the uid check on NetworkAgentInfo is tested - mMockVpn.disconnect(); assertTrue( "NetworkCapabilities administrator uid permission not applied", mService.checkConnectivityDiagnosticsPermissions( From d2adbfbf40aaf5d533607fe71e93d6ff6cba2ba1 Mon Sep 17 00:00:00 2001 From: Lorenzo Colitti Date: Thu, 19 Nov 2020 23:20:55 +0900 Subject: [PATCH 097/288] Make testVpnNetworkActive more deterministic. This test is a bit brittle because it sets the underlying networks while the VPN is undergoing validation by NetworkMonitor. The test does attempt to disable validation, but that's not actually possible - the only thing that's possible is to tell NetworkMonitor to validate immediately without sending any probes. So the underlying network change races with the validation. I'm not sure why the test isn't flaky. It might be because both the network change and the validation result in a capabilities change, and the test expects "a capabilities change" without expressing what change that should be. Make this a bit more predictable by ensuring that the network validates before the underlying networks are set. This is useful because an upcoming CL will change the way underlying network capabilities are propagated. With this test CL, both the old and the new code pass. Bug: 172870110 Test: test-only change Change-Id: I319858228e8d097c0b60a107029f296385f91269 Merged-In: I319858228e8d097c0b60a107029f296385f91269 --- .../android/server/ConnectivityServiceTest.java | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index 810ccbe252ca0..bb39af9a1b9e9 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -5423,6 +5423,7 @@ public class ConnectivityServiceTest { final Set ranges = uidRangesForUid(uid); mMockVpn.registerAgent(ranges); + mService.setUnderlyingNetworksForVpn(new Network[0]); // VPN networks do not satisfy the default request and are automatically validated // by NetworkMonitor @@ -5431,19 +5432,12 @@ public class ConnectivityServiceTest { mMockVpn.getAgent().setNetworkValid(false /* isStrictMode */); mMockVpn.connect(false); - mService.setUnderlyingNetworksForVpn(new Network[0]); - genericNetworkCallback.expectAvailableCallbacksUnvalidated(mMockVpn); + genericNetworkCallback.expectAvailableThenValidatedCallbacks(mMockVpn); genericNotVpnNetworkCallback.assertNoCallback(); wifiNetworkCallback.assertNoCallback(); - vpnNetworkCallback.expectAvailableCallbacksUnvalidated(mMockVpn); - defaultCallback.expectAvailableCallbacksUnvalidated(mMockVpn); - assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); - - genericNetworkCallback.expectCallback(CallbackEntry.NETWORK_CAPS_UPDATED, mMockVpn); - genericNotVpnNetworkCallback.assertNoCallback(); - vpnNetworkCallback.expectCapabilitiesThat(mMockVpn, nc -> null == nc.getUids()); - defaultCallback.expectCallback(CallbackEntry.NETWORK_CAPS_UPDATED, mMockVpn); + vpnNetworkCallback.expectAvailableThenValidatedCallbacks(mMockVpn); + defaultCallback.expectAvailableThenValidatedCallbacks(mMockVpn); assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); ranges.clear(); From 1a05734c87f9e3ce0cbd33ea1f13ee7a27c57f01 Mon Sep 17 00:00:00 2001 From: Lorenzo Colitti Date: Wed, 25 Nov 2020 22:59:08 +0900 Subject: [PATCH 098/288] Test passing an underlying network array with null network in it. Current code treats these nulls as if they weren't there. Bug: 172870110 Test: test-only change Change-Id: Id4632e1b004c09910b4b7613f7233d2c19e2f0ac Merged-In: Id4632e1b004c09910b4b7613f7233d2c19e2f0ac --- .../server/ConnectivityServiceTest.java | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index bb39af9a1b9e9..9945853c5a6f9 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -4896,8 +4896,6 @@ public class ConnectivityServiceTest { final Network[] cellAndVpn = new Network[] { mCellNetworkAgent.getNetwork(), mMockVpn.getNetwork()}; - Network[] cellAndWifi = new Network[] { - mCellNetworkAgent.getNetwork(), mWiFiNetworkAgent.getNetwork()}; // A VPN with default (null) underlying networks sets the underlying network's interfaces... expectForceUpdateIfaces(cellAndVpn, MOBILE_IFNAME, Process.myUid(), VPN_IFNAME, @@ -4907,10 +4905,13 @@ public class ConnectivityServiceTest { mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); mWiFiNetworkAgent.connect(false); mWiFiNetworkAgent.sendLinkProperties(wifiLp); + final Network[] onlyNull = new Network[]{null}; final Network[] wifiAndVpn = new Network[] { mWiFiNetworkAgent.getNetwork(), mMockVpn.getNetwork()}; - cellAndWifi = new Network[] { + final Network[] cellAndWifi = new Network[] { mCellNetworkAgent.getNetwork(), mWiFiNetworkAgent.getNetwork()}; + final Network[] cellNullAndWifi = new Network[] { + mCellNetworkAgent.getNetwork(), null, mWiFiNetworkAgent.getNetwork()}; waitForIdle(); assertEquals(wifiLp, mService.getActiveLinkProperties()); @@ -4936,6 +4937,13 @@ public class ConnectivityServiceTest { new String[]{MOBILE_IFNAME, WIFI_IFNAME}); reset(mStatsService); + // Null underlying networks are ignored. + mService.setUnderlyingNetworksForVpn(cellNullAndWifi); + waitForIdle(); + expectForceUpdateIfaces(wifiAndVpn, MOBILE_IFNAME, Process.myUid(), VPN_IFNAME, + new String[]{MOBILE_IFNAME, WIFI_IFNAME}); + reset(mStatsService); + // If an underlying network disconnects, that interface should no longer be underlying. // This doesn't actually work because disconnectAndDestroyNetwork only notifies // NetworkStatsService before the underlying network is actually removed. So the underlying @@ -4970,6 +4978,7 @@ public class ConnectivityServiceTest { argThat(vpnInfos -> vpnInfos[0].underlyingIfaces.length == 1 && WIFI_IFNAME.equals(vpnInfos[0].underlyingIfaces[0]))); mEthernetNetworkAgent.disconnect(); + waitForIdle(); reset(mStatsService); // When a VPN declares no underlying networks (i.e., no connectivity), getAllVpnInfo @@ -4982,6 +4991,18 @@ public class ConnectivityServiceTest { waitForIdle(); expectForceUpdateIfaces(wifiAndVpn, null); reset(mStatsService); + + // Specifying only a null underlying network is the same as no networks. + mService.setUnderlyingNetworksForVpn(onlyNull); + waitForIdle(); + expectForceUpdateIfaces(wifiAndVpn, null); + reset(mStatsService); + + // Specifying networks that are all disconnected is the same as specifying no networks. + mService.setUnderlyingNetworksForVpn(onlyCell); + waitForIdle(); + expectForceUpdateIfaces(wifiAndVpn, null); + reset(mStatsService); } @Test From 4a66aedf09ccdf19d302a5cff6dec5ec9da076bf Mon Sep 17 00:00:00 2001 From: Lorenzo Colitti Date: Wed, 6 Jan 2021 01:36:07 +0900 Subject: [PATCH 099/288] Improve testing of CONNECTIVITY_ACTION broadcasts. We currently test CONNECTIVITY_ACTION broadcasts by directly registering BroadcastReceivers with BroadcastInterceptingContext, and making the receivers unregister themselves when all the broadcasts they expect have been received. This works for current test cases, but does not work if anything registers another receiver for CONNECTIVITY_ACTION. In that case, when we unregister the receiver in the receiver's onReceive method, BroadcastInterceptingContext will throw a ConcurrentModificationException because the list of receivers is being modified during iteration. Fix this by adding an ExpectedBroadcast class that stores the receiver and unregisters the receiver only when the test checks that the broadcast was received, which happens after the receiver runs. This is easier to use and also guarantees that the receiver is unregistered even if the test is expecting that the broadcast is never fired. Accordingly, remove mRegisteredReceivers and the code that uses it; it's no longer necessary now that ExpectedBroadcast always unregisters its receivers. Also add a convenience expectConnectivityAction method to expect a CONNECTIVITY_ACTION broadcast with specific contents. This makes the test easier to read and more detailed. Convert some existing tests to this method. While I'm at it, fix a test that was using "mCellNetworkAgent" to represent a wifi network. R backport notes: added import for NetworkInfo.DetailedState. That was added in aosp/1527378, which is impractical to backport. Bug: 172870110 Test: test-only change Change-Id: Ibada8b4215625e1016d9fd170526206920af76f5 Merged-In: Ibada8b4215625e1016d9fd170526206920af76f5 --- .../server/ConnectivityServiceTest.java | 335 ++++++++++-------- 1 file changed, 180 insertions(+), 155 deletions(-) diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index 9945853c5a6f9..6cbcb6784ddd6 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -170,6 +170,7 @@ import android.net.NetworkAgentConfig; import android.net.NetworkCapabilities; import android.net.NetworkFactory; import android.net.NetworkInfo; +import android.net.NetworkInfo.DetailedState; import android.net.NetworkRequest; import android.net.NetworkSpecifier; import android.net.NetworkStack; @@ -274,13 +275,16 @@ import java.util.HashSet; import java.util.List; import java.util.Objects; import java.util.Set; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; import java.util.function.Predicate; import java.util.function.Supplier; @@ -384,9 +388,6 @@ public class ConnectivityServiceTest { private class MockContext extends BroadcastInterceptingContext { private final MockContentResolver mContentResolver; - // Contains all registered receivers since this object was created. Useful to clear - // them when needed, as BroadcastInterceptingContext does not provide this facility. - private final List mRegisteredReceivers = new ArrayList<>(); @Spy private Resources mResources; private final LinkedBlockingQueue mStartedActivities = new LinkedBlockingQueue<>(); @@ -504,19 +505,6 @@ public class ConnectivityServiceTest { public void setPermission(String permission, Integer granted) { mMockedPermissions.put(permission, granted); } - - @Override - public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) { - mRegisteredReceivers.add(receiver); - return super.registerReceiver(receiver, filter); - } - - public void clearRegisteredReceivers() { - // super.unregisterReceiver is a no-op for receivers that are not registered (because - // they haven't been registered or because they have already been unregistered). - // For the same reason, don't bother clearing mRegisteredReceivers. - for (final BroadcastReceiver rcv : mRegisteredReceivers) unregisterReceiver(rcv); - } } private void waitForIdle() { @@ -545,10 +533,10 @@ public class ConnectivityServiceTest { } // Bring up a network that we can use to send messages to ConnectivityService. - ConditionVariable cv = registerConnectivityBroadcast(1); + ExpectedBroadcast b = expectConnectivityAction(TYPE_WIFI, DetailedState.CONNECTED); mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); mWiFiNetworkAgent.connect(false); - waitFor(cv); + b.expectBroadcast(); Network n = mWiFiNetworkAgent.getNetwork(); assertNotNull(n); @@ -565,10 +553,10 @@ public class ConnectivityServiceTest { @Ignore public void verifyThatNotWaitingForIdleCausesRaceConditions() throws Exception { // Bring up a network that we can use to send messages to ConnectivityService. - ConditionVariable cv = registerConnectivityBroadcast(1); + ExpectedBroadcast b = expectConnectivityAction(TYPE_WIFI, DetailedState.CONNECTED); mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); mWiFiNetworkAgent.connect(false); - waitFor(cv); + b.expectBroadcast(); Network n = mWiFiNetworkAgent.getNetwork(); assertNotNull(n); @@ -1422,29 +1410,79 @@ public class ConnectivityServiceTest { } /** - * Return a ConditionVariable that opens when {@code count} numbers of CONNECTIVITY_ACTION - * broadcasts are received. + * Class to simplify expecting broadcasts using BroadcastInterceptingContext. + * Ensures that the receiver is unregistered after the expected broadcast is received. This + * cannot be done in the BroadcastReceiver itself because BroadcastInterceptingContext runs + * the receivers' receive method while iterating over the list of receivers, and unregistering + * the receiver during iteration throws ConcurrentModificationException. */ - private ConditionVariable registerConnectivityBroadcast(final int count) { + private class ExpectedBroadcast extends CompletableFuture { + private final BroadcastReceiver mReceiver; + + ExpectedBroadcast(BroadcastReceiver receiver) { + mReceiver = receiver; + } + + public Intent expectBroadcast(int timeoutMs) throws Exception { + try { + return get(timeoutMs, TimeUnit.MILLISECONDS); + } catch (TimeoutException e) { + fail("Expected broadcast not received after " + timeoutMs + " ms"); + return null; + } finally { + mServiceContext.unregisterReceiver(mReceiver); + } + } + + public Intent expectBroadcast() throws Exception { + return expectBroadcast(TIMEOUT_MS); + } + + public void expectNoBroadcast(int timeoutMs) throws Exception { + waitForIdle(); + try { + final Intent intent = get(timeoutMs, TimeUnit.MILLISECONDS); + fail("Unexpected broadcast: " + intent.getAction()); + } catch (TimeoutException expected) { + } finally { + mServiceContext.unregisterReceiver(mReceiver); + } + } + } + + /** Expects that {@code count} CONNECTIVITY_ACTION broadcasts are received. */ + private ExpectedBroadcast registerConnectivityBroadcast(final int count) { return registerConnectivityBroadcastThat(count, intent -> true); } - private ConditionVariable registerConnectivityBroadcastThat(final int count, + private ExpectedBroadcast registerConnectivityBroadcastThat(final int count, @NonNull final Predicate filter) { - final ConditionVariable cv = new ConditionVariable(); final IntentFilter intentFilter = new IntentFilter(CONNECTIVITY_ACTION); + // AtomicReference allows receiver to access expected even though it is constructed later. + final AtomicReference expectedRef = new AtomicReference<>(); final BroadcastReceiver receiver = new BroadcastReceiver() { - private int remaining = count; - public void onReceive(Context context, Intent intent) { - if (!filter.test(intent)) return; - if (--remaining == 0) { - cv.open(); - mServiceContext.unregisterReceiver(this); - } - } - }; + private int mRemaining = count; + public void onReceive(Context context, Intent intent) { + final int type = intent.getIntExtra(EXTRA_NETWORK_TYPE, -1); + final NetworkInfo ni = intent.getParcelableExtra(EXTRA_NETWORK_INFO); + Log.d(TAG, "Received CONNECTIVITY_ACTION type=" + type + " ni=" + ni); + if (!filter.test(intent)) return; + if (--mRemaining == 0) { + expectedRef.get().complete(intent); + } + } + }; + final ExpectedBroadcast expected = new ExpectedBroadcast(receiver); + expectedRef.set(expected); mServiceContext.registerReceiver(receiver, intentFilter); - return cv; + return expected; + } + + private ExpectedBroadcast expectConnectivityAction(int type, NetworkInfo.DetailedState state) { + return registerConnectivityBroadcastThat(1, intent -> + type == intent.getIntExtra(EXTRA_NETWORK_TYPE, -1) && state.equals( + ((NetworkInfo) intent.getParcelableExtra(EXTRA_NETWORK_INFO)) + .getDetailedState())); } @Test @@ -1468,10 +1506,9 @@ public class ConnectivityServiceTest { // Connect the cell agent and wait for the connected broadcast. mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR); mCellNetworkAgent.addCapability(NET_CAPABILITY_SUPL); - final ConditionVariable cv1 = registerConnectivityBroadcastThat(1, - intent -> intent.getIntExtra(EXTRA_NETWORK_TYPE, -1) == TYPE_MOBILE); + ExpectedBroadcast b = expectConnectivityAction(TYPE_MOBILE, DetailedState.CONNECTED); mCellNetworkAgent.connect(true); - waitFor(cv1); + b.expectBroadcast(); // Build legacy request for SUPL. final NetworkCapabilities legacyCaps = new NetworkCapabilities(); @@ -1481,27 +1518,17 @@ public class ConnectivityServiceTest { ConnectivityManager.REQUEST_ID_UNSET, NetworkRequest.Type.REQUEST); // File request, withdraw it and make sure no broadcast is sent - final ConditionVariable cv2 = registerConnectivityBroadcast(1); + b = registerConnectivityBroadcast(1); final TestNetworkCallback callback = new TestNetworkCallback(); mCm.requestNetwork(legacyRequest, callback); callback.expectCallback(CallbackEntry.AVAILABLE, mCellNetworkAgent); mCm.unregisterNetworkCallback(callback); - assertFalse(cv2.block(800)); // 800ms long enough to at least flake if this is sent - // As the broadcast did not fire, the receiver was not unregistered. Do this now. - mServiceContext.clearRegisteredReceivers(); + b.expectNoBroadcast(800); // 800ms long enough to at least flake if this is sent - // Disconnect the network and expect mobile disconnected broadcast. Use a small hack to - // check that has been sent. - final AtomicBoolean vanillaAction = new AtomicBoolean(false); - final ConditionVariable cv3 = registerConnectivityBroadcastThat(1, intent -> { - if (intent.getAction().equals(CONNECTIVITY_ACTION)) { - vanillaAction.set(true); - } - return !((NetworkInfo) intent.getExtra(EXTRA_NETWORK_INFO, -1)).isConnected(); - }); + // Disconnect the network and expect mobile disconnected broadcast. + b = expectConnectivityAction(TYPE_MOBILE, DetailedState.DISCONNECTED); mCellNetworkAgent.disconnect(); - waitFor(cv3); - assertTrue(vanillaAction.get()); + b.expectBroadcast(); } @Test @@ -1512,9 +1539,9 @@ public class ConnectivityServiceTest { assertNull(mCm.getActiveNetworkInfo()); assertNull(mCm.getActiveNetwork()); // Test bringing up validated cellular. - ConditionVariable cv = registerConnectivityBroadcast(1); + ExpectedBroadcast b = expectConnectivityAction(TYPE_MOBILE, DetailedState.CONNECTED); mCellNetworkAgent.connect(true); - waitFor(cv); + b.expectBroadcast(); verifyActiveNetwork(TRANSPORT_CELLULAR); assertLength(2, mCm.getAllNetworks()); assertTrue(mCm.getAllNetworks()[0].equals(mCm.getActiveNetwork()) || @@ -1522,9 +1549,9 @@ public class ConnectivityServiceTest { assertTrue(mCm.getAllNetworks()[0].equals(mWiFiNetworkAgent.getNetwork()) || mCm.getAllNetworks()[1].equals(mWiFiNetworkAgent.getNetwork())); // Test bringing up validated WiFi. - cv = registerConnectivityBroadcast(2); + b = registerConnectivityBroadcast(2); mWiFiNetworkAgent.connect(true); - waitFor(cv); + b.expectBroadcast(); verifyActiveNetwork(TRANSPORT_WIFI); assertLength(2, mCm.getAllNetworks()); assertTrue(mCm.getAllNetworks()[0].equals(mCm.getActiveNetwork()) || @@ -1539,9 +1566,9 @@ public class ConnectivityServiceTest { assertLength(1, mCm.getAllNetworks()); assertEquals(mCm.getAllNetworks()[0], mCm.getActiveNetwork()); // Test WiFi disconnect. - cv = registerConnectivityBroadcast(1); + b = registerConnectivityBroadcast(1); mWiFiNetworkAgent.disconnect(); - waitFor(cv); + b.expectBroadcast(); verifyNoNetwork(); } @@ -1549,9 +1576,9 @@ public class ConnectivityServiceTest { public void testValidatedCellularOutscoresUnvalidatedWiFi() throws Exception { // Test bringing up unvalidated WiFi mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); - ConditionVariable cv = registerConnectivityBroadcast(1); + ExpectedBroadcast b = registerConnectivityBroadcast(1); mWiFiNetworkAgent.connect(false); - waitFor(cv); + b.expectBroadcast(); verifyActiveNetwork(TRANSPORT_WIFI); // Test bringing up unvalidated cellular mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR); @@ -1564,19 +1591,19 @@ public class ConnectivityServiceTest { verifyActiveNetwork(TRANSPORT_WIFI); // Test bringing up validated cellular mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR); - cv = registerConnectivityBroadcast(2); + b = registerConnectivityBroadcast(2); mCellNetworkAgent.connect(true); - waitFor(cv); + b.expectBroadcast(); verifyActiveNetwork(TRANSPORT_CELLULAR); // Test cellular disconnect. - cv = registerConnectivityBroadcast(2); + b = registerConnectivityBroadcast(2); mCellNetworkAgent.disconnect(); - waitFor(cv); + b.expectBroadcast(); verifyActiveNetwork(TRANSPORT_WIFI); // Test WiFi disconnect. - cv = registerConnectivityBroadcast(1); + b = registerConnectivityBroadcast(1); mWiFiNetworkAgent.disconnect(); - waitFor(cv); + b.expectBroadcast(); verifyNoNetwork(); } @@ -1584,25 +1611,25 @@ public class ConnectivityServiceTest { public void testUnvalidatedWifiOutscoresUnvalidatedCellular() throws Exception { // Test bringing up unvalidated cellular. mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR); - ConditionVariable cv = registerConnectivityBroadcast(1); + ExpectedBroadcast b = registerConnectivityBroadcast(1); mCellNetworkAgent.connect(false); - waitFor(cv); + b.expectBroadcast(); verifyActiveNetwork(TRANSPORT_CELLULAR); // Test bringing up unvalidated WiFi. mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); - cv = registerConnectivityBroadcast(2); + b = registerConnectivityBroadcast(2); mWiFiNetworkAgent.connect(false); - waitFor(cv); + b.expectBroadcast(); verifyActiveNetwork(TRANSPORT_WIFI); // Test WiFi disconnect. - cv = registerConnectivityBroadcast(2); + b = registerConnectivityBroadcast(2); mWiFiNetworkAgent.disconnect(); - waitFor(cv); + b.expectBroadcast(); verifyActiveNetwork(TRANSPORT_CELLULAR); // Test cellular disconnect. - cv = registerConnectivityBroadcast(1); + b = registerConnectivityBroadcast(1); mCellNetworkAgent.disconnect(); - waitFor(cv); + b.expectBroadcast(); verifyNoNetwork(); } @@ -1610,24 +1637,24 @@ public class ConnectivityServiceTest { public void testUnlingeringDoesNotValidate() throws Exception { // Test bringing up unvalidated WiFi. mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); - ConditionVariable cv = registerConnectivityBroadcast(1); + ExpectedBroadcast b = registerConnectivityBroadcast(1); mWiFiNetworkAgent.connect(false); - waitFor(cv); + b.expectBroadcast(); verifyActiveNetwork(TRANSPORT_WIFI); assertFalse(mCm.getNetworkCapabilities(mWiFiNetworkAgent.getNetwork()).hasCapability( NET_CAPABILITY_VALIDATED)); // Test bringing up validated cellular. mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR); - cv = registerConnectivityBroadcast(2); + b = registerConnectivityBroadcast(2); mCellNetworkAgent.connect(true); - waitFor(cv); + b.expectBroadcast(); verifyActiveNetwork(TRANSPORT_CELLULAR); assertFalse(mCm.getNetworkCapabilities(mWiFiNetworkAgent.getNetwork()).hasCapability( NET_CAPABILITY_VALIDATED)); // Test cellular disconnect. - cv = registerConnectivityBroadcast(2); + b = registerConnectivityBroadcast(2); mCellNetworkAgent.disconnect(); - waitFor(cv); + b.expectBroadcast(); verifyActiveNetwork(TRANSPORT_WIFI); // Unlingering a network should not cause it to be marked as validated. assertFalse(mCm.getNetworkCapabilities(mWiFiNetworkAgent.getNetwork()).hasCapability( @@ -1638,25 +1665,25 @@ public class ConnectivityServiceTest { public void testCellularOutscoresWeakWifi() throws Exception { // Test bringing up validated cellular. mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR); - ConditionVariable cv = registerConnectivityBroadcast(1); + ExpectedBroadcast b = registerConnectivityBroadcast(1); mCellNetworkAgent.connect(true); - waitFor(cv); + b.expectBroadcast(); verifyActiveNetwork(TRANSPORT_CELLULAR); // Test bringing up validated WiFi. mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); - cv = registerConnectivityBroadcast(2); + b = registerConnectivityBroadcast(2); mWiFiNetworkAgent.connect(true); - waitFor(cv); + b.expectBroadcast(); verifyActiveNetwork(TRANSPORT_WIFI); // Test WiFi getting really weak. - cv = registerConnectivityBroadcast(2); + b = registerConnectivityBroadcast(2); mWiFiNetworkAgent.adjustScore(-11); - waitFor(cv); + b.expectBroadcast(); verifyActiveNetwork(TRANSPORT_CELLULAR); // Test WiFi restoring signal strength. - cv = registerConnectivityBroadcast(2); + b = registerConnectivityBroadcast(2); mWiFiNetworkAgent.adjustScore(11); - waitFor(cv); + b.expectBroadcast(); verifyActiveNetwork(TRANSPORT_WIFI); } @@ -1674,9 +1701,9 @@ public class ConnectivityServiceTest { mCellNetworkAgent.expectDisconnected(); // Test bringing up validated WiFi. mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); - final ConditionVariable cv = registerConnectivityBroadcast(1); + final ExpectedBroadcast b = expectConnectivityAction(TYPE_WIFI, DetailedState.CONNECTED); mWiFiNetworkAgent.connect(true); - waitFor(cv); + b.expectBroadcast(); verifyActiveNetwork(TRANSPORT_WIFI); // Test bringing up unvalidated cellular. // Expect it to be torn down because it could never be the highest scoring network @@ -1693,33 +1720,33 @@ public class ConnectivityServiceTest { public void testCellularFallback() throws Exception { // Test bringing up validated cellular. mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR); - ConditionVariable cv = registerConnectivityBroadcast(1); + ExpectedBroadcast b = registerConnectivityBroadcast(1); mCellNetworkAgent.connect(true); - waitFor(cv); + b.expectBroadcast(); verifyActiveNetwork(TRANSPORT_CELLULAR); // Test bringing up validated WiFi. mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); - cv = registerConnectivityBroadcast(2); + b = registerConnectivityBroadcast(2); mWiFiNetworkAgent.connect(true); - waitFor(cv); + b.expectBroadcast(); verifyActiveNetwork(TRANSPORT_WIFI); // Reevaluate WiFi (it'll instantly fail DNS). - cv = registerConnectivityBroadcast(2); + b = registerConnectivityBroadcast(2); assertTrue(mCm.getNetworkCapabilities(mWiFiNetworkAgent.getNetwork()).hasCapability( NET_CAPABILITY_VALIDATED)); mCm.reportBadNetwork(mWiFiNetworkAgent.getNetwork()); // Should quickly fall back to Cellular. - waitFor(cv); + b.expectBroadcast(); assertFalse(mCm.getNetworkCapabilities(mWiFiNetworkAgent.getNetwork()).hasCapability( NET_CAPABILITY_VALIDATED)); verifyActiveNetwork(TRANSPORT_CELLULAR); // Reevaluate cellular (it'll instantly fail DNS). - cv = registerConnectivityBroadcast(2); + b = registerConnectivityBroadcast(2); assertTrue(mCm.getNetworkCapabilities(mCellNetworkAgent.getNetwork()).hasCapability( NET_CAPABILITY_VALIDATED)); mCm.reportBadNetwork(mCellNetworkAgent.getNetwork()); // Should quickly fall back to WiFi. - waitFor(cv); + b.expectBroadcast(); assertFalse(mCm.getNetworkCapabilities(mCellNetworkAgent.getNetwork()).hasCapability( NET_CAPABILITY_VALIDATED)); assertFalse(mCm.getNetworkCapabilities(mWiFiNetworkAgent.getNetwork()).hasCapability( @@ -1731,23 +1758,23 @@ public class ConnectivityServiceTest { public void testWiFiFallback() throws Exception { // Test bringing up unvalidated WiFi. mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); - ConditionVariable cv = registerConnectivityBroadcast(1); + ExpectedBroadcast b = registerConnectivityBroadcast(1); mWiFiNetworkAgent.connect(false); - waitFor(cv); + b.expectBroadcast(); verifyActiveNetwork(TRANSPORT_WIFI); // Test bringing up validated cellular. mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR); - cv = registerConnectivityBroadcast(2); + b = registerConnectivityBroadcast(2); mCellNetworkAgent.connect(true); - waitFor(cv); + b.expectBroadcast(); verifyActiveNetwork(TRANSPORT_CELLULAR); // Reevaluate cellular (it'll instantly fail DNS). - cv = registerConnectivityBroadcast(2); + b = registerConnectivityBroadcast(2); assertTrue(mCm.getNetworkCapabilities(mCellNetworkAgent.getNetwork()).hasCapability( NET_CAPABILITY_VALIDATED)); mCm.reportBadNetwork(mCellNetworkAgent.getNetwork()); // Should quickly fall back to WiFi. - waitFor(cv); + b.expectBroadcast(); assertFalse(mCm.getNetworkCapabilities(mCellNetworkAgent.getNetwork()).hasCapability( NET_CAPABILITY_VALIDATED)); verifyActiveNetwork(TRANSPORT_WIFI); @@ -1817,13 +1844,13 @@ public class ConnectivityServiceTest { mCm.registerNetworkCallback(cellRequest, cellNetworkCallback); // Test unvalidated networks - ConditionVariable cv = registerConnectivityBroadcast(1); + ExpectedBroadcast b = registerConnectivityBroadcast(1); mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR); mCellNetworkAgent.connect(false); genericNetworkCallback.expectAvailableCallbacksUnvalidated(mCellNetworkAgent); cellNetworkCallback.expectAvailableCallbacksUnvalidated(mCellNetworkAgent); assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetwork()); - waitFor(cv); + b.expectBroadcast(); assertNoCallbacks(genericNetworkCallback, wifiNetworkCallback, cellNetworkCallback); // This should not trigger spurious onAvailable() callbacks, b/21762680. @@ -1832,28 +1859,28 @@ public class ConnectivityServiceTest { assertNoCallbacks(genericNetworkCallback, wifiNetworkCallback, cellNetworkCallback); assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetwork()); - cv = registerConnectivityBroadcast(2); + b = registerConnectivityBroadcast(2); mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); mWiFiNetworkAgent.connect(false); genericNetworkCallback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); wifiNetworkCallback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); - waitFor(cv); + b.expectBroadcast(); assertNoCallbacks(genericNetworkCallback, wifiNetworkCallback, cellNetworkCallback); - cv = registerConnectivityBroadcast(2); + b = registerConnectivityBroadcast(2); mWiFiNetworkAgent.disconnect(); genericNetworkCallback.expectCallback(CallbackEntry.LOST, mWiFiNetworkAgent); wifiNetworkCallback.expectCallback(CallbackEntry.LOST, mWiFiNetworkAgent); cellNetworkCallback.assertNoCallback(); - waitFor(cv); + b.expectBroadcast(); assertNoCallbacks(genericNetworkCallback, wifiNetworkCallback, cellNetworkCallback); - cv = registerConnectivityBroadcast(1); + b = registerConnectivityBroadcast(1); mCellNetworkAgent.disconnect(); genericNetworkCallback.expectCallback(CallbackEntry.LOST, mCellNetworkAgent); cellNetworkCallback.expectCallback(CallbackEntry.LOST, mCellNetworkAgent); - waitFor(cv); + b.expectBroadcast(); assertNoCallbacks(genericNetworkCallback, wifiNetworkCallback, cellNetworkCallback); // Test validated networks @@ -2542,9 +2569,9 @@ public class ConnectivityServiceTest { // Test bringing up validated WiFi. mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); - final ConditionVariable cv = registerConnectivityBroadcast(1); + final ExpectedBroadcast b = expectConnectivityAction(TYPE_WIFI, DetailedState.CONNECTED); mWiFiNetworkAgent.connect(true); - waitFor(cv); + b.expectBroadcast(); verifyActiveNetwork(TRANSPORT_WIFI); // Register MMS NetworkRequest @@ -2570,9 +2597,9 @@ public class ConnectivityServiceTest { public void testMMSonCell() throws Exception { // Test bringing up cellular without MMS mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR); - ConditionVariable cv = registerConnectivityBroadcast(1); + ExpectedBroadcast b = expectConnectivityAction(TYPE_MOBILE, DetailedState.CONNECTED); mCellNetworkAgent.connect(false); - waitFor(cv); + b.expectBroadcast(); verifyActiveNetwork(TRANSPORT_CELLULAR); // Register MMS NetworkRequest @@ -4037,9 +4064,9 @@ public class ConnectivityServiceTest { } mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); - ConditionVariable cv = registerConnectivityBroadcast(1); + ExpectedBroadcast b = expectConnectivityAction(TYPE_WIFI, DetailedState.CONNECTED); mWiFiNetworkAgent.connect(true); - waitFor(cv); + b.expectBroadcast(); verifyActiveNetwork(TRANSPORT_WIFI); mWiFiNetworkAgent.sendLinkProperties(lp); waitForIdle(); @@ -4570,10 +4597,10 @@ public class ConnectivityServiceTest { assertNotPinnedToWifi(); // Disconnect cell and wifi. - ConditionVariable cv = registerConnectivityBroadcast(3); // cell down, wifi up, wifi down. + ExpectedBroadcast b = registerConnectivityBroadcast(3); // cell down, wifi up, wifi down. mCellNetworkAgent.disconnect(); mWiFiNetworkAgent.disconnect(); - waitFor(cv); + b.expectBroadcast(); // Pinning takes effect even if the pinned network is the default when the pin is set... TestNetworkPinner.pin(mServiceContext, wifiRequest); @@ -4583,10 +4610,10 @@ public class ConnectivityServiceTest { assertPinnedToWifiWithWifiDefault(); // ... and is maintained even when that network is no longer the default. - cv = registerConnectivityBroadcast(1); + b = registerConnectivityBroadcast(1); mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); mCellNetworkAgent.connect(true); - waitFor(cv); + b.expectBroadcast(); assertPinnedToWifiWithCellDefault(); } @@ -4684,7 +4711,7 @@ public class ConnectivityServiceTest { @Test public void testNetworkInfoOfTypeNone() throws Exception { - ConditionVariable broadcastCV = registerConnectivityBroadcast(1); + ExpectedBroadcast b = registerConnectivityBroadcast(1); verifyNoNetwork(); TestNetworkAgentWrapper wifiAware = new TestNetworkAgentWrapper(TRANSPORT_WIFI_AWARE); @@ -4717,9 +4744,7 @@ public class ConnectivityServiceTest { mCm.unregisterNetworkCallback(callback); verifyNoNetwork(); - if (broadcastCV.block(10)) { - fail("expected no broadcast, but got CONNECTIVITY_ACTION broadcast"); - } + b.expectNoBroadcast(10); } @Test @@ -6456,11 +6481,11 @@ public class ConnectivityServiceTest { // prefix discovery is never started. LinkProperties lp = new LinkProperties(baseLp); lp.setNat64Prefix(pref64FromRa); - mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI, lp); - mCellNetworkAgent.connect(false); - final Network network = mCellNetworkAgent.getNetwork(); + mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI, lp); + mWiFiNetworkAgent.connect(false); + final Network network = mWiFiNetworkAgent.getNetwork(); int netId = network.getNetId(); - callback.expectAvailableCallbacksUnvalidated(mCellNetworkAgent); + callback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); inOrder.verify(mMockNetd).clatdStart(iface, pref64FromRa.toString()); inOrder.verify(mMockDnsResolver).setPrefix64(netId, pref64FromRa.toString()); inOrder.verify(mMockDnsResolver, never()).startPrefix64Discovery(netId); @@ -6469,8 +6494,8 @@ public class ConnectivityServiceTest { // If the RA prefix is withdrawn, clatd is stopped and prefix discovery is started. lp.setNat64Prefix(null); - mCellNetworkAgent.sendLinkProperties(lp); - expectNat64PrefixChange(callback, mCellNetworkAgent, null); + mWiFiNetworkAgent.sendLinkProperties(lp); + expectNat64PrefixChange(callback, mWiFiNetworkAgent, null); inOrder.verify(mMockNetd).clatdStop(iface); inOrder.verify(mMockDnsResolver).setPrefix64(netId, ""); inOrder.verify(mMockDnsResolver).startPrefix64Discovery(netId); @@ -6478,8 +6503,8 @@ public class ConnectivityServiceTest { // If the RA prefix appears while DNS discovery is in progress, discovery is stopped and // clatd is started with the prefix from the RA. lp.setNat64Prefix(pref64FromRa); - mCellNetworkAgent.sendLinkProperties(lp); - expectNat64PrefixChange(callback, mCellNetworkAgent, pref64FromRa); + mWiFiNetworkAgent.sendLinkProperties(lp); + expectNat64PrefixChange(callback, mWiFiNetworkAgent, pref64FromRa); inOrder.verify(mMockNetd).clatdStart(iface, pref64FromRa.toString()); inOrder.verify(mMockDnsResolver).stopPrefix64Discovery(netId); inOrder.verify(mMockDnsResolver).setPrefix64(netId, pref64FromRa.toString()); @@ -6487,21 +6512,21 @@ public class ConnectivityServiceTest { // Withdraw the RA prefix so we can test the case where an RA prefix appears after DNS // discovery has succeeded. lp.setNat64Prefix(null); - mCellNetworkAgent.sendLinkProperties(lp); - expectNat64PrefixChange(callback, mCellNetworkAgent, null); + mWiFiNetworkAgent.sendLinkProperties(lp); + expectNat64PrefixChange(callback, mWiFiNetworkAgent, null); inOrder.verify(mMockNetd).clatdStop(iface); inOrder.verify(mMockDnsResolver).setPrefix64(netId, ""); inOrder.verify(mMockDnsResolver).startPrefix64Discovery(netId); mService.mNetdEventCallback.onNat64PrefixEvent(netId, true /* added */, pref64FromDnsStr, 96); - expectNat64PrefixChange(callback, mCellNetworkAgent, pref64FromDns); + expectNat64PrefixChange(callback, mWiFiNetworkAgent, pref64FromDns); inOrder.verify(mMockNetd).clatdStart(iface, pref64FromDns.toString()); // If an RA advertises the same prefix that was discovered by DNS, nothing happens: prefix // discovery is not stopped, and there are no callbacks. lp.setNat64Prefix(pref64FromDns); - mCellNetworkAgent.sendLinkProperties(lp); + mWiFiNetworkAgent.sendLinkProperties(lp); callback.assertNoCallback(); inOrder.verify(mMockNetd, never()).clatdStop(iface); inOrder.verify(mMockNetd, never()).clatdStart(eq(iface), anyString()); @@ -6511,7 +6536,7 @@ public class ConnectivityServiceTest { // If the RA is later withdrawn, nothing happens again. lp.setNat64Prefix(null); - mCellNetworkAgent.sendLinkProperties(lp); + mWiFiNetworkAgent.sendLinkProperties(lp); callback.assertNoCallback(); inOrder.verify(mMockNetd, never()).clatdStop(iface); inOrder.verify(mMockNetd, never()).clatdStart(eq(iface), anyString()); @@ -6521,8 +6546,8 @@ public class ConnectivityServiceTest { // If the RA prefix changes, clatd is restarted and prefix discovery is stopped. lp.setNat64Prefix(pref64FromRa); - mCellNetworkAgent.sendLinkProperties(lp); - expectNat64PrefixChange(callback, mCellNetworkAgent, pref64FromRa); + mWiFiNetworkAgent.sendLinkProperties(lp); + expectNat64PrefixChange(callback, mWiFiNetworkAgent, pref64FromRa); inOrder.verify(mMockNetd).clatdStop(iface); inOrder.verify(mMockDnsResolver).stopPrefix64Discovery(netId); @@ -6536,8 +6561,8 @@ public class ConnectivityServiceTest { // If the RA prefix changes, clatd is restarted and prefix discovery is not started. lp.setNat64Prefix(newPref64FromRa); - mCellNetworkAgent.sendLinkProperties(lp); - expectNat64PrefixChange(callback, mCellNetworkAgent, newPref64FromRa); + mWiFiNetworkAgent.sendLinkProperties(lp); + expectNat64PrefixChange(callback, mWiFiNetworkAgent, newPref64FromRa); inOrder.verify(mMockNetd).clatdStop(iface); inOrder.verify(mMockDnsResolver).setPrefix64(netId, ""); inOrder.verify(mMockNetd).clatdStart(iface, newPref64FromRa.toString()); @@ -6547,7 +6572,7 @@ public class ConnectivityServiceTest { // If the RA prefix changes to the same value, nothing happens. lp.setNat64Prefix(newPref64FromRa); - mCellNetworkAgent.sendLinkProperties(lp); + mWiFiNetworkAgent.sendLinkProperties(lp); callback.assertNoCallback(); assertEquals(newPref64FromRa, mCm.getLinkProperties(network).getNat64Prefix()); inOrder.verify(mMockNetd, never()).clatdStop(iface); @@ -6561,19 +6586,19 @@ public class ConnectivityServiceTest { // If the same prefix is learned first by DNS and then by RA, and clat is later stopped, // (e.g., because the network disconnects) setPrefix64(netid, "") is never called. lp.setNat64Prefix(null); - mCellNetworkAgent.sendLinkProperties(lp); - expectNat64PrefixChange(callback, mCellNetworkAgent, null); + mWiFiNetworkAgent.sendLinkProperties(lp); + expectNat64PrefixChange(callback, mWiFiNetworkAgent, null); inOrder.verify(mMockNetd).clatdStop(iface); inOrder.verify(mMockDnsResolver).setPrefix64(netId, ""); inOrder.verify(mMockDnsResolver).startPrefix64Discovery(netId); mService.mNetdEventCallback.onNat64PrefixEvent(netId, true /* added */, pref64FromDnsStr, 96); - expectNat64PrefixChange(callback, mCellNetworkAgent, pref64FromDns); + expectNat64PrefixChange(callback, mWiFiNetworkAgent, pref64FromDns); inOrder.verify(mMockNetd).clatdStart(iface, pref64FromDns.toString()); inOrder.verify(mMockDnsResolver, never()).setPrefix64(eq(netId), any()); lp.setNat64Prefix(pref64FromDns); - mCellNetworkAgent.sendLinkProperties(lp); + mWiFiNetworkAgent.sendLinkProperties(lp); callback.assertNoCallback(); inOrder.verify(mMockNetd, never()).clatdStop(iface); inOrder.verify(mMockNetd, never()).clatdStart(eq(iface), anyString()); @@ -6584,10 +6609,10 @@ public class ConnectivityServiceTest { // When tearing down a network, clat state is only updated after CALLBACK_LOST is fired, but // before CONNECTIVITY_ACTION is sent. Wait for CONNECTIVITY_ACTION before verifying that // clat has been stopped, or the test will be flaky. - ConditionVariable cv = registerConnectivityBroadcast(1); - mCellNetworkAgent.disconnect(); - callback.expectCallback(CallbackEntry.LOST, mCellNetworkAgent); - waitFor(cv); + ExpectedBroadcast b = expectConnectivityAction(TYPE_WIFI, DetailedState.DISCONNECTED); + mWiFiNetworkAgent.disconnect(); + callback.expectCallback(CallbackEntry.LOST, mWiFiNetworkAgent); + b.expectBroadcast(); inOrder.verify(mMockNetd).clatdStop(iface); inOrder.verify(mMockDnsResolver).stopPrefix64Discovery(netId); @@ -6662,10 +6687,10 @@ public class ConnectivityServiceTest { .destroyNetworkCache(eq(mCellNetworkAgent.getNetwork().netId)); // Disconnect wifi - ConditionVariable cv = registerConnectivityBroadcast(1); + ExpectedBroadcast b = expectConnectivityAction(TYPE_WIFI, DetailedState.DISCONNECTED); reset(mNetworkManagementService); mWiFiNetworkAgent.disconnect(); - waitFor(cv); + b.expectBroadcast(); verify(mNetworkManagementService, times(1)).removeIdleTimer(eq(WIFI_IFNAME)); // Clean up From cb2feba0fbc5f9a80e3c5cc863ecd56b26113e39 Mon Sep 17 00:00:00 2001 From: Lorenzo Colitti Date: Tue, 15 Dec 2020 00:45:30 +0900 Subject: [PATCH 100/288] Add a test for getDefaultNetworkCapabilitiesForUser. Bug: 172870110 Test: test-only change Test: new test passes 100 times in a row Change-Id: I210284578e38cd25b8b95235d3390d5bd66a5a70 Merged-In: I210284578e38cd25b8b95235d3390d5bd66a5a70 --- .../server/ConnectivityServiceTest.java | 33 +++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index 6cbcb6784ddd6..fb370a0f7124b 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -5667,10 +5667,21 @@ public class ConnectivityServiceTest { assertTrue(nc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); } + private void assertDefaultNetworkCapabilities(int userId, NetworkAgentWrapper... networks) { + final NetworkCapabilities[] defaultCaps = mService.getDefaultNetworkCapabilitiesForUser( + userId, "com.android.calling.package"); + final String defaultCapsString = Arrays.toString(defaultCaps); + assertEquals(defaultCapsString, defaultCaps.length, networks.length); + final Set defaultCapsSet = new ArraySet<>(defaultCaps); + for (NetworkAgentWrapper network : networks) { + final NetworkCapabilities nc = mCm.getNetworkCapabilities(network.getNetwork()); + final String msg = "Did not find " + nc + " in " + Arrays.toString(defaultCaps); + assertTrue(msg, defaultCapsSet.contains(nc)); + } + } + @Test public void testVpnSetUnderlyingNetworks() throws Exception { - final int uid = Process.myUid(); - final TestNetworkCallback vpnNetworkCallback = new TestNetworkCallback(); final NetworkRequest vpnNetworkRequest = new NetworkRequest.Builder() .removeCapability(NET_CAPABILITY_NOT_VPN) @@ -5693,6 +5704,9 @@ public class ConnectivityServiceTest { // A VPN without underlying networks is not suspended. assertTrue(nc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); + final int userId = UserHandle.getUserId(Process.myUid()); + assertDefaultNetworkCapabilities(userId /* no networks */); + // Connect cell and use it as an underlying network. mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR); mCellNetworkAgent.addCapability(NET_CAPABILITY_NOT_SUSPENDED); @@ -5706,6 +5720,7 @@ public class ConnectivityServiceTest { && caps.hasTransport(TRANSPORT_CELLULAR) && !caps.hasTransport(TRANSPORT_WIFI) && !caps.hasCapability(NET_CAPABILITY_NOT_METERED) && caps.hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); + assertDefaultNetworkCapabilities(userId, mCellNetworkAgent); mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); mWiFiNetworkAgent.addCapability(NET_CAPABILITY_NOT_METERED); @@ -5720,6 +5735,7 @@ public class ConnectivityServiceTest { && caps.hasTransport(TRANSPORT_CELLULAR) && caps.hasTransport(TRANSPORT_WIFI) && !caps.hasCapability(NET_CAPABILITY_NOT_METERED) && caps.hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); + assertDefaultNetworkCapabilities(userId, mCellNetworkAgent, mWiFiNetworkAgent); // Don't disconnect, but note the VPN is not using wifi any more. mService.setUnderlyingNetworksForVpn( @@ -5730,6 +5746,9 @@ public class ConnectivityServiceTest { && caps.hasTransport(TRANSPORT_CELLULAR) && !caps.hasTransport(TRANSPORT_WIFI) && !caps.hasCapability(NET_CAPABILITY_NOT_METERED) && caps.hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); + // The return value of getDefaultNetworkCapabilitiesForUser always includes the default + // network (wifi) as well as the underlying networks (cell). + assertDefaultNetworkCapabilities(userId, mCellNetworkAgent, mWiFiNetworkAgent); // Remove NOT_SUSPENDED from the only network and observe VPN is now suspended. mCellNetworkAgent.removeCapability(NET_CAPABILITY_NOT_SUSPENDED); @@ -5758,6 +5777,7 @@ public class ConnectivityServiceTest { && !caps.hasTransport(TRANSPORT_CELLULAR) && caps.hasTransport(TRANSPORT_WIFI) && caps.hasCapability(NET_CAPABILITY_NOT_METERED) && caps.hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); + assertDefaultNetworkCapabilities(userId, mWiFiNetworkAgent); // Use both again. mService.setUnderlyingNetworksForVpn( @@ -5768,6 +5788,7 @@ public class ConnectivityServiceTest { && caps.hasTransport(TRANSPORT_CELLULAR) && caps.hasTransport(TRANSPORT_WIFI) && !caps.hasCapability(NET_CAPABILITY_NOT_METERED) && caps.hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); + assertDefaultNetworkCapabilities(userId, mCellNetworkAgent, mWiFiNetworkAgent); // Cell is suspended again. As WiFi is not, this should not cause a callback. mCellNetworkAgent.removeCapability(NET_CAPABILITY_NOT_SUSPENDED); @@ -5785,6 +5806,7 @@ public class ConnectivityServiceTest { // a bug in ConnectivityService, but as the SUSPENDED and RESUMED callbacks have never // been public and are deprecated and slated for removal, there is no sense in spending // resources fixing this bug now. + assertDefaultNetworkCapabilities(userId, mCellNetworkAgent, mWiFiNetworkAgent); // Use both again. mService.setUnderlyingNetworksForVpn( @@ -5797,6 +5819,7 @@ public class ConnectivityServiceTest { && caps.hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); // As above, the RESUMED callback not being sent here is a bug, but not a bug that's // worth anybody's time to fix. + assertDefaultNetworkCapabilities(userId, mCellNetworkAgent, mWiFiNetworkAgent); // Disconnect cell. Receive update without even removing the dead network from the // underlying networks – it's dead anyway. Not metered any more. @@ -5805,6 +5828,7 @@ public class ConnectivityServiceTest { (caps) -> caps.hasTransport(TRANSPORT_VPN) && !caps.hasTransport(TRANSPORT_CELLULAR) && caps.hasTransport(TRANSPORT_WIFI) && caps.hasCapability(NET_CAPABILITY_NOT_METERED)); + assertDefaultNetworkCapabilities(userId, mWiFiNetworkAgent); // Disconnect wifi too. No underlying networks means this is now metered. mWiFiNetworkAgent.disconnect(); @@ -5812,6 +5836,11 @@ public class ConnectivityServiceTest { (caps) -> caps.hasTransport(TRANSPORT_VPN) && !caps.hasTransport(TRANSPORT_CELLULAR) && !caps.hasTransport(TRANSPORT_WIFI) && !caps.hasCapability(NET_CAPABILITY_NOT_METERED)); + // When a network disconnects, the callbacks are fired before all state is updated, so for a + // short time, synchronous calls will behave as if the network is still connected. Wait for + // things to settle. + waitForIdle(); + assertDefaultNetworkCapabilities(userId /* no networks */); mMockVpn.disconnect(); } From 9687fd7c3bcb563d8bd3b53874f6e35876275dda Mon Sep 17 00:00:00 2001 From: Lorenzo Colitti Date: Thu, 7 Jan 2021 23:33:18 +0900 Subject: [PATCH 101/288] Test for bugs with suspended VPN underlying networks. Bug: 172870110 Test: atest --rerun-until-failure 100 ConnectivityServiceTest#testVpnSwitchFromSuspendedToNonSuspended Change-Id: Ia52f9cafef3f49ae70ad135d017e207eb57fddfe Merged-In: Ia52f9cafef3f49ae70ad135d017e207eb57fddfe --- .../server/ConnectivityServiceTest.java | 115 ++++++++++++++++++ 1 file changed, 115 insertions(+) diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index fb370a0f7124b..ffd6b28e8b0d5 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -5433,6 +5433,121 @@ public class ConnectivityServiceTest { mCm.unregisterNetworkCallback(callback); } + private void assertGetNetworkInfoOfGetActiveNetworkIsConnected(boolean expectedConnectivity) { + // What Chromium used to do before https://chromium-review.googlesource.com/2605304 + assertEquals("Unexpected result for getActiveNetworkInfo(getActiveNetwork())", + expectedConnectivity, mCm.getNetworkInfo(mCm.getActiveNetwork()).isConnected()); + } + + @Test + public void testVpnUnderlyingNetworkSuspended() throws Exception { + final TestNetworkCallback callback = new TestNetworkCallback(); + mCm.registerDefaultNetworkCallback(callback); + + // Connect a VPN. + mMockVpn.establishForMyUid(false, true, false); + callback.expectAvailableCallbacksUnvalidated(mMockVpn); + + // Connect cellular data. + mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR); + mCellNetworkAgent.connect(false /* validated */); + callback.expectCapabilitiesThat(mMockVpn, + nc -> nc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED) + && nc.hasTransport(TRANSPORT_CELLULAR)); + callback.assertNoCallback(); + + assertTrue(mCm.getNetworkCapabilities(mMockVpn.getNetwork()) + .hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); + assertNetworkInfo(TYPE_MOBILE, DetailedState.CONNECTED); + assertNetworkInfo(TYPE_WIFI, DetailedState.DISCONNECTED); + assertNetworkInfo(TYPE_VPN, DetailedState.CONNECTED); + assertActiveNetworkInfo(TYPE_MOBILE, DetailedState.CONNECTED); + assertGetNetworkInfoOfGetActiveNetworkIsConnected(true); + + // Suspend the cellular network and expect the VPN to be suspended. + mCellNetworkAgent.suspend(); + callback.expectCapabilitiesThat(mMockVpn, + nc -> !nc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED) + && nc.hasTransport(TRANSPORT_CELLULAR)); + callback.expectCallback(CallbackEntry.SUSPENDED, mMockVpn); + callback.assertNoCallback(); + + assertFalse(mCm.getNetworkCapabilities(mMockVpn.getNetwork()) + .hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); + assertNetworkInfo(TYPE_MOBILE, DetailedState.SUSPENDED); + assertNetworkInfo(TYPE_WIFI, DetailedState.DISCONNECTED); + assertNetworkInfo(TYPE_VPN, DetailedState.SUSPENDED); + assertActiveNetworkInfo(TYPE_MOBILE, DetailedState.SUSPENDED); + // VPN's main underlying network is suspended, so no connectivity. + assertGetNetworkInfoOfGetActiveNetworkIsConnected(false); + + // Switch to another network. The VPN should no longer be suspended. + mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); + mWiFiNetworkAgent.connect(false /* validated */); + callback.expectCapabilitiesThat(mMockVpn, + nc -> nc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED) + && nc.hasTransport(TRANSPORT_WIFI)); + + // BUG: the VPN is no longer suspended, so a RESUMED callback should have been sent. + // callback.expectCallback(CallbackEntry.RESUMED, mMockVpn); + callback.assertNoCallback(); + + assertTrue(mCm.getNetworkCapabilities(mMockVpn.getNetwork()) + .hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); + assertNetworkInfo(TYPE_MOBILE, DetailedState.DISCONNECTED); + assertNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED); + assertNetworkInfo(TYPE_VPN, DetailedState.SUSPENDED); // BUG: VPN caps have NOT_SUSPENDED. + assertActiveNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED); + // BUG: the device has connectivity, so this should return true. + assertGetNetworkInfoOfGetActiveNetworkIsConnected(false); + + // Unsuspend cellular and then switch back to it. + // The same bug happens in the opposite direction: the VPN's capabilities correctly have + // NOT_SUSPENDED, but the VPN's NetworkInfo is in state SUSPENDED. + mCellNetworkAgent.resume(); + mWiFiNetworkAgent.disconnect(); + callback.expectCapabilitiesThat(mMockVpn, + nc -> nc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED) + && nc.hasTransport(TRANSPORT_CELLULAR)); + // Spurious double callback? + callback.expectCapabilitiesThat(mMockVpn, + nc -> nc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED) + && nc.hasTransport(TRANSPORT_CELLULAR)); + callback.assertNoCallback(); + + assertTrue(mCm.getNetworkCapabilities(mMockVpn.getNetwork()) + .hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); + assertNetworkInfo(TYPE_MOBILE, DetailedState.CONNECTED); + assertNetworkInfo(TYPE_WIFI, DetailedState.DISCONNECTED); + assertNetworkInfo(TYPE_VPN, DetailedState.SUSPENDED); // BUG: VPN caps have NOT_SUSPENDED. + assertNull(mCm.getActiveNetworkInfo()); // ??? + // BUG: the device has connectivity, so this should return true. + assertGetNetworkInfoOfGetActiveNetworkIsConnected(false); + + // Suspending and resuming reveals other bugs. + mCellNetworkAgent.suspend(); + callback.assertNoCallback(); // BUG: should get callback that VPN is suspended. + + assertTrue(mCm.getNetworkCapabilities(mMockVpn.getNetwork()) + .hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); // BUG: VPN should be SUSPENDED. + assertNetworkInfo(TYPE_MOBILE, DetailedState.SUSPENDED); + assertNetworkInfo(TYPE_WIFI, DetailedState.DISCONNECTED); + assertNetworkInfo(TYPE_VPN, DetailedState.SUSPENDED); + assertNull(mCm.getActiveNetworkInfo()); // ??? + assertGetNetworkInfoOfGetActiveNetworkIsConnected(false); + + mCellNetworkAgent.resume(); + callback.assertNoCallback(); // BUG: should get callback that VPN is no longer suspended. + + assertTrue(mCm.getNetworkCapabilities(mMockVpn.getNetwork()) + .hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); + assertNetworkInfo(TYPE_MOBILE, DetailedState.CONNECTED); + assertNetworkInfo(TYPE_WIFI, DetailedState.DISCONNECTED); + assertNetworkInfo(TYPE_VPN, DetailedState.SUSPENDED); + assertNull(mCm.getActiveNetworkInfo()); // ??? + assertGetNetworkInfoOfGetActiveNetworkIsConnected(false); + } + @Test public void testVpnNetworkActive() throws Exception { final int uid = Process.myUid(); From be317557fe11d9a27412712556c9203778fab645 Mon Sep 17 00:00:00 2001 From: Lorenzo Colitti Date: Thu, 28 Jan 2021 18:31:31 +0900 Subject: [PATCH 102/288] Backport some helpers in ConnectivityServiceTest. These were added in aosp/1527378, which is impractical to backport. Bug: 172870110 Test: test-only change Change-Id: Id3d12b23034b284c8f7dffb5167244e1e43987e2 Merged-In: I827543751dbf5e626a24ec02cd6f50b423f5f761 --- .../android/server/ConnectivityServiceTest.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index ffd6b28e8b0d5..d8e1f0a434f1d 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -36,6 +36,7 @@ import static android.net.ConnectivityManager.TYPE_MOBILE; import static android.net.ConnectivityManager.TYPE_MOBILE_FOTA; import static android.net.ConnectivityManager.TYPE_MOBILE_MMS; import static android.net.ConnectivityManager.TYPE_MOBILE_SUPL; +import static android.net.ConnectivityManager.TYPE_VPN; import static android.net.ConnectivityManager.TYPE_WIFI; import static android.net.INetworkMonitor.NETWORK_VALIDATION_PROBE_DNS; import static android.net.INetworkMonitor.NETWORK_VALIDATION_PROBE_FALLBACK; @@ -6289,6 +6290,19 @@ public class ConnectivityServiceTest { mCm.unregisterNetworkCallback(defaultCallback); } + private void checkNetworkInfo(NetworkInfo ni, int type, DetailedState state) { + assertNotNull(ni); + assertEquals(type, ni.getType()); + assertEquals(ConnectivityManager.getNetworkTypeName(type), state, ni.getDetailedState()); + } + + private void assertActiveNetworkInfo(int type, DetailedState state) { + checkNetworkInfo(mCm.getActiveNetworkInfo(), type, state); + } + private void assertNetworkInfo(int type, DetailedState state) { + checkNetworkInfo(mCm.getNetworkInfo(type), type, state); + } + @Test public final void testLoseTrusted() throws Exception { final NetworkRequest trustedRequest = new NetworkRequest.Builder() From 1255ddbc76df53c9562a87cd5701d791e0ec55ad Mon Sep 17 00:00:00 2001 From: Lorenzo Colitti Date: Tue, 12 Jan 2021 00:34:44 +0900 Subject: [PATCH 103/288] Backport test coverage from aosp/1547496. This test coverage is necessary to fix an upcoming bug in R. Backport it from the change that added it. The non-test portion of that change is not necessary in R because it fixes a bug that was introduced in S. Bug: 172870110 Test: accompanying unit test shows lots of bugs removed Change-Id: If7eb8857474d8b4f774f5fa5db2a3112e85c9cae Merged-In: Ibf376a6fa4b34d1c96f8506fa8abbb7595a8c272 --- .../server/ConnectivityServiceTest.java | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index d8e1f0a434f1d..3d4ff41d65fbc 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -5521,32 +5521,40 @@ public class ConnectivityServiceTest { assertNetworkInfo(TYPE_MOBILE, DetailedState.CONNECTED); assertNetworkInfo(TYPE_WIFI, DetailedState.DISCONNECTED); assertNetworkInfo(TYPE_VPN, DetailedState.SUSPENDED); // BUG: VPN caps have NOT_SUSPENDED. - assertNull(mCm.getActiveNetworkInfo()); // ??? + assertActiveNetworkInfo(TYPE_MOBILE, DetailedState.CONNECTED); // BUG: the device has connectivity, so this should return true. assertGetNetworkInfoOfGetActiveNetworkIsConnected(false); - // Suspending and resuming reveals other bugs. + // Re-suspending the current network fixes the problem. mCellNetworkAgent.suspend(); - callback.assertNoCallback(); // BUG: should get callback that VPN is suspended. + callback.expectCapabilitiesThat(mMockVpn, + nc -> !nc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED) + && nc.hasTransport(TRANSPORT_CELLULAR)); + callback.expectCallback(CallbackEntry.SUSPENDED, mMockVpn); + callback.assertNoCallback(); - assertTrue(mCm.getNetworkCapabilities(mMockVpn.getNetwork()) - .hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); // BUG: VPN should be SUSPENDED. + assertFalse(mCm.getNetworkCapabilities(mMockVpn.getNetwork()) + .hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); assertNetworkInfo(TYPE_MOBILE, DetailedState.SUSPENDED); assertNetworkInfo(TYPE_WIFI, DetailedState.DISCONNECTED); assertNetworkInfo(TYPE_VPN, DetailedState.SUSPENDED); - assertNull(mCm.getActiveNetworkInfo()); // ??? + assertActiveNetworkInfo(TYPE_MOBILE, DetailedState.SUSPENDED); assertGetNetworkInfoOfGetActiveNetworkIsConnected(false); mCellNetworkAgent.resume(); - callback.assertNoCallback(); // BUG: should get callback that VPN is no longer suspended. + callback.expectCapabilitiesThat(mMockVpn, + nc -> nc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED) + && nc.hasTransport(TRANSPORT_CELLULAR)); + callback.expectCallback(CallbackEntry.RESUMED, mMockVpn); + callback.assertNoCallback(); assertTrue(mCm.getNetworkCapabilities(mMockVpn.getNetwork()) .hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); assertNetworkInfo(TYPE_MOBILE, DetailedState.CONNECTED); assertNetworkInfo(TYPE_WIFI, DetailedState.DISCONNECTED); - assertNetworkInfo(TYPE_VPN, DetailedState.SUSPENDED); - assertNull(mCm.getActiveNetworkInfo()); // ??? - assertGetNetworkInfoOfGetActiveNetworkIsConnected(false); + assertNetworkInfo(TYPE_VPN, DetailedState.CONNECTED); + assertActiveNetworkInfo(TYPE_MOBILE, DetailedState.CONNECTED); + assertGetNetworkInfoOfGetActiveNetworkIsConnected(true); } @Test From 9d680e7cd3c58da63d7753f2e4dce5683d2fd893 Mon Sep 17 00:00:00 2001 From: Lorenzo Colitti Date: Mon, 11 Jan 2021 22:27:57 +0900 Subject: [PATCH 104/288] Fix legacy APIs when VPN switches to suspended underlying network. Currently, when the VPN underlying network changes from a network that is not suspended to one that is suspended (or vice versa), some of the legacy APIs return incorrect results. This is because the VPN's NetworkInfo can get into SUSPENDED state even though the capabilities have the NOT_SUSPENDED capability. This happens because the code in updateCapabilities that checks for changes in NOT_SUSPENDED and NOT_ROAMING (which are the capabilities that can affect the NetworkInfo state) is only run when the capabilities change in a certain way. Fix this by always checking for changes in these capabilities, regardless of what else has changed. This results in sending a lot more SUSPENDED and RESUMED callbacks than the code sent previously. This should hopefully not impact apps because those callback methods have never been public API, though because they're just callbacks, it's possible that apps found out via code inspection that the callbacks existed and implemented them. Bug: 172870110 Test: changes to existing tests in ConnectivityServiceTest Change-Id: I6ec246a6a4e61f634956a165797fbb80296efd6a Merged-In: I6ec246a6a4e61f634956a165797fbb80296efd6a --- .../android/server/ConnectivityService.java | 33 +++++++++++-------- .../server/ConnectivityServiceTest.java | 29 ++++++---------- 2 files changed, 30 insertions(+), 32 deletions(-) diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 77cd5d2ffdabb..fcf73ac7ce15a 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -6316,6 +6316,25 @@ public class ConnectivityService extends IConnectivityManager.Stub return newNc; } + private void updateNetworkInfoForRoamingAndSuspended(NetworkAgentInfo nai, + NetworkCapabilities prevNc, NetworkCapabilities newNc) { + final boolean prevSuspended = !prevNc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED); + final boolean suspended = !newNc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED); + final boolean prevRoaming = !prevNc.hasCapability(NET_CAPABILITY_NOT_ROAMING); + final boolean roaming = !newNc.hasCapability(NET_CAPABILITY_NOT_ROAMING); + if (prevSuspended != suspended) { + // TODO (b/73132094) : remove this call once the few users of onSuspended and + // onResumed have been removed. + notifyNetworkCallbacks(nai, suspended ? ConnectivityManager.CALLBACK_SUSPENDED + : ConnectivityManager.CALLBACK_RESUMED); + } + if (prevSuspended != suspended || prevRoaming != roaming) { + // updateNetworkInfo will mix in the suspended info from the capabilities and + // take appropriate action for the network having possibly changed state. + updateNetworkInfo(nai, nai.networkInfo); + } + } + /** * Update the NetworkCapabilities for {@code nai} to {@code nc}. Specifically: * @@ -6347,25 +6366,13 @@ public class ConnectivityService extends IConnectivityManager.Stub // on this network. We might have been called by rematchNetworkAndRequests when a // network changed foreground state. processListenRequests(nai); - final boolean prevSuspended = !prevNc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED); - final boolean suspended = !newNc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED); - final boolean prevRoaming = !prevNc.hasCapability(NET_CAPABILITY_NOT_ROAMING); - final boolean roaming = !newNc.hasCapability(NET_CAPABILITY_NOT_ROAMING); - if (prevSuspended != suspended || prevRoaming != roaming) { - // TODO (b/73132094) : remove this call once the few users of onSuspended and - // onResumed have been removed. - notifyNetworkCallbacks(nai, suspended ? ConnectivityManager.CALLBACK_SUSPENDED - : ConnectivityManager.CALLBACK_RESUMED); - // updateNetworkInfo will mix in the suspended info from the capabilities and - // take appropriate action for the network having possibly changed state. - updateNetworkInfo(nai, nai.networkInfo); - } } else { // If the requestable capabilities have changed or the score changed, we can't have been // called by rematchNetworkAndRequests, so it's safe to start a rematch. rematchAllNetworksAndRequests(); notifyNetworkCallbacks(nai, ConnectivityManager.CALLBACK_CAP_CHANGED); } + updateNetworkInfoForRoamingAndSuspended(nai, prevNc, newNc); // TODO : static analysis indicates that prevNc can't be null here (getAndSetNetworkCaps // never returns null), so mark the relevant members and functions in nai as @NonNull and diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index 3d4ff41d65fbc..a5554c740e7f7 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -5488,23 +5488,18 @@ public class ConnectivityServiceTest { callback.expectCapabilitiesThat(mMockVpn, nc -> nc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED) && nc.hasTransport(TRANSPORT_WIFI)); - - // BUG: the VPN is no longer suspended, so a RESUMED callback should have been sent. - // callback.expectCallback(CallbackEntry.RESUMED, mMockVpn); + callback.expectCallback(CallbackEntry.RESUMED, mMockVpn); callback.assertNoCallback(); assertTrue(mCm.getNetworkCapabilities(mMockVpn.getNetwork()) .hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); assertNetworkInfo(TYPE_MOBILE, DetailedState.DISCONNECTED); assertNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED); - assertNetworkInfo(TYPE_VPN, DetailedState.SUSPENDED); // BUG: VPN caps have NOT_SUSPENDED. + assertNetworkInfo(TYPE_VPN, DetailedState.CONNECTED); assertActiveNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED); - // BUG: the device has connectivity, so this should return true. - assertGetNetworkInfoOfGetActiveNetworkIsConnected(false); + assertGetNetworkInfoOfGetActiveNetworkIsConnected(true); - // Unsuspend cellular and then switch back to it. - // The same bug happens in the opposite direction: the VPN's capabilities correctly have - // NOT_SUSPENDED, but the VPN's NetworkInfo is in state SUSPENDED. + // Unsuspend cellular and then switch back to it. The VPN remains not suspended. mCellNetworkAgent.resume(); mWiFiNetworkAgent.disconnect(); callback.expectCapabilitiesThat(mMockVpn, @@ -5520,12 +5515,11 @@ public class ConnectivityServiceTest { .hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); assertNetworkInfo(TYPE_MOBILE, DetailedState.CONNECTED); assertNetworkInfo(TYPE_WIFI, DetailedState.DISCONNECTED); - assertNetworkInfo(TYPE_VPN, DetailedState.SUSPENDED); // BUG: VPN caps have NOT_SUSPENDED. + assertNetworkInfo(TYPE_VPN, DetailedState.CONNECTED); assertActiveNetworkInfo(TYPE_MOBILE, DetailedState.CONNECTED); - // BUG: the device has connectivity, so this should return true. - assertGetNetworkInfoOfGetActiveNetworkIsConnected(false); + assertGetNetworkInfoOfGetActiveNetworkIsConnected(true); - // Re-suspending the current network fixes the problem. + // Suspend cellular and expect no connectivity. mCellNetworkAgent.suspend(); callback.expectCapabilitiesThat(mMockVpn, nc -> !nc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED) @@ -5541,6 +5535,7 @@ public class ConnectivityServiceTest { assertActiveNetworkInfo(TYPE_MOBILE, DetailedState.SUSPENDED); assertGetNetworkInfoOfGetActiveNetworkIsConnected(false); + // Resume cellular and expect that connectivity comes back. mCellNetworkAgent.resume(); callback.expectCapabilitiesThat(mMockVpn, nc -> nc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED) @@ -5926,10 +5921,7 @@ public class ConnectivityServiceTest { && caps.hasTransport(TRANSPORT_CELLULAR) && !caps.hasCapability(NET_CAPABILITY_NOT_METERED) && !caps.hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); - // While the SUSPENDED callback should in theory be sent here, it is not. This is - // a bug in ConnectivityService, but as the SUSPENDED and RESUMED callbacks have never - // been public and are deprecated and slated for removal, there is no sense in spending - // resources fixing this bug now. + vpnNetworkCallback.expectCallback(CallbackEntry.SUSPENDED, mMockVpn); assertDefaultNetworkCapabilities(userId, mCellNetworkAgent, mWiFiNetworkAgent); // Use both again. @@ -5941,8 +5933,7 @@ public class ConnectivityServiceTest { && caps.hasTransport(TRANSPORT_CELLULAR) && caps.hasTransport(TRANSPORT_WIFI) && !caps.hasCapability(NET_CAPABILITY_NOT_METERED) && caps.hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); - // As above, the RESUMED callback not being sent here is a bug, but not a bug that's - // worth anybody's time to fix. + vpnNetworkCallback.expectCallback(CallbackEntry.RESUMED, mMockVpn); assertDefaultNetworkCapabilities(userId, mCellNetworkAgent, mWiFiNetworkAgent); // Disconnect cell. Receive update without even removing the dead network from the From 19f28d7894d4c518b4343e601d745846aaff6562 Mon Sep 17 00:00:00 2001 From: Miranda Kephart Date: Mon, 16 Nov 2020 11:22:13 -0500 Subject: [PATCH 105/288] [DO NOT MERGE] Close screenshot process on user switched Currently, we keep the process up even if the user switches, meaning that in some cases (if the user is switched while the screenshot UI is up) we will save images to the wrong profile. This change makes ScreenshotHelper listen for user switches and close the screenshot service, so that a new screenshot is guaranteed to be constructed with the correct user's context. Bug: 170474245 Fix: 170474245 Test: manual -- verified bad state occurs if user switches within the timeout period, ensured that screenshots work immediately after switching with this change. Change-Id: I9d32d0928e6c2bda161d04555438d0dd7afef0ba (cherry picked from commit 7ef1a5dd1506075507412626f2533283d9520144) --- .../internal/util/ScreenshotHelper.java | 37 ++++++++++++++++--- 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/core/java/com/android/internal/util/ScreenshotHelper.java b/core/java/com/android/internal/util/ScreenshotHelper.java index 7fd94c6859fb2..b92204236e97f 100644 --- a/core/java/com/android/internal/util/ScreenshotHelper.java +++ b/core/java/com/android/internal/util/ScreenshotHelper.java @@ -1,9 +1,13 @@ package com.android.internal.util; +import static android.content.Intent.ACTION_USER_SWITCHED; + import android.annotation.NonNull; +import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.content.ServiceConnection; import android.os.Handler; import android.os.IBinder; @@ -29,8 +33,21 @@ public class ScreenshotHelper { private ServiceConnection mScreenshotConnection = null; private final Context mContext; + private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + synchronized (mScreenshotLock) { + if (ACTION_USER_SWITCHED.equals(intent.getAction())) { + resetConnection(); + } + } + } + }; + public ScreenshotHelper(Context context) { mContext = context; + IntentFilter filter = new IntentFilter(ACTION_USER_SWITCHED); + mContext.registerReceiver(mBroadcastReceiver, filter); } /** @@ -57,8 +74,8 @@ public class ScreenshotHelper { @Override public void run() { synchronized (mScreenshotLock) { if (mScreenshotConnection != null) { - mContext.unbindService(mScreenshotConnection); - mScreenshotConnection = null; + Log.e(TAG, "Timed out before getting screenshot capture response"); + resetConnection(); notifyScreenshotError(); } } @@ -81,8 +98,7 @@ public class ScreenshotHelper { public void handleMessage(Message msg) { synchronized (mScreenshotLock) { if (mScreenshotConnection == myConn) { - mContext.unbindService(mScreenshotConnection); - mScreenshotConnection = null; + resetConnection(); handler.removeCallbacks(mScreenshotTimeout); } } @@ -103,8 +119,7 @@ public class ScreenshotHelper { public void onServiceDisconnected(ComponentName name) { synchronized (mScreenshotLock) { if (mScreenshotConnection != null) { - mContext.unbindService(mScreenshotConnection); - mScreenshotConnection = null; + resetConnection(); handler.removeCallbacks(mScreenshotTimeout); notifyScreenshotError(); } @@ -120,6 +135,16 @@ public class ScreenshotHelper { } } + /** + * Unbinds the current screenshot connection (if any). + */ + private void resetConnection() { + if (mScreenshotConnection != null) { + mContext.unbindService(mScreenshotConnection); + mScreenshotConnection = null; + } + } + /** * Notifies the screenshot service to show an error. */ From 41a97a3fd773176a0c262250dc87b2f26cbbdf31 Mon Sep 17 00:00:00 2001 From: Miranda Kephart Date: Mon, 16 Nov 2020 11:22:13 -0500 Subject: [PATCH 106/288] [DO NOT MERGE] Close screenshot process on user switched Currently, we keep the process up even if the user switches, meaning that in some cases (if the user is switched while the screenshot UI is up) we will save images to the wrong profile. This change makes ScreenshotHelper listen for user switches and close the screenshot service, so that a new screenshot is guaranteed to be constructed with the correct user's context. Bug: 170474245 Fix: 170474245 Test: manual -- verified bad state occurs if user switches within the timeout period, ensured that screenshots work immediately after switching with this change. Change-Id: I9d32d0928e6c2bda161d04555438d0dd7afef0ba (cherry picked from commit 7ef1a5dd1506075507412626f2533283d9520144) --- .../internal/util/ScreenshotHelper.java | 37 ++++++++++++++++--- 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/core/java/com/android/internal/util/ScreenshotHelper.java b/core/java/com/android/internal/util/ScreenshotHelper.java index d24d78c6f3dab..14afe9958a409 100644 --- a/core/java/com/android/internal/util/ScreenshotHelper.java +++ b/core/java/com/android/internal/util/ScreenshotHelper.java @@ -1,10 +1,14 @@ package com.android.internal.util; +import static android.content.Intent.ACTION_USER_SWITCHED; + import android.annotation.NonNull; import android.annotation.Nullable; +import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.content.ServiceConnection; import android.net.Uri; import android.os.Handler; @@ -33,8 +37,21 @@ public class ScreenshotHelper { private ServiceConnection mScreenshotConnection = null; private final Context mContext; + private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + synchronized (mScreenshotLock) { + if (ACTION_USER_SWITCHED.equals(intent.getAction())) { + resetConnection(); + } + } + } + }; + public ScreenshotHelper(Context context) { mContext = context; + IntentFilter filter = new IntentFilter(ACTION_USER_SWITCHED); + mContext.registerReceiver(mBroadcastReceiver, filter); } /** @@ -103,8 +120,8 @@ public class ScreenshotHelper { public void run() { synchronized (mScreenshotLock) { if (mScreenshotConnection != null) { - mContext.unbindService(mScreenshotConnection); - mScreenshotConnection = null; + Log.e(TAG, "Timed out before getting screenshot capture response"); + resetConnection(); notifyScreenshotError(); } } @@ -130,8 +147,7 @@ public class ScreenshotHelper { public void handleMessage(Message msg) { synchronized (mScreenshotLock) { if (mScreenshotConnection == myConn) { - mContext.unbindService(mScreenshotConnection); - mScreenshotConnection = null; + resetConnection(); handler.removeCallbacks(mScreenshotTimeout); } } @@ -160,8 +176,7 @@ public class ScreenshotHelper { public void onServiceDisconnected(ComponentName name) { synchronized (mScreenshotLock) { if (mScreenshotConnection != null) { - mContext.unbindService(mScreenshotConnection); - mScreenshotConnection = null; + resetConnection(); handler.removeCallbacks(mScreenshotTimeout); notifyScreenshotError(); } @@ -177,6 +192,16 @@ public class ScreenshotHelper { } } + /** + * Unbinds the current screenshot connection (if any). + */ + private void resetConnection() { + if (mScreenshotConnection != null) { + mContext.unbindService(mScreenshotConnection); + mScreenshotConnection = null; + } + } + /** * Notifies the screenshot service to show an error. */ From 9908e1a14575b5543fef15032f9fe495382fce87 Mon Sep 17 00:00:00 2001 From: Miranda Kephart Date: Mon, 16 Nov 2020 11:22:13 -0500 Subject: [PATCH 107/288] [DO NOT MERGE] Close screenshot process on user switched Currently, we keep the process up even if the user switches, meaning that in some cases (if the user is switched while the screenshot UI is up) we will save images to the wrong profile. This change makes ScreenshotHelper listen for user switches and close the screenshot service, so that a new screenshot is guaranteed to be constructed with the correct user's context. Bug: 170474245 Fix: 170474245 Test: manual -- verified bad state occurs if user switches within the timeout period, ensured that screenshots work immediately after switching with this change. Change-Id: I9d32d0928e6c2bda161d04555438d0dd7afef0ba (cherry picked from commit 7ef1a5dd1506075507412626f2533283d9520144) --- .../internal/util/ScreenshotHelper.java | 47 ++++++++++++++----- 1 file changed, 35 insertions(+), 12 deletions(-) diff --git a/core/java/com/android/internal/util/ScreenshotHelper.java b/core/java/com/android/internal/util/ScreenshotHelper.java index 7fd94c6859fb2..9ab89328a075c 100644 --- a/core/java/com/android/internal/util/ScreenshotHelper.java +++ b/core/java/com/android/internal/util/ScreenshotHelper.java @@ -1,9 +1,13 @@ package com.android.internal.util; +import static android.content.Intent.ACTION_USER_SWITCHED; + import android.annotation.NonNull; +import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.content.ServiceConnection; import android.os.Handler; import android.os.IBinder; @@ -29,8 +33,21 @@ public class ScreenshotHelper { private ServiceConnection mScreenshotConnection = null; private final Context mContext; + private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + synchronized (mScreenshotLock) { + if (ACTION_USER_SWITCHED.equals(intent.getAction())) { + resetConnection(); + } + } + } + }; + public ScreenshotHelper(Context context) { mContext = context; + IntentFilter filter = new IntentFilter(ACTION_USER_SWITCHED); + mContext.registerReceiver(mBroadcastReceiver, filter); } /** @@ -53,14 +70,12 @@ public class ScreenshotHelper { SYSUI_SCREENSHOT_SERVICE); final Intent serviceIntent = new Intent(); - final Runnable mScreenshotTimeout = new Runnable() { - @Override public void run() { - synchronized (mScreenshotLock) { - if (mScreenshotConnection != null) { - mContext.unbindService(mScreenshotConnection); - mScreenshotConnection = null; - notifyScreenshotError(); - } + final Runnable mScreenshotTimeout = () -> { + synchronized (mScreenshotLock) { + if (mScreenshotConnection != null) { + Log.e(TAG, "Timed out before getting screenshot capture response"); + resetConnection(); + notifyScreenshotError(); } } }; @@ -81,8 +96,7 @@ public class ScreenshotHelper { public void handleMessage(Message msg) { synchronized (mScreenshotLock) { if (mScreenshotConnection == myConn) { - mContext.unbindService(mScreenshotConnection); - mScreenshotConnection = null; + resetConnection(); handler.removeCallbacks(mScreenshotTimeout); } } @@ -103,8 +117,7 @@ public class ScreenshotHelper { public void onServiceDisconnected(ComponentName name) { synchronized (mScreenshotLock) { if (mScreenshotConnection != null) { - mContext.unbindService(mScreenshotConnection); - mScreenshotConnection = null; + resetConnection(); handler.removeCallbacks(mScreenshotTimeout); notifyScreenshotError(); } @@ -120,6 +133,16 @@ public class ScreenshotHelper { } } + /** + * Unbinds the current screenshot connection (if any). + */ + private void resetConnection() { + if (mScreenshotConnection != null) { + mContext.unbindService(mScreenshotConnection); + mScreenshotConnection = null; + } + } + /** * Notifies the screenshot service to show an error. */ From 3a62e9ffaad2d81bf176decb7b60266bd6005301 Mon Sep 17 00:00:00 2001 From: Beth Thibodeau Date: Wed, 27 Jan 2021 13:33:34 -0500 Subject: [PATCH 108/288] Limit maximum allowed size for a status bar icon Bug: 169255797 Test: atest StatusBarIconViewTest Test: verified that app crashes instead of SysUI following repro steps Change-Id: I66e3bb873841b5babfd522c82cea7bed361fc14c (cherry picked from commit 4394595debfd3f625b45a8b2280cdbec61f8dc71) --- .../android/systemui/statusbar/StatusBarIconView.java | 10 ++++++++++ .../systemui/statusbar/StatusBarIconViewTest.java | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java index 8cf8a22999220..25ae5c2dadef1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java @@ -83,6 +83,9 @@ public class StatusBarIconView extends AnimatedImageView implements StatusIconDi public static final int STATE_DOT = 1; public static final int STATE_HIDDEN = 2; + /** Maximum allowed width or height for an icon drawable */ + private static final int MAX_IMAGE_SIZE = 500; + private static final String TAG = "StatusBarIconView"; private static final Property ICON_APPEAR_AMOUNT = new FloatProperty("iconAppearAmount") { @@ -378,6 +381,13 @@ public class StatusBarIconView extends AnimatedImageView implements StatusIconDi Log.w(TAG, "No icon for slot " + mSlot + "; " + mIcon.icon); return false; } + + if (drawable.getIntrinsicWidth() > MAX_IMAGE_SIZE + || drawable.getIntrinsicHeight() > MAX_IMAGE_SIZE) { + Log.w(TAG, "Drawable is too large " + mIcon); + return false; + } + if (withClear) { setImageDrawable(null); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java index 9971e0cf81a32..daa805a8f6e6a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java @@ -35,6 +35,7 @@ import android.content.ContextWrapper; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.res.Resources; +import android.graphics.Bitmap; import android.graphics.Color; import android.graphics.drawable.Icon; import android.os.UserHandle; @@ -123,4 +124,13 @@ public class StatusBarIconViewTest extends SysuiTestCase { assertEquals("Transparent backgrounds should fallback to drawable color", color, mIconView.getStaticDrawableColor()); } + + @Test + public void testGiantImageNotAllowed() { + Bitmap largeBitmap = Bitmap.createBitmap(1000, 1000, Bitmap.Config.ARGB_8888); + Icon icon = Icon.createWithBitmap(largeBitmap); + StatusBarIcon largeIcon = new StatusBarIcon(UserHandle.ALL, "mockPackage", + icon, 0, 0, ""); + assertFalse(mIconView.set(largeIcon)); + } } \ No newline at end of file From def75584a3f1a375685f1520fe5df506e8dcfa77 Mon Sep 17 00:00:00 2001 From: Beth Thibodeau Date: Wed, 27 Jan 2021 13:33:34 -0500 Subject: [PATCH 109/288] Limit maximum allowed size for a status bar icon Bug: 169255797 Test: atest StatusBarIconViewTest Test: verified that app crashes instead of SysUI following repro steps Change-Id: I66e3bb873841b5babfd522c82cea7bed361fc14c (cherry picked from commit 4394595debfd3f625b45a8b2280cdbec61f8dc71) --- .../android/systemui/statusbar/StatusBarIconView.java | 10 ++++++++++ .../systemui/statusbar/StatusBarIconViewTest.java | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java index 8cf8a22999220..25ae5c2dadef1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java @@ -83,6 +83,9 @@ public class StatusBarIconView extends AnimatedImageView implements StatusIconDi public static final int STATE_DOT = 1; public static final int STATE_HIDDEN = 2; + /** Maximum allowed width or height for an icon drawable */ + private static final int MAX_IMAGE_SIZE = 500; + private static final String TAG = "StatusBarIconView"; private static final Property ICON_APPEAR_AMOUNT = new FloatProperty("iconAppearAmount") { @@ -378,6 +381,13 @@ public class StatusBarIconView extends AnimatedImageView implements StatusIconDi Log.w(TAG, "No icon for slot " + mSlot + "; " + mIcon.icon); return false; } + + if (drawable.getIntrinsicWidth() > MAX_IMAGE_SIZE + || drawable.getIntrinsicHeight() > MAX_IMAGE_SIZE) { + Log.w(TAG, "Drawable is too large " + mIcon); + return false; + } + if (withClear) { setImageDrawable(null); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java index 9971e0cf81a32..daa805a8f6e6a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java @@ -35,6 +35,7 @@ import android.content.ContextWrapper; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.res.Resources; +import android.graphics.Bitmap; import android.graphics.Color; import android.graphics.drawable.Icon; import android.os.UserHandle; @@ -123,4 +124,13 @@ public class StatusBarIconViewTest extends SysuiTestCase { assertEquals("Transparent backgrounds should fallback to drawable color", color, mIconView.getStaticDrawableColor()); } + + @Test + public void testGiantImageNotAllowed() { + Bitmap largeBitmap = Bitmap.createBitmap(1000, 1000, Bitmap.Config.ARGB_8888); + Icon icon = Icon.createWithBitmap(largeBitmap); + StatusBarIcon largeIcon = new StatusBarIcon(UserHandle.ALL, "mockPackage", + icon, 0, 0, ""); + assertFalse(mIconView.set(largeIcon)); + } } \ No newline at end of file From a21b2252e0b0eccd482b3b69e67b8911b94dba73 Mon Sep 17 00:00:00 2001 From: Lorenzo Colitti Date: Mon, 16 Nov 2020 10:11:12 +0900 Subject: [PATCH 110/288] Test a VPN with an underlying network that does not yet exist. This test checks that if a VPN declares an underlying network that does not exist, the capabilities of that network are applied to the VPN as soon as the network starts to exist. Bug: 172870110 Test: test-only change Change-Id: Icc0701cb4cea7d91f7738c1e426e94cd26686b74 Merged-In: Icc0701cb4cea7d91f7738c1e426e94cd26686b74 --- .../com/android/server/TestNetIdManager.kt | 1 + .../server/ConnectivityServiceTest.java | 57 ++++++++++++++++++- 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/tests/net/integration/util/com/android/server/TestNetIdManager.kt b/tests/net/integration/util/com/android/server/TestNetIdManager.kt index eb290dc7d24ad..938a694e8ba98 100644 --- a/tests/net/integration/util/com/android/server/TestNetIdManager.kt +++ b/tests/net/integration/util/com/android/server/TestNetIdManager.kt @@ -35,4 +35,5 @@ class TestNetIdManager : NetIdManager() { private val nextId = AtomicInteger(MAX_NET_ID) override fun reserveNetId() = nextId.decrementAndGet() override fun releaseNetId(id: Int) = Unit + fun peekNextNetId() = nextId.get() - 1 } diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index 385005f90c3be..0c1bf548db6dc 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -336,6 +336,7 @@ public class ConnectivityServiceTest { private INetworkPolicyListener mPolicyListener; private WrappedMultinetworkPolicyTracker mPolicyTracker; private HandlerThread mAlarmManagerThread; + private TestNetIdManager mNetIdManager; @Mock IIpConnectivityMetrics mIpConnectivityMetrics; @Mock IpConnectivityMetrics.Logger mMetricsService; @@ -1194,6 +1195,8 @@ public class ConnectivityServiceTest { @Before public void setUp() throws Exception { + mNetIdManager = new TestNetIdManager(); + mContext = InstrumentationRegistry.getContext(); MockitoAnnotations.initMocks(this); @@ -1264,7 +1267,7 @@ public class ConnectivityServiceTest { final ConnectivityService.Dependencies deps = mock(ConnectivityService.Dependencies.class); doReturn(mCsHandlerThread).when(deps).makeHandlerThread(); - doReturn(new TestNetIdManager()).when(deps).makeNetIdManager(); + doReturn(mNetIdManager).when(deps).makeNetIdManager(); doReturn(mNetworkStack).when(deps).getNetworkStack(); doReturn(systemProperties).when(deps).getSystemProperties(); doReturn(mock(ProxyTracker.class)).when(deps).makeProxyTracker(any(), any()); @@ -5186,6 +5189,58 @@ public class ConnectivityServiceTest { assertTrue(lp.getDnsServers().containsAll(dnsServers)); } + @Test + public void testVpnConnectDisconnectUnderlyingNetwork() throws Exception { + final TestNetworkCallback callback = new TestNetworkCallback(); + final NetworkRequest request = new NetworkRequest.Builder() + .removeCapability(NET_CAPABILITY_NOT_VPN).build(); + + mCm.registerNetworkCallback(request, callback); + + // Bring up a VPN that specifies an underlying network that does not exist yet. + // Note: it's sort of meaningless for a VPN app to declare a network that doesn't exist yet, + // (and doing so is difficult without using reflection) but it's good to test that the code + // behaves approximately correctly. + final int uid = Process.myUid(); + final TestNetworkAgentWrapper + vpnNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_VPN); + final ArraySet ranges = new ArraySet<>(); + ranges.add(new UidRange(uid, uid)); + + final Network wifiNetwork = new Network(mNetIdManager.peekNextNetId()); + mMockVpn.setNetworkAgent(vpnNetworkAgent); + mMockVpn.setUids(ranges); + mMockVpn.setUnderlyingNetworks(new Network[]{wifiNetwork}); + vpnNetworkAgent.connect(false); + mMockVpn.connect(); + callback.expectAvailableCallbacksUnvalidated(vpnNetworkAgent); + assertTrue(mCm.getNetworkCapabilities(vpnNetworkAgent.getNetwork()) + .hasTransport(TRANSPORT_VPN)); + assertFalse(mCm.getNetworkCapabilities(vpnNetworkAgent.getNetwork()) + .hasTransport(TRANSPORT_WIFI)); + + // Make that underlying network connect, and expect to see its capabilities immediately + // reflected in the VPN's capabilities. + mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); + assertEquals(wifiNetwork, mWiFiNetworkAgent.getNetwork()); + mWiFiNetworkAgent.connect(false); + callback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); + callback.expectCallback(CallbackEntry.NETWORK_CAPS_UPDATED, vpnNetworkAgent); + assertTrue(mCm.getNetworkCapabilities(vpnNetworkAgent.getNetwork()) + .hasTransport(TRANSPORT_VPN)); + assertTrue(mCm.getNetworkCapabilities(vpnNetworkAgent.getNetwork()) + .hasTransport(TRANSPORT_WIFI)); + + // Disconnect the network, and expect to see the VPN capabilities change accordingly. + mWiFiNetworkAgent.disconnect(); + callback.expectCallback(CallbackEntry.LOST, mWiFiNetworkAgent); + callback.expectCapabilitiesThat(vpnNetworkAgent, (nc) -> + nc.getTransportTypes().length == 1 && nc.hasTransport(TRANSPORT_VPN)); + + vpnNetworkAgent.disconnect(); + mCm.unregisterNetworkCallback(callback); + } + @Test public void testVpnNetworkActive() throws Exception { final int uid = Process.myUid(); From 9ededd8476680d40b0b0d5b21e3a4bc0d743adae Mon Sep 17 00:00:00 2001 From: Lorenzo Colitti Date: Mon, 16 Nov 2020 16:05:44 +0900 Subject: [PATCH 111/288] Simplify MockVpn. This CL removes four methods in MockVpn by slightly changing the test code to leverage the actual methods implemented by the (production) Vpn superclass. This works because setting mInterface results in isRunningLocked() returning true, which makes a number of methods behave as if the VPN is connected (which is what the test expects). The more realistic behaviour exposes a minor bug in the treatment of underlying networks. Add a TODO to fix it. Bug: 172870110 Test: test-only change Change-Id: I49421183538ba61ca790af71e309ece36b653bf9 Merged-In: I49421183538ba61ca790af71e309ece36b653bf9 --- .../com/android/server/connectivity/Vpn.java | 3 +- .../server/ConnectivityServiceTest.java | 53 ++++++++----------- 2 files changed, 25 insertions(+), 31 deletions(-) diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java index bcb17bc9e2dc9..9edb0e440baac 100644 --- a/services/core/java/com/android/server/connectivity/Vpn.java +++ b/services/core/java/com/android/server/connectivity/Vpn.java @@ -202,7 +202,8 @@ public class Vpn { @VisibleForTesting protected String mPackage; private int mOwnerUID; private boolean mIsPackageTargetingAtLeastQ; - private String mInterface; + @VisibleForTesting + protected String mInterface; private Connection mConnection; /** Tracks the runners for all VPN types managed by the platform (eg. LegacyVpn, PlatformVpn) */ diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index 0c1bf548db6dc..572ea12358ec1 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -319,6 +319,7 @@ public class ConnectivityServiceTest { private static final String MOBILE_IFNAME = "test_rmnet_data0"; private static final String WIFI_IFNAME = "test_wlan0"; private static final String WIFI_WOL_IFNAME = "test_wlan_wol"; + private static final String VPN_IFNAME = "tun10042"; private static final String TEST_PACKAGE_NAME = "com.android.test.package"; private static final String[] EMPTY_STRING_ARRAY = new String[0]; @@ -1033,12 +1034,14 @@ public class ConnectivityServiceTest { public MockVpn(int userId) { super(startHandlerThreadAndReturnLooper(), mServiceContext, mNetworkManagementService, userId, mock(KeyStore.class)); + mConfig = new VpnConfig(); } public void setNetworkAgent(TestNetworkAgentWrapper agent) { agent.waitForIdle(TIMEOUT_MS); mMockNetworkAgent = agent; mNetworkAgent = agent.getNetworkAgent(); + mInterface = VPN_IFNAME; mNetworkCapabilities.set(agent.getNetworkCapabilities()); } @@ -1059,16 +1062,6 @@ public class ConnectivityServiceTest { return mMockNetworkAgent.getNetwork().netId; } - @Override - public boolean appliesToUid(int uid) { - return mConnected; // Trickery to simplify testing. - } - - @Override - protected boolean isCallerEstablishedOwnerLocked() { - return mConnected; // Similar trickery - } - @Override public int getActiveAppVpnType() { return mVpnType; @@ -1077,7 +1070,6 @@ public class ConnectivityServiceTest { private void connect(boolean isAlwaysMetered) { mNetworkCapabilities.set(mMockNetworkAgent.getNetworkCapabilities()); mConnected = true; - mConfig = new VpnConfig(); mConfig.isMetered = isAlwaysMetered; } @@ -1108,7 +1100,6 @@ public class ConnectivityServiceTest { public void disconnect() { mConnected = false; - mConfig = null; } @Override @@ -1121,18 +1112,6 @@ public class ConnectivityServiceTest { private synchronized void setVpnInfo(VpnInfo vpnInfo) { mVpnInfo = vpnInfo; } - - @Override - public synchronized Network[] getUnderlyingNetworks() { - if (mUnderlyingNetworks != null) return mUnderlyingNetworks; - - return super.getUnderlyingNetworks(); - } - - /** Don't override behavior for {@link Vpn#setUnderlyingNetworks}. */ - private synchronized void overrideUnderlyingNetworks(Network[] underlyingNetworks) { - mUnderlyingNetworks = underlyingNetworks; - } } private void mockVpn(int uid) { @@ -5210,7 +5189,7 @@ public class ConnectivityServiceTest { final Network wifiNetwork = new Network(mNetIdManager.peekNextNetId()); mMockVpn.setNetworkAgent(vpnNetworkAgent); mMockVpn.setUids(ranges); - mMockVpn.setUnderlyingNetworks(new Network[]{wifiNetwork}); + mService.setUnderlyingNetworksForVpn(new Network[]{wifiNetwork}); vpnNetworkAgent.connect(false); mMockVpn.connect(); callback.expectAvailableCallbacksUnvalidated(vpnNetworkAgent); @@ -5224,8 +5203,17 @@ public class ConnectivityServiceTest { mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); assertEquals(wifiNetwork, mWiFiNetworkAgent.getNetwork()); mWiFiNetworkAgent.connect(false); - callback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); + // TODO: the callback for the VPN happens before any callbacks are called for the wifi + // network that has just connected. There appear to be two issues here: + // 1. The VPN code will accept an underlying network as soon as getNetworkCapabilities() for + // it returns non-null (which happens very early, during handleRegisterNetworkAgent). + // This is not correct because that that point the network is not connected and cannot + // pass any traffic. + // 2. When a network connects, updateNetworkInfo propagates underlying network capabilities + // before rematching networks. + // Given that this scenario can't really happen, this is probably fine for now. callback.expectCallback(CallbackEntry.NETWORK_CAPS_UPDATED, vpnNetworkAgent); + callback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); assertTrue(mCm.getNetworkCapabilities(vpnNetworkAgent.getNetwork()) .hasTransport(TRANSPORT_VPN)); assertTrue(mCm.getNetworkCapabilities(vpnNetworkAgent.getNetwork()) @@ -5289,7 +5277,7 @@ public class ConnectivityServiceTest { vpnNetworkAgent.connect(false); mMockVpn.connect(); - mMockVpn.setUnderlyingNetworks(new Network[0]); + mService.setUnderlyingNetworksForVpn(new Network[0]); genericNetworkCallback.expectAvailableCallbacksUnvalidated(vpnNetworkAgent); genericNotVpnNetworkCallback.assertNoCallback(); @@ -7249,16 +7237,21 @@ public class ConnectivityServiceTest { // active final VpnInfo info = new VpnInfo(); info.ownerUid = Process.myUid(); - info.vpnIface = "interface"; + info.vpnIface = VPN_IFNAME; mMockVpn.setVpnInfo(info); - mMockVpn.overrideUnderlyingNetworks(new Network[] {network}); + + final TestNetworkAgentWrapper vpnNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_VPN); + mMockVpn.setNetworkAgent(vpnNetworkAgent); + mMockVpn.connect(); + + assertTrue(mService.setUnderlyingNetworksForVpn(new Network[] {network})); assertTrue( "Active VPN permission not applied", mService.checkConnectivityDiagnosticsPermissions( Process.myPid(), Process.myUid(), naiWithoutUid, mContext.getOpPackageName())); - mMockVpn.overrideUnderlyingNetworks(null); + assertTrue(mService.setUnderlyingNetworksForVpn(null)); assertFalse( "VPN shouldn't receive callback on non-underlying network", mService.checkConnectivityDiagnosticsPermissions( From 04314f147d00660fc5d32613bc06ede3d9ec3b9d Mon Sep 17 00:00:00 2001 From: Lorenzo Colitti Date: Tue, 17 Nov 2020 23:23:58 +0900 Subject: [PATCH 112/288] Increase test coverage for VPN info sent to NetworkStatsService. Bug: 172870110 Test: test-only change Change-Id: I3711b362f31cb92b759e9f5c9d244fb88d9bd5e7 Merged-In: I3711b362f31cb92b759e9f5c9d244fb88d9bd5e7 --- .../server/ConnectivityServiceTest.java | 169 +++++++++++++++--- 1 file changed, 149 insertions(+), 20 deletions(-) diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index 572ea12358ec1..c0293c157c277 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -4745,13 +4745,52 @@ public class ConnectivityServiceTest { mCm.unregisterNetworkCallback(networkCallback); } + private void assertSameElementsNoDuplicates(T[] expected, T[] actual) { + // Easier to implement than a proper "assertSameElements" method that also correctly deals + // with duplicates. + final String msg = Arrays.toString(expected) + " != " + Arrays.toString(actual); + assertEquals(msg, expected.length, actual.length); + Set expectedSet = new ArraySet<>(Arrays.asList(expected)); + assertEquals("expected contains duplicates", expectedSet.size(), expected.length); + // actual cannot have duplicates because it's the same length and has the same elements. + Set actualSet = new ArraySet<>(Arrays.asList(actual)); + assertEquals(expectedSet, actualSet); + } + + private void expectForceUpdateIfaces(Network[] networks, String defaultIface, + Integer vpnUid, String vpnIfname, String[] underlyingIfaces) throws Exception { + ArgumentCaptor networksCaptor = ArgumentCaptor.forClass(Network[].class); + ArgumentCaptor vpnInfosCaptor = ArgumentCaptor.forClass(VpnInfo[].class); + + verify(mStatsService, atLeastOnce()).forceUpdateIfaces(networksCaptor.capture(), + any(NetworkState[].class), eq(defaultIface), vpnInfosCaptor.capture()); + + assertSameElementsNoDuplicates(networksCaptor.getValue(), networks); + + VpnInfo[] infos = vpnInfosCaptor.getValue(); + if (vpnUid != null) { + assertEquals("Should have exactly one VPN:", 1, infos.length); + VpnInfo info = infos[0]; + assertEquals("Unexpected VPN owner:", (int) vpnUid, info.ownerUid); + assertEquals("Unexpected VPN interface:", vpnIfname, info.vpnIface); + assertSameElementsNoDuplicates(underlyingIfaces, info.underlyingIfaces); + } else { + assertEquals(0, infos.length); + return; + } + } + + private void expectForceUpdateIfaces(Network[] networks, String defaultIface) throws Exception { + expectForceUpdateIfaces(networks, defaultIface, null, null, new String[0]); + } + @Test public void testStatsIfacesChanged() throws Exception { mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR); mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); - Network[] onlyCell = new Network[] {mCellNetworkAgent.getNetwork()}; - Network[] onlyWifi = new Network[] {mWiFiNetworkAgent.getNetwork()}; + final Network[] onlyCell = new Network[] {mCellNetworkAgent.getNetwork()}; + final Network[] onlyWifi = new Network[] {mWiFiNetworkAgent.getNetwork()}; LinkProperties cellLp = new LinkProperties(); cellLp.setInterfaceName(MOBILE_IFNAME); @@ -4762,9 +4801,7 @@ public class ConnectivityServiceTest { mCellNetworkAgent.connect(false); mCellNetworkAgent.sendLinkProperties(cellLp); waitForIdle(); - verify(mStatsService, atLeastOnce()) - .forceUpdateIfaces(eq(onlyCell), any(NetworkState[].class), eq(MOBILE_IFNAME), - eq(new VpnInfo[0])); + expectForceUpdateIfaces(onlyCell, MOBILE_IFNAME); reset(mStatsService); // Default network switch should update ifaces. @@ -4772,32 +4809,24 @@ public class ConnectivityServiceTest { mWiFiNetworkAgent.sendLinkProperties(wifiLp); waitForIdle(); assertEquals(wifiLp, mService.getActiveLinkProperties()); - verify(mStatsService, atLeastOnce()) - .forceUpdateIfaces(eq(onlyWifi), any(NetworkState[].class), eq(WIFI_IFNAME), - eq(new VpnInfo[0])); + expectForceUpdateIfaces(onlyWifi, WIFI_IFNAME); reset(mStatsService); // Disconnect should update ifaces. mWiFiNetworkAgent.disconnect(); waitForIdle(); - verify(mStatsService, atLeastOnce()) - .forceUpdateIfaces(eq(onlyCell), any(NetworkState[].class), - eq(MOBILE_IFNAME), eq(new VpnInfo[0])); + expectForceUpdateIfaces(onlyCell, MOBILE_IFNAME); reset(mStatsService); // Metered change should update ifaces mCellNetworkAgent.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED); waitForIdle(); - verify(mStatsService, atLeastOnce()) - .forceUpdateIfaces(eq(onlyCell), any(NetworkState[].class), eq(MOBILE_IFNAME), - eq(new VpnInfo[0])); + expectForceUpdateIfaces(onlyCell, MOBILE_IFNAME); reset(mStatsService); mCellNetworkAgent.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED); waitForIdle(); - verify(mStatsService, atLeastOnce()) - .forceUpdateIfaces(eq(onlyCell), any(NetworkState[].class), eq(MOBILE_IFNAME), - eq(new VpnInfo[0])); + expectForceUpdateIfaces(onlyCell, MOBILE_IFNAME); reset(mStatsService); // Captive portal change shouldn't update ifaces @@ -4811,9 +4840,101 @@ public class ConnectivityServiceTest { // Roaming change should update ifaces mCellNetworkAgent.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING); waitForIdle(); - verify(mStatsService, atLeastOnce()) - .forceUpdateIfaces(eq(onlyCell), any(NetworkState[].class), eq(MOBILE_IFNAME), - eq(new VpnInfo[0])); + expectForceUpdateIfaces(onlyCell, MOBILE_IFNAME); + reset(mStatsService); + + // Test VPNs. + final LinkProperties lp = new LinkProperties(); + lp.setInterfaceName(VPN_IFNAME); + + final NetworkAgentWrapper vpnNetworkAgent = establishVpnForMyUid(lp); + final Network[] cellAndVpn = new Network[] { + mCellNetworkAgent.getNetwork(), vpnNetworkAgent.getNetwork()}; + Network[] cellAndWifi = new Network[] { + mCellNetworkAgent.getNetwork(), mWiFiNetworkAgent.getNetwork()}; + + // A VPN with default (null) underlying networks sets the underlying network's interfaces... + expectForceUpdateIfaces(cellAndVpn, MOBILE_IFNAME, Process.myUid(), VPN_IFNAME, + new String[]{MOBILE_IFNAME}); + + // ...and updates them as the default network switches. + mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); + mWiFiNetworkAgent.connect(false); + mWiFiNetworkAgent.sendLinkProperties(wifiLp); + final Network[] wifiAndVpn = new Network[] { + mWiFiNetworkAgent.getNetwork(), vpnNetworkAgent.getNetwork()}; + cellAndWifi = new Network[] { + mCellNetworkAgent.getNetwork(), mWiFiNetworkAgent.getNetwork()}; + + waitForIdle(); + assertEquals(wifiLp, mService.getActiveLinkProperties()); + expectForceUpdateIfaces(wifiAndVpn, WIFI_IFNAME, Process.myUid(), VPN_IFNAME, + new String[]{WIFI_IFNAME}); + reset(mStatsService); + + // A VPN that sets its underlying networks passes the underlying interfaces, and influences + // the default interface sent to NetworkStatsService by virtue of applying to the system + // server UID (or, in this test, to the test's UID). This is the reason for sending + // MOBILE_IFNAME even though the default network is wifi. + // TODO: fix this to pass in the actual default network interface. Whether or not the VPN + // applies to the system server UID should not have any bearing on network stats. + mService.setUnderlyingNetworksForVpn(onlyCell); + waitForIdle(); + expectForceUpdateIfaces(wifiAndVpn, MOBILE_IFNAME, Process.myUid(), VPN_IFNAME, + new String[]{MOBILE_IFNAME}); + reset(mStatsService); + + mService.setUnderlyingNetworksForVpn(cellAndWifi); + waitForIdle(); + expectForceUpdateIfaces(wifiAndVpn, MOBILE_IFNAME, Process.myUid(), VPN_IFNAME, + new String[]{MOBILE_IFNAME, WIFI_IFNAME}); + reset(mStatsService); + + // If an underlying network disconnects, that interface should no longer be underlying. + // This doesn't actually work because disconnectAndDestroyNetwork only notifies + // NetworkStatsService before the underlying network is actually removed. So the underlying + // network will only be removed if notifyIfacesChangedForNetworkStats is called again. This + // could result in incorrect data usage measurements if the interface used by the + // disconnected network is reused by a system component that does not register an agent for + // it (e.g., tethering). + mCellNetworkAgent.disconnect(); + waitForIdle(); + assertNull(mService.getLinkProperties(mCellNetworkAgent.getNetwork())); + expectForceUpdateIfaces(wifiAndVpn, MOBILE_IFNAME, Process.myUid(), VPN_IFNAME, + new String[]{MOBILE_IFNAME, WIFI_IFNAME}); + + // Confirm that we never tell NetworkStatsService that cell is no longer the underlying + // network for the VPN... + verify(mStatsService, never()).forceUpdateIfaces(any(Network[].class), + any(NetworkState[].class), any() /* anyString() doesn't match null */, + argThat(infos -> infos[0].underlyingIfaces.length == 1 + && WIFI_IFNAME.equals(infos[0].underlyingIfaces[0]))); + verifyNoMoreInteractions(mStatsService); + reset(mStatsService); + + // ... but if something else happens that causes notifyIfacesChangedForNetworkStats to be + // called again, it does. For example, connect Ethernet, but with a low score, such that it + // does not become the default network. + mEthernetNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_ETHERNET); + mEthernetNetworkAgent.adjustScore(-40); + mEthernetNetworkAgent.connect(false); + waitForIdle(); + verify(mStatsService).forceUpdateIfaces(any(Network[].class), + any(NetworkState[].class), any() /* anyString() doesn't match null */, + argThat(vpnInfos -> vpnInfos[0].underlyingIfaces.length == 1 + && WIFI_IFNAME.equals(vpnInfos[0].underlyingIfaces[0]))); + mEthernetNetworkAgent.disconnect(); + reset(mStatsService); + + // When a VPN declares no underlying networks (i.e., no connectivity), getAllVpnInfo + // does not return the VPN, so CS does not pass it to NetworkStatsService. This causes + // NetworkStatsFactory#adjustForTunAnd464Xlat not to attempt any VPN data migration, which + // is probably a performance improvement (though it's very unlikely that a VPN would declare + // no underlying networks). + // Also, for the same reason as above, the active interface passed in is null. + mService.setUnderlyingNetworksForVpn(new Network[0]); + waitForIdle(); + expectForceUpdateIfaces(wifiAndVpn, null); reset(mStatsService); } @@ -7052,6 +7173,14 @@ public class ConnectivityServiceTest { return vpnNetworkAgent; } + private TestNetworkAgentWrapper establishVpnForMyUid(LinkProperties lp) + throws Exception { + final int uid = Process.myUid(); + final ArraySet ranges = new ArraySet<>(); + ranges.add(new UidRange(uid, uid)); + return establishVpn(lp, uid, ranges); + } + private static PackageInfo buildPackageInfo(boolean hasSystemPermission, int uid) { final PackageInfo packageInfo = new PackageInfo(); if (hasSystemPermission) { From a083cb1ffed7a851f2748463a31904fc4c6b625d Mon Sep 17 00:00:00 2001 From: Lorenzo Colitti Date: Wed, 18 Nov 2020 22:50:57 +0900 Subject: [PATCH 113/288] Make MockVpn more realistic and easier to use. MockVpn is very difficult to use because it requires the test caller keeping track of both the MockVpn object and an accompanying TestNetworkAgentWrapper. It's also not very realistic: for example, connect() doesn't actually connect anything, it just makes it so that if ConnectivityService tries to update the capabilities, the attempt will not be ignored. Also, unlike the real code in Vpn, it connects with empty NetworkCapabilities (in particular, with empty UID ranges). Make this easier to use and a bit more realistic by: - Allowing TestNetworkAgentWrapper to take a "NetworkCapabilities template" that will form the initial capabilities sent when the agent registers with ConnectivityService. This allows the VPN to register its agent with its UID ranges already set, like the production code does. - Providing separate methods to register the NetworkAgent and mark it connected for cases where the test needs to make changes to the NetworkAgent before connecting (e.g., poking NetworkMonitor). - Putting the TestNetworkAgentWrapper inside MockVpn and driving it through MockVpn's methods. In order not to have too many wrapper functions (and because we can't delegate like in Kotlin), there's still an agent() method that returns the TestNetworkAgentWrapper. Bug: 172870110 Test: test-only change Change-Id: I749ff325bc13ac96f512270b86d1f67686eec378 Merged-In: I749ff325bc13ac96f512270b86d1f67686eec378 --- .../ConnectivityServiceIntegrationTest.kt | 5 +- .../android/server/NetworkAgentWrapper.java | 6 +- .../server/ConnectivityServiceTest.java | 514 ++++++++---------- 3 files changed, 227 insertions(+), 298 deletions(-) diff --git a/tests/net/integration/src/com/android/server/net/integrationtests/ConnectivityServiceIntegrationTest.kt b/tests/net/integration/src/com/android/server/net/integrationtests/ConnectivityServiceIntegrationTest.kt index c4801aab5c321..344d0c3260c9a 100644 --- a/tests/net/integration/src/com/android/server/net/integrationtests/ConnectivityServiceIntegrationTest.kt +++ b/tests/net/integration/src/com/android/server/net/integrationtests/ConnectivityServiceIntegrationTest.kt @@ -195,7 +195,8 @@ class ConnectivityServiceIntegrationTest { "https://secure.test.android.com", responseCode = 204, contentLength = 42, redirectUrl = null)) - val na = NetworkAgentWrapper(TRANSPORT_CELLULAR, LinkProperties(), context) + val na = NetworkAgentWrapper(TRANSPORT_CELLULAR, LinkProperties(), null /* ncTemplate */, + context) networkStackClient.verifyNetworkMonitorCreated(na.network, TEST_TIMEOUT_MS) na.addCapability(NET_CAPABILITY_INTERNET) @@ -204,4 +205,4 @@ class ConnectivityServiceIntegrationTest { testCallback.expectAvailableThenValidatedCallbacks(na.network, TEST_TIMEOUT_MS) assertEquals(2, nsInstrumentation.getRequestUrls().size) } -} \ No newline at end of file +} diff --git a/tests/net/integration/util/com/android/server/NetworkAgentWrapper.java b/tests/net/integration/util/com/android/server/NetworkAgentWrapper.java index 0ffafd45613a8..03954de984386 100644 --- a/tests/net/integration/util/com/android/server/NetworkAgentWrapper.java +++ b/tests/net/integration/util/com/android/server/NetworkAgentWrapper.java @@ -69,12 +69,12 @@ public class NetworkAgentWrapper implements TestableNetworkCallback.HasNetwork { private int mStopKeepaliveError = SocketKeepalive.NO_KEEPALIVE; private Integer mExpectedKeepaliveSlot = null; - public NetworkAgentWrapper(int transport, LinkProperties linkProperties, Context context) - throws Exception { + public NetworkAgentWrapper(int transport, LinkProperties linkProperties, + NetworkCapabilities ncTemplate, Context context) throws Exception { final int type = transportToLegacyType(transport); final String typeName = ConnectivityManager.getNetworkTypeName(type); mNetworkInfo = new NetworkInfo(type, 0, typeName, "Mock"); - mNetworkCapabilities = new NetworkCapabilities(); + mNetworkCapabilities = (ncTemplate != null) ? ncTemplate : new NetworkCapabilities(); mNetworkCapabilities.addCapability(NET_CAPABILITY_NOT_SUSPENDED); mNetworkCapabilities.addTransportType(transport); switch (transport) { diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index c0293c157c277..810ccbe252ca0 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -606,12 +606,17 @@ public class ConnectivityServiceTest { private String mRedirectUrl; TestNetworkAgentWrapper(int transport) throws Exception { - this(transport, new LinkProperties()); + this(transport, new LinkProperties(), null); } TestNetworkAgentWrapper(int transport, LinkProperties linkProperties) throws Exception { - super(transport, linkProperties, mServiceContext); + this(transport, linkProperties, null); + } + + private TestNetworkAgentWrapper(int transport, LinkProperties linkProperties, + NetworkCapabilities ncTemplate) throws Exception { + super(transport, linkProperties, ncTemplate, mServiceContext); // Waits for the NetworkAgent to be registered, which includes the creation of the // NetworkMonitor. @@ -1006,30 +1011,26 @@ public class ConnectivityServiceTest { } } + private Set uidRangesForUid(int uid) { + final ArraySet ranges = new ArraySet<>(); + ranges.add(new UidRange(uid, uid)); + return ranges; + } + private static Looper startHandlerThreadAndReturnLooper() { final HandlerThread handlerThread = new HandlerThread("MockVpnThread"); handlerThread.start(); return handlerThread.getLooper(); } - private class MockVpn extends Vpn { - // TODO : the interactions between this mock and the mock network agent are too - // hard to get right at this moment, because it's unclear in which case which - // target needs to get a method call or both, and in what order. It's because - // MockNetworkAgent wants to manage its own NetworkCapabilities, but the Vpn - // parent class of MockVpn agent wants that responsibility. - // That being said inside the test it should be possible to make the interactions - // harder to get wrong with precise speccing, judicious comments, helper methods - // and a few sprinkled assertions. - - private boolean mConnected = false; + private class MockVpn extends Vpn implements TestableNetworkCallback.HasNetwork { // Careful ! This is different from mNetworkAgent, because MockNetworkAgent does // not inherit from NetworkAgent. private TestNetworkAgentWrapper mMockNetworkAgent; - private int mVpnType = VpnManager.TYPE_VPN_SERVICE; + private boolean mAgentRegistered = false; + private int mVpnType = VpnManager.TYPE_VPN_SERVICE; private VpnInfo mVpnInfo; - private Network[] mUnderlyingNetworks; public MockVpn(int userId) { super(startHandlerThreadAndReturnLooper(), mServiceContext, mNetworkManagementService, @@ -1037,29 +1038,23 @@ public class ConnectivityServiceTest { mConfig = new VpnConfig(); } - public void setNetworkAgent(TestNetworkAgentWrapper agent) { - agent.waitForIdle(TIMEOUT_MS); - mMockNetworkAgent = agent; - mNetworkAgent = agent.getNetworkAgent(); - mInterface = VPN_IFNAME; - mNetworkCapabilities.set(agent.getNetworkCapabilities()); - } - public void setUids(Set uids) { mNetworkCapabilities.setUids(uids); - updateCapabilities(null /* defaultNetwork */); + updateCapabilitiesInternal(null /* defaultNetwork */, true); } public void setVpnType(int vpnType) { mVpnType = vpnType; } + @Override + public Network getNetwork() { + return (mMockNetworkAgent == null) ? null : mMockNetworkAgent.getNetwork(); + } + @Override public int getNetId() { - if (mMockNetworkAgent == null) { - return NETID_UNSET; - } - return mMockNetworkAgent.getNetwork().netId; + return (mMockNetworkAgent == null) ? NETID_UNSET : mMockNetworkAgent.getNetwork().netId; } @Override @@ -1067,39 +1062,94 @@ public class ConnectivityServiceTest { return mVpnType; } - private void connect(boolean isAlwaysMetered) { - mNetworkCapabilities.set(mMockNetworkAgent.getNetworkCapabilities()); - mConnected = true; + private void registerAgent(boolean isAlwaysMetered, Set uids, LinkProperties lp) + throws Exception { + if (mAgentRegistered) throw new IllegalStateException("already registered"); + setUids(uids); mConfig.isMetered = isAlwaysMetered; + mInterface = VPN_IFNAME; + mMockNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_VPN, lp, + mNetworkCapabilities); + mMockNetworkAgent.waitForIdle(TIMEOUT_MS); + mAgentRegistered = true; + mNetworkCapabilities.set(mMockNetworkAgent.getNetworkCapabilities()); + mNetworkAgent = mMockNetworkAgent.getNetworkAgent(); } - public void connectAsAlwaysMetered() { - connect(true /* isAlwaysMetered */); + private void registerAgent(Set uids) throws Exception { + registerAgent(false /* isAlwaysMetered */, uids, new LinkProperties()); } - public void connect() { - connect(false /* isAlwaysMetered */); + private void connect(boolean validated, boolean hasInternet, boolean isStrictMode) { + mMockNetworkAgent.connect(validated, hasInternet, isStrictMode); + } + + private void connect(boolean validated) { + mMockNetworkAgent.connect(validated); + } + + private TestNetworkAgentWrapper getAgent() { + return mMockNetworkAgent; + } + + public void establish(LinkProperties lp, int uid, Set ranges, boolean validated, + boolean hasInternet, boolean isStrictMode) throws Exception { + mNetworkCapabilities.setOwnerUid(uid); + mNetworkCapabilities.setAdministratorUids(new int[]{uid}); + registerAgent(false, ranges, lp); + connect(validated, hasInternet, isStrictMode); + waitForIdle(); + } + + public void establish(LinkProperties lp, int uid, Set ranges) throws Exception { + establish(lp, uid, ranges, true, true, false); + } + + public void establishForMyUid(LinkProperties lp) throws Exception { + final int uid = Process.myUid(); + establish(lp, uid, uidRangesForUid(uid), true, true, false); + } + + public void establishForMyUid(boolean validated, boolean hasInternet, boolean isStrictMode) + throws Exception { + final int uid = Process.myUid(); + establish(new LinkProperties(), uid, uidRangesForUid(uid), validated, hasInternet, + isStrictMode); + } + + public void establishForMyUid() throws Exception { + establishForMyUid(new LinkProperties()); + } + + public void sendLinkProperties(LinkProperties lp) { + mMockNetworkAgent.sendLinkProperties(lp); + } + + private NetworkCapabilities updateCapabilitiesInternal(Network defaultNetwork, + boolean sendToConnectivityService) { + if (!mAgentRegistered) return null; + super.updateCapabilities(defaultNetwork); + // Because super.updateCapabilities will update the capabilities of the agent but + // not the mock agent, the mock agent needs to know about them. + copyCapabilitiesToNetworkAgent(sendToConnectivityService); + return new NetworkCapabilities(mNetworkCapabilities); + } + + private void copyCapabilitiesToNetworkAgent(boolean sendToConnectivityService) { + if (null != mMockNetworkAgent) { + mMockNetworkAgent.setNetworkCapabilities(mNetworkCapabilities, + sendToConnectivityService); + } } @Override public NetworkCapabilities updateCapabilities(Network defaultNetwork) { - if (!mConnected) return null; - super.updateCapabilities(defaultNetwork); - // Because super.updateCapabilities will update the capabilities of the agent but - // not the mock agent, the mock agent needs to know about them. - copyCapabilitiesToNetworkAgent(); - return new NetworkCapabilities(mNetworkCapabilities); - } - - private void copyCapabilitiesToNetworkAgent() { - if (null != mMockNetworkAgent) { - mMockNetworkAgent.setNetworkCapabilities(mNetworkCapabilities, - false /* sendToConnectivityService */); - } + return updateCapabilitiesInternal(defaultNetwork, false); } public void disconnect() { - mConnected = false; + if (mMockNetworkAgent != null) mMockNetworkAgent.disconnect(); + mAgentRegistered = false; } @Override @@ -1305,6 +1355,9 @@ public class ConnectivityServiceTest { mEthernetNetworkAgent.disconnect(); mEthernetNetworkAgent = null; } + mMockVpn.disconnect(); + waitForIdle(); + FakeSettingsProvider.clearSettingsProvider(); mCsHandlerThread.quitSafely(); @@ -3180,20 +3233,12 @@ public class ConnectivityServiceTest { waitForIdle(); assertEquals(null, mCm.getActiveNetwork()); - final int uid = Process.myUid(); - final TestNetworkAgentWrapper - vpnNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_VPN); - final ArraySet ranges = new ArraySet<>(); - ranges.add(new UidRange(uid, uid)); - mMockVpn.setNetworkAgent(vpnNetworkAgent); - mMockVpn.setUids(ranges); - vpnNetworkAgent.connect(true); - mMockVpn.connect(); - defaultNetworkCallback.expectAvailableThenValidatedCallbacks(vpnNetworkAgent); + mMockVpn.establishForMyUid(); + defaultNetworkCallback.expectAvailableThenValidatedCallbacks(mMockVpn); assertEquals(defaultNetworkCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); - vpnNetworkAgent.disconnect(); - defaultNetworkCallback.expectCallback(CallbackEntry.LOST, vpnNetworkAgent); + mMockVpn.disconnect(); + defaultNetworkCallback.expectCallback(CallbackEntry.LOST, mMockVpn); waitForIdle(); assertEquals(null, mCm.getActiveNetwork()); } @@ -4847,9 +4892,10 @@ public class ConnectivityServiceTest { final LinkProperties lp = new LinkProperties(); lp.setInterfaceName(VPN_IFNAME); - final NetworkAgentWrapper vpnNetworkAgent = establishVpnForMyUid(lp); + mMockVpn.establishForMyUid(lp); + final Network[] cellAndVpn = new Network[] { - mCellNetworkAgent.getNetwork(), vpnNetworkAgent.getNetwork()}; + mCellNetworkAgent.getNetwork(), mMockVpn.getNetwork()}; Network[] cellAndWifi = new Network[] { mCellNetworkAgent.getNetwork(), mWiFiNetworkAgent.getNetwork()}; @@ -4862,7 +4908,7 @@ public class ConnectivityServiceTest { mWiFiNetworkAgent.connect(false); mWiFiNetworkAgent.sendLinkProperties(wifiLp); final Network[] wifiAndVpn = new Network[] { - mWiFiNetworkAgent.getNetwork(), vpnNetworkAgent.getNetwork()}; + mWiFiNetworkAgent.getNetwork(), mMockVpn.getNetwork()}; cellAndWifi = new Network[] { mCellNetworkAgent.getNetwork(), mWiFiNetworkAgent.getNetwork()}; @@ -5301,22 +5347,13 @@ public class ConnectivityServiceTest { // Note: it's sort of meaningless for a VPN app to declare a network that doesn't exist yet, // (and doing so is difficult without using reflection) but it's good to test that the code // behaves approximately correctly. - final int uid = Process.myUid(); - final TestNetworkAgentWrapper - vpnNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_VPN); - final ArraySet ranges = new ArraySet<>(); - ranges.add(new UidRange(uid, uid)); - + mMockVpn.establishForMyUid(false, true, false); final Network wifiNetwork = new Network(mNetIdManager.peekNextNetId()); - mMockVpn.setNetworkAgent(vpnNetworkAgent); - mMockVpn.setUids(ranges); mService.setUnderlyingNetworksForVpn(new Network[]{wifiNetwork}); - vpnNetworkAgent.connect(false); - mMockVpn.connect(); - callback.expectAvailableCallbacksUnvalidated(vpnNetworkAgent); - assertTrue(mCm.getNetworkCapabilities(vpnNetworkAgent.getNetwork()) + callback.expectAvailableCallbacksUnvalidated(mMockVpn); + assertTrue(mCm.getNetworkCapabilities(mMockVpn.getNetwork()) .hasTransport(TRANSPORT_VPN)); - assertFalse(mCm.getNetworkCapabilities(vpnNetworkAgent.getNetwork()) + assertFalse(mCm.getNetworkCapabilities(mMockVpn.getNetwork()) .hasTransport(TRANSPORT_WIFI)); // Make that underlying network connect, and expect to see its capabilities immediately @@ -5333,20 +5370,20 @@ public class ConnectivityServiceTest { // 2. When a network connects, updateNetworkInfo propagates underlying network capabilities // before rematching networks. // Given that this scenario can't really happen, this is probably fine for now. - callback.expectCallback(CallbackEntry.NETWORK_CAPS_UPDATED, vpnNetworkAgent); + callback.expectCallback(CallbackEntry.NETWORK_CAPS_UPDATED, mMockVpn); callback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); - assertTrue(mCm.getNetworkCapabilities(vpnNetworkAgent.getNetwork()) + assertTrue(mCm.getNetworkCapabilities(mMockVpn.getNetwork()) .hasTransport(TRANSPORT_VPN)); - assertTrue(mCm.getNetworkCapabilities(vpnNetworkAgent.getNetwork()) + assertTrue(mCm.getNetworkCapabilities(mMockVpn.getNetwork()) .hasTransport(TRANSPORT_WIFI)); // Disconnect the network, and expect to see the VPN capabilities change accordingly. mWiFiNetworkAgent.disconnect(); callback.expectCallback(CallbackEntry.LOST, mWiFiNetworkAgent); - callback.expectCapabilitiesThat(vpnNetworkAgent, (nc) -> + callback.expectCapabilitiesThat(mMockVpn, (nc) -> nc.getTransportTypes().length == 1 && nc.hasTransport(TRANSPORT_VPN)); - vpnNetworkAgent.disconnect(); + mMockVpn.disconnect(); mCm.unregisterNetworkCallback(callback); } @@ -5384,42 +5421,38 @@ public class ConnectivityServiceTest { vpnNetworkCallback.assertNoCallback(); assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); - final TestNetworkAgentWrapper - vpnNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_VPN); - final ArraySet ranges = new ArraySet<>(); - ranges.add(new UidRange(uid, uid)); - mMockVpn.setNetworkAgent(vpnNetworkAgent); - mMockVpn.setUids(ranges); + final Set ranges = uidRangesForUid(uid); + mMockVpn.registerAgent(ranges); + // VPN networks do not satisfy the default request and are automatically validated // by NetworkMonitor assertFalse(NetworkMonitorUtils.isValidationRequired( - vpnNetworkAgent.getNetworkCapabilities())); - vpnNetworkAgent.setNetworkValid(false /* isStrictMode */); + mMockVpn.getAgent().getNetworkCapabilities())); + mMockVpn.getAgent().setNetworkValid(false /* isStrictMode */); - vpnNetworkAgent.connect(false); - mMockVpn.connect(); + mMockVpn.connect(false); mService.setUnderlyingNetworksForVpn(new Network[0]); - genericNetworkCallback.expectAvailableCallbacksUnvalidated(vpnNetworkAgent); + genericNetworkCallback.expectAvailableCallbacksUnvalidated(mMockVpn); genericNotVpnNetworkCallback.assertNoCallback(); wifiNetworkCallback.assertNoCallback(); - vpnNetworkCallback.expectAvailableCallbacksUnvalidated(vpnNetworkAgent); - defaultCallback.expectAvailableCallbacksUnvalidated(vpnNetworkAgent); + vpnNetworkCallback.expectAvailableCallbacksUnvalidated(mMockVpn); + defaultCallback.expectAvailableCallbacksUnvalidated(mMockVpn); assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); - genericNetworkCallback.expectCallback(CallbackEntry.NETWORK_CAPS_UPDATED, vpnNetworkAgent); + genericNetworkCallback.expectCallback(CallbackEntry.NETWORK_CAPS_UPDATED, mMockVpn); genericNotVpnNetworkCallback.assertNoCallback(); - vpnNetworkCallback.expectCapabilitiesThat(vpnNetworkAgent, nc -> null == nc.getUids()); - defaultCallback.expectCallback(CallbackEntry.NETWORK_CAPS_UPDATED, vpnNetworkAgent); + vpnNetworkCallback.expectCapabilitiesThat(mMockVpn, nc -> null == nc.getUids()); + defaultCallback.expectCallback(CallbackEntry.NETWORK_CAPS_UPDATED, mMockVpn); assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); ranges.clear(); - vpnNetworkAgent.setUids(ranges); + mMockVpn.setUids(ranges); - genericNetworkCallback.expectCallback(CallbackEntry.LOST, vpnNetworkAgent); + genericNetworkCallback.expectCallback(CallbackEntry.LOST, mMockVpn); genericNotVpnNetworkCallback.assertNoCallback(); wifiNetworkCallback.assertNoCallback(); - vpnNetworkCallback.expectCallback(CallbackEntry.LOST, vpnNetworkAgent); + vpnNetworkCallback.expectCallback(CallbackEntry.LOST, mMockVpn); // TODO : The default network callback should actually get a LOST call here (also see the // comment below for AVAILABLE). This is because ConnectivityService does not look at UID @@ -5427,19 +5460,18 @@ public class ConnectivityServiceTest { // can't currently update their UIDs without disconnecting, so this does not matter too // much, but that is the reason the test here has to check for an update to the // capabilities instead of the expected LOST then AVAILABLE. - defaultCallback.expectCallback(CallbackEntry.NETWORK_CAPS_UPDATED, vpnNetworkAgent); + defaultCallback.expectCallback(CallbackEntry.NETWORK_CAPS_UPDATED, mMockVpn); ranges.add(new UidRange(uid, uid)); mMockVpn.setUids(ranges); - vpnNetworkAgent.setUids(ranges); - genericNetworkCallback.expectAvailableCallbacksValidated(vpnNetworkAgent); + genericNetworkCallback.expectAvailableCallbacksValidated(mMockVpn); genericNotVpnNetworkCallback.assertNoCallback(); wifiNetworkCallback.assertNoCallback(); - vpnNetworkCallback.expectAvailableCallbacksValidated(vpnNetworkAgent); + vpnNetworkCallback.expectAvailableCallbacksValidated(mMockVpn); // TODO : Here like above, AVAILABLE would be correct, but because this can't actually // happen outside of the test, ConnectivityService does not rematch callbacks. - defaultCallback.expectCallback(CallbackEntry.NETWORK_CAPS_UPDATED, vpnNetworkAgent); + defaultCallback.expectCallback(CallbackEntry.NETWORK_CAPS_UPDATED, mMockVpn); mWiFiNetworkAgent.disconnect(); @@ -5449,13 +5481,13 @@ public class ConnectivityServiceTest { vpnNetworkCallback.assertNoCallback(); defaultCallback.assertNoCallback(); - vpnNetworkAgent.disconnect(); + mMockVpn.disconnect(); - genericNetworkCallback.expectCallback(CallbackEntry.LOST, vpnNetworkAgent); + genericNetworkCallback.expectCallback(CallbackEntry.LOST, mMockVpn); genericNotVpnNetworkCallback.assertNoCallback(); wifiNetworkCallback.assertNoCallback(); - vpnNetworkCallback.expectCallback(CallbackEntry.LOST, vpnNetworkAgent); - defaultCallback.expectCallback(CallbackEntry.LOST, vpnNetworkAgent); + vpnNetworkCallback.expectCallback(CallbackEntry.LOST, mMockVpn); + defaultCallback.expectCallback(CallbackEntry.LOST, mMockVpn); assertEquals(null, mCm.getActiveNetwork()); mCm.unregisterNetworkCallback(genericNetworkCallback); @@ -5477,20 +5509,13 @@ public class ConnectivityServiceTest { defaultCallback.expectAvailableThenValidatedCallbacks(mWiFiNetworkAgent); assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); - TestNetworkAgentWrapper - vpnNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_VPN); - final ArraySet ranges = new ArraySet<>(); - ranges.add(new UidRange(uid, uid)); - mMockVpn.setNetworkAgent(vpnNetworkAgent); - mMockVpn.setUids(ranges); - vpnNetworkAgent.connect(true /* validated */, false /* hasInternet */, + mMockVpn.establishForMyUid(true /* validated */, false /* hasInternet */, false /* isStrictMode */); - mMockVpn.connect(); defaultCallback.assertNoCallback(); assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); - vpnNetworkAgent.disconnect(); + mMockVpn.disconnect(); defaultCallback.assertNoCallback(); mCm.unregisterNetworkCallback(defaultCallback); @@ -5509,21 +5534,14 @@ public class ConnectivityServiceTest { defaultCallback.expectAvailableThenValidatedCallbacks(mWiFiNetworkAgent); assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); - TestNetworkAgentWrapper - vpnNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_VPN); - final ArraySet ranges = new ArraySet<>(); - ranges.add(new UidRange(uid, uid)); - mMockVpn.setNetworkAgent(vpnNetworkAgent); - mMockVpn.setUids(ranges); - vpnNetworkAgent.connect(true /* validated */, true /* hasInternet */, + mMockVpn.establishForMyUid(true /* validated */, true /* hasInternet */, false /* isStrictMode */); - mMockVpn.connect(); - defaultCallback.expectAvailableThenValidatedCallbacks(vpnNetworkAgent); + defaultCallback.expectAvailableThenValidatedCallbacks(mMockVpn); assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); - vpnNetworkAgent.disconnect(); - defaultCallback.expectCallback(CallbackEntry.LOST, vpnNetworkAgent); + mMockVpn.disconnect(); + defaultCallback.expectCallback(CallbackEntry.LOST, mMockVpn); defaultCallback.expectAvailableCallbacksValidated(mWiFiNetworkAgent); mCm.unregisterNetworkCallback(defaultCallback); @@ -5541,44 +5559,36 @@ public class ConnectivityServiceTest { callback.assertNoCallback(); // Bring up a VPN that has the INTERNET capability, initially unvalidated. - final int uid = Process.myUid(); - final TestNetworkAgentWrapper - vpnNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_VPN); - final ArraySet ranges = new ArraySet<>(); - ranges.add(new UidRange(uid, uid)); - mMockVpn.setNetworkAgent(vpnNetworkAgent); - mMockVpn.setUids(ranges); - vpnNetworkAgent.connect(false /* validated */, true /* hasInternet */, + mMockVpn.establishForMyUid(false /* validated */, true /* hasInternet */, false /* isStrictMode */); - mMockVpn.connect(); // Even though the VPN is unvalidated, it becomes the default network for our app. - callback.expectAvailableCallbacksUnvalidated(vpnNetworkAgent); + callback.expectAvailableCallbacksUnvalidated(mMockVpn); callback.assertNoCallback(); - assertTrue(vpnNetworkAgent.getScore() > mEthernetNetworkAgent.getScore()); - assertEquals(ConnectivityConstants.VPN_DEFAULT_SCORE, vpnNetworkAgent.getScore()); - assertEquals(vpnNetworkAgent.getNetwork(), mCm.getActiveNetwork()); + assertTrue(mMockVpn.getAgent().getScore() > mEthernetNetworkAgent.getScore()); + assertEquals(ConnectivityConstants.VPN_DEFAULT_SCORE, mMockVpn.getAgent().getScore()); + assertEquals(mMockVpn.getNetwork(), mCm.getActiveNetwork()); - NetworkCapabilities nc = mCm.getNetworkCapabilities(vpnNetworkAgent.getNetwork()); + NetworkCapabilities nc = mCm.getNetworkCapabilities(mMockVpn.getNetwork()); assertFalse(nc.hasCapability(NET_CAPABILITY_VALIDATED)); assertTrue(nc.hasCapability(NET_CAPABILITY_INTERNET)); assertFalse(NetworkMonitorUtils.isValidationRequired( - vpnNetworkAgent.getNetworkCapabilities())); + mMockVpn.getAgent().getNetworkCapabilities())); assertTrue(NetworkMonitorUtils.isPrivateDnsValidationRequired( - vpnNetworkAgent.getNetworkCapabilities())); + mMockVpn.getAgent().getNetworkCapabilities())); // Pretend that the VPN network validates. - vpnNetworkAgent.setNetworkValid(false /* isStrictMode */); - vpnNetworkAgent.mNetworkMonitor.forceReevaluation(Process.myUid()); + mMockVpn.getAgent().setNetworkValid(false /* isStrictMode */); + mMockVpn.getAgent().mNetworkMonitor.forceReevaluation(Process.myUid()); // Expect to see the validated capability, but no other changes, because the VPN is already // the default network for the app. - callback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, vpnNetworkAgent); + callback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mMockVpn); callback.assertNoCallback(); - vpnNetworkAgent.disconnect(); - callback.expectCallback(CallbackEntry.LOST, vpnNetworkAgent); + mMockVpn.disconnect(); + callback.expectCallback(CallbackEntry.LOST, mMockVpn); callback.expectAvailableCallbacksValidated(mEthernetNetworkAgent); } @@ -5600,21 +5610,15 @@ public class ConnectivityServiceTest { mCellNetworkAgent.addCapability(NET_CAPABILITY_NOT_SUSPENDED); mCellNetworkAgent.connect(true); - final TestNetworkAgentWrapper vpnNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_VPN); - final ArraySet ranges = new ArraySet<>(); - ranges.add(new UidRange(uid, uid)); - mMockVpn.setNetworkAgent(vpnNetworkAgent); - mMockVpn.connect(); - mMockVpn.setUids(ranges); - vpnNetworkAgent.connect(true /* validated */, false /* hasInternet */, + mMockVpn.establishForMyUid(true /* validated */, false /* hasInternet */, false /* isStrictMode */); - vpnNetworkCallback.expectAvailableCallbacks(vpnNetworkAgent.getNetwork(), + vpnNetworkCallback.expectAvailableCallbacks(mMockVpn.getNetwork(), false /* suspended */, false /* validated */, false /* blocked */, TIMEOUT_MS); - vpnNetworkCallback.expectCapabilitiesThat(vpnNetworkAgent.getNetwork(), TIMEOUT_MS, + vpnNetworkCallback.expectCapabilitiesThat(mMockVpn.getNetwork(), TIMEOUT_MS, nc -> nc.hasCapability(NET_CAPABILITY_VALIDATED)); - final NetworkCapabilities nc = mCm.getNetworkCapabilities(vpnNetworkAgent.getNetwork()); + final NetworkCapabilities nc = mCm.getNetworkCapabilities(mMockVpn.getNetwork()); assertTrue(nc.hasTransport(TRANSPORT_VPN)); assertTrue(nc.hasTransport(TRANSPORT_CELLULAR)); assertFalse(nc.hasTransport(TRANSPORT_WIFI)); @@ -5636,18 +5640,11 @@ public class ConnectivityServiceTest { mCm.registerNetworkCallback(vpnNetworkRequest, vpnNetworkCallback); vpnNetworkCallback.assertNoCallback(); - final TestNetworkAgentWrapper - vpnNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_VPN); - final ArraySet ranges = new ArraySet<>(); - ranges.add(new UidRange(uid, uid)); - mMockVpn.setNetworkAgent(vpnNetworkAgent); - mMockVpn.connect(); - mMockVpn.setUids(ranges); - vpnNetworkAgent.connect(true /* validated */, false /* hasInternet */, + mMockVpn.establishForMyUid(true /* validated */, false /* hasInternet */, false /* isStrictMode */); - vpnNetworkCallback.expectAvailableThenValidatedCallbacks(vpnNetworkAgent); - nc = mCm.getNetworkCapabilities(vpnNetworkAgent.getNetwork()); + vpnNetworkCallback.expectAvailableThenValidatedCallbacks(mMockVpn); + nc = mCm.getNetworkCapabilities(mMockVpn.getNetwork()); assertTrue(nc.hasTransport(TRANSPORT_VPN)); assertFalse(nc.hasTransport(TRANSPORT_CELLULAR)); assertFalse(nc.hasTransport(TRANSPORT_WIFI)); @@ -5664,7 +5661,7 @@ public class ConnectivityServiceTest { mService.setUnderlyingNetworksForVpn( new Network[] { mCellNetworkAgent.getNetwork() }); - vpnNetworkCallback.expectCapabilitiesThat(vpnNetworkAgent, + vpnNetworkCallback.expectCapabilitiesThat(mMockVpn, (caps) -> caps.hasTransport(TRANSPORT_VPN) && caps.hasTransport(TRANSPORT_CELLULAR) && !caps.hasTransport(TRANSPORT_WIFI) && !caps.hasCapability(NET_CAPABILITY_NOT_METERED) @@ -5678,7 +5675,7 @@ public class ConnectivityServiceTest { mService.setUnderlyingNetworksForVpn( new Network[] { mCellNetworkAgent.getNetwork(), mWiFiNetworkAgent.getNetwork() }); - vpnNetworkCallback.expectCapabilitiesThat(vpnNetworkAgent, + vpnNetworkCallback.expectCapabilitiesThat(mMockVpn, (caps) -> caps.hasTransport(TRANSPORT_VPN) && caps.hasTransport(TRANSPORT_CELLULAR) && caps.hasTransport(TRANSPORT_WIFI) && !caps.hasCapability(NET_CAPABILITY_NOT_METERED) @@ -5688,7 +5685,7 @@ public class ConnectivityServiceTest { mService.setUnderlyingNetworksForVpn( new Network[] { mCellNetworkAgent.getNetwork() }); - vpnNetworkCallback.expectCapabilitiesThat(vpnNetworkAgent, + vpnNetworkCallback.expectCapabilitiesThat(mMockVpn, (caps) -> caps.hasTransport(TRANSPORT_VPN) && caps.hasTransport(TRANSPORT_CELLULAR) && !caps.hasTransport(TRANSPORT_WIFI) && !caps.hasCapability(NET_CAPABILITY_NOT_METERED) @@ -5696,27 +5693,27 @@ public class ConnectivityServiceTest { // Remove NOT_SUSPENDED from the only network and observe VPN is now suspended. mCellNetworkAgent.removeCapability(NET_CAPABILITY_NOT_SUSPENDED); - vpnNetworkCallback.expectCapabilitiesThat(vpnNetworkAgent, + vpnNetworkCallback.expectCapabilitiesThat(mMockVpn, (caps) -> caps.hasTransport(TRANSPORT_VPN) && caps.hasTransport(TRANSPORT_CELLULAR) && !caps.hasTransport(TRANSPORT_WIFI) && !caps.hasCapability(NET_CAPABILITY_NOT_METERED) && !caps.hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); - vpnNetworkCallback.expectCallback(CallbackEntry.SUSPENDED, vpnNetworkAgent); + vpnNetworkCallback.expectCallback(CallbackEntry.SUSPENDED, mMockVpn); // Add NOT_SUSPENDED again and observe VPN is no longer suspended. mCellNetworkAgent.addCapability(NET_CAPABILITY_NOT_SUSPENDED); - vpnNetworkCallback.expectCapabilitiesThat(vpnNetworkAgent, + vpnNetworkCallback.expectCapabilitiesThat(mMockVpn, (caps) -> caps.hasTransport(TRANSPORT_VPN) && caps.hasTransport(TRANSPORT_CELLULAR) && !caps.hasTransport(TRANSPORT_WIFI) && !caps.hasCapability(NET_CAPABILITY_NOT_METERED) && caps.hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); - vpnNetworkCallback.expectCallback(CallbackEntry.RESUMED, vpnNetworkAgent); + vpnNetworkCallback.expectCallback(CallbackEntry.RESUMED, mMockVpn); // Use Wifi but not cell. Note the VPN is now unmetered and not suspended. mService.setUnderlyingNetworksForVpn( new Network[] { mWiFiNetworkAgent.getNetwork() }); - vpnNetworkCallback.expectCapabilitiesThat(vpnNetworkAgent, + vpnNetworkCallback.expectCapabilitiesThat(mMockVpn, (caps) -> caps.hasTransport(TRANSPORT_VPN) && !caps.hasTransport(TRANSPORT_CELLULAR) && caps.hasTransport(TRANSPORT_WIFI) && caps.hasCapability(NET_CAPABILITY_NOT_METERED) @@ -5726,7 +5723,7 @@ public class ConnectivityServiceTest { mService.setUnderlyingNetworksForVpn( new Network[] { mCellNetworkAgent.getNetwork(), mWiFiNetworkAgent.getNetwork() }); - vpnNetworkCallback.expectCapabilitiesThat(vpnNetworkAgent, + vpnNetworkCallback.expectCapabilitiesThat(mMockVpn, (caps) -> caps.hasTransport(TRANSPORT_VPN) && caps.hasTransport(TRANSPORT_CELLULAR) && caps.hasTransport(TRANSPORT_WIFI) && !caps.hasCapability(NET_CAPABILITY_NOT_METERED) @@ -5739,7 +5736,7 @@ public class ConnectivityServiceTest { // Stop using WiFi. The VPN is suspended again. mService.setUnderlyingNetworksForVpn( new Network[] { mCellNetworkAgent.getNetwork() }); - vpnNetworkCallback.expectCapabilitiesThat(vpnNetworkAgent, + vpnNetworkCallback.expectCapabilitiesThat(mMockVpn, (caps) -> caps.hasTransport(TRANSPORT_VPN) && caps.hasTransport(TRANSPORT_CELLULAR) && !caps.hasCapability(NET_CAPABILITY_NOT_METERED) @@ -5753,7 +5750,7 @@ public class ConnectivityServiceTest { mService.setUnderlyingNetworksForVpn( new Network[] { mCellNetworkAgent.getNetwork(), mWiFiNetworkAgent.getNetwork() }); - vpnNetworkCallback.expectCapabilitiesThat(vpnNetworkAgent, + vpnNetworkCallback.expectCapabilitiesThat(mMockVpn, (caps) -> caps.hasTransport(TRANSPORT_VPN) && caps.hasTransport(TRANSPORT_CELLULAR) && caps.hasTransport(TRANSPORT_WIFI) && !caps.hasCapability(NET_CAPABILITY_NOT_METERED) @@ -5764,14 +5761,14 @@ public class ConnectivityServiceTest { // Disconnect cell. Receive update without even removing the dead network from the // underlying networks – it's dead anyway. Not metered any more. mCellNetworkAgent.disconnect(); - vpnNetworkCallback.expectCapabilitiesThat(vpnNetworkAgent, + vpnNetworkCallback.expectCapabilitiesThat(mMockVpn, (caps) -> caps.hasTransport(TRANSPORT_VPN) && !caps.hasTransport(TRANSPORT_CELLULAR) && caps.hasTransport(TRANSPORT_WIFI) && caps.hasCapability(NET_CAPABILITY_NOT_METERED)); // Disconnect wifi too. No underlying networks means this is now metered. mWiFiNetworkAgent.disconnect(); - vpnNetworkCallback.expectCapabilitiesThat(vpnNetworkAgent, + vpnNetworkCallback.expectCapabilitiesThat(mMockVpn, (caps) -> caps.hasTransport(TRANSPORT_VPN) && !caps.hasTransport(TRANSPORT_CELLULAR) && !caps.hasTransport(TRANSPORT_WIFI) && !caps.hasCapability(NET_CAPABILITY_NOT_METERED)); @@ -5792,18 +5789,11 @@ public class ConnectivityServiceTest { mCm.registerNetworkCallback(vpnNetworkRequest, vpnNetworkCallback); vpnNetworkCallback.assertNoCallback(); - final TestNetworkAgentWrapper - vpnNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_VPN); - final ArraySet ranges = new ArraySet<>(); - ranges.add(new UidRange(uid, uid)); - mMockVpn.setNetworkAgent(vpnNetworkAgent); - mMockVpn.connect(); - mMockVpn.setUids(ranges); - vpnNetworkAgent.connect(true /* validated */, false /* hasInternet */, + mMockVpn.establishForMyUid(true /* validated */, false /* hasInternet */, false /* isStrictMode */); - vpnNetworkCallback.expectAvailableThenValidatedCallbacks(vpnNetworkAgent); - nc = mCm.getNetworkCapabilities(vpnNetworkAgent.getNetwork()); + vpnNetworkCallback.expectAvailableThenValidatedCallbacks(mMockVpn); + nc = mCm.getNetworkCapabilities(mMockVpn.getNetwork()); assertTrue(nc.hasTransport(TRANSPORT_VPN)); assertFalse(nc.hasTransport(TRANSPORT_CELLULAR)); assertFalse(nc.hasTransport(TRANSPORT_WIFI)); @@ -5815,7 +5805,7 @@ public class ConnectivityServiceTest { mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR); mCellNetworkAgent.connect(true); - vpnNetworkCallback.expectCapabilitiesThat(vpnNetworkAgent, + vpnNetworkCallback.expectCapabilitiesThat(mMockVpn, (caps) -> caps.hasTransport(TRANSPORT_VPN) && caps.hasTransport(TRANSPORT_CELLULAR) && !caps.hasTransport(TRANSPORT_WIFI) && !caps.hasCapability(NET_CAPABILITY_NOT_METERED)); @@ -5825,7 +5815,7 @@ public class ConnectivityServiceTest { mWiFiNetworkAgent.addCapability(NET_CAPABILITY_NOT_METERED); mWiFiNetworkAgent.connect(true); - vpnNetworkCallback.expectCapabilitiesThat(vpnNetworkAgent, + vpnNetworkCallback.expectCapabilitiesThat(mMockVpn, (caps) -> caps.hasTransport(TRANSPORT_VPN) && !caps.hasTransport(TRANSPORT_CELLULAR) && caps.hasTransport(TRANSPORT_WIFI) && caps.hasCapability(NET_CAPABILITY_NOT_METERED)); @@ -5837,7 +5827,7 @@ public class ConnectivityServiceTest { // Disconnect wifi too. Now we have no default network. mWiFiNetworkAgent.disconnect(); - vpnNetworkCallback.expectCapabilitiesThat(vpnNetworkAgent, + vpnNetworkCallback.expectCapabilitiesThat(mMockVpn, (caps) -> caps.hasTransport(TRANSPORT_VPN) && !caps.hasTransport(TRANSPORT_CELLULAR) && !caps.hasTransport(TRANSPORT_WIFI) && !caps.hasCapability(NET_CAPABILITY_NOT_METERED)); @@ -5880,18 +5870,10 @@ public class ConnectivityServiceTest { assertTrue(mCm.isActiveNetworkMetered()); // Connect VPN network. By default it is using current default network (Cell). - TestNetworkAgentWrapper - vpnNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_VPN); - final ArraySet ranges = new ArraySet<>(); - final int uid = Process.myUid(); - ranges.add(new UidRange(uid, uid)); - mMockVpn.setNetworkAgent(vpnNetworkAgent); - mMockVpn.setUids(ranges); - vpnNetworkAgent.connect(true); - mMockVpn.connect(); - waitForIdle(); + mMockVpn.establishForMyUid(); + // Ensure VPN is now the active network. - assertEquals(vpnNetworkAgent.getNetwork(), mCm.getActiveNetwork()); + assertEquals(mMockVpn.getNetwork(), mCm.getActiveNetwork()); // Expect VPN to be metered. assertTrue(mCm.isActiveNetworkMetered()); @@ -5902,7 +5884,7 @@ public class ConnectivityServiceTest { mWiFiNetworkAgent.connect(true); waitForIdle(); // VPN should still be the active network. - assertEquals(vpnNetworkAgent.getNetwork(), mCm.getActiveNetwork()); + assertEquals(mMockVpn.getNetwork(), mCm.getActiveNetwork()); // Expect VPN to be unmetered as it should now be using WiFi (new default). assertFalse(mCm.isActiveNetworkMetered()); @@ -5920,7 +5902,6 @@ public class ConnectivityServiceTest { // VPN without any underlying networks is treated as metered. assertTrue(mCm.isActiveNetworkMetered()); - vpnNetworkAgent.disconnect(); mMockVpn.disconnect(); } @@ -5941,18 +5922,10 @@ public class ConnectivityServiceTest { assertFalse(mCm.isActiveNetworkMetered()); // Connect VPN network. - TestNetworkAgentWrapper - vpnNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_VPN); - final ArraySet ranges = new ArraySet<>(); - final int uid = Process.myUid(); - ranges.add(new UidRange(uid, uid)); - mMockVpn.setNetworkAgent(vpnNetworkAgent); - mMockVpn.setUids(ranges); - vpnNetworkAgent.connect(true); - mMockVpn.connect(); - waitForIdle(); + mMockVpn.establishForMyUid(); + // Ensure VPN is now the active network. - assertEquals(vpnNetworkAgent.getNetwork(), mCm.getActiveNetwork()); + assertEquals(mMockVpn.getNetwork(), mCm.getActiveNetwork()); // VPN is using Cell mService.setUnderlyingNetworksForVpn( new Network[] { mCellNetworkAgent.getNetwork() }); @@ -5992,7 +5965,6 @@ public class ConnectivityServiceTest { // VPN without underlying networks is treated as metered. assertTrue(mCm.isActiveNetworkMetered()); - vpnNetworkAgent.disconnect(); mMockVpn.disconnect(); } @@ -6007,17 +5979,11 @@ public class ConnectivityServiceTest { assertFalse(mCm.isActiveNetworkMetered()); // Connect VPN network. - TestNetworkAgentWrapper - vpnNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_VPN); - final ArraySet ranges = new ArraySet<>(); - final int uid = Process.myUid(); - ranges.add(new UidRange(uid, uid)); - mMockVpn.setNetworkAgent(vpnNetworkAgent); - mMockVpn.setUids(ranges); - vpnNetworkAgent.connect(true); - mMockVpn.connectAsAlwaysMetered(); + mMockVpn.registerAgent(true /* isAlwaysMetered */, uidRangesForUid(Process.myUid()), + new LinkProperties()); + mMockVpn.connect(true); waitForIdle(); - assertEquals(vpnNetworkAgent.getNetwork(), mCm.getActiveNetwork()); + assertEquals(mMockVpn.getNetwork(), mCm.getActiveNetwork()); // VPN is tracking current platform default (WiFi). mService.setUnderlyingNetworksForVpn(null); @@ -6041,7 +6007,7 @@ public class ConnectivityServiceTest { assertTrue(mCm.isActiveNetworkMetered()); - vpnNetworkAgent.disconnect(); + mMockVpn.disconnect(); } @Test @@ -6766,34 +6732,21 @@ public class ConnectivityServiceTest { waitForIdle(); assertNull(mService.getProxyForNetwork(null)); - // Set up a VPN network with a proxy - final int uid = Process.myUid(); - final TestNetworkAgentWrapper - vpnNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_VPN); - final ArraySet ranges = new ArraySet<>(); - ranges.add(new UidRange(uid, uid)); - mMockVpn.setUids(ranges); + // Connect a VPN network with a proxy. LinkProperties testLinkProperties = new LinkProperties(); testLinkProperties.setHttpProxy(testProxyInfo); - vpnNetworkAgent.sendLinkProperties(testLinkProperties); - waitForIdle(); - - // Connect to VPN with proxy - mMockVpn.setNetworkAgent(vpnNetworkAgent); - vpnNetworkAgent.connect(true); - mMockVpn.connect(); - waitForIdle(); + mMockVpn.establishForMyUid(testLinkProperties); // Test that the VPN network returns a proxy, and the WiFi does not. - assertEquals(testProxyInfo, mService.getProxyForNetwork(vpnNetworkAgent.getNetwork())); + assertEquals(testProxyInfo, mService.getProxyForNetwork(mMockVpn.getNetwork())); assertEquals(testProxyInfo, mService.getProxyForNetwork(null)); assertNull(mService.getProxyForNetwork(mWiFiNetworkAgent.getNetwork())); // Test that the VPN network returns no proxy when it is set to null. testLinkProperties.setHttpProxy(null); - vpnNetworkAgent.sendLinkProperties(testLinkProperties); + mMockVpn.sendLinkProperties(testLinkProperties); waitForIdle(); - assertNull(mService.getProxyForNetwork(vpnNetworkAgent.getNetwork())); + assertNull(mService.getProxyForNetwork(mMockVpn.getNetwork())); assertNull(mService.getProxyForNetwork(null)); // Set WiFi proxy and check that the vpn proxy is still null. @@ -6804,7 +6757,7 @@ public class ConnectivityServiceTest { // Disconnect from VPN and check that the active network, which is now the WiFi, has the // correct proxy setting. - vpnNetworkAgent.disconnect(); + mMockVpn.disconnect(); waitForIdle(); assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); assertEquals(testProxyInfo, mService.getProxyForNetwork(mWiFiNetworkAgent.getNetwork())); @@ -6819,7 +6772,7 @@ public class ConnectivityServiceTest { lp.addRoute(new RouteInfo(new IpPrefix(Inet6Address.ANY, 0), RTN_UNREACHABLE)); // The uid range needs to cover the test app so the network is visible to it. final Set vpnRange = Collections.singleton(UidRange.createForUser(VPN_USER)); - final TestNetworkAgentWrapper vpnNetworkAgent = establishVpn(lp, VPN_UID, vpnRange); + mMockVpn.establish(lp, VPN_UID, vpnRange); // Connected VPN should have interface rules set up. There are two expected invocations, // one during VPN uid update, one during VPN LinkProperties update @@ -6829,7 +6782,7 @@ public class ConnectivityServiceTest { assertContainsExactly(uidCaptor.getAllValues().get(1), APP1_UID, APP2_UID); assertTrue(mService.mPermissionMonitor.getVpnUidRanges("tun0").equals(vpnRange)); - vpnNetworkAgent.disconnect(); + mMockVpn.disconnect(); waitForIdle(); // Disconnected VPN should have interface rules removed @@ -6846,8 +6799,7 @@ public class ConnectivityServiceTest { lp.addRoute(new RouteInfo(new IpPrefix(Inet4Address.ANY, 0), null)); // The uid range needs to cover the test app so the network is visible to it. final Set vpnRange = Collections.singleton(UidRange.createForUser(VPN_USER)); - final TestNetworkAgentWrapper vpnNetworkAgent = establishVpn( - lp, Process.SYSTEM_UID, vpnRange); + mMockVpn.establish(lp, Process.SYSTEM_UID, vpnRange); // Legacy VPN should not have interface rules set up verify(mMockNetd, never()).firewallAddUidInterfaceRules(any(), any()); @@ -6862,8 +6814,7 @@ public class ConnectivityServiceTest { lp.addRoute(new RouteInfo(new IpPrefix(Inet6Address.ANY, 0), RTN_UNREACHABLE)); // The uid range needs to cover the test app so the network is visible to it. final Set vpnRange = Collections.singleton(UidRange.createForUser(VPN_USER)); - final TestNetworkAgentWrapper vpnNetworkAgent = establishVpn( - lp, Process.SYSTEM_UID, vpnRange); + mMockVpn.establish(lp, Process.SYSTEM_UID, vpnRange); // IPv6 unreachable route should not be misinterpreted as a default route verify(mMockNetd, never()).firewallAddUidInterfaceRules(any(), any()); @@ -6877,7 +6828,7 @@ public class ConnectivityServiceTest { lp.addRoute(new RouteInfo(new IpPrefix(Inet6Address.ANY, 0), null)); // The uid range needs to cover the test app so the network is visible to it. final Set vpnRange = Collections.singleton(UidRange.createForUser(VPN_USER)); - final TestNetworkAgentWrapper vpnNetworkAgent = establishVpn(lp, VPN_UID, vpnRange); + mMockVpn.establish(lp, VPN_UID, vpnRange); // Connected VPN should have interface rules set up. There are two expected invocations, // one during VPN uid update, one during VPN LinkProperties update @@ -6889,7 +6840,7 @@ public class ConnectivityServiceTest { reset(mMockNetd); InOrder inOrder = inOrder(mMockNetd); lp.setInterfaceName("tun1"); - vpnNetworkAgent.sendLinkProperties(lp); + mMockVpn.sendLinkProperties(lp); waitForIdle(); // VPN handover (switch to a new interface) should result in rules being updated (old rules // removed first, then new rules added) @@ -6902,7 +6853,7 @@ public class ConnectivityServiceTest { lp = new LinkProperties(); lp.setInterfaceName("tun1"); lp.addRoute(new RouteInfo(new IpPrefix("192.0.2.0/24"), null, "tun1")); - vpnNetworkAgent.sendLinkProperties(lp); + mMockVpn.sendLinkProperties(lp); waitForIdle(); // VPN not routing everything should no longer have interface filtering rules verify(mMockNetd).firewallRemoveUidInterfaceRules(uidCaptor.capture()); @@ -6913,7 +6864,7 @@ public class ConnectivityServiceTest { lp.setInterfaceName("tun1"); lp.addRoute(new RouteInfo(new IpPrefix(Inet4Address.ANY, 0), RTN_UNREACHABLE)); lp.addRoute(new RouteInfo(new IpPrefix(Inet6Address.ANY, 0), null)); - vpnNetworkAgent.sendLinkProperties(lp); + mMockVpn.sendLinkProperties(lp); waitForIdle(); // Back to routing all IPv6 traffic should have filtering rules verify(mMockNetd).firewallAddUidInterfaceRules(eq("tun1"), uidCaptor.capture()); @@ -6928,8 +6879,7 @@ public class ConnectivityServiceTest { lp.addRoute(new RouteInfo(new IpPrefix(Inet6Address.ANY, 0), null)); // The uid range needs to cover the test app so the network is visible to it. final UidRange vpnRange = UidRange.createForUser(VPN_USER); - final TestNetworkAgentWrapper vpnNetworkAgent = establishVpn(lp, VPN_UID, - Collections.singleton(vpnRange)); + mMockVpn.establish(lp, VPN_UID, Collections.singleton(vpnRange)); reset(mMockNetd); InOrder inOrder = inOrder(mMockNetd); @@ -6938,7 +6888,7 @@ public class ConnectivityServiceTest { final Set newRanges = new HashSet<>(Arrays.asList( new UidRange(vpnRange.start, APP1_UID - 1), new UidRange(APP1_UID + 1, vpnRange.stop))); - vpnNetworkAgent.setUids(newRanges); + mMockVpn.setUids(newRanges); waitForIdle(); ArgumentCaptor uidCaptor = ArgumentCaptor.forClass(int[].class); @@ -7079,7 +7029,7 @@ public class ConnectivityServiceTest { private void setupConnectionOwnerUid(int vpnOwnerUid, @VpnManager.VpnType int vpnType) throws Exception { final Set vpnRange = Collections.singleton(UidRange.createForUser(VPN_USER)); - establishVpn(new LinkProperties(), vpnOwnerUid, vpnRange); + mMockVpn.establish(new LinkProperties(), vpnOwnerUid, vpnRange); mMockVpn.setVpnType(vpnType); final VpnInfo vpnInfo = new VpnInfo(); @@ -7160,27 +7110,6 @@ public class ConnectivityServiceTest { mService.getConnectionOwnerUid(getTestConnectionInfo()); } - private TestNetworkAgentWrapper establishVpn( - LinkProperties lp, int ownerUid, Set vpnRange) throws Exception { - final TestNetworkAgentWrapper - vpnNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_VPN, lp); - vpnNetworkAgent.getNetworkCapabilities().setOwnerUid(ownerUid); - mMockVpn.setNetworkAgent(vpnNetworkAgent); - mMockVpn.connect(); - mMockVpn.setUids(vpnRange); - vpnNetworkAgent.connect(true); - waitForIdle(); - return vpnNetworkAgent; - } - - private TestNetworkAgentWrapper establishVpnForMyUid(LinkProperties lp) - throws Exception { - final int uid = Process.myUid(); - final ArraySet ranges = new ArraySet<>(); - ranges.add(new UidRange(uid, uid)); - return establishVpn(lp, uid, ranges); - } - private static PackageInfo buildPackageInfo(boolean hasSystemPermission, int uid) { final PackageInfo packageInfo = new PackageInfo(); if (hasSystemPermission) { @@ -7360,7 +7289,6 @@ public class ConnectivityServiceTest { setupLocationPermissions(Build.VERSION_CODES.Q, true, AppOpsManager.OPSTR_FINE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION); - mServiceContext.setPermission(android.Manifest.permission.NETWORK_STACK, PERMISSION_DENIED); // setUp() calls mockVpn() which adds a VPN with the Test Runner's uid. Configure it to be // active @@ -7369,9 +7297,11 @@ public class ConnectivityServiceTest { info.vpnIface = VPN_IFNAME; mMockVpn.setVpnInfo(info); - final TestNetworkAgentWrapper vpnNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_VPN); - mMockVpn.setNetworkAgent(vpnNetworkAgent); - mMockVpn.connect(); + mMockVpn.establishForMyUid(); + waitForIdle(); + + mServiceContext.setPermission(android.Manifest.permission.NETWORK_STACK, PERMISSION_DENIED); + assertTrue(mService.setUnderlyingNetworksForVpn(new Network[] {network})); assertTrue( @@ -7401,8 +7331,6 @@ public class ConnectivityServiceTest { Manifest.permission.ACCESS_FINE_LOCATION); mServiceContext.setPermission(android.Manifest.permission.NETWORK_STACK, PERMISSION_DENIED); - // Disconnect mock vpn so the uid check on NetworkAgentInfo is tested - mMockVpn.disconnect(); assertTrue( "NetworkCapabilities administrator uid permission not applied", mService.checkConnectivityDiagnosticsPermissions( From 0b53357c1a74300319a61890201e56916864309c Mon Sep 17 00:00:00 2001 From: Lorenzo Colitti Date: Thu, 19 Nov 2020 23:20:55 +0900 Subject: [PATCH 114/288] Make testVpnNetworkActive more deterministic. This test is a bit brittle because it sets the underlying networks while the VPN is undergoing validation by NetworkMonitor. The test does attempt to disable validation, but that's not actually possible - the only thing that's possible is to tell NetworkMonitor to validate immediately without sending any probes. So the underlying network change races with the validation. I'm not sure why the test isn't flaky. It might be because both the network change and the validation result in a capabilities change, and the test expects "a capabilities change" without expressing what change that should be. Make this a bit more predictable by ensuring that the network validates before the underlying networks are set. This is useful because an upcoming CL will change the way underlying network capabilities are propagated. With this test CL, both the old and the new code pass. Bug: 172870110 Test: test-only change Change-Id: I319858228e8d097c0b60a107029f296385f91269 Merged-In: I319858228e8d097c0b60a107029f296385f91269 --- .../android/server/ConnectivityServiceTest.java | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index 810ccbe252ca0..bb39af9a1b9e9 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -5423,6 +5423,7 @@ public class ConnectivityServiceTest { final Set ranges = uidRangesForUid(uid); mMockVpn.registerAgent(ranges); + mService.setUnderlyingNetworksForVpn(new Network[0]); // VPN networks do not satisfy the default request and are automatically validated // by NetworkMonitor @@ -5431,19 +5432,12 @@ public class ConnectivityServiceTest { mMockVpn.getAgent().setNetworkValid(false /* isStrictMode */); mMockVpn.connect(false); - mService.setUnderlyingNetworksForVpn(new Network[0]); - genericNetworkCallback.expectAvailableCallbacksUnvalidated(mMockVpn); + genericNetworkCallback.expectAvailableThenValidatedCallbacks(mMockVpn); genericNotVpnNetworkCallback.assertNoCallback(); wifiNetworkCallback.assertNoCallback(); - vpnNetworkCallback.expectAvailableCallbacksUnvalidated(mMockVpn); - defaultCallback.expectAvailableCallbacksUnvalidated(mMockVpn); - assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); - - genericNetworkCallback.expectCallback(CallbackEntry.NETWORK_CAPS_UPDATED, mMockVpn); - genericNotVpnNetworkCallback.assertNoCallback(); - vpnNetworkCallback.expectCapabilitiesThat(mMockVpn, nc -> null == nc.getUids()); - defaultCallback.expectCallback(CallbackEntry.NETWORK_CAPS_UPDATED, mMockVpn); + vpnNetworkCallback.expectAvailableThenValidatedCallbacks(mMockVpn); + defaultCallback.expectAvailableThenValidatedCallbacks(mMockVpn); assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); ranges.clear(); From eccd26239024ca2a401e354fb16b855fa72f9923 Mon Sep 17 00:00:00 2001 From: Lorenzo Colitti Date: Wed, 25 Nov 2020 22:59:08 +0900 Subject: [PATCH 115/288] Test passing an underlying network array with null network in it. Current code treats these nulls as if they weren't there. Bug: 172870110 Test: test-only change Change-Id: Id4632e1b004c09910b4b7613f7233d2c19e2f0ac Merged-In: Id4632e1b004c09910b4b7613f7233d2c19e2f0ac --- .../server/ConnectivityServiceTest.java | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index bb39af9a1b9e9..9945853c5a6f9 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -4896,8 +4896,6 @@ public class ConnectivityServiceTest { final Network[] cellAndVpn = new Network[] { mCellNetworkAgent.getNetwork(), mMockVpn.getNetwork()}; - Network[] cellAndWifi = new Network[] { - mCellNetworkAgent.getNetwork(), mWiFiNetworkAgent.getNetwork()}; // A VPN with default (null) underlying networks sets the underlying network's interfaces... expectForceUpdateIfaces(cellAndVpn, MOBILE_IFNAME, Process.myUid(), VPN_IFNAME, @@ -4907,10 +4905,13 @@ public class ConnectivityServiceTest { mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); mWiFiNetworkAgent.connect(false); mWiFiNetworkAgent.sendLinkProperties(wifiLp); + final Network[] onlyNull = new Network[]{null}; final Network[] wifiAndVpn = new Network[] { mWiFiNetworkAgent.getNetwork(), mMockVpn.getNetwork()}; - cellAndWifi = new Network[] { + final Network[] cellAndWifi = new Network[] { mCellNetworkAgent.getNetwork(), mWiFiNetworkAgent.getNetwork()}; + final Network[] cellNullAndWifi = new Network[] { + mCellNetworkAgent.getNetwork(), null, mWiFiNetworkAgent.getNetwork()}; waitForIdle(); assertEquals(wifiLp, mService.getActiveLinkProperties()); @@ -4936,6 +4937,13 @@ public class ConnectivityServiceTest { new String[]{MOBILE_IFNAME, WIFI_IFNAME}); reset(mStatsService); + // Null underlying networks are ignored. + mService.setUnderlyingNetworksForVpn(cellNullAndWifi); + waitForIdle(); + expectForceUpdateIfaces(wifiAndVpn, MOBILE_IFNAME, Process.myUid(), VPN_IFNAME, + new String[]{MOBILE_IFNAME, WIFI_IFNAME}); + reset(mStatsService); + // If an underlying network disconnects, that interface should no longer be underlying. // This doesn't actually work because disconnectAndDestroyNetwork only notifies // NetworkStatsService before the underlying network is actually removed. So the underlying @@ -4970,6 +4978,7 @@ public class ConnectivityServiceTest { argThat(vpnInfos -> vpnInfos[0].underlyingIfaces.length == 1 && WIFI_IFNAME.equals(vpnInfos[0].underlyingIfaces[0]))); mEthernetNetworkAgent.disconnect(); + waitForIdle(); reset(mStatsService); // When a VPN declares no underlying networks (i.e., no connectivity), getAllVpnInfo @@ -4982,6 +4991,18 @@ public class ConnectivityServiceTest { waitForIdle(); expectForceUpdateIfaces(wifiAndVpn, null); reset(mStatsService); + + // Specifying only a null underlying network is the same as no networks. + mService.setUnderlyingNetworksForVpn(onlyNull); + waitForIdle(); + expectForceUpdateIfaces(wifiAndVpn, null); + reset(mStatsService); + + // Specifying networks that are all disconnected is the same as specifying no networks. + mService.setUnderlyingNetworksForVpn(onlyCell); + waitForIdle(); + expectForceUpdateIfaces(wifiAndVpn, null); + reset(mStatsService); } @Test From d39cfb8de7ce7a789afd2c9e8ac3ca18fb8186ba Mon Sep 17 00:00:00 2001 From: Lorenzo Colitti Date: Wed, 6 Jan 2021 01:36:07 +0900 Subject: [PATCH 116/288] Improve testing of CONNECTIVITY_ACTION broadcasts. We currently test CONNECTIVITY_ACTION broadcasts by directly registering BroadcastReceivers with BroadcastInterceptingContext, and making the receivers unregister themselves when all the broadcasts they expect have been received. This works for current test cases, but does not work if anything registers another receiver for CONNECTIVITY_ACTION. In that case, when we unregister the receiver in the receiver's onReceive method, BroadcastInterceptingContext will throw a ConcurrentModificationException because the list of receivers is being modified during iteration. Fix this by adding an ExpectedBroadcast class that stores the receiver and unregisters the receiver only when the test checks that the broadcast was received, which happens after the receiver runs. This is easier to use and also guarantees that the receiver is unregistered even if the test is expecting that the broadcast is never fired. Accordingly, remove mRegisteredReceivers and the code that uses it; it's no longer necessary now that ExpectedBroadcast always unregisters its receivers. Also add a convenience expectConnectivityAction method to expect a CONNECTIVITY_ACTION broadcast with specific contents. This makes the test easier to read and more detailed. Convert some existing tests to this method. While I'm at it, fix a test that was using "mCellNetworkAgent" to represent a wifi network. R backport notes: added import for NetworkInfo.DetailedState. That was added in aosp/1527378, which is impractical to backport. Bug: 172870110 Test: test-only change Change-Id: Ibada8b4215625e1016d9fd170526206920af76f5 Merged-In: Ibada8b4215625e1016d9fd170526206920af76f5 --- .../server/ConnectivityServiceTest.java | 335 ++++++++++-------- 1 file changed, 180 insertions(+), 155 deletions(-) diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index 9945853c5a6f9..6cbcb6784ddd6 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -170,6 +170,7 @@ import android.net.NetworkAgentConfig; import android.net.NetworkCapabilities; import android.net.NetworkFactory; import android.net.NetworkInfo; +import android.net.NetworkInfo.DetailedState; import android.net.NetworkRequest; import android.net.NetworkSpecifier; import android.net.NetworkStack; @@ -274,13 +275,16 @@ import java.util.HashSet; import java.util.List; import java.util.Objects; import java.util.Set; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; import java.util.function.Predicate; import java.util.function.Supplier; @@ -384,9 +388,6 @@ public class ConnectivityServiceTest { private class MockContext extends BroadcastInterceptingContext { private final MockContentResolver mContentResolver; - // Contains all registered receivers since this object was created. Useful to clear - // them when needed, as BroadcastInterceptingContext does not provide this facility. - private final List mRegisteredReceivers = new ArrayList<>(); @Spy private Resources mResources; private final LinkedBlockingQueue mStartedActivities = new LinkedBlockingQueue<>(); @@ -504,19 +505,6 @@ public class ConnectivityServiceTest { public void setPermission(String permission, Integer granted) { mMockedPermissions.put(permission, granted); } - - @Override - public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) { - mRegisteredReceivers.add(receiver); - return super.registerReceiver(receiver, filter); - } - - public void clearRegisteredReceivers() { - // super.unregisterReceiver is a no-op for receivers that are not registered (because - // they haven't been registered or because they have already been unregistered). - // For the same reason, don't bother clearing mRegisteredReceivers. - for (final BroadcastReceiver rcv : mRegisteredReceivers) unregisterReceiver(rcv); - } } private void waitForIdle() { @@ -545,10 +533,10 @@ public class ConnectivityServiceTest { } // Bring up a network that we can use to send messages to ConnectivityService. - ConditionVariable cv = registerConnectivityBroadcast(1); + ExpectedBroadcast b = expectConnectivityAction(TYPE_WIFI, DetailedState.CONNECTED); mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); mWiFiNetworkAgent.connect(false); - waitFor(cv); + b.expectBroadcast(); Network n = mWiFiNetworkAgent.getNetwork(); assertNotNull(n); @@ -565,10 +553,10 @@ public class ConnectivityServiceTest { @Ignore public void verifyThatNotWaitingForIdleCausesRaceConditions() throws Exception { // Bring up a network that we can use to send messages to ConnectivityService. - ConditionVariable cv = registerConnectivityBroadcast(1); + ExpectedBroadcast b = expectConnectivityAction(TYPE_WIFI, DetailedState.CONNECTED); mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); mWiFiNetworkAgent.connect(false); - waitFor(cv); + b.expectBroadcast(); Network n = mWiFiNetworkAgent.getNetwork(); assertNotNull(n); @@ -1422,29 +1410,79 @@ public class ConnectivityServiceTest { } /** - * Return a ConditionVariable that opens when {@code count} numbers of CONNECTIVITY_ACTION - * broadcasts are received. + * Class to simplify expecting broadcasts using BroadcastInterceptingContext. + * Ensures that the receiver is unregistered after the expected broadcast is received. This + * cannot be done in the BroadcastReceiver itself because BroadcastInterceptingContext runs + * the receivers' receive method while iterating over the list of receivers, and unregistering + * the receiver during iteration throws ConcurrentModificationException. */ - private ConditionVariable registerConnectivityBroadcast(final int count) { + private class ExpectedBroadcast extends CompletableFuture { + private final BroadcastReceiver mReceiver; + + ExpectedBroadcast(BroadcastReceiver receiver) { + mReceiver = receiver; + } + + public Intent expectBroadcast(int timeoutMs) throws Exception { + try { + return get(timeoutMs, TimeUnit.MILLISECONDS); + } catch (TimeoutException e) { + fail("Expected broadcast not received after " + timeoutMs + " ms"); + return null; + } finally { + mServiceContext.unregisterReceiver(mReceiver); + } + } + + public Intent expectBroadcast() throws Exception { + return expectBroadcast(TIMEOUT_MS); + } + + public void expectNoBroadcast(int timeoutMs) throws Exception { + waitForIdle(); + try { + final Intent intent = get(timeoutMs, TimeUnit.MILLISECONDS); + fail("Unexpected broadcast: " + intent.getAction()); + } catch (TimeoutException expected) { + } finally { + mServiceContext.unregisterReceiver(mReceiver); + } + } + } + + /** Expects that {@code count} CONNECTIVITY_ACTION broadcasts are received. */ + private ExpectedBroadcast registerConnectivityBroadcast(final int count) { return registerConnectivityBroadcastThat(count, intent -> true); } - private ConditionVariable registerConnectivityBroadcastThat(final int count, + private ExpectedBroadcast registerConnectivityBroadcastThat(final int count, @NonNull final Predicate filter) { - final ConditionVariable cv = new ConditionVariable(); final IntentFilter intentFilter = new IntentFilter(CONNECTIVITY_ACTION); + // AtomicReference allows receiver to access expected even though it is constructed later. + final AtomicReference expectedRef = new AtomicReference<>(); final BroadcastReceiver receiver = new BroadcastReceiver() { - private int remaining = count; - public void onReceive(Context context, Intent intent) { - if (!filter.test(intent)) return; - if (--remaining == 0) { - cv.open(); - mServiceContext.unregisterReceiver(this); - } - } - }; + private int mRemaining = count; + public void onReceive(Context context, Intent intent) { + final int type = intent.getIntExtra(EXTRA_NETWORK_TYPE, -1); + final NetworkInfo ni = intent.getParcelableExtra(EXTRA_NETWORK_INFO); + Log.d(TAG, "Received CONNECTIVITY_ACTION type=" + type + " ni=" + ni); + if (!filter.test(intent)) return; + if (--mRemaining == 0) { + expectedRef.get().complete(intent); + } + } + }; + final ExpectedBroadcast expected = new ExpectedBroadcast(receiver); + expectedRef.set(expected); mServiceContext.registerReceiver(receiver, intentFilter); - return cv; + return expected; + } + + private ExpectedBroadcast expectConnectivityAction(int type, NetworkInfo.DetailedState state) { + return registerConnectivityBroadcastThat(1, intent -> + type == intent.getIntExtra(EXTRA_NETWORK_TYPE, -1) && state.equals( + ((NetworkInfo) intent.getParcelableExtra(EXTRA_NETWORK_INFO)) + .getDetailedState())); } @Test @@ -1468,10 +1506,9 @@ public class ConnectivityServiceTest { // Connect the cell agent and wait for the connected broadcast. mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR); mCellNetworkAgent.addCapability(NET_CAPABILITY_SUPL); - final ConditionVariable cv1 = registerConnectivityBroadcastThat(1, - intent -> intent.getIntExtra(EXTRA_NETWORK_TYPE, -1) == TYPE_MOBILE); + ExpectedBroadcast b = expectConnectivityAction(TYPE_MOBILE, DetailedState.CONNECTED); mCellNetworkAgent.connect(true); - waitFor(cv1); + b.expectBroadcast(); // Build legacy request for SUPL. final NetworkCapabilities legacyCaps = new NetworkCapabilities(); @@ -1481,27 +1518,17 @@ public class ConnectivityServiceTest { ConnectivityManager.REQUEST_ID_UNSET, NetworkRequest.Type.REQUEST); // File request, withdraw it and make sure no broadcast is sent - final ConditionVariable cv2 = registerConnectivityBroadcast(1); + b = registerConnectivityBroadcast(1); final TestNetworkCallback callback = new TestNetworkCallback(); mCm.requestNetwork(legacyRequest, callback); callback.expectCallback(CallbackEntry.AVAILABLE, mCellNetworkAgent); mCm.unregisterNetworkCallback(callback); - assertFalse(cv2.block(800)); // 800ms long enough to at least flake if this is sent - // As the broadcast did not fire, the receiver was not unregistered. Do this now. - mServiceContext.clearRegisteredReceivers(); + b.expectNoBroadcast(800); // 800ms long enough to at least flake if this is sent - // Disconnect the network and expect mobile disconnected broadcast. Use a small hack to - // check that has been sent. - final AtomicBoolean vanillaAction = new AtomicBoolean(false); - final ConditionVariable cv3 = registerConnectivityBroadcastThat(1, intent -> { - if (intent.getAction().equals(CONNECTIVITY_ACTION)) { - vanillaAction.set(true); - } - return !((NetworkInfo) intent.getExtra(EXTRA_NETWORK_INFO, -1)).isConnected(); - }); + // Disconnect the network and expect mobile disconnected broadcast. + b = expectConnectivityAction(TYPE_MOBILE, DetailedState.DISCONNECTED); mCellNetworkAgent.disconnect(); - waitFor(cv3); - assertTrue(vanillaAction.get()); + b.expectBroadcast(); } @Test @@ -1512,9 +1539,9 @@ public class ConnectivityServiceTest { assertNull(mCm.getActiveNetworkInfo()); assertNull(mCm.getActiveNetwork()); // Test bringing up validated cellular. - ConditionVariable cv = registerConnectivityBroadcast(1); + ExpectedBroadcast b = expectConnectivityAction(TYPE_MOBILE, DetailedState.CONNECTED); mCellNetworkAgent.connect(true); - waitFor(cv); + b.expectBroadcast(); verifyActiveNetwork(TRANSPORT_CELLULAR); assertLength(2, mCm.getAllNetworks()); assertTrue(mCm.getAllNetworks()[0].equals(mCm.getActiveNetwork()) || @@ -1522,9 +1549,9 @@ public class ConnectivityServiceTest { assertTrue(mCm.getAllNetworks()[0].equals(mWiFiNetworkAgent.getNetwork()) || mCm.getAllNetworks()[1].equals(mWiFiNetworkAgent.getNetwork())); // Test bringing up validated WiFi. - cv = registerConnectivityBroadcast(2); + b = registerConnectivityBroadcast(2); mWiFiNetworkAgent.connect(true); - waitFor(cv); + b.expectBroadcast(); verifyActiveNetwork(TRANSPORT_WIFI); assertLength(2, mCm.getAllNetworks()); assertTrue(mCm.getAllNetworks()[0].equals(mCm.getActiveNetwork()) || @@ -1539,9 +1566,9 @@ public class ConnectivityServiceTest { assertLength(1, mCm.getAllNetworks()); assertEquals(mCm.getAllNetworks()[0], mCm.getActiveNetwork()); // Test WiFi disconnect. - cv = registerConnectivityBroadcast(1); + b = registerConnectivityBroadcast(1); mWiFiNetworkAgent.disconnect(); - waitFor(cv); + b.expectBroadcast(); verifyNoNetwork(); } @@ -1549,9 +1576,9 @@ public class ConnectivityServiceTest { public void testValidatedCellularOutscoresUnvalidatedWiFi() throws Exception { // Test bringing up unvalidated WiFi mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); - ConditionVariable cv = registerConnectivityBroadcast(1); + ExpectedBroadcast b = registerConnectivityBroadcast(1); mWiFiNetworkAgent.connect(false); - waitFor(cv); + b.expectBroadcast(); verifyActiveNetwork(TRANSPORT_WIFI); // Test bringing up unvalidated cellular mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR); @@ -1564,19 +1591,19 @@ public class ConnectivityServiceTest { verifyActiveNetwork(TRANSPORT_WIFI); // Test bringing up validated cellular mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR); - cv = registerConnectivityBroadcast(2); + b = registerConnectivityBroadcast(2); mCellNetworkAgent.connect(true); - waitFor(cv); + b.expectBroadcast(); verifyActiveNetwork(TRANSPORT_CELLULAR); // Test cellular disconnect. - cv = registerConnectivityBroadcast(2); + b = registerConnectivityBroadcast(2); mCellNetworkAgent.disconnect(); - waitFor(cv); + b.expectBroadcast(); verifyActiveNetwork(TRANSPORT_WIFI); // Test WiFi disconnect. - cv = registerConnectivityBroadcast(1); + b = registerConnectivityBroadcast(1); mWiFiNetworkAgent.disconnect(); - waitFor(cv); + b.expectBroadcast(); verifyNoNetwork(); } @@ -1584,25 +1611,25 @@ public class ConnectivityServiceTest { public void testUnvalidatedWifiOutscoresUnvalidatedCellular() throws Exception { // Test bringing up unvalidated cellular. mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR); - ConditionVariable cv = registerConnectivityBroadcast(1); + ExpectedBroadcast b = registerConnectivityBroadcast(1); mCellNetworkAgent.connect(false); - waitFor(cv); + b.expectBroadcast(); verifyActiveNetwork(TRANSPORT_CELLULAR); // Test bringing up unvalidated WiFi. mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); - cv = registerConnectivityBroadcast(2); + b = registerConnectivityBroadcast(2); mWiFiNetworkAgent.connect(false); - waitFor(cv); + b.expectBroadcast(); verifyActiveNetwork(TRANSPORT_WIFI); // Test WiFi disconnect. - cv = registerConnectivityBroadcast(2); + b = registerConnectivityBroadcast(2); mWiFiNetworkAgent.disconnect(); - waitFor(cv); + b.expectBroadcast(); verifyActiveNetwork(TRANSPORT_CELLULAR); // Test cellular disconnect. - cv = registerConnectivityBroadcast(1); + b = registerConnectivityBroadcast(1); mCellNetworkAgent.disconnect(); - waitFor(cv); + b.expectBroadcast(); verifyNoNetwork(); } @@ -1610,24 +1637,24 @@ public class ConnectivityServiceTest { public void testUnlingeringDoesNotValidate() throws Exception { // Test bringing up unvalidated WiFi. mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); - ConditionVariable cv = registerConnectivityBroadcast(1); + ExpectedBroadcast b = registerConnectivityBroadcast(1); mWiFiNetworkAgent.connect(false); - waitFor(cv); + b.expectBroadcast(); verifyActiveNetwork(TRANSPORT_WIFI); assertFalse(mCm.getNetworkCapabilities(mWiFiNetworkAgent.getNetwork()).hasCapability( NET_CAPABILITY_VALIDATED)); // Test bringing up validated cellular. mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR); - cv = registerConnectivityBroadcast(2); + b = registerConnectivityBroadcast(2); mCellNetworkAgent.connect(true); - waitFor(cv); + b.expectBroadcast(); verifyActiveNetwork(TRANSPORT_CELLULAR); assertFalse(mCm.getNetworkCapabilities(mWiFiNetworkAgent.getNetwork()).hasCapability( NET_CAPABILITY_VALIDATED)); // Test cellular disconnect. - cv = registerConnectivityBroadcast(2); + b = registerConnectivityBroadcast(2); mCellNetworkAgent.disconnect(); - waitFor(cv); + b.expectBroadcast(); verifyActiveNetwork(TRANSPORT_WIFI); // Unlingering a network should not cause it to be marked as validated. assertFalse(mCm.getNetworkCapabilities(mWiFiNetworkAgent.getNetwork()).hasCapability( @@ -1638,25 +1665,25 @@ public class ConnectivityServiceTest { public void testCellularOutscoresWeakWifi() throws Exception { // Test bringing up validated cellular. mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR); - ConditionVariable cv = registerConnectivityBroadcast(1); + ExpectedBroadcast b = registerConnectivityBroadcast(1); mCellNetworkAgent.connect(true); - waitFor(cv); + b.expectBroadcast(); verifyActiveNetwork(TRANSPORT_CELLULAR); // Test bringing up validated WiFi. mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); - cv = registerConnectivityBroadcast(2); + b = registerConnectivityBroadcast(2); mWiFiNetworkAgent.connect(true); - waitFor(cv); + b.expectBroadcast(); verifyActiveNetwork(TRANSPORT_WIFI); // Test WiFi getting really weak. - cv = registerConnectivityBroadcast(2); + b = registerConnectivityBroadcast(2); mWiFiNetworkAgent.adjustScore(-11); - waitFor(cv); + b.expectBroadcast(); verifyActiveNetwork(TRANSPORT_CELLULAR); // Test WiFi restoring signal strength. - cv = registerConnectivityBroadcast(2); + b = registerConnectivityBroadcast(2); mWiFiNetworkAgent.adjustScore(11); - waitFor(cv); + b.expectBroadcast(); verifyActiveNetwork(TRANSPORT_WIFI); } @@ -1674,9 +1701,9 @@ public class ConnectivityServiceTest { mCellNetworkAgent.expectDisconnected(); // Test bringing up validated WiFi. mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); - final ConditionVariable cv = registerConnectivityBroadcast(1); + final ExpectedBroadcast b = expectConnectivityAction(TYPE_WIFI, DetailedState.CONNECTED); mWiFiNetworkAgent.connect(true); - waitFor(cv); + b.expectBroadcast(); verifyActiveNetwork(TRANSPORT_WIFI); // Test bringing up unvalidated cellular. // Expect it to be torn down because it could never be the highest scoring network @@ -1693,33 +1720,33 @@ public class ConnectivityServiceTest { public void testCellularFallback() throws Exception { // Test bringing up validated cellular. mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR); - ConditionVariable cv = registerConnectivityBroadcast(1); + ExpectedBroadcast b = registerConnectivityBroadcast(1); mCellNetworkAgent.connect(true); - waitFor(cv); + b.expectBroadcast(); verifyActiveNetwork(TRANSPORT_CELLULAR); // Test bringing up validated WiFi. mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); - cv = registerConnectivityBroadcast(2); + b = registerConnectivityBroadcast(2); mWiFiNetworkAgent.connect(true); - waitFor(cv); + b.expectBroadcast(); verifyActiveNetwork(TRANSPORT_WIFI); // Reevaluate WiFi (it'll instantly fail DNS). - cv = registerConnectivityBroadcast(2); + b = registerConnectivityBroadcast(2); assertTrue(mCm.getNetworkCapabilities(mWiFiNetworkAgent.getNetwork()).hasCapability( NET_CAPABILITY_VALIDATED)); mCm.reportBadNetwork(mWiFiNetworkAgent.getNetwork()); // Should quickly fall back to Cellular. - waitFor(cv); + b.expectBroadcast(); assertFalse(mCm.getNetworkCapabilities(mWiFiNetworkAgent.getNetwork()).hasCapability( NET_CAPABILITY_VALIDATED)); verifyActiveNetwork(TRANSPORT_CELLULAR); // Reevaluate cellular (it'll instantly fail DNS). - cv = registerConnectivityBroadcast(2); + b = registerConnectivityBroadcast(2); assertTrue(mCm.getNetworkCapabilities(mCellNetworkAgent.getNetwork()).hasCapability( NET_CAPABILITY_VALIDATED)); mCm.reportBadNetwork(mCellNetworkAgent.getNetwork()); // Should quickly fall back to WiFi. - waitFor(cv); + b.expectBroadcast(); assertFalse(mCm.getNetworkCapabilities(mCellNetworkAgent.getNetwork()).hasCapability( NET_CAPABILITY_VALIDATED)); assertFalse(mCm.getNetworkCapabilities(mWiFiNetworkAgent.getNetwork()).hasCapability( @@ -1731,23 +1758,23 @@ public class ConnectivityServiceTest { public void testWiFiFallback() throws Exception { // Test bringing up unvalidated WiFi. mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); - ConditionVariable cv = registerConnectivityBroadcast(1); + ExpectedBroadcast b = registerConnectivityBroadcast(1); mWiFiNetworkAgent.connect(false); - waitFor(cv); + b.expectBroadcast(); verifyActiveNetwork(TRANSPORT_WIFI); // Test bringing up validated cellular. mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR); - cv = registerConnectivityBroadcast(2); + b = registerConnectivityBroadcast(2); mCellNetworkAgent.connect(true); - waitFor(cv); + b.expectBroadcast(); verifyActiveNetwork(TRANSPORT_CELLULAR); // Reevaluate cellular (it'll instantly fail DNS). - cv = registerConnectivityBroadcast(2); + b = registerConnectivityBroadcast(2); assertTrue(mCm.getNetworkCapabilities(mCellNetworkAgent.getNetwork()).hasCapability( NET_CAPABILITY_VALIDATED)); mCm.reportBadNetwork(mCellNetworkAgent.getNetwork()); // Should quickly fall back to WiFi. - waitFor(cv); + b.expectBroadcast(); assertFalse(mCm.getNetworkCapabilities(mCellNetworkAgent.getNetwork()).hasCapability( NET_CAPABILITY_VALIDATED)); verifyActiveNetwork(TRANSPORT_WIFI); @@ -1817,13 +1844,13 @@ public class ConnectivityServiceTest { mCm.registerNetworkCallback(cellRequest, cellNetworkCallback); // Test unvalidated networks - ConditionVariable cv = registerConnectivityBroadcast(1); + ExpectedBroadcast b = registerConnectivityBroadcast(1); mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR); mCellNetworkAgent.connect(false); genericNetworkCallback.expectAvailableCallbacksUnvalidated(mCellNetworkAgent); cellNetworkCallback.expectAvailableCallbacksUnvalidated(mCellNetworkAgent); assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetwork()); - waitFor(cv); + b.expectBroadcast(); assertNoCallbacks(genericNetworkCallback, wifiNetworkCallback, cellNetworkCallback); // This should not trigger spurious onAvailable() callbacks, b/21762680. @@ -1832,28 +1859,28 @@ public class ConnectivityServiceTest { assertNoCallbacks(genericNetworkCallback, wifiNetworkCallback, cellNetworkCallback); assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetwork()); - cv = registerConnectivityBroadcast(2); + b = registerConnectivityBroadcast(2); mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); mWiFiNetworkAgent.connect(false); genericNetworkCallback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); wifiNetworkCallback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); - waitFor(cv); + b.expectBroadcast(); assertNoCallbacks(genericNetworkCallback, wifiNetworkCallback, cellNetworkCallback); - cv = registerConnectivityBroadcast(2); + b = registerConnectivityBroadcast(2); mWiFiNetworkAgent.disconnect(); genericNetworkCallback.expectCallback(CallbackEntry.LOST, mWiFiNetworkAgent); wifiNetworkCallback.expectCallback(CallbackEntry.LOST, mWiFiNetworkAgent); cellNetworkCallback.assertNoCallback(); - waitFor(cv); + b.expectBroadcast(); assertNoCallbacks(genericNetworkCallback, wifiNetworkCallback, cellNetworkCallback); - cv = registerConnectivityBroadcast(1); + b = registerConnectivityBroadcast(1); mCellNetworkAgent.disconnect(); genericNetworkCallback.expectCallback(CallbackEntry.LOST, mCellNetworkAgent); cellNetworkCallback.expectCallback(CallbackEntry.LOST, mCellNetworkAgent); - waitFor(cv); + b.expectBroadcast(); assertNoCallbacks(genericNetworkCallback, wifiNetworkCallback, cellNetworkCallback); // Test validated networks @@ -2542,9 +2569,9 @@ public class ConnectivityServiceTest { // Test bringing up validated WiFi. mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); - final ConditionVariable cv = registerConnectivityBroadcast(1); + final ExpectedBroadcast b = expectConnectivityAction(TYPE_WIFI, DetailedState.CONNECTED); mWiFiNetworkAgent.connect(true); - waitFor(cv); + b.expectBroadcast(); verifyActiveNetwork(TRANSPORT_WIFI); // Register MMS NetworkRequest @@ -2570,9 +2597,9 @@ public class ConnectivityServiceTest { public void testMMSonCell() throws Exception { // Test bringing up cellular without MMS mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR); - ConditionVariable cv = registerConnectivityBroadcast(1); + ExpectedBroadcast b = expectConnectivityAction(TYPE_MOBILE, DetailedState.CONNECTED); mCellNetworkAgent.connect(false); - waitFor(cv); + b.expectBroadcast(); verifyActiveNetwork(TRANSPORT_CELLULAR); // Register MMS NetworkRequest @@ -4037,9 +4064,9 @@ public class ConnectivityServiceTest { } mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); - ConditionVariable cv = registerConnectivityBroadcast(1); + ExpectedBroadcast b = expectConnectivityAction(TYPE_WIFI, DetailedState.CONNECTED); mWiFiNetworkAgent.connect(true); - waitFor(cv); + b.expectBroadcast(); verifyActiveNetwork(TRANSPORT_WIFI); mWiFiNetworkAgent.sendLinkProperties(lp); waitForIdle(); @@ -4570,10 +4597,10 @@ public class ConnectivityServiceTest { assertNotPinnedToWifi(); // Disconnect cell and wifi. - ConditionVariable cv = registerConnectivityBroadcast(3); // cell down, wifi up, wifi down. + ExpectedBroadcast b = registerConnectivityBroadcast(3); // cell down, wifi up, wifi down. mCellNetworkAgent.disconnect(); mWiFiNetworkAgent.disconnect(); - waitFor(cv); + b.expectBroadcast(); // Pinning takes effect even if the pinned network is the default when the pin is set... TestNetworkPinner.pin(mServiceContext, wifiRequest); @@ -4583,10 +4610,10 @@ public class ConnectivityServiceTest { assertPinnedToWifiWithWifiDefault(); // ... and is maintained even when that network is no longer the default. - cv = registerConnectivityBroadcast(1); + b = registerConnectivityBroadcast(1); mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); mCellNetworkAgent.connect(true); - waitFor(cv); + b.expectBroadcast(); assertPinnedToWifiWithCellDefault(); } @@ -4684,7 +4711,7 @@ public class ConnectivityServiceTest { @Test public void testNetworkInfoOfTypeNone() throws Exception { - ConditionVariable broadcastCV = registerConnectivityBroadcast(1); + ExpectedBroadcast b = registerConnectivityBroadcast(1); verifyNoNetwork(); TestNetworkAgentWrapper wifiAware = new TestNetworkAgentWrapper(TRANSPORT_WIFI_AWARE); @@ -4717,9 +4744,7 @@ public class ConnectivityServiceTest { mCm.unregisterNetworkCallback(callback); verifyNoNetwork(); - if (broadcastCV.block(10)) { - fail("expected no broadcast, but got CONNECTIVITY_ACTION broadcast"); - } + b.expectNoBroadcast(10); } @Test @@ -6456,11 +6481,11 @@ public class ConnectivityServiceTest { // prefix discovery is never started. LinkProperties lp = new LinkProperties(baseLp); lp.setNat64Prefix(pref64FromRa); - mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI, lp); - mCellNetworkAgent.connect(false); - final Network network = mCellNetworkAgent.getNetwork(); + mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI, lp); + mWiFiNetworkAgent.connect(false); + final Network network = mWiFiNetworkAgent.getNetwork(); int netId = network.getNetId(); - callback.expectAvailableCallbacksUnvalidated(mCellNetworkAgent); + callback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); inOrder.verify(mMockNetd).clatdStart(iface, pref64FromRa.toString()); inOrder.verify(mMockDnsResolver).setPrefix64(netId, pref64FromRa.toString()); inOrder.verify(mMockDnsResolver, never()).startPrefix64Discovery(netId); @@ -6469,8 +6494,8 @@ public class ConnectivityServiceTest { // If the RA prefix is withdrawn, clatd is stopped and prefix discovery is started. lp.setNat64Prefix(null); - mCellNetworkAgent.sendLinkProperties(lp); - expectNat64PrefixChange(callback, mCellNetworkAgent, null); + mWiFiNetworkAgent.sendLinkProperties(lp); + expectNat64PrefixChange(callback, mWiFiNetworkAgent, null); inOrder.verify(mMockNetd).clatdStop(iface); inOrder.verify(mMockDnsResolver).setPrefix64(netId, ""); inOrder.verify(mMockDnsResolver).startPrefix64Discovery(netId); @@ -6478,8 +6503,8 @@ public class ConnectivityServiceTest { // If the RA prefix appears while DNS discovery is in progress, discovery is stopped and // clatd is started with the prefix from the RA. lp.setNat64Prefix(pref64FromRa); - mCellNetworkAgent.sendLinkProperties(lp); - expectNat64PrefixChange(callback, mCellNetworkAgent, pref64FromRa); + mWiFiNetworkAgent.sendLinkProperties(lp); + expectNat64PrefixChange(callback, mWiFiNetworkAgent, pref64FromRa); inOrder.verify(mMockNetd).clatdStart(iface, pref64FromRa.toString()); inOrder.verify(mMockDnsResolver).stopPrefix64Discovery(netId); inOrder.verify(mMockDnsResolver).setPrefix64(netId, pref64FromRa.toString()); @@ -6487,21 +6512,21 @@ public class ConnectivityServiceTest { // Withdraw the RA prefix so we can test the case where an RA prefix appears after DNS // discovery has succeeded. lp.setNat64Prefix(null); - mCellNetworkAgent.sendLinkProperties(lp); - expectNat64PrefixChange(callback, mCellNetworkAgent, null); + mWiFiNetworkAgent.sendLinkProperties(lp); + expectNat64PrefixChange(callback, mWiFiNetworkAgent, null); inOrder.verify(mMockNetd).clatdStop(iface); inOrder.verify(mMockDnsResolver).setPrefix64(netId, ""); inOrder.verify(mMockDnsResolver).startPrefix64Discovery(netId); mService.mNetdEventCallback.onNat64PrefixEvent(netId, true /* added */, pref64FromDnsStr, 96); - expectNat64PrefixChange(callback, mCellNetworkAgent, pref64FromDns); + expectNat64PrefixChange(callback, mWiFiNetworkAgent, pref64FromDns); inOrder.verify(mMockNetd).clatdStart(iface, pref64FromDns.toString()); // If an RA advertises the same prefix that was discovered by DNS, nothing happens: prefix // discovery is not stopped, and there are no callbacks. lp.setNat64Prefix(pref64FromDns); - mCellNetworkAgent.sendLinkProperties(lp); + mWiFiNetworkAgent.sendLinkProperties(lp); callback.assertNoCallback(); inOrder.verify(mMockNetd, never()).clatdStop(iface); inOrder.verify(mMockNetd, never()).clatdStart(eq(iface), anyString()); @@ -6511,7 +6536,7 @@ public class ConnectivityServiceTest { // If the RA is later withdrawn, nothing happens again. lp.setNat64Prefix(null); - mCellNetworkAgent.sendLinkProperties(lp); + mWiFiNetworkAgent.sendLinkProperties(lp); callback.assertNoCallback(); inOrder.verify(mMockNetd, never()).clatdStop(iface); inOrder.verify(mMockNetd, never()).clatdStart(eq(iface), anyString()); @@ -6521,8 +6546,8 @@ public class ConnectivityServiceTest { // If the RA prefix changes, clatd is restarted and prefix discovery is stopped. lp.setNat64Prefix(pref64FromRa); - mCellNetworkAgent.sendLinkProperties(lp); - expectNat64PrefixChange(callback, mCellNetworkAgent, pref64FromRa); + mWiFiNetworkAgent.sendLinkProperties(lp); + expectNat64PrefixChange(callback, mWiFiNetworkAgent, pref64FromRa); inOrder.verify(mMockNetd).clatdStop(iface); inOrder.verify(mMockDnsResolver).stopPrefix64Discovery(netId); @@ -6536,8 +6561,8 @@ public class ConnectivityServiceTest { // If the RA prefix changes, clatd is restarted and prefix discovery is not started. lp.setNat64Prefix(newPref64FromRa); - mCellNetworkAgent.sendLinkProperties(lp); - expectNat64PrefixChange(callback, mCellNetworkAgent, newPref64FromRa); + mWiFiNetworkAgent.sendLinkProperties(lp); + expectNat64PrefixChange(callback, mWiFiNetworkAgent, newPref64FromRa); inOrder.verify(mMockNetd).clatdStop(iface); inOrder.verify(mMockDnsResolver).setPrefix64(netId, ""); inOrder.verify(mMockNetd).clatdStart(iface, newPref64FromRa.toString()); @@ -6547,7 +6572,7 @@ public class ConnectivityServiceTest { // If the RA prefix changes to the same value, nothing happens. lp.setNat64Prefix(newPref64FromRa); - mCellNetworkAgent.sendLinkProperties(lp); + mWiFiNetworkAgent.sendLinkProperties(lp); callback.assertNoCallback(); assertEquals(newPref64FromRa, mCm.getLinkProperties(network).getNat64Prefix()); inOrder.verify(mMockNetd, never()).clatdStop(iface); @@ -6561,19 +6586,19 @@ public class ConnectivityServiceTest { // If the same prefix is learned first by DNS and then by RA, and clat is later stopped, // (e.g., because the network disconnects) setPrefix64(netid, "") is never called. lp.setNat64Prefix(null); - mCellNetworkAgent.sendLinkProperties(lp); - expectNat64PrefixChange(callback, mCellNetworkAgent, null); + mWiFiNetworkAgent.sendLinkProperties(lp); + expectNat64PrefixChange(callback, mWiFiNetworkAgent, null); inOrder.verify(mMockNetd).clatdStop(iface); inOrder.verify(mMockDnsResolver).setPrefix64(netId, ""); inOrder.verify(mMockDnsResolver).startPrefix64Discovery(netId); mService.mNetdEventCallback.onNat64PrefixEvent(netId, true /* added */, pref64FromDnsStr, 96); - expectNat64PrefixChange(callback, mCellNetworkAgent, pref64FromDns); + expectNat64PrefixChange(callback, mWiFiNetworkAgent, pref64FromDns); inOrder.verify(mMockNetd).clatdStart(iface, pref64FromDns.toString()); inOrder.verify(mMockDnsResolver, never()).setPrefix64(eq(netId), any()); lp.setNat64Prefix(pref64FromDns); - mCellNetworkAgent.sendLinkProperties(lp); + mWiFiNetworkAgent.sendLinkProperties(lp); callback.assertNoCallback(); inOrder.verify(mMockNetd, never()).clatdStop(iface); inOrder.verify(mMockNetd, never()).clatdStart(eq(iface), anyString()); @@ -6584,10 +6609,10 @@ public class ConnectivityServiceTest { // When tearing down a network, clat state is only updated after CALLBACK_LOST is fired, but // before CONNECTIVITY_ACTION is sent. Wait for CONNECTIVITY_ACTION before verifying that // clat has been stopped, or the test will be flaky. - ConditionVariable cv = registerConnectivityBroadcast(1); - mCellNetworkAgent.disconnect(); - callback.expectCallback(CallbackEntry.LOST, mCellNetworkAgent); - waitFor(cv); + ExpectedBroadcast b = expectConnectivityAction(TYPE_WIFI, DetailedState.DISCONNECTED); + mWiFiNetworkAgent.disconnect(); + callback.expectCallback(CallbackEntry.LOST, mWiFiNetworkAgent); + b.expectBroadcast(); inOrder.verify(mMockNetd).clatdStop(iface); inOrder.verify(mMockDnsResolver).stopPrefix64Discovery(netId); @@ -6662,10 +6687,10 @@ public class ConnectivityServiceTest { .destroyNetworkCache(eq(mCellNetworkAgent.getNetwork().netId)); // Disconnect wifi - ConditionVariable cv = registerConnectivityBroadcast(1); + ExpectedBroadcast b = expectConnectivityAction(TYPE_WIFI, DetailedState.DISCONNECTED); reset(mNetworkManagementService); mWiFiNetworkAgent.disconnect(); - waitFor(cv); + b.expectBroadcast(); verify(mNetworkManagementService, times(1)).removeIdleTimer(eq(WIFI_IFNAME)); // Clean up From a9aca9744745b7fc8b3d2a1235096982ad8ec8b6 Mon Sep 17 00:00:00 2001 From: Lorenzo Colitti Date: Tue, 15 Dec 2020 00:45:30 +0900 Subject: [PATCH 117/288] Add a test for getDefaultNetworkCapabilitiesForUser. Bug: 172870110 Test: test-only change Test: new test passes 100 times in a row Change-Id: I210284578e38cd25b8b95235d3390d5bd66a5a70 Merged-In: I210284578e38cd25b8b95235d3390d5bd66a5a70 --- .../server/ConnectivityServiceTest.java | 33 +++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index 6cbcb6784ddd6..fb370a0f7124b 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -5667,10 +5667,21 @@ public class ConnectivityServiceTest { assertTrue(nc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); } + private void assertDefaultNetworkCapabilities(int userId, NetworkAgentWrapper... networks) { + final NetworkCapabilities[] defaultCaps = mService.getDefaultNetworkCapabilitiesForUser( + userId, "com.android.calling.package"); + final String defaultCapsString = Arrays.toString(defaultCaps); + assertEquals(defaultCapsString, defaultCaps.length, networks.length); + final Set defaultCapsSet = new ArraySet<>(defaultCaps); + for (NetworkAgentWrapper network : networks) { + final NetworkCapabilities nc = mCm.getNetworkCapabilities(network.getNetwork()); + final String msg = "Did not find " + nc + " in " + Arrays.toString(defaultCaps); + assertTrue(msg, defaultCapsSet.contains(nc)); + } + } + @Test public void testVpnSetUnderlyingNetworks() throws Exception { - final int uid = Process.myUid(); - final TestNetworkCallback vpnNetworkCallback = new TestNetworkCallback(); final NetworkRequest vpnNetworkRequest = new NetworkRequest.Builder() .removeCapability(NET_CAPABILITY_NOT_VPN) @@ -5693,6 +5704,9 @@ public class ConnectivityServiceTest { // A VPN without underlying networks is not suspended. assertTrue(nc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); + final int userId = UserHandle.getUserId(Process.myUid()); + assertDefaultNetworkCapabilities(userId /* no networks */); + // Connect cell and use it as an underlying network. mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR); mCellNetworkAgent.addCapability(NET_CAPABILITY_NOT_SUSPENDED); @@ -5706,6 +5720,7 @@ public class ConnectivityServiceTest { && caps.hasTransport(TRANSPORT_CELLULAR) && !caps.hasTransport(TRANSPORT_WIFI) && !caps.hasCapability(NET_CAPABILITY_NOT_METERED) && caps.hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); + assertDefaultNetworkCapabilities(userId, mCellNetworkAgent); mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); mWiFiNetworkAgent.addCapability(NET_CAPABILITY_NOT_METERED); @@ -5720,6 +5735,7 @@ public class ConnectivityServiceTest { && caps.hasTransport(TRANSPORT_CELLULAR) && caps.hasTransport(TRANSPORT_WIFI) && !caps.hasCapability(NET_CAPABILITY_NOT_METERED) && caps.hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); + assertDefaultNetworkCapabilities(userId, mCellNetworkAgent, mWiFiNetworkAgent); // Don't disconnect, but note the VPN is not using wifi any more. mService.setUnderlyingNetworksForVpn( @@ -5730,6 +5746,9 @@ public class ConnectivityServiceTest { && caps.hasTransport(TRANSPORT_CELLULAR) && !caps.hasTransport(TRANSPORT_WIFI) && !caps.hasCapability(NET_CAPABILITY_NOT_METERED) && caps.hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); + // The return value of getDefaultNetworkCapabilitiesForUser always includes the default + // network (wifi) as well as the underlying networks (cell). + assertDefaultNetworkCapabilities(userId, mCellNetworkAgent, mWiFiNetworkAgent); // Remove NOT_SUSPENDED from the only network and observe VPN is now suspended. mCellNetworkAgent.removeCapability(NET_CAPABILITY_NOT_SUSPENDED); @@ -5758,6 +5777,7 @@ public class ConnectivityServiceTest { && !caps.hasTransport(TRANSPORT_CELLULAR) && caps.hasTransport(TRANSPORT_WIFI) && caps.hasCapability(NET_CAPABILITY_NOT_METERED) && caps.hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); + assertDefaultNetworkCapabilities(userId, mWiFiNetworkAgent); // Use both again. mService.setUnderlyingNetworksForVpn( @@ -5768,6 +5788,7 @@ public class ConnectivityServiceTest { && caps.hasTransport(TRANSPORT_CELLULAR) && caps.hasTransport(TRANSPORT_WIFI) && !caps.hasCapability(NET_CAPABILITY_NOT_METERED) && caps.hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); + assertDefaultNetworkCapabilities(userId, mCellNetworkAgent, mWiFiNetworkAgent); // Cell is suspended again. As WiFi is not, this should not cause a callback. mCellNetworkAgent.removeCapability(NET_CAPABILITY_NOT_SUSPENDED); @@ -5785,6 +5806,7 @@ public class ConnectivityServiceTest { // a bug in ConnectivityService, but as the SUSPENDED and RESUMED callbacks have never // been public and are deprecated and slated for removal, there is no sense in spending // resources fixing this bug now. + assertDefaultNetworkCapabilities(userId, mCellNetworkAgent, mWiFiNetworkAgent); // Use both again. mService.setUnderlyingNetworksForVpn( @@ -5797,6 +5819,7 @@ public class ConnectivityServiceTest { && caps.hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); // As above, the RESUMED callback not being sent here is a bug, but not a bug that's // worth anybody's time to fix. + assertDefaultNetworkCapabilities(userId, mCellNetworkAgent, mWiFiNetworkAgent); // Disconnect cell. Receive update without even removing the dead network from the // underlying networks – it's dead anyway. Not metered any more. @@ -5805,6 +5828,7 @@ public class ConnectivityServiceTest { (caps) -> caps.hasTransport(TRANSPORT_VPN) && !caps.hasTransport(TRANSPORT_CELLULAR) && caps.hasTransport(TRANSPORT_WIFI) && caps.hasCapability(NET_CAPABILITY_NOT_METERED)); + assertDefaultNetworkCapabilities(userId, mWiFiNetworkAgent); // Disconnect wifi too. No underlying networks means this is now metered. mWiFiNetworkAgent.disconnect(); @@ -5812,6 +5836,11 @@ public class ConnectivityServiceTest { (caps) -> caps.hasTransport(TRANSPORT_VPN) && !caps.hasTransport(TRANSPORT_CELLULAR) && !caps.hasTransport(TRANSPORT_WIFI) && !caps.hasCapability(NET_CAPABILITY_NOT_METERED)); + // When a network disconnects, the callbacks are fired before all state is updated, so for a + // short time, synchronous calls will behave as if the network is still connected. Wait for + // things to settle. + waitForIdle(); + assertDefaultNetworkCapabilities(userId /* no networks */); mMockVpn.disconnect(); } From 27ecde937319012a3fc07783e1133e14111da788 Mon Sep 17 00:00:00 2001 From: Lorenzo Colitti Date: Thu, 7 Jan 2021 23:33:18 +0900 Subject: [PATCH 118/288] Test for bugs with suspended VPN underlying networks. Bug: 172870110 Test: atest --rerun-until-failure 100 ConnectivityServiceTest#testVpnSwitchFromSuspendedToNonSuspended Change-Id: Ia52f9cafef3f49ae70ad135d017e207eb57fddfe Merged-In: Ia52f9cafef3f49ae70ad135d017e207eb57fddfe --- .../server/ConnectivityServiceTest.java | 115 ++++++++++++++++++ 1 file changed, 115 insertions(+) diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index fb370a0f7124b..ffd6b28e8b0d5 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -5433,6 +5433,121 @@ public class ConnectivityServiceTest { mCm.unregisterNetworkCallback(callback); } + private void assertGetNetworkInfoOfGetActiveNetworkIsConnected(boolean expectedConnectivity) { + // What Chromium used to do before https://chromium-review.googlesource.com/2605304 + assertEquals("Unexpected result for getActiveNetworkInfo(getActiveNetwork())", + expectedConnectivity, mCm.getNetworkInfo(mCm.getActiveNetwork()).isConnected()); + } + + @Test + public void testVpnUnderlyingNetworkSuspended() throws Exception { + final TestNetworkCallback callback = new TestNetworkCallback(); + mCm.registerDefaultNetworkCallback(callback); + + // Connect a VPN. + mMockVpn.establishForMyUid(false, true, false); + callback.expectAvailableCallbacksUnvalidated(mMockVpn); + + // Connect cellular data. + mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR); + mCellNetworkAgent.connect(false /* validated */); + callback.expectCapabilitiesThat(mMockVpn, + nc -> nc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED) + && nc.hasTransport(TRANSPORT_CELLULAR)); + callback.assertNoCallback(); + + assertTrue(mCm.getNetworkCapabilities(mMockVpn.getNetwork()) + .hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); + assertNetworkInfo(TYPE_MOBILE, DetailedState.CONNECTED); + assertNetworkInfo(TYPE_WIFI, DetailedState.DISCONNECTED); + assertNetworkInfo(TYPE_VPN, DetailedState.CONNECTED); + assertActiveNetworkInfo(TYPE_MOBILE, DetailedState.CONNECTED); + assertGetNetworkInfoOfGetActiveNetworkIsConnected(true); + + // Suspend the cellular network and expect the VPN to be suspended. + mCellNetworkAgent.suspend(); + callback.expectCapabilitiesThat(mMockVpn, + nc -> !nc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED) + && nc.hasTransport(TRANSPORT_CELLULAR)); + callback.expectCallback(CallbackEntry.SUSPENDED, mMockVpn); + callback.assertNoCallback(); + + assertFalse(mCm.getNetworkCapabilities(mMockVpn.getNetwork()) + .hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); + assertNetworkInfo(TYPE_MOBILE, DetailedState.SUSPENDED); + assertNetworkInfo(TYPE_WIFI, DetailedState.DISCONNECTED); + assertNetworkInfo(TYPE_VPN, DetailedState.SUSPENDED); + assertActiveNetworkInfo(TYPE_MOBILE, DetailedState.SUSPENDED); + // VPN's main underlying network is suspended, so no connectivity. + assertGetNetworkInfoOfGetActiveNetworkIsConnected(false); + + // Switch to another network. The VPN should no longer be suspended. + mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); + mWiFiNetworkAgent.connect(false /* validated */); + callback.expectCapabilitiesThat(mMockVpn, + nc -> nc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED) + && nc.hasTransport(TRANSPORT_WIFI)); + + // BUG: the VPN is no longer suspended, so a RESUMED callback should have been sent. + // callback.expectCallback(CallbackEntry.RESUMED, mMockVpn); + callback.assertNoCallback(); + + assertTrue(mCm.getNetworkCapabilities(mMockVpn.getNetwork()) + .hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); + assertNetworkInfo(TYPE_MOBILE, DetailedState.DISCONNECTED); + assertNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED); + assertNetworkInfo(TYPE_VPN, DetailedState.SUSPENDED); // BUG: VPN caps have NOT_SUSPENDED. + assertActiveNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED); + // BUG: the device has connectivity, so this should return true. + assertGetNetworkInfoOfGetActiveNetworkIsConnected(false); + + // Unsuspend cellular and then switch back to it. + // The same bug happens in the opposite direction: the VPN's capabilities correctly have + // NOT_SUSPENDED, but the VPN's NetworkInfo is in state SUSPENDED. + mCellNetworkAgent.resume(); + mWiFiNetworkAgent.disconnect(); + callback.expectCapabilitiesThat(mMockVpn, + nc -> nc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED) + && nc.hasTransport(TRANSPORT_CELLULAR)); + // Spurious double callback? + callback.expectCapabilitiesThat(mMockVpn, + nc -> nc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED) + && nc.hasTransport(TRANSPORT_CELLULAR)); + callback.assertNoCallback(); + + assertTrue(mCm.getNetworkCapabilities(mMockVpn.getNetwork()) + .hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); + assertNetworkInfo(TYPE_MOBILE, DetailedState.CONNECTED); + assertNetworkInfo(TYPE_WIFI, DetailedState.DISCONNECTED); + assertNetworkInfo(TYPE_VPN, DetailedState.SUSPENDED); // BUG: VPN caps have NOT_SUSPENDED. + assertNull(mCm.getActiveNetworkInfo()); // ??? + // BUG: the device has connectivity, so this should return true. + assertGetNetworkInfoOfGetActiveNetworkIsConnected(false); + + // Suspending and resuming reveals other bugs. + mCellNetworkAgent.suspend(); + callback.assertNoCallback(); // BUG: should get callback that VPN is suspended. + + assertTrue(mCm.getNetworkCapabilities(mMockVpn.getNetwork()) + .hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); // BUG: VPN should be SUSPENDED. + assertNetworkInfo(TYPE_MOBILE, DetailedState.SUSPENDED); + assertNetworkInfo(TYPE_WIFI, DetailedState.DISCONNECTED); + assertNetworkInfo(TYPE_VPN, DetailedState.SUSPENDED); + assertNull(mCm.getActiveNetworkInfo()); // ??? + assertGetNetworkInfoOfGetActiveNetworkIsConnected(false); + + mCellNetworkAgent.resume(); + callback.assertNoCallback(); // BUG: should get callback that VPN is no longer suspended. + + assertTrue(mCm.getNetworkCapabilities(mMockVpn.getNetwork()) + .hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); + assertNetworkInfo(TYPE_MOBILE, DetailedState.CONNECTED); + assertNetworkInfo(TYPE_WIFI, DetailedState.DISCONNECTED); + assertNetworkInfo(TYPE_VPN, DetailedState.SUSPENDED); + assertNull(mCm.getActiveNetworkInfo()); // ??? + assertGetNetworkInfoOfGetActiveNetworkIsConnected(false); + } + @Test public void testVpnNetworkActive() throws Exception { final int uid = Process.myUid(); From 4c36cb764a6ffbc81acdbf2297cde010a7396f8b Mon Sep 17 00:00:00 2001 From: Lorenzo Colitti Date: Thu, 28 Jan 2021 18:31:31 +0900 Subject: [PATCH 119/288] Backport some helpers in ConnectivityServiceTest. These were added in aosp/1527378, which is impractical to backport. Bug: 172870110 Test: test-only change Change-Id: Id3d12b23034b284c8f7dffb5167244e1e43987e2 Merged-In: I827543751dbf5e626a24ec02cd6f50b423f5f761 --- .../android/server/ConnectivityServiceTest.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index ffd6b28e8b0d5..d8e1f0a434f1d 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -36,6 +36,7 @@ import static android.net.ConnectivityManager.TYPE_MOBILE; import static android.net.ConnectivityManager.TYPE_MOBILE_FOTA; import static android.net.ConnectivityManager.TYPE_MOBILE_MMS; import static android.net.ConnectivityManager.TYPE_MOBILE_SUPL; +import static android.net.ConnectivityManager.TYPE_VPN; import static android.net.ConnectivityManager.TYPE_WIFI; import static android.net.INetworkMonitor.NETWORK_VALIDATION_PROBE_DNS; import static android.net.INetworkMonitor.NETWORK_VALIDATION_PROBE_FALLBACK; @@ -6289,6 +6290,19 @@ public class ConnectivityServiceTest { mCm.unregisterNetworkCallback(defaultCallback); } + private void checkNetworkInfo(NetworkInfo ni, int type, DetailedState state) { + assertNotNull(ni); + assertEquals(type, ni.getType()); + assertEquals(ConnectivityManager.getNetworkTypeName(type), state, ni.getDetailedState()); + } + + private void assertActiveNetworkInfo(int type, DetailedState state) { + checkNetworkInfo(mCm.getActiveNetworkInfo(), type, state); + } + private void assertNetworkInfo(int type, DetailedState state) { + checkNetworkInfo(mCm.getNetworkInfo(type), type, state); + } + @Test public final void testLoseTrusted() throws Exception { final NetworkRequest trustedRequest = new NetworkRequest.Builder() From 55229beb747b9e7b8a0f392d855a1b3342df8646 Mon Sep 17 00:00:00 2001 From: Lorenzo Colitti Date: Tue, 12 Jan 2021 00:34:44 +0900 Subject: [PATCH 120/288] Backport test coverage from aosp/1547496. This test coverage is necessary to fix an upcoming bug in R. Backport it from the change that added it. The non-test portion of that change is not necessary in R because it fixes a bug that was introduced in S. Bug: 172870110 Test: accompanying unit test shows lots of bugs removed Change-Id: If7eb8857474d8b4f774f5fa5db2a3112e85c9cae Merged-In: Ibf376a6fa4b34d1c96f8506fa8abbb7595a8c272 --- .../server/ConnectivityServiceTest.java | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index d8e1f0a434f1d..3d4ff41d65fbc 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -5521,32 +5521,40 @@ public class ConnectivityServiceTest { assertNetworkInfo(TYPE_MOBILE, DetailedState.CONNECTED); assertNetworkInfo(TYPE_WIFI, DetailedState.DISCONNECTED); assertNetworkInfo(TYPE_VPN, DetailedState.SUSPENDED); // BUG: VPN caps have NOT_SUSPENDED. - assertNull(mCm.getActiveNetworkInfo()); // ??? + assertActiveNetworkInfo(TYPE_MOBILE, DetailedState.CONNECTED); // BUG: the device has connectivity, so this should return true. assertGetNetworkInfoOfGetActiveNetworkIsConnected(false); - // Suspending and resuming reveals other bugs. + // Re-suspending the current network fixes the problem. mCellNetworkAgent.suspend(); - callback.assertNoCallback(); // BUG: should get callback that VPN is suspended. + callback.expectCapabilitiesThat(mMockVpn, + nc -> !nc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED) + && nc.hasTransport(TRANSPORT_CELLULAR)); + callback.expectCallback(CallbackEntry.SUSPENDED, mMockVpn); + callback.assertNoCallback(); - assertTrue(mCm.getNetworkCapabilities(mMockVpn.getNetwork()) - .hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); // BUG: VPN should be SUSPENDED. + assertFalse(mCm.getNetworkCapabilities(mMockVpn.getNetwork()) + .hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); assertNetworkInfo(TYPE_MOBILE, DetailedState.SUSPENDED); assertNetworkInfo(TYPE_WIFI, DetailedState.DISCONNECTED); assertNetworkInfo(TYPE_VPN, DetailedState.SUSPENDED); - assertNull(mCm.getActiveNetworkInfo()); // ??? + assertActiveNetworkInfo(TYPE_MOBILE, DetailedState.SUSPENDED); assertGetNetworkInfoOfGetActiveNetworkIsConnected(false); mCellNetworkAgent.resume(); - callback.assertNoCallback(); // BUG: should get callback that VPN is no longer suspended. + callback.expectCapabilitiesThat(mMockVpn, + nc -> nc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED) + && nc.hasTransport(TRANSPORT_CELLULAR)); + callback.expectCallback(CallbackEntry.RESUMED, mMockVpn); + callback.assertNoCallback(); assertTrue(mCm.getNetworkCapabilities(mMockVpn.getNetwork()) .hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); assertNetworkInfo(TYPE_MOBILE, DetailedState.CONNECTED); assertNetworkInfo(TYPE_WIFI, DetailedState.DISCONNECTED); - assertNetworkInfo(TYPE_VPN, DetailedState.SUSPENDED); - assertNull(mCm.getActiveNetworkInfo()); // ??? - assertGetNetworkInfoOfGetActiveNetworkIsConnected(false); + assertNetworkInfo(TYPE_VPN, DetailedState.CONNECTED); + assertActiveNetworkInfo(TYPE_MOBILE, DetailedState.CONNECTED); + assertGetNetworkInfoOfGetActiveNetworkIsConnected(true); } @Test From 5b90ebaf4d9edefcd9648b46cd0226f882169476 Mon Sep 17 00:00:00 2001 From: Lorenzo Colitti Date: Mon, 11 Jan 2021 22:27:57 +0900 Subject: [PATCH 121/288] Fix legacy APIs when VPN switches to suspended underlying network. Currently, when the VPN underlying network changes from a network that is not suspended to one that is suspended (or vice versa), some of the legacy APIs return incorrect results. This is because the VPN's NetworkInfo can get into SUSPENDED state even though the capabilities have the NOT_SUSPENDED capability. This happens because the code in updateCapabilities that checks for changes in NOT_SUSPENDED and NOT_ROAMING (which are the capabilities that can affect the NetworkInfo state) is only run when the capabilities change in a certain way. Fix this by always checking for changes in these capabilities, regardless of what else has changed. This results in sending a lot more SUSPENDED and RESUMED callbacks than the code sent previously. This should hopefully not impact apps because those callback methods have never been public API, though because they're just callbacks, it's possible that apps found out via code inspection that the callbacks existed and implemented them. Bug: 172870110 Test: changes to existing tests in ConnectivityServiceTest Change-Id: I6ec246a6a4e61f634956a165797fbb80296efd6a Merged-In: I6ec246a6a4e61f634956a165797fbb80296efd6a --- .../android/server/ConnectivityService.java | 33 +++++++++++-------- .../server/ConnectivityServiceTest.java | 29 ++++++---------- 2 files changed, 30 insertions(+), 32 deletions(-) diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index cf14c6377d210..a1cbd00e360f1 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -6318,6 +6318,25 @@ public class ConnectivityService extends IConnectivityManager.Stub return newNc; } + private void updateNetworkInfoForRoamingAndSuspended(NetworkAgentInfo nai, + NetworkCapabilities prevNc, NetworkCapabilities newNc) { + final boolean prevSuspended = !prevNc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED); + final boolean suspended = !newNc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED); + final boolean prevRoaming = !prevNc.hasCapability(NET_CAPABILITY_NOT_ROAMING); + final boolean roaming = !newNc.hasCapability(NET_CAPABILITY_NOT_ROAMING); + if (prevSuspended != suspended) { + // TODO (b/73132094) : remove this call once the few users of onSuspended and + // onResumed have been removed. + notifyNetworkCallbacks(nai, suspended ? ConnectivityManager.CALLBACK_SUSPENDED + : ConnectivityManager.CALLBACK_RESUMED); + } + if (prevSuspended != suspended || prevRoaming != roaming) { + // updateNetworkInfo will mix in the suspended info from the capabilities and + // take appropriate action for the network having possibly changed state. + updateNetworkInfo(nai, nai.networkInfo); + } + } + /** * Update the NetworkCapabilities for {@code nai} to {@code nc}. Specifically: * @@ -6349,25 +6368,13 @@ public class ConnectivityService extends IConnectivityManager.Stub // on this network. We might have been called by rematchNetworkAndRequests when a // network changed foreground state. processListenRequests(nai); - final boolean prevSuspended = !prevNc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED); - final boolean suspended = !newNc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED); - final boolean prevRoaming = !prevNc.hasCapability(NET_CAPABILITY_NOT_ROAMING); - final boolean roaming = !newNc.hasCapability(NET_CAPABILITY_NOT_ROAMING); - if (prevSuspended != suspended || prevRoaming != roaming) { - // TODO (b/73132094) : remove this call once the few users of onSuspended and - // onResumed have been removed. - notifyNetworkCallbacks(nai, suspended ? ConnectivityManager.CALLBACK_SUSPENDED - : ConnectivityManager.CALLBACK_RESUMED); - // updateNetworkInfo will mix in the suspended info from the capabilities and - // take appropriate action for the network having possibly changed state. - updateNetworkInfo(nai, nai.networkInfo); - } } else { // If the requestable capabilities have changed or the score changed, we can't have been // called by rematchNetworkAndRequests, so it's safe to start a rematch. rematchAllNetworksAndRequests(); notifyNetworkCallbacks(nai, ConnectivityManager.CALLBACK_CAP_CHANGED); } + updateNetworkInfoForRoamingAndSuspended(nai, prevNc, newNc); // TODO : static analysis indicates that prevNc can't be null here (getAndSetNetworkCaps // never returns null), so mark the relevant members and functions in nai as @NonNull and diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index 3d4ff41d65fbc..a5554c740e7f7 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -5488,23 +5488,18 @@ public class ConnectivityServiceTest { callback.expectCapabilitiesThat(mMockVpn, nc -> nc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED) && nc.hasTransport(TRANSPORT_WIFI)); - - // BUG: the VPN is no longer suspended, so a RESUMED callback should have been sent. - // callback.expectCallback(CallbackEntry.RESUMED, mMockVpn); + callback.expectCallback(CallbackEntry.RESUMED, mMockVpn); callback.assertNoCallback(); assertTrue(mCm.getNetworkCapabilities(mMockVpn.getNetwork()) .hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); assertNetworkInfo(TYPE_MOBILE, DetailedState.DISCONNECTED); assertNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED); - assertNetworkInfo(TYPE_VPN, DetailedState.SUSPENDED); // BUG: VPN caps have NOT_SUSPENDED. + assertNetworkInfo(TYPE_VPN, DetailedState.CONNECTED); assertActiveNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED); - // BUG: the device has connectivity, so this should return true. - assertGetNetworkInfoOfGetActiveNetworkIsConnected(false); + assertGetNetworkInfoOfGetActiveNetworkIsConnected(true); - // Unsuspend cellular and then switch back to it. - // The same bug happens in the opposite direction: the VPN's capabilities correctly have - // NOT_SUSPENDED, but the VPN's NetworkInfo is in state SUSPENDED. + // Unsuspend cellular and then switch back to it. The VPN remains not suspended. mCellNetworkAgent.resume(); mWiFiNetworkAgent.disconnect(); callback.expectCapabilitiesThat(mMockVpn, @@ -5520,12 +5515,11 @@ public class ConnectivityServiceTest { .hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); assertNetworkInfo(TYPE_MOBILE, DetailedState.CONNECTED); assertNetworkInfo(TYPE_WIFI, DetailedState.DISCONNECTED); - assertNetworkInfo(TYPE_VPN, DetailedState.SUSPENDED); // BUG: VPN caps have NOT_SUSPENDED. + assertNetworkInfo(TYPE_VPN, DetailedState.CONNECTED); assertActiveNetworkInfo(TYPE_MOBILE, DetailedState.CONNECTED); - // BUG: the device has connectivity, so this should return true. - assertGetNetworkInfoOfGetActiveNetworkIsConnected(false); + assertGetNetworkInfoOfGetActiveNetworkIsConnected(true); - // Re-suspending the current network fixes the problem. + // Suspend cellular and expect no connectivity. mCellNetworkAgent.suspend(); callback.expectCapabilitiesThat(mMockVpn, nc -> !nc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED) @@ -5541,6 +5535,7 @@ public class ConnectivityServiceTest { assertActiveNetworkInfo(TYPE_MOBILE, DetailedState.SUSPENDED); assertGetNetworkInfoOfGetActiveNetworkIsConnected(false); + // Resume cellular and expect that connectivity comes back. mCellNetworkAgent.resume(); callback.expectCapabilitiesThat(mMockVpn, nc -> nc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED) @@ -5926,10 +5921,7 @@ public class ConnectivityServiceTest { && caps.hasTransport(TRANSPORT_CELLULAR) && !caps.hasCapability(NET_CAPABILITY_NOT_METERED) && !caps.hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); - // While the SUSPENDED callback should in theory be sent here, it is not. This is - // a bug in ConnectivityService, but as the SUSPENDED and RESUMED callbacks have never - // been public and are deprecated and slated for removal, there is no sense in spending - // resources fixing this bug now. + vpnNetworkCallback.expectCallback(CallbackEntry.SUSPENDED, mMockVpn); assertDefaultNetworkCapabilities(userId, mCellNetworkAgent, mWiFiNetworkAgent); // Use both again. @@ -5941,8 +5933,7 @@ public class ConnectivityServiceTest { && caps.hasTransport(TRANSPORT_CELLULAR) && caps.hasTransport(TRANSPORT_WIFI) && !caps.hasCapability(NET_CAPABILITY_NOT_METERED) && caps.hasCapability(NET_CAPABILITY_NOT_SUSPENDED)); - // As above, the RESUMED callback not being sent here is a bug, but not a bug that's - // worth anybody's time to fix. + vpnNetworkCallback.expectCallback(CallbackEntry.RESUMED, mMockVpn); assertDefaultNetworkCapabilities(userId, mCellNetworkAgent, mWiFiNetworkAgent); // Disconnect cell. Receive update without even removing the dead network from the From 8a2656d4b69efcec5140f3de5a9a721ffb21112e Mon Sep 17 00:00:00 2001 From: Miranda Kephart Date: Mon, 16 Nov 2020 11:22:13 -0500 Subject: [PATCH 122/288] [DO NOT MERGE] Close screenshot process on user switched Currently, we keep the process up even if the user switches, meaning that in some cases (if the user is switched while the screenshot UI is up) we will save images to the wrong profile. This change makes ScreenshotHelper listen for user switches and close the screenshot service, so that a new screenshot is guaranteed to be constructed with the correct user's context. Bug: 170474245 Fix: 170474245 Test: manual -- verified bad state occurs if user switches within the timeout period, ensured that screenshots work immediately after switching with this change. Change-Id: I9d32d0928e6c2bda161d04555438d0dd7afef0ba (cherry picked from commit 7ef1a5dd1506075507412626f2533283d9520144) --- .../server/policy/PhoneWindowManager.java | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index cd82d086d6efa..ada1ce3fa5dce 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -5837,8 +5837,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { @Override public void run() { synchronized (mScreenshotLock) { if (mScreenshotConnection != null) { - mContext.unbindService(mScreenshotConnection); - mScreenshotConnection = null; + resetScreenshotConnection(); notifyScreenshotError(); } } @@ -5870,8 +5869,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { public void handleMessage(Message msg) { synchronized (mScreenshotLock) { if (mScreenshotConnection == myConn) { - mContext.unbindService(mScreenshotConnection); - mScreenshotConnection = null; + resetScreenshotConnection(); mHandler.removeCallbacks(mScreenshotTimeout); } } @@ -5894,8 +5892,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { public void onServiceDisconnected(ComponentName name) { synchronized (mScreenshotLock) { if (mScreenshotConnection != null) { - mContext.unbindService(mScreenshotConnection); - mScreenshotConnection = null; + resetScreenshotConnection(); mHandler.removeCallbacks(mScreenshotTimeout); notifyScreenshotError(); } @@ -5925,6 +5922,16 @@ public class PhoneWindowManager implements WindowManagerPolicy { mContext.sendBroadcastAsUser(errorIntent, UserHandle.CURRENT); } + /** + * Reset the screenshot connection. + */ + private void resetScreenshotConnection() { + if (mScreenshotConnection != null) { + mContext.unbindService(mScreenshotConnection); + mScreenshotConnection = null; + } + } + /** {@inheritDoc} */ @Override public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) { @@ -6605,6 +6612,12 @@ public class PhoneWindowManager implements WindowManagerPolicy { mLastSystemUiFlags = 0; updateSystemUiVisibilityLw(); } + + // close the screenshot connection on user switch so that screenshots + // are always started with the correct user's context + synchronized(mScreenshotLock) { + resetScreenshotConnection(); + } } } }; From 2d062e56f1d2e6f7340b53feea107a3f50d88f13 Mon Sep 17 00:00:00 2001 From: Keun young Park Date: Fri, 11 Dec 2020 14:59:16 -0800 Subject: [PATCH 123/288] Change setPrimaryStorageUuid to handle it for the current user - It used hard coded user 0 and that breaks it for secondary users. Current user should be enough if this move is triggered from settings which is run from the current user. - For device with no user switching from user 0, this should not make any differences. - This change also fixes failure of CTS android.appsecurity.cts.AdoptableHostTest#testPrimaryStorage. - In longer term, we need separate setPrimaryStorageUuidAsUser API to control it per each user. Bug: 174593750 Test: atest android.appsecurity.cts.AdoptableHostTest#testPrimaryStorage Change-Id: I87c821903987d22e8d26ade92120b99a33897168 Merged-In: I87c821903987d22e8d26ade92120b99a33897168 (cherry picked from commit 9aa55f0168864186180e9090197889bee70fbb60) --- .../android/server/StorageManagerService.java | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java index 391923324d0ce..392894616bf43 100644 --- a/services/core/java/com/android/server/StorageManagerService.java +++ b/services/core/java/com/android/server/StorageManagerService.java @@ -58,6 +58,7 @@ import static org.xmlpull.v1.XmlPullParser.START_TAG; import android.Manifest; import android.annotation.Nullable; +import android.annotation.UserIdInt; import android.app.ActivityManager; import android.app.ActivityManagerInternal; import android.app.AppOpsManager; @@ -511,14 +512,21 @@ class StorageManagerService extends IStorageManager.Stub } } - private @Nullable VolumeInfo findStorageForUuid(String volumeUuid) { + private @Nullable VolumeInfo findStorageForUuidAsUser(String volumeUuid, + @UserIdInt int userId) { final StorageManager storage = mContext.getSystemService(StorageManager.class); if (Objects.equals(StorageManager.UUID_PRIVATE_INTERNAL, volumeUuid)) { - return storage.findVolumeById(VolumeInfo.ID_EMULATED_INTERNAL + ";" + 0); + return storage.findVolumeById(VolumeInfo.ID_EMULATED_INTERNAL + ";" + userId); } else if (Objects.equals(StorageManager.UUID_PRIMARY_PHYSICAL, volumeUuid)) { return storage.getPrimaryPhysicalVolume(); } else { - return storage.findEmulatedForPrivate(storage.findVolumeByUuid(volumeUuid)); + VolumeInfo info = storage.findVolumeByUuid(volumeUuid); + if (info == null) { + Slog.w(TAG, "findStorageForUuidAsUser cannot find volumeUuid:" + volumeUuid); + return null; + } + String emulatedUuid = info.getId().replace("private", "emulated") + ";" + userId; + return storage.findVolumeById(emulatedUuid); } } @@ -2763,8 +2771,9 @@ class StorageManagerService extends IStorageManager.Stub return; } else { - from = findStorageForUuid(mPrimaryStorageUuid); - to = findStorageForUuid(volumeUuid); + int currentUserId = mCurrentUserId; + from = findStorageForUuidAsUser(mPrimaryStorageUuid, currentUserId); + to = findStorageForUuidAsUser(volumeUuid, currentUserId); if (from == null) { Slog.w(TAG, "Failing move due to missing from volume " + mPrimaryStorageUuid); From c894d634762206c135bf16b0fd1386b93e5e3912 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 1 Feb 2021 05:26:01 +0000 Subject: [PATCH 124/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I24a8b519e96a7b5122d079e058d859fb57d78366 --- core/res/res/values-as/strings.xml | 2 +- core/res/res/values-ca/strings.xml | 2 +- core/res/res/values-eu/strings.xml | 26 +++---- core/res/res/values-fr-rCA/strings.xml | 2 +- core/res/res/values-gu/strings.xml | 4 +- core/res/res/values-hi/strings.xml | 4 +- core/res/res/values-hr/strings.xml | 2 +- core/res/res/values-kk/strings.xml | 4 +- core/res/res/values-kn/strings.xml | 2 +- core/res/res/values-ml/strings.xml | 2 +- core/res/res/values-mn/strings.xml | 8 +-- core/res/res/values-mr/strings.xml | 22 +++--- core/res/res/values-or/strings.xml | 12 ++-- core/res/res/values-pa/strings.xml | 2 +- core/res/res/values-pt-rPT/strings.xml | 2 +- core/res/res/values-sv/strings.xml | 20 +++--- core/res/res/values-ta/strings.xml | 8 +-- core/res/res/values-te/strings.xml | 96 +++++++++++++------------- core/res/res/values-uz/strings.xml | 14 ++-- 19 files changed, 117 insertions(+), 117 deletions(-) diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml index 4ff2a6a062ec1..54b22ee3578ec 100644 --- a/core/res/res/values-as/strings.xml +++ b/core/res/res/values-as/strings.xml @@ -100,7 +100,7 @@ "নেটৱৰ্ক পীয়েৰে TTY ম\'ড HCOলৈ সলনি কৰিবলৈ অনুৰোধ কৰিছে" "নেটৱৰ্ক পীয়েৰে TTY ম\'ড VCO লৈ সলনি কৰিবলৈ অনুৰোধ কৰিছে" "নেটৱৰ্ক পীয়েৰে TTY ম\'ড OFFলৈ সলনি কৰিবলৈ অনুৰোধ কৰিছে" - "কণ্ঠস্বৰ" + "Voice" "ডেটা" "ফেক্স" "এছএমএছ" diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index f85fe5ac93599..3b2bb14a5db04 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -956,7 +956,7 @@ "Permet que l\'aplicació modifiqui l\'historial del navegador o els marcadors de la tauleta. Això pot permetre que l\'aplicació esborri o modifiqui les dades del navegador. Nota: És possible que aquest permís no s\'apliqui a navegadors de tercers o a altres aplicacions amb capacitats de navegació web." "Permet que l\'aplicació modifiqui l\'historial o les adreces d\'interès que hagis desat al dispositiu Android TV. D\'aquesta manera, l\'aplicació pot esborrar o modificar les dades del navegador. Nota: és possible que aquest permís no s\'apliqui a navegadors de tercers ni a altres aplicacions amb funcions de navegació web." "Permet que l\'aplicació modifiqui l\'historial del navegador o els marcadors del telèfon. Això pot permetre que l\'aplicació esborri o modifiqui les dades del navegador. Nota: És possible que aquest permís no s\'apliqui a navegadors de tercers o a altres aplicacions amb capacitats de navegació web." - "configuració d\'una alarma" + "configurar una alarma" "Permet que l\'aplicació defineixi una alarma en una aplicació de despertador instal·lada. És possible que algunes aplicacions de despertador no incorporin aquesta funció." "afegeix bústia de veu" "Permet que l\'aplicació afegeixi missatges a la safata d\'entrada de la bústia de veu." diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index 5e52506c40db1..b69c08ddfbe5c 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -348,13 +348,13 @@ "jaso testu-mezuak (MMSak)" "MMS mezuak jasotzeko eta prozesatzeko baimena ematen die aplikazioei. Horrela, aplikazioak gailura bidalitako mezuak kontrola eta ezaba ditzake zuri erakutsi gabe." "desbideratu sare mugikor bidezko igorpen-mezuak" - "Sare mugikor bidezko igorpen-modulura lotzeko baimena ematen dio aplikazioari, sare mugikor bidezko igorpen-mezuak jaso ahala desbideratu ahal izateko. Sare mugikor bidezko igorpen-alertak kokapen batzuetan entregatzen dira larrialdi-egoeren berri emateko. Sare mugikor bidezko larrialdi-igorpenak jasotzean, aplikazio gaiztoek gailuaren errendimenduari edota funtzionamenduari eragin diezaiokete." + "Sare mugikor bidezko igorpen-modulura lotzeko baimena ematen dio aplikazioari, sare mugikor bidezko igorpen-mezuak jaso ahala desbideratu ahal izateko. Sare mugikor bidezko igorpen-alertak kokapen batzuetan entregatzen dira larrialdi-egoeren berri emateko. Sare mugikor bidezko larrialdi-igorpenak jasotzean, asmo txarreko aplikazioek gailuaren errendimenduari edota funtzionamenduari eragin diezaiokete." "irakurri sare mugikor bidezko igorpen-mezuak" - "Gailuak jasotako sare mugikor bidezko igorpenen mezuak irakurtzeko baimena ematen die aplikazioei. Sare mugikor bidezko igorpen-alertak kokapen batzuetan ematen dira larrialdi-egoeren berri emateko. Aplikazio gaiztoek gailuaren errendimendua edo funtzionamendua oztopa dezakete larrialdi-igorpen horietako bat jasotzen denean." + "Gailuak jasotako sare mugikor bidezko igorpenen mezuak irakurtzeko baimena ematen die aplikazioei. Sare mugikor bidezko igorpen-alertak kokapen batzuetan ematen dira larrialdi-egoeren berri emateko. Asmo txarreko aplikazioek gailuaren errendimendua edo funtzionamendua oztopa dezakete larrialdi-igorpen horietako bat jasotzen denean." "irakurri harpidetutako jarioak" "Une horretan sinkronizatutako jarioei buruzko xehetasunak lortzeko baimena ematen die aplikazioei." "bidali eta ikusi SMS mezuak" - "SMS mezuak bidaltzeko baimena ematen die aplikazioei. Horrela, ustekabeko gastuak eragin daitezke. Aplikazio gaiztoek erabil dezakete zuk berretsi gabeko mezuak bidalita gastuak eragiteko." + "SMS mezuak bidaltzeko baimena ematen die aplikazioei. Horrela, ustekabeko gastuak eragin daitezke. Asmo txarreko aplikazioek erabil dezakete zuk berretsi gabeko mezuak bidalita gastuak eragiteko." "irakurri testu-mezuak (SMSak edo MMSak)" "Aplikazioak tabletan gordetako SMS mezu (testu-mezu) guztiak irakur ditzake." "Aplikazioek Android TV gailuan gordetako SMS (testu) mezu guztiak irakur ditzakete." @@ -386,7 +386,7 @@ "neurtu aplikazioen biltegiratzeko tokia" "Bere kodea, datuak eta cache-tamainak eskuratzeko baimena ematen die aplikazioei." "aldatu sistemaren ezarpenak" - "Sistemaren ezarpenen datuak aldatzeko baimena ematen die aplikazioei. Aplikazio gaiztoek sistemaren konfigurazioa hondatzeko erabil dezakete." + "Sistemaren ezarpenen datuak aldatzeko baimena ematen die aplikazioei. Asmo txarreko aplikazioek sistemaren konfigurazioa hondatzeko erabil dezakete." "exekutatu abiaraztean" "Sistema berrabiarazi bezain laster abiarazteko baimena ematen die aplikazioei. Horrela, agian denbora gehiago beharko du tabletak abiarazteko, eta tabletaren funtzionamendu orokorra mantso daiteke, baimen hori duten aplikazioak beti abian egongo baitira." "Sistema abiarazi bezain laster beren burua abiarazteko baimena ematen die aplikazioei. Baliteke denbora gehiago behar izatea Android TV gailua abiarazteko eta aplikazioek gailua orokorrean mantsoago ibilarazteko baimena izatea, beti abian izango baita." @@ -396,9 +396,9 @@ "Igorpen iraunkorrak egiteko baimena ematen die aplikazioei. Igorpena amaitu ondoren ere igortzen jarraitzen dute igorpen iraunkorrek. Gehiegi erabiliz gero, Android TV gailua motel edo ezegonkor ibiliko da, memoria gehiago erabiliko delako." "Igorpen iraunkorrak emateko baimena ematen die; horiek igorpena amaitu ondoren mantentzen dira. Gehiegi erabiliz gero, telefonoa motel edo ezegonkor ibiliko da, memoria gehiago erabiliko delako." "irakurri kontaktuak" - "Tabletan gordetako kontaktuei buruzko datuak irakurtzeko baimena ematen dio aplikazioari. Kontaktuak sortu dituzten tabletako kontuak ere atzitu ahalko dituzte aplikazioek. Horrek barnean hartuko ditu instalatutako aplikazioek sortutako kontuak, agian. Baimen horrekin, kontaktuen datuak gorde ditzakete aplikazioek, eta baliteke aplikazio gaiztoek zuk jakin gabe partekatzea datu horiek." - "Android TV gailuan gordetako kontaktuei buruzko datuak irakurtzeko baimena ematen dio aplikazioari. Kontaktuak sortu dituzten Android TV gailuko kontuak ere atzitu ahalko dituzte aplikazioek. Horrek barnean hartuko ditu instalatutako aplikazioek sortutako kontuak, agian. Baimen horrekin, kontaktuen datuak gorde ditzakete aplikazioek, eta baliteke aplikazio gaiztoek zuk jakin gabe partekatzea datu horiek." - "Telefonoan gordetako kontaktuei buruzko datuak irakurtzeko baimena ematen dio aplikazioari. Kontaktuak sortu dituzten telefonoko kontuak ere atzitu ahalko dituzte aplikazioek. Horrek barnean hartuko ditu instalatutako aplikazioek sortutako kontuak, agian. Baimen horrekin, kontaktuen datuak gorde ditzakete aplikazioek, eta baliteke aplikazio gaiztoek zuk jakin gabe partekatzea datu horiek." + "Tabletan gordetako kontaktuei buruzko datuak irakurtzeko baimena ematen dio aplikazioari. Kontaktuak sortu dituzten tabletako kontuak ere atzitu ahalko dituzte aplikazioek. Horrek barnean hartuko ditu instalatutako aplikazioek sortutako kontuak, agian. Baimen horrekin, kontaktuen datuak gorde ditzakete aplikazioek, eta baliteke asmo txarreko aplikazioek zuk jakin gabe partekatzea datu horiek." + "Android TV gailuan gordetako kontaktuei buruzko datuak irakurtzeko baimena ematen dio aplikazioari. Kontaktuak sortu dituzten Android TV gailuko kontuak ere atzitu ahalko dituzte aplikazioek. Horrek barnean hartuko ditu instalatutako aplikazioek sortutako kontuak, agian. Baimen horrekin, kontaktuen datuak gorde ditzakete aplikazioek, eta baliteke asmo txarreko aplikazioek zuk jakin gabe partekatzea datu horiek." + "Telefonoan gordetako kontaktuei buruzko datuak irakurtzeko baimena ematen dio aplikazioari. Kontaktuak sortu dituzten telefonoko kontuak ere atzitu ahalko dituzte aplikazioek. Horrek barnean hartuko ditu instalatutako aplikazioek sortutako kontuak, agian. Baimen horrekin, kontaktuen datuak gorde ditzakete aplikazioek, eta baliteke asmo txarreko aplikazioek zuk jakin gabe partekatzea datu horiek." "aldatu kontaktuak" "Tabletan gordetako kontaktuei buruzko datuak aldatzeko baimena ematen dio aplikazioari. Baimen horrekin, aplikazioek kontaktuen datuak ezaba ditzakete." "Android TV gailuan gordetako kontaktuei buruzko datuak aldatzeko baimena ematen dio aplikazioari. Baimen horrekin, aplikazioek kontaktuen datuak ezaba ditzakete." @@ -406,9 +406,9 @@ "irakurri deien erregistroa" "Aplikazioak deien historia irakur dezake." "idatzi deien erregistroan" - "Tabletaren deien erregistroa aldatzeko baimena ematen die aplikazioei, sarrerako eta irteerako deiei buruzko datuak barne. Aplikazio gaiztoek deien erregistroa ezabatzeko edo aldatzeko erabil dezakete." - "Android TV gailuko deien erregistroa aldatzeko baimena ematen die aplikazioei, jasotako eta egindako deiei buruzko datuak barne. Baliteke aplikazio gaiztoek deien erregistroa ezabatzea edo aldatzea." - "Telefonoaren deien erregistroa aldatzeko baimena ematen die aplikazioei, sarrerako eta irteerako deiei buruzko datuak barne. Aplikazio gaiztoek deien erregistroa ezabatzeko edo aldatzeko erabil dezakete." + "Tabletaren deien erregistroa aldatzeko baimena ematen die aplikazioei, sarrerako eta irteerako deiei buruzko datuak barne. Asmo txarreko aplikazioek deien erregistroa ezabatzeko edo aldatzeko erabil dezakete." + "Android TV gailuko deien erregistroa aldatzeko baimena ematen die aplikazioei, jasotako eta egindako deiei buruzko datuak barne. Baliteke asmo txarreko aplikazioek deien erregistroa ezabatzea edo aldatzea." + "Telefonoaren deien erregistroa aldatzeko baimena ematen die aplikazioei, sarrerako eta irteerako deiei buruzko datuak barne. Asmo txarreko aplikazioek deien erregistroa ezabatzeko edo aldatzeko erabil dezakete." "Atzitu gorputzaren sentsoreak (adibidez, bihotz-maiztasunarenak)" "Zure egoera fisikoa kontrolatzen duten sentsoreetako datuak (adibidez, bihotz-maiztasuna) atzitzeko baimena ematen die aplikazioei." "irakurri egutegiko gertaerak eta xehetasunak" @@ -445,7 +445,7 @@ "Bibragailua kontrolatzeko aukera ematen die aplikazioei." "Dardara-egoera atzitzeko baimena ematen dio aplikazioari." "deitu zuzenean telefono-zenbakietara" - "Telefono-zenbakietara zuk esku hartu gabe deitzeko baimena ematen die aplikazioei. Horrela, ustekabeko gastuak edo deiak eragin daitezke. Aplikazio gaiztoek erabil dezakete zuk berretsi gabeko deiak eginda gastuak eragiteko." + "Telefono-zenbakietara zuk esku hartu gabe deitzeko baimena ematen die aplikazioei. Horrela, ustekabeko gastuak edo deiak eragin daitezke. Asmo txarreko aplikazioek erabil dezakete zuk berretsi gabeko deiak eginda gastuak eragiteko." "atzitu IMS dei-zerbitzua" "Zuk ezer egin beharrik gabe deiak egiteko IMS zerbitzua erabiltzeko baimena ematen die aplikazioei." "irakurri telefonoaren egoera eta identitatea" @@ -961,7 +961,7 @@ "gehitu erantzungailua" "Erantzungailuko sarrera-ontzian mezuak gehitzeko baimena ematen die aplikazioei." "aldatu arakatzailearen geokokapenaren baimenak" - "Arakatzailearen geokokapenaren baimenak aldatzeko baimena ematen die aplikazioei. Aplikazio gaiztoek hori erabil dezakete kokapenari buruzko informazioa haiek hautatutako webguneetara bidaltzeko." + "Arakatzailearen geokokapenaren baimenak aldatzeko baimena ematen die aplikazioei. Asmo txarreko aplikazioek hori erabil dezakete kokapenari buruzko informazioa haiek hautatutako webguneetara bidaltzeko." "Arakatzaileak pasahitza gogoratzea nahi duzu?" "Ez une honetan" "Gogoratu" @@ -1574,7 +1574,7 @@ "Pantaila integratua" "HDMI pantaila" "%1$d. gainjartzea" - "%1$s: %2$d x %3$d, %4$d dpi" + "%1$s: %2$d × %3$d, %4$d dpi" ", segurua" "Eredua ahaztu zaizu" "Eredu okerra" diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index 29fe1364f1f45..f12725ff7c155 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -854,7 +854,7 @@ "Appels d\'urgence uniquement" "Réseau verrouillé" "La carte SIM est verrouillée par clé PUK." - "Veuillez consulter le guide utilisateur ou contacter le service à la clientèle." + "Veuillez consulter le guide d\'utilisation ou contacter le service à la clientèle." "La carte SIM est verrouillée." "Déverrouillage de la carte SIM en cours…" "Vous avez dessiné un schéma de déverrouillage incorrect à %1$d reprises.\n\nVeuillez réessayer dans %2$d secondes." diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index 55e462c825720..25d997ae49bb2 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -100,7 +100,7 @@ "પીઅરે TTY મોડ HCO ની વિનંતી કરી" "પીઅરે TTY મોડ VCO ની વિનંતી કરી" "પીઅરે TTY મોડ બંધ કરવાની વિનંતી કરી" - "અવાજ" + "Voice" "ડેટા" "ફેક્સ" "SMS" @@ -1306,7 +1306,7 @@ "કનેક્ટ કરેલ ઉપકરણ ચાર્જ થઈ રહ્યું છે. વધુ વિકલ્પો માટે ટૅપ કરો." "એનાલોગ ઑડિઓ ઍક્સેસરી મળી" "જોડેલ ઉપકરણ આ ફોન સાથે સુસંગત નથી. વધુ જાણવા માટે ટૅપ કરો." - "USB ડીબગિંગ કનેક્ટ થયું." + "USB ડિબગીંગ કનેક્ટ થયું." "USB ડિબગીંગ બંધ કરવા માટે ટૅપ કરો" "USB ડિબગીંગને અક્ષમ કરવા માટે પસંદ કરો." "વાયરલેસ ડિબગીંગ કનેક્ટ કરો" diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 7d48ce034dbfe..86af9a7186877 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -100,7 +100,7 @@ "पीयर ने टेलीटाइपराइटर (TTY) मोड एचसीओ (HCO) का अनुरोध किया" "पीयर ने टेलीटाइपराइटर (TTY) मोड वीसीओ (VCO) का अनुरोध किया" "पीयर ने टेलीटाइपराइटर (TTY) मोड बंद का अनुरोध किया" - "आवाज़" + "Voice" "डेटा" "फ़ैक्स" "मैसेज (एसएमएस)" @@ -1153,7 +1153,7 @@ "सिस्‍टम सेटिंग और डाउनलोड किए गए ऐप में डिफ़ॉल्‍ट साफ़ करें." "कोई कार्रवाई चुनें" "USB डिवाइस के लिए कोई ऐप्स चुनें" - "कोई भी ऐप्स यह कार्यवाही नहीं कर सकता." + "कोई भी ऐप्लिकेशन यह कार्रवाई नहीं कर सकता." "%1$s रुक गया है" "%1$s रुक गई है" "%1$s रुक रहा है" diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index d0ad16e93f9a9..de8d4cfa9b14a 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -1327,7 +1327,7 @@ "Otkriven je analogni audiododatak" "Priključeni uređaj nije kompatibilan s ovim telefonom. Dodirnite da biste saznali više." "Priključen je alat za otklanjanje pogrešaka putem USB-a" - "Dodirnite da isključite otklanjanje pogrešaka putem USB-a" + "Dodirnite da isključite otkl. pogrešaka putem USB-a" "Odaberite da biste onemogućili rješavanje programske pogreške na USB-u." "Bežično otklanjanje pogrešaka povezano" "Dodirnite da biste isključili bežično otklanjanje pogrešaka" diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml index 04020fb643a8a..e92f53bd497ee 100644 --- a/core/res/res/values-kk/strings.xml +++ b/core/res/res/values-kk/strings.xml @@ -1794,8 +1794,8 @@ "Жарайды" "Батарея жұмысының ұзақтығын арттыру үшін Батареяны үнемдеу режимі:\n\n•қараңғы тақырыпты іске қосады;\n•фондық әрекеттерді, кейбір көрнекі әсерлерді және \"Ok Google\" сияқты басқа да функцияларды өшіреді не шектейді.\n\n""Толығырақ" "Батарея ұзағырақ жұмыс істеуі үшін, Battery Saver:\n\n• қараңғы тақырыпты қосады;\n•фондық жұмысты, кейбір визуалды әсерлерді және \"Ok Google\" сияқты басқа функцияларды өшіреді не шектейді." - "Дерек шығынын азайту үшін Data Saver функциясы кейбір қолданбаларға деректерді фондық режимде жіберуге және алуға жол бермейді. Ашық тұрған қолданба деректерді пайдаланады, бірақ шектеулі шамада (мысалы, кескіндер оларды түрткенге дейін көрсетілмейді)." - "Data Saver функциясын қосу керек пе?" + "Дерек шығынын азайту үшін Трафикті үнемдеу функциясы кейбір қолданбаларға деректерді фондық режимде жіберуге және алуға жол бермейді. Ашық тұрған қолданба деректерді пайдаланады, бірақ шектеулі шамада (мысалы, кескіндер оларды түрткенге дейін көрсетілмейді)." + "Трафикті үнемдеу функциясын қосу керек пе?" "Қосу" %1$d минут бойы (%2$s дейін) diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml index 9b226889bd4fc..947b28f43ce67 100644 --- a/core/res/res/values-kn/strings.xml +++ b/core/res/res/values-kn/strings.xml @@ -100,7 +100,7 @@ "ಪೀರ್ ವಿನಂತಿಸಿಕೊಂಡ TTY ಮೋಡ್ HCO" "ಪೀರ್ ವಿನಂತಿಸಿಕೊಂಡ TTY ಮೋಡ್ VCO" "ಪೀರ್ ವಿನಂತಿಸಿಕೊಂಡ TTY ಮೋಡ್ ಆಫ್ ಆಗಿದೆ" - "ಧ್ವನಿ" + "Voice" "ಡೇಟಾ" "ಫ್ಯಾಕ್ಸ್" "SMS" diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml index d30861f22b751..1e431ce599629 100644 --- a/core/res/res/values-ml/strings.xml +++ b/core/res/res/values-ml/strings.xml @@ -100,7 +100,7 @@ "പിയർ അഭ്യർത്ഥിച്ച TTY മോഡ് HCO" "പിയർ അഭ്യർത്ഥിച്ച TTY മോഡ് VCO" "പിയർ അഭ്യർത്ഥിച്ച TTY മോഡ് \'ഓഫ്\'" - "ശബ്‌ദം" + "Voice" "ഡാറ്റ" "ഫാക്സ്" "SMS" diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml index 657f680fb8d92..5034c4239d1d3 100644 --- a/core/res/res/values-mn/strings.xml +++ b/core/res/res/values-mn/strings.xml @@ -49,10 +49,10 @@ "8-с цөөнгүй тооноос бүтэх PUK-г бичнэ үү." "SIM картны PUK-түгжигдсэн. Тайлах бол PUK кодыг бичнэ үү." "SIM картыг блокоос гаргах бол PUK2-г бичнэ үү." - "Амжилтгүй боллоо, СИМ/РҮИМ түгжээг идэвхжүүлнэ үү." + "Амжилтгүй боллоо, SIM/РҮИМ түгжээг идэвхжүүлнэ үү." - Таны СИМ түгжигдэхээс өмнө танд %d оролдлого хийх боломж үлдлээ. - Таны СИМ түгжигдэхээс өмнө танд %d оролдлого хийх боломж үлдлээ. + Таны SIM түгжигдэхээс өмнө танд %d оролдлого хийх боломж үлдлээ. + Таны SIM түгжигдэхээс өмнө танд %d оролдлого хийх боломж үлдлээ. "IMEI" "MEID" @@ -798,7 +798,7 @@ "Туслагч" "Ах" "Хүүхэд" - "Дотоод Түнш" + "Хамтран амьдрагч" "Эцэг" "Найз" "Менежер" diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml index a1c4b63b804b7..46057eea940e7 100644 --- a/core/res/res/values-mr/strings.xml +++ b/core/res/res/values-mr/strings.xml @@ -100,7 +100,7 @@ "समवयस्क व्यक्तीने TTY मोड HCO ची विनंती केली" "समवयस्क व्यक्तीने TTY मोड VCO ची विनंती केली" "समवयस्क व्यक्तीने TTY मोड बंद ची विनंती केली" - "व्हॉइस" + "Voice" "डेटा" "फॅक्स" "SMS" @@ -146,11 +146,11 @@ "वाय-फायवरून कॉल करा" "मोबाइल नेटवर्कवरून कॉल करा" "केवळ वाय-फाय" - "{0}: अग्रेषित केला नाही" + "{0}: फॉरवर्ड केला नाही" "{0}: {1}" "{0}: {2} सेकंदांनंतर {1}" - "{0}: अग्रेषित केला नाही" - "{0}: अग्रेषित केला नाही" + "{0}: फॉरवर्ड केला नाही" + "{0}: फॉरवर्ड केला नाही" "वैशिष्ट्य कोड पूर्ण." "कनेक्शन समस्या किंवा अवैध फीचर कोड." "ठीक" @@ -388,9 +388,9 @@ "सिस्टम सेटिंग्ज सुधारित करा" "सिस्टीमचा सेटिंग्ज डेटा सुधारित करण्यासाठी अ‍ॅप ला अनुमती देते. दुर्भावनापूर्ण अ‍ॅप्स आपल्या सिस्टीमचे कॉंफिगरेशन दूषित करू शकतात." "सुरूवातीस चालवा" - "जसे सिस्टम बूट करणे समाप्त करते तसे अ‍ॅप ला स्वतः प्रारंभ करण्यास अनुमती देते. यामुळे टॅबलेट प्रारंभ करण्यास वेळ लागू शकतो आणि नेहमी सुरू राहून एकंदर टॅबलेटला धीमे करण्यास अ‍ॅप ला अनुमती देते." + "जसे सिस्टम बूट करणे समाप्त करते तसे अ‍ॅप ला स्वतः सुरू करण्यास अनुमती देते. यामुळे टॅबलेट सुरू करण्यास वेळ लागू शकतो आणि नेहमी सुरू राहून एकंदर टॅबलेटला धीमे करण्यास अ‍ॅप ला अनुमती देते." "सिस्टम बूट होणे संपल्यावर ॲपला स्वतः सुरू होण्याची अनुमती देते. यामुळे तुमच्या Android TV डिव्हाइसला सुरू होण्यास वेळ लागू शकतो आणि नेहमी सुरू राहून एकंदर डिव्हाइसलाच धीमे करण्याची अनुमती ॲपला देते." - "जसे सिस्टम बूट करणे समाप्त करते तसे अ‍ॅप ला स्वतः प्रारंभ करण्यास अनुमती देते. यामुळे फोन प्रारंभ करण्यास वेळ लागू शकतो आणि नेहमी सुरू राहून एकंदर फोनला धीमे करण्यास अ‍ॅप ला अनुमती देते." + "जसे सिस्टम बूट करणे समाप्त करते तसे अ‍ॅप ला स्वतः सुरू करण्यास अनुमती देते. यामुळे फोन सुरू करण्यास वेळ लागू शकतो आणि नेहमी सुरू राहून एकंदर फोनला धीमे करण्यास अ‍ॅप ला अनुमती देते." "रोचक प्रसारण पाठवा" "रोचक प्रसारणे पाठविण्यासाठी अ‍ॅप ला अनुमती देते, जे प्रसारण समाप्त झाल्यानंतर देखील तसेच राहते. अत्याधिक वापरामुळे बरीच मेमरी वापरली जाऊन तो टॅब्लेटला धीमा किंवा अस्थिर करू शकतो." "चिकट प्रसारणे पाठविण्यासाठी ॲपला अनुमती देते, जे प्रसारण समाप्त झाल्यानंतर देखील तसेच राहते. अत्याधिक वापरामुळे बरीच मेमरी वापरली जाऊन तो तुमच्या Android TV डिव्हाइसला धीमा किंवा अस्थिर करू शकतो." @@ -899,7 +899,7 @@ "स्थिती" "कॅमेरा" "मीडिया नियंत्रणे" - "विजेट पुनर्क्रमित करणे प्रारंभ झाले." + "विजेट पुनर्क्रमित करणे सुरू झाले." "विजेट पुनर्क्रमित करणे समाप्त झाले." "विजेट %1$s हटविले." "अनलॉक क्षेत्र विस्तृत करा." @@ -1190,7 +1190,7 @@ "टॅबलेट अपडेट होत आहे…" "डिव्‍हाइस अपडेट होत आहे…" "फोन सुरू होत आहे…" - "Android प्रारंभ करत आहे…" + "Android सुरू करत आहे…" "टॅबलेट सुरू होत आहे…" "डिव्‍हाइस सुरू होत आहे…" "संचयन ऑप्टिमाइझ करत आहे." @@ -1198,7 +1198,7 @@ "%1$s श्रेणीसुधारित करत आहे…" "%2$d पैकी %1$d अ‍ॅप ऑप्टिमाइझ करत आहे." "%1$s तयार करत आहे." - "अ‍ॅप्स प्रारंभ करत आहे." + "अ‍ॅप्स सुरू करत आहे." "बूट समाप्त होत आहे." "रन होणारे %1$s" "गेमवर परत जाण्यासाठी टॅप करा" @@ -1275,7 +1275,7 @@ "नेहमी अनुमती द्या" "कधीही अनुमती देऊ नका" "सिम कार्ड काढले" - "तुम्ही एक वैध सिम कार्ड घालून प्रारंभ करेपर्यंत मोबाइल नेटवर्क अनुपलब्ध असेल." + "तुम्ही एक वैध सिम कार्ड घालून सुरू करेपर्यंत मोबाइल नेटवर्क अनुपलब्ध असेल." "पूर्ण झाले" "सिम कार्ड जोडले" "मोबाइल नेटवर्कवर अ‍ॅक्सेस करण्यासाठी तुमचे डिव्हाइस रीस्टार्ट करा." @@ -1906,7 +1906,7 @@ "%1$s ला अनपिन करा" "अ‍ॅप माहिती" "−%1$s" - "डेमो प्रारंभ करत आहे..." + "डेमो सुरू करत आहे..." "डिव्हाइस रीसेट करत आहे..." "%1$s अक्षम केले" "कॉंफरन्स कॉल" diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml index 72fbc1d317815..e6618f023ef37 100644 --- a/core/res/res/values-or/strings.xml +++ b/core/res/res/values-or/strings.xml @@ -100,7 +100,7 @@ "ପୀଅର୍‌ ଅନୁରୋଧ କରିଥିବା TTY ମୋଡ୍‍ HCO ଅଟେ" "ପୀଅର୍‌ ଅନୁରୋଧ କରିଥିବା TTY ମୋଡ୍‍ VCO ଅଟେ" "ପୀଅର୍‌ ଅନୁରୋଧ କରିଥିବା TTY ମୋଡ୍‍ OFF ଅଛି" - "ଭଏସ୍" + "Voice" "ଡାଟା" "ଫାକ୍ସ" "SMS" @@ -1113,9 +1113,9 @@ "%1$s ଚାଲୁଛି" "ଅଧିକ ସୂଚନା ପାଇଁ କିମ୍ବା ଆପ୍‍ ବନ୍ଦ କରିବାକୁ ଟାପ୍‍ କରନ୍ତୁ।" "ଠିକ୍‍ ଅଛି" - "କ୍ୟାନ୍ସଲ୍‍ କରନ୍ତୁ" + "ବାତିଲ୍‍ କରନ୍ତୁ" "ଠିକ୍‍ ଅଛି" - "କ୍ୟାନ୍ସଲ୍‍ କରନ୍ତୁ" + "ବାତିଲ୍‍ କରନ୍ତୁ" "ଧ୍ୟାନଦିଅନ୍ତୁ" "ଲୋଡ୍ କରାଯାଉଛି…" "ଚାଲୁ" @@ -1269,7 +1269,7 @@ "ଏହା ଦ୍ୱାରା "" ଆପଣଙ୍କ ମୋବାଇଲ୍ ଆକାଉଣ୍ଟରୁ ପଇସା କଟିପାରେ। " " ଆପଣଙ୍କ ମୋବାଇଲ୍ ଆକାଉଣ୍ଟରୁ ପଇସା କଟିପାରେ। " "ପଠାନ୍ତୁ" - "କ୍ୟାନ୍ସଲ୍‍ କରନ୍ତୁ" + "ବାତିଲ୍‍ କରନ୍ତୁ" "ମୋ ପସନ୍ଦ ମନେରଖନ୍ତୁ" "ଏହାକୁ ଆପଣ ସେଟିଙ୍ଗ ଓ ଆପ୍‍ରେ ପରବର୍ତ୍ତୀ ସମୟରେ ବଦଳାଇପାରିବେ" "ସର୍ବଦା ଅନୁମତି ଦିଅନ୍ତୁ" @@ -1490,7 +1490,7 @@ "ପୂର୍ବ ମାସ" "ପରବର୍ତ୍ତୀ ମାସ" "ALT" - "କ୍ୟାନ୍ସଲ୍‍ କରନ୍ତୁ" + "ବାତିଲ୍‍ କରନ୍ତୁ" "ଡିଲିଟ୍‍ କରନ୍ତୁ" "ହୋଇଗଲା" "ମୋଡ୍‍ ପରିବର୍ତ୍ତନ" @@ -1751,7 +1751,7 @@ "You4" "ଅଜଣା ପୋର୍ଟ୍ରେଟ୍‍" "ଅଜଣା ଲ୍ୟାଣ୍ଡସ୍କେପ୍‌" - "କ୍ୟାନ୍ସଲ୍‍ କରାଗଲା" + "ବାତିଲ୍‍ କରାଗଲା" "କଣ୍ଟେଣ୍ଟ ଲେଖିବାବେଳେ ତ୍ରୁଟି" "ଅଜଣା" "ପ୍ରିଣ୍ଟ ସେବାକୁ ସକ୍ଷମ କରାଯାଇନାହିଁ" diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml index 45d32f2aa0e43..67b7144472ee9 100644 --- a/core/res/res/values-pa/strings.xml +++ b/core/res/res/values-pa/strings.xml @@ -1306,7 +1306,7 @@ "ਕਨੈਕਟ ਕੀਤਾ ਡੀਵਾਈਸ ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੈ। ਹੋਰ ਵਿਕਲਪਾਂ ਲਈ ਟੈਪ ਕਰੋ।" "ਐਨਾਲੌਗ ਆਡੀਓ ਉਪਸਾਧਨ ਦਾ ਪਤਾ ਲੱਗਿਆ" "ਨੱਥੀ ਕੀਤਾ ਡੀਵਾਈਸ ਇਸ ਫ਼ੋਨ ਦੇ ਅਨੁਰੂਪ ਨਹੀਂ ਹੈ। ਹੋਰ ਜਾਣਨ ਲਈ ਟੈਪ ਕਰੋ।" - "USB ਡੀਬਗਿੰਗ ਕਨੈਕਟ ਕੀਤੀ" + "USB ਡੀਬੱਗਿੰਗ ਕਨੈਕਟ ਕੀਤੀ" "USB ਡੀਬੱਗਿੰਗ ਬੰਦ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ" "USB ਡੀਬੱਗਿੰਗ ਅਯੋਗ ਬਣਾਉਣ ਲਈ ਚੁਣੋ।" "ਵਾਇਰਲੈੱਸ ਡੀਬੱਗਿੰਗ ਨੂੰ ਕਨੈਕਟ ਕੀਤਾ ਗਿਆ" diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 1beb966c44215..d3cb8528683f4 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -2048,7 +2048,7 @@ "%1$s:" "enviou uma imagem" "Conversa" - "Conversa de grupo" + "Conversa em grupo" "> %1$d" "Pessoal" "Trabalho" diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index 279c619c65fca..66bf9c2d80303 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -242,19 +242,19 @@ "Nödsituation" "Felrapport" "Avsluta session" - "Skärmdump" + "Skärmbild" "Felrapport" "Nu hämtas information om aktuell status för enheten, som sedan skickas i ett e-postmeddelade. Det tar en liten stund innan felrapporten är färdig och kan skickas, så vi ber dig ha tålamod." "Interaktiv rapport" - "Bör användas i de flesta fall. Då kan du spåra rapportförloppet, ange mer information om problemet och ta skärmdumpar. En del mindre använda avsnitt, som det tar lång tid att rapportera om, kan uteslutas." + "Bör användas i de flesta fall. Då kan du spåra rapportförloppet, ange mer information om problemet och ta skärmbilder. En del mindre använda avsnitt, som det tar lång tid att rapportera om, kan uteslutas." "Fullständig rapport" - "Alternativet innebär minsta möjliga störning när enheten inte svarar eller är långsam, eller när alla avsnitt ska ingå i rapporten. Du kan inte ange mer information eller ta ytterligare skärmdumpar." + "Alternativet innebär minsta möjliga störning när enheten inte svarar eller är långsam, eller när alla avsnitt ska ingå i rapporten. Du kan inte ange mer information eller ta ytterligare skärmbilder." - Tar en skärmdump till felrapporten om %d sekunder. - Tar en skärmdump till felrapporten om %d sekund. + Tar en skärmbild till felrapporten om %d sekunder. + Tar en skärmbild till felrapporten om %d sekund. - "Skärmdump med felrapport har tagits" - "Det gick inte att ta en skärmdump med felrapport" + "Skärmbild med felrapport har tagits" + "Det gick inte att ta en skärmbild med felrapport" "Tyst läge" "Ljudet är AV" "Ljudet är PÅ" @@ -327,8 +327,8 @@ "Kan trycka, svepa, nypa och göra andra rörelser." "Fingeravtrycksrörelser" "Kan registrera rörelser som utförs med hjälp av enhetens fingeravtryckssensor." - "Ta skärmdump" - "Du kan ta en skärmdump av skärmen." + "Ta skärmbild" + "Du kan ta en skärmbild av skärmen." "inaktivera eller ändra statusfält" "Tillåter att appen inaktiverar statusfältet eller lägger till och tar bort systemikoner." "visas i statusfältet" @@ -2039,7 +2039,7 @@ "Snabbinställningar" "Dialogruta för ström" "Låsskärm" - "Skärmdump" + "Skärmbild" "Tillgänglighetsgenväg på skärmen" "Valfunktion för tillgänglighetsgenväg på skärmen" "Aktivera tillgänglighet snabbt" diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml index 0c5f964ee6571..ccec19c5a8c09 100644 --- a/core/res/res/values-ta/strings.xml +++ b/core/res/res/values-ta/strings.xml @@ -100,7 +100,7 @@ "TTY Mode HCOஐ இணைச் செயல்பாடு கோரியது" "TTY Mode VCOஐ இணைச் செயல்பாடு கோரியது" "TTY Mode OFFஐ இணைச் செயல்பாடு கோரியது" - "குரல்" + "Voice" "தரவு" "தொலைநகல்" "SMS" @@ -268,7 +268,7 @@ "999+" "புதிய அறிவிப்பு" "விர்ச்சுவல் கீபோர்டு" - "கைமுறை விசைப்பலகை" + "கைமுறை கீபோர்டு" "பாதுகாப்பு" "கார் பயன்முறை" "கணக்கின் நிலை" @@ -1327,9 +1327,9 @@ "பகிர்" "வேண்டாம்" "உள்ளீட்டு முறையைத் தேர்வுசெய்க" - "கைமுறை விசைப்பலகை இயக்கத்தில் இருக்கும் போது IMEஐ திரையில் வைத்திரு" + "கைமுறை கீபோர்டு இயக்கத்தில் இருக்கும் போது IMEஐ திரையில் வைத்திரு" "விர்ச்சுவல் கீபோர்டை காட்டு" - "கைமுறை விசைப்பலகையை உள்ளமைக்கவும்" + "கைமுறை கீபோர்டை உள்ளமைக்கவும்" "மொழியையும் தளவமைப்பையும் தேர்ந்தெடுக்க, தட்டவும்" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index 726fd6c6180a5..699132df0f23f 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -100,7 +100,7 @@ "అవతలి వారు HCO TTY మోడ్‌ని అభ్యర్థించారు" "అవతలి వారు VCO TTY మోడ్‌ని అభ్యర్థించారు" "అవతలి వారు OFF TTY మోడ్‌ని అభ్యర్థించారు" - "వాయిస్" + "Voice" "డేటా" "ఫ్యాక్స్" "SMS" @@ -229,9 +229,9 @@ "మీ ఫోన్ షట్‌డౌన్ చేయబడుతుంది." "మీరు షట్ డౌన్ చేయాలనుకుంటున్నారా?" "సురక్షిత మోడ్‌కు రీబూట్ చేయండి" - "మీరు సురక్షిత మోడ్‌లోకి రీబూట్ చేయాలనుకుంటున్నారా? దీని వలన మీరు ఇన్‌స్టాల్ చేసిన అన్ని మూడవ పక్షం అనువర్తనాలు నిలిపివేయబడతాయి. ఇవి మీరు మళ్లీ రీబూట్ చేసినప్పుడు పునరుద్ధరించబడతాయి." + "మీరు సురక్షిత మోడ్‌లోకి రీబూట్ చేయాలనుకుంటున్నారా? దీని వలన మీరు ఇన్‌స్టాల్ చేసిన అన్ని మూడవ పక్షం యాప్‌లు నిలిపివేయబడతాయి. ఇవి మీరు మళ్లీ రీబూట్ చేసినప్పుడు పునరుద్ధరించబడతాయి." "ఇటీవలివి" - "ఇటీవలి అనువర్తనాలు ఏవీ లేవు." + "ఇటీవలి యాప్‌లు ఏవీ లేవు." "టాబ్లెట్ ఎంపికలు" "Android TV ఎంపికలు" "ఫోన్ ఎంపికలు" @@ -336,13 +336,13 @@ "స్థితి పట్టీని విస్తరింపజేయడం/కుదించడం" "స్థితి బార్‌ను విస్తరింపజేయడానికి లేదా కుదించడానికి యాప్‌ను అనుమతిస్తుంది." "షార్ట్‌కట్‌లను ఇన్‌స్టాల్ చేయడం" - "వినియోగదారు ప్రమేయం లేకుండానే హోమ్‌స్క్రీన్ సత్వరమార్గాలను జోడించడానికి అనువర్తనాన్ని అనుమతిస్తుంది." + "వినియోగదారు ప్రమేయం లేకుండానే హోమ్‌స్క్రీన్ సత్వరమార్గాలను జోడించడానికి యాప్‌ను అనుమతిస్తుంది." "సత్వరమార్గాలను అన్ఇన్‌స్టాల్ చేయడం" - "వినియోగదారు ప్రమేయం లేకుండానే హోమ్‌స్క్రీన్ సత్వరమార్గాలను తీసివేయడానికి అనువర్తనాన్ని అనుమతిస్తుంది." + "వినియోగదారు ప్రమేయం లేకుండానే హోమ్‌స్క్రీన్ సత్వరమార్గాలను తీసివేయడానికి యాప్‌ను అనుమతిస్తుంది." "అవుట్‌గోయింగ్ కాల్‌లను దారి మళ్లించడం" - "కాల్‌ను వేరే నంబర్‌కు దారి మళ్లించే లేదా మొత్తంగా కాల్‌ను ఆపివేసే ఎంపిక సహాయంతో అవుట్‌గోయింగ్ కాల్ సమయంలో డయల్ చేయబడుతున్న నంబర్‌ను చూడటానికి అనువర్తనాన్ని అనుమతిస్తుంది." + "కాల్‌ను వేరే నంబర్‌కు దారి మళ్లించే లేదా మొత్తంగా కాల్‌ను ఆపివేసే ఎంపిక సహాయంతో అవుట్‌గోయింగ్ కాల్ సమయంలో డయల్ చేయబడుతున్న నంబర్‌ను చూడటానికి యాప్‌ను అనుమతిస్తుంది." "ఫోన్ కాల్‌లకు సమాధానమివ్వు" - "ఇన్‌కమింగ్ ఫోన్ కాల్‌లకు సమాధానమివ్వడానికి అనువర్తనాన్ని అనుమతిస్తుంది." + "ఇన్‌కమింగ్ ఫోన్ కాల్‌లకు సమాధానమివ్వడానికి యాప్‌ను అనుమతిస్తుంది." "వచన సందేశాలను (SMS) స్వీకరించడం" "SMS సందేశాలను స్వీకరించడానికి మరియు ప్రాసెస్ చేయడానికి యాప్‌ను అనుమతిస్తుంది. యాప్ మీ డివైజ్‌కు పంపబడిన సందేశాలను మీకు చూపకుండానే పర్యవేక్షించగలదని లేదా తొలగించగలదని దీని అర్థం." "వచన సందేశాలను (MMS) స్వీకరించడం" @@ -386,7 +386,7 @@ "యాప్ నిల్వ స్థలాన్ని అంచనా వేయడం" "యాప్‌ కోడ్, డేటా మరియు కాష్ పరిమాణాలను తిరిగి పొందడానికి దాన్ని అనుమతిస్తుంది" "సిస్టమ్ సెట్టింగ్‌లను మార్చడం" - "సిస్టమ్ యొక్క సెట్టింగ్‌ల డేటాను సవరించడానికి అనువర్తనాన్ని అనుమతిస్తుంది. హానికరమైన యాప్‌లు మీ సిస్టమ్ యొక్క కాన్ఫిగరేషన్‌ను నాశనం చేయవచ్చు." + "సిస్టమ్ యొక్క సెట్టింగ్‌ల డేటాను సవరించడానికి యాప్‌ను అనుమతిస్తుంది. హానికరమైన యాప్‌లు మీ సిస్టమ్ యొక్క కాన్ఫిగరేషన్‌ను నాశనం చేయవచ్చు." "ప్రారంభంలో అమలు చేయడం" "సిస్టమ్ బూటింగ్‌ను పూర్తి చేసిన వెంటనే దానికదే ప్రారంభించబడటానికి యాప్‌ను అనుమతిస్తుంది. ఇది టాబ్లెట్‌ను ప్రారంభించడానికి ఎక్కువ సమయం పట్టేలా చేయవచ్చు మరియు ఎల్లప్పుడూ అమలు చేయడం ద్వారా మొత్తం టాబ్లెట్‌ను నెమ్మదిగా పని చేయడానికి యాప్‌ను అనుమతించేలా చేయవచ్చు." "సిస్టమ్ బూటింగ్‌ను పూర్తి చేసిన వెంటనే యాప్ దానికదే ప్రారంభం కావడానికి అనుమతిస్తుంది. ఇది మీ Android TV పరికరం ప్రారంభం కావడానికి ఎక్కువ సమయం పట్టేలా చేయవచ్చు మరియు ఎల్లప్పుడూ అమలు కావడం ద్వారా మొత్తం పరికరం పనితీరును నెమ్మది చేయడానికి యాప్‌ను అనుమతించవచ్చు." @@ -432,7 +432,7 @@ "ఆడియోను రికార్డ్ చేయడం" "ఈ యాప్ మైక్రోఫోన్‌ని ఉపయోగించి ఎప్పుడైనా ఆడియోను రికార్డ్ చేయగలదు." "SIMకి ఆదేశాలను పంపడం" - "సిమ్‌కు ఆదేశాలను పంపడానికి అనువర్తనాన్ని అనుమతిస్తుంది. ఇది చాలా ప్రమాదకరం." + "సిమ్‌కు ఆదేశాలను పంపడానికి యాప్‌ను అనుమతిస్తుంది. ఇది చాలా ప్రమాదకరం." "భౌతిక కార్యాకలాపాన్ని గుర్తించండి" "ఈ యాప్ మీ భౌతిక కార్యాకలాపాన్ని గుర్తించగలదు." "చిత్రాలు మరియు వీడియోలు తీయడం" @@ -447,11 +447,11 @@ "నేరుగా కాల్ చేసే ఫోన్ నంబర్‌లు" "మీ ప్రమేయం లేకుండా ఫోన్ నంబర్‌లకు కాల్ చేయడానికి యాప్‌ను అనుమతిస్తుంది. దీని వలన అనుకోని ఛార్జీలు విధించబడవచ్చు లేదా కాల్‌లు రావచ్చు. ఇది అత్యవసర నంబర్‌లకు కాల్ చేయడానికి యాప్‌ను అనుమతించదని గుర్తుంచుకోండి. హానికరమైన యాప్‌లు మీ నిర్ధారణ లేకుండానే కాల్‌లు చేయడం ద్వారా మీకు డబ్బు ఖర్చయ్యేలా చేయవచ్చు." "IMS కాల్ సేవ యాక్సెస్ అనుమతి" - "మీ ప్రమేయం లేకుండా కాల్‌లు చేయడం కోసం IMS సేవను ఉపయోగించడానికి అనువర్తనాన్ని అనుమతిస్తుంది." + "మీ ప్రమేయం లేకుండా కాల్‌లు చేయడం కోసం IMS సేవను ఉపయోగించడానికి యాప్‌ను అనుమతిస్తుంది." "ఫోన్ స్థితి మరియు గుర్తింపుని చదవడం" "పరికరం యొక్క ఫోన్ ఫీచర్‌లను యాక్సెస్ చేయడానికి యాప్‌ను అనుమతిస్తుంది. ఈ అనుమతి ఫోన్ నంబర్ మరియు పరికరం IDలను, కాల్ సక్రియంగా ఉందా లేదా అనే విషయాన్ని మరియు కాల్ ద్వారా కనెక్ట్ చేయబడిన రిమోట్ నంబర్‌ను కనుగొనడానికి యాప్‌ను అనుమతిస్తుంది." "కాల్‌లను సిస్టమ్ ద్వారా వెళ్లేలా చేయి" - "కాలింగ్ అనుభవాన్ని మెరుగుపరచడం కోసం తన కాల్‌లను సిస్టమ్ ద్వారా వెళ్లేలా చేయడానికి అనువర్తనాన్ని అనుమతిస్తుంది." + "కాలింగ్ అనుభవాన్ని మెరుగుపరచడం కోసం తన కాల్‌లను సిస్టమ్ ద్వారా వెళ్లేలా చేయడానికి యాప్‌ను అనుమతిస్తుంది." "సిస్టమ్ ద్వారా కాల్‌లను చూసి, నియంత్రించండి." "పరికరంలో కొనసాగుతున్న కాల్‌లను చూడడానికి మరియు నియంత్రించడానికి యాప్‌ను అనుమతిస్తుంది. ఇందులో కాల్ కోసం కాల్‌ల నంబర్‌లు మరియు రాష్ట్ర కాల్ వంటి సమాచారం ఉంటుంది." "ఆడియో రికార్డ్ పరిమితుల నుండి మినహాయింపు" @@ -469,9 +469,9 @@ "మీ Android TV పరికరం స్లీప్ మోడ్‌లోకి వెళ్లకుండా నివారించడానికి యాప్‌ని అనుమతిస్తుంది." "నిద్రావస్థకి వెళ్లకుండా ఫోన్‌ను నిరోధించడానికి యాప్‌ను అనుమతిస్తుంది." "ఇన్‌ఫ్రారెడ్ ప్రసరణ" - "టాబ్లెట్ యొక్క ఇన్‌ఫ్రారెడ్ ట్రాన్స్‌మిటర్‌ను ఉపయోగించడానికి అనువర్తనాన్ని అనుమతిస్తుంది." + "టాబ్లెట్ యొక్క ఇన్‌ఫ్రారెడ్ ట్రాన్స్‌మిటర్‌ను ఉపయోగించడానికి యాప్‌ను అనుమతిస్తుంది." "మీ Android TV పరికరం యొక్క ఇన్‌ఫ్రారెడ్ ట్రాన్స్‌మిటర్‌ని ఉపయోగించడానికి యాప్‌ని అనుమతిస్తుంది." - "ఫోన్ యొక్క ఇన్‌ఫ్రారెడ్ ట్రాన్స్‌మిటర్‌ను ఉపయోగించడానికి అనువర్తనాన్ని అనుమతిస్తుంది." + "ఫోన్ యొక్క ఇన్‌ఫ్రారెడ్ ట్రాన్స్‌మిటర్‌ను ఉపయోగించడానికి యాప్‌ను అనుమతిస్తుంది." "వాల్‌పేపర్‌ను సెట్ చేయడం" "సిస్టమ్ వాల్‌పేపర్‌ను సెట్ చేయడానికి యాప్‌ను అనుమతిస్తుంది." "మీ వాల్‌పేపర్ పరిమాణాన్ని సర్దుబాటు చేయడం" @@ -493,13 +493,13 @@ "టీథర్ చేయబడిన కనెక్టివిటీని మార్చడం" "టీథర్ చేసిన నెట్‌వర్క్ కనెక్టివిటీ యొక్క స్థితిని మార్చడానికి యాప్‌ను అనుమతిస్తుంది." "Wi-Fi కనెక్షన్‌లను వీక్షించడం" - "Wi-Fi ప్రారంభించబడిందా, లేదా మరియు కనెక్ట్ చేయబడిన Wi-Fi పరికరాల పేరు వంటి Wi-Fi నెట్‌వర్కింగ్ గురించి సమాచారాన్ని వీక్షించడానికి అనువర్తనాన్ని అనుమతిస్తుంది." + "Wi-Fi ప్రారంభించబడిందా, లేదా మరియు కనెక్ట్ చేయబడిన Wi-Fi పరికరాల పేరు వంటి Wi-Fi నెట్‌వర్కింగ్ గురించి సమాచారాన్ని వీక్షించడానికి యాప్‌ను అనుమతిస్తుంది." "Wi-Fiకి కనెక్ట్ చేయడం మరియు దాని నుండి డిస్‌కనెక్ట్ చేయడం" "Wi-Fi యాక్సెస్ స్థానాలకు కనెక్ట్ చేయడానికి మరియు వాటి నుండి డిస్‌కనెక్ట్ చేయడానికి మరియు Wi-Fi నెట్‌వర్క్‌ల కోసం పరికర కాన్ఫిగరేషన్‌కు మార్పులు చేయడానికి యాప్‌ను అనుమతిస్తుంది." "Wi-Fi Multicast స్వీకరణను అనుమతించడం" "మల్టీక్యాస్ట్ చిరునామాలను ఉపయోగించి మీ టాబ్లెట్‌కు మాత్రమే కాకుండా Wi-Fi నెట్‌వర్క్‌లోని అన్ని పరికరాలకు పంపబడిన ప్యాకెట్‌లను స్వీకరించడానికి యాప్‌ను అనుమతిస్తుంది. మల్టీక్యాస్ట్ యేతర మోడ్ కంటే ఇది ఎక్కువ పవర్ ఉపయోగిస్తుంది." "మల్టీక్యాస్ట్ చిరునామాలను ఉపయోగించి మీ Android TV పరికరానికి మాత్రమే కాకుండా Wi-Fi నెట్‌వర్క్‌లోని అన్ని పరికరాలకు పంపిన ప్యాకెట్‌లను స్వీకరించడానికి యాప్‌ని అనుమతిస్తుంది. ఇది మల్టీక్యాస్ట్ యేతర మోడ్ కంటే ఎక్కువ పవర్‌ను ఉపయోగిస్తుంది." - "మల్టీక్యాస్ట్ చిరునామాలను ఉపయోగించి మీ ఫోన్‌కు మాత్రమే కాకుండా Wi-Fi నెట్‌వర్క్‌లోని అన్ని పరికరాలకు పంపబడిన ప్యాకెట్‌లను స్వీకరించడానికి అనువర్తనాన్ని అనుమతిస్తుంది. మల్టీక్యాస్ట్ యేతర మోడ్ కంటే ఇది ఎక్కువ పవర్ ఉపయోగిస్తుంది." + "మల్టీక్యాస్ట్ చిరునామాలను ఉపయోగించి మీ ఫోన్‌కు మాత్రమే కాకుండా Wi-Fi నెట్‌వర్క్‌లోని అన్ని పరికరాలకు పంపబడిన ప్యాకెట్‌లను స్వీకరించడానికి యాప్‌ను అనుమతిస్తుంది. మల్టీక్యాస్ట్ యేతర మోడ్ కంటే ఇది ఎక్కువ పవర్ ఉపయోగిస్తుంది." "బ్లూటూత్ సెట్టింగ్‌లను యాక్సెస్ చేయడం" "స్థానిక బ్లూటూత్ టాబ్లెట్‌ను కాన్ఫిగర్ చేయడానికి మరియు రిమోట్ పరికరాలతో దాన్ని కనుగొనడానికి మరియు జత చేయడానికి యాప్‌ను అనుమతిస్తుంది." "మీ Android TV పరికరంలో బ్లూటూత్‌ను కాన్ఫిగర్ చేయడానికి మరియు రిమోట్ పరికరాలతో దాన్ని కనుగొని, జత చేయడానికి యాప్‌ను అనుమతిస్తుంది." @@ -507,7 +507,7 @@ "WiMAXకు కనెక్ట్ చేయడం మరియు దాని నుండి డిస్‌కనెక్ట్ చేయడం" "Wi-Fi ప్రారంభించబడిందా, లేదా మరియు కనెక్ట్ చేయబడిన WiMAX నెట్‌వర్క్‌ల గురించి సమాచారాన్ని కనుగొనడానికి యాప్‌ను అనుమతిస్తుంది." "WiMAX స్థితిని మార్చడం" - "WiMAX నెట్‌వర్క్‌లకు టాబ్లెట్‌ను కనెక్ట్ చేయడానికి మరియు వాటి నుండి టాబ్లెట్‌ను డిస్‌కనెక్ట్ చేయడానికి అనువర్తనాన్ని అనుమతిస్తుంది." + "WiMAX నెట్‌వర్క్‌లకు టాబ్లెట్‌ను కనెక్ట్ చేయడానికి మరియు వాటి నుండి టాబ్లెట్‌ను డిస్‌కనెక్ట్ చేయడానికి యాప్‌ను అనుమతిస్తుంది." "మీ Android TV పరికరాన్ని WiMAX నెట్‌వర్క్‌లకు కనెక్ట్ చేయడానికి లేదా డిస్‌కనెక్ట్ చేయడానికి యాప్‌ని అనుమతిస్తుంది." "WiMAX నెట్‌వర్క్‌లకు ఫోన్‌ను కనెక్ట్ చేయడానికి మరియు వాటి నుండి ఫోన్‌ను డిస్‌కనెక్ట్ చేయడానికి యాప్‌ను అనుమతిస్తుంది." "బ్లూటూత్ పరికరాలతో జత చేయడం" @@ -622,19 +622,19 @@ "మీ షేర్ చేసిన నిల్వ యొక్క కంటెంట్‌లను సవరించండి లేదా తొలగించండి" "మీ షేర్ చేసిన నిల్వ యొక్క కంటెంట్‌లను రాయడానికి యాప్‌ను అనుమతిస్తుంది." "SIP కాల్‌లను చేయడానికి/స్వీకరించడానికి" - "SIP కాల్‌లను చేయడానికి మరియు స్వీకరించడానికి అనువర్తనాన్ని అనుమతిస్తుంది." + "SIP కాల్‌లను చేయడానికి మరియు స్వీకరించడానికి యాప్‌ను అనుమతిస్తుంది." "కొత్త టెలికామ్ SIM కనెక్షన్‌లను నమోదు చేయడం" - "కొత్త టెలికామ్ SIM కనెక్షన్‌లను నమోదు చేయడానికి అనువర్తనాన్ని అనుమతిస్తుంది." + "కొత్త టెలికామ్ SIM కనెక్షన్‌లను నమోదు చేయడానికి యాప్‌ను అనుమతిస్తుంది." "కొత్త టెలికామ్ కనెక్షన్‌లను నమోదు చేయడం" - "కొత్త టెలికామ్ కనెక్షన్‌లను నమోదు చేయడానికి అనువర్తనాన్ని అనుమతిస్తుంది." + "కొత్త టెలికామ్ కనెక్షన్‌లను నమోదు చేయడానికి యాప్‌ను అనుమతిస్తుంది." "టెలికామ్ కనెక్షన్‌లను నిర్వహించడం" - "టెలికామ్ కనెక్షన్‌లను నిర్వహించడానికి అనువర్తనాన్ని అనుమతిస్తుంది." + "టెలికామ్ కనెక్షన్‌లను నిర్వహించడానికి యాప్‌ను అనుమతిస్తుంది." "ఇన్-కాల్ స్క్రీన్‌తో పరస్పర చర్య చేయడం" - "వినియోగదారునికి ఇన్-కాల్ స్క్రీన్ ఎప్పుడు, ఎలా కనిపించాలనే దాన్ని నియంత్రించడానికి అనువర్తనాన్ని అనుమతిస్తుంది." + "వినియోగదారునికి ఇన్-కాల్ స్క్రీన్ ఎప్పుడు, ఎలా కనిపించాలనే దాన్ని నియంత్రించడానికి యాప్‌ను అనుమతిస్తుంది." "టెలిఫోన్ సేవలతో పరస్పర చర్య చేయడం" - "కాల్‌లు చేయడం/స్వీకరించడం కోసం టెలిఫోన్ సేవలతో పరస్పర చర్య చేయడానికి అనువర్తనాన్ని అనుమతిస్తుంది." + "కాల్‌లు చేయడం/స్వీకరించడం కోసం టెలిఫోన్ సేవలతో పరస్పర చర్య చేయడానికి యాప్‌ను అనుమతిస్తుంది." "ఇన్-కాల్ వినియోగదారు అనుభవాన్ని అందించడం" - "ఇన్-కాల్ వినియోగదారుని అనుభవాన్ని అందించడానికి అనువర్తనాన్ని అనుమతిస్తుంది." + "ఇన్-కాల్ వినియోగదారుని అనుభవాన్ని అందించడానికి యాప్‌ను అనుమతిస్తుంది." "చారిత్రక నెట్‌వర్క్ వినియోగాన్ని చదవడం" "నిర్దిష్ట నెట్‌వర్క్‌లు మరియు యాప్‌ల కోసం చారిత్రాత్మక నెట్‌వర్క్ వినియోగాన్ని చదవడానికి యాప్‌ను అనుమతిస్తుంది." "నెట్‌వర్క్ విధానాన్ని నిర్వహించడం" @@ -642,31 +642,31 @@ "నెట్‌వర్క్ వినియోగ అకౌంటింగ్‌ను సవరించడం" "యాప్‌లలో నెట్‌వర్క్ వినియోగం ఎలా గణించాలనే దాన్ని సవరించడానికి యాప్‌ను అనుమతిస్తుంది. సాధారణ యాప్‌ల ద్వారా ఉపయోగించడానికి ఉద్దేశించినది కాదు." "నోటిఫికేషన్‌లను యాక్సెస్ చేయడం" - "నోటిఫికేషన్‌లను, ఇతర అనువర్తనాల ద్వారా పోస్ట్ చేయబడిన వాటిని తిరిగి పొందడానికి, పరిశీలించడానికి మరియు క్లియర్ చేయడానికి అనువర్తనాన్ని అనుమతిస్తుంది." + "నోటిఫికేషన్‌లను, ఇతర అనువర్తనాల ద్వారా పోస్ట్ చేయబడిన వాటిని తిరిగి పొందడానికి, పరిశీలించడానికి మరియు క్లియర్ చేయడానికి యాప్‌ను అనుమతిస్తుంది." "నోటిఫికేషన్ పరిశీలన సేవకు అనుబంధించడం" "నోటిఫికేషన్ పరిశీలన సేవ యొక్క అగ్ర-స్థాయి ఇంటర్‌ఫేస్‌కు అనుబంధించడానికి హోల్డర్‌ను అనుమతిస్తుంది. సాధారణ అనువర్తనాల కోసం ఎప్పటికీ అవసరం ఉండకూడదు." "షరతు ప్రదాత సేవకు అనుబంధించడం" "షరతు ప్రదాత సేవ యొక్క అగ్ర-స్థాయి ఇంటర్‌ఫేస్‌కు అనుబంధించడానికి హోల్డర్‌ను అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు." "డ్రీమ్ సేవ‌కి అనుబంధించడం" "డ్రీమ్ సేవ యొక్క అగ్ర-స్థాయి ఇంటర్‌ఫేస్‌కు అనుబంధించడానికి హోల్డర్‌ను అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు." - "క్యారియర్ అందించిన కాన్ఫిగరేషన్ అనువర్తనాన్ని అభ్యర్థించడం" - "క్యారియర్ అందించిన కాన్ఫిగరేషన్ అనువర్తనాన్ని అభ్యర్థించడానికి హోల్డర్‌ను అనుమతిస్తుంది. సాధారణ అనువర్తనాల కోసం ఎప్పటికీ అవసరం ఉండకూడదు." + "క్యారియర్ అందించిన కాన్ఫిగరేషన్ యాప్‌ను అభ్యర్థించడం" + "క్యారియర్ అందించిన కాన్ఫిగరేషన్ యాప్‌ను అభ్యర్థించడానికి హోల్డర్‌ను అనుమతిస్తుంది. సాధారణ అనువర్తనాల కోసం ఎప్పటికీ అవసరం ఉండకూడదు." "నెట్‌వర్క్ పరిస్థితులపై పరిశీలనల గురించి తెలుసుకోవడం" - "నెట్‌వర్క్ పరిస్థితులపై పరిశీలనల గురించి తెలుసుకోవడానికి అనువర్తనాన్ని అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండకూడదు." + "నెట్‌వర్క్ పరిస్థితులపై పరిశీలనల గురించి తెలుసుకోవడానికి యాప్‌ను అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండకూడదు." "ఇన్‌పుట్ పరికరం క్రమాంకనాన్ని మార్చండి" - "టచ్ స్క్రీన్ యొక్క క్రమాంకన పరామితులను సవరించడానికి అనువర్తనాన్ని అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు." + "టచ్ స్క్రీన్ యొక్క క్రమాంకన పరామితులను సవరించడానికి యాప్‌ను అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు." "DRM ప్రమాణపత్రాలను యాక్సెస్ చేయడం" - "DRM ప్రమాణపత్రాలను కేటాయించడానికి మరియు ఉపయోగించడానికి అనువర్తనాన్ని అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు." + "DRM ప్రమాణపత్రాలను కేటాయించడానికి మరియు ఉపయోగించడానికి యాప్‌ను అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు." "Android Beam బదిలీ స్థితిని స్వీకరించడం" - "ప్రస్తుత Android Beam బదిలీలకు సంబంధించిన సమాచారాన్ని స్వీకరించడానికి ఈ అనువర్తనాన్ని అనుమతిస్తుంది" + "ప్రస్తుత Android Beam బదిలీలకు సంబంధించిన సమాచారాన్ని స్వీకరించడానికి ఈ యాప్‌ను అనుమతిస్తుంది" "DRM ప్రమాణపత్రాలను తీసివేయడం" - "DRM ప్రమాణపత్రాలను తీసివేయడానికి అనువర్తనాన్ని అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు." + "DRM ప్రమాణపత్రాలను తీసివేయడానికి యాప్‌ను అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు." "క్యారియర్ సందేశ సేవకు అనుబంధించడం" "క్యారియర్ సందేశ సేవ యొక్క అగ్ర-స్థాయి ఇంటర్‌ఫేస్‌కు అనుబంధించడానికి హోల్డర్‌ను అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు." "క్యారియర్ సేవలకు అనుబంధించడం" "క్యారియర్ సేవలకు అనుబంధించడానికి హోల్డర్‌ను అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు." "అంతరాయం కలిగించవద్దును యాక్సెస్ చేయడం" - "అంతరాయం కలిగించవద్దు ఎంపిక కాన్ఫిగరేషన్ చదవడానికి మరియు వ్రాయడానికి అనువర్తనాన్ని అనుమతిస్తుంది." + "అంతరాయం కలిగించవద్దు ఎంపిక కాన్ఫిగరేషన్ చదవడానికి మరియు వ్రాయడానికి యాప్‌ను అనుమతిస్తుంది." "వీక్షణ అనుమతి వినియోగాన్ని ప్రారంభించండి" "యాప్‌నకు అనుమతి వినియోగాన్ని ప్రారంభించడానికి హోల్డర్‌‌ను అనుమతిస్తుంది. సాధారణ యాప్‌లకు ఎప్పటికీ ఇటువంటి అనుమతి అవసరం ఉండదు." "పాస్‌వర్డ్ నియమాలను సెట్ చేయండి" @@ -1111,7 +1111,7 @@ "కొన్ని సిస్టమ్ కార్యాచరణలు పని చేయకపోవచ్చు" "సిస్టమ్ కోసం తగినంత నిల్వ లేదు. మీకు 250MB ఖాళీ స్థలం ఉందని నిర్ధారించుకుని, పునఃప్రారంభించండి." "%1$s అమలులో ఉంది" - "మరింత సమాచారం కోసం లేదా అనువర్తనాన్ని ఆపివేయడం కోసం నొక్కండి." + "మరింత సమాచారం కోసం లేదా యాప్‌ను ఆపివేయడం కోసం నొక్కండి." "సరే" "రద్దు చేయి" "సరే" @@ -1142,28 +1142,28 @@ "దీన్ని ఉపయోగించి పంపండి" "%1$sని ఉపయోగించి పంపండి" "పంపు" - "హోమ్ అనువర్తనాన్ని ఎంచుకోండి" + "హోమ్ యాప్‌ను ఎంచుకోండి" "%1$sని హోమ్‌గా ఉపయోగించండి" "చిత్రాన్ని క్యాప్చర్ చేయి" "దీనితో చిత్రాన్ని క్యాప్చర్ చేయి" "%1$sతో చిత్రాన్ని క్యాప్చర్ చేయండి" "చిత్రాన్ని క్యాప్చర్ చేయి" "ఈ చర్యకు డిఫాల్ట్‌గా ఉపయోగించండి." - "వేరొక అనువర్తనాన్ని ఉపయోగించండి" - "సిస్టమ్ సెట్టింగ్‌లు > అనువర్తనాలు > డౌన్‌లోడ్ చేయబడినవిలో డిఫాల్ట్‌ను క్లియర్ చేయి." + "వేరొక యాప్‌ను ఉపయోగించండి" + "సిస్టమ్ సెట్టింగ్‌లు > యాప్‌లు > డౌన్‌లోడ్ చేయబడినవిలో డిఫాల్ట్‌ను క్లియర్ చేయి." "చర్యను ఎంచుకోండి" "USB పరికరం కోసం యాప్‌ను ఎంచుకోండి" - "ఈ చర్యను అమలు చేయగల అనువర్తనాలు ఏవీ లేవు." + "ఈ చర్యను అమలు చేయగల యాప్‌లు ఏవీ లేవు." "%1$s ఆపివేయబడింది" "%1$s ఆపివేయబడింది" "%1$s పునరావృతంగా ఆపివేయబడుతోంది" "%1$s పునరావృతంగా ఆపివేయబడుతోంది" - "అనువర్తనాన్ని మళ్లీ తెరువు" + "యాప్‌ను మళ్లీ తెరువు" "ఫీడ్‌బ్యాక్‌ను పంపు" "మూసివేయి" "పరికరం పునఃప్రారంభమయ్యే వరకు మ్యూట్ చేయి" "వేచి ఉండండి" - "అనువర్తనాన్ని మూసివేయి" + "యాప్‌ను మూసివేయి" "%2$s ప్రతిస్పందించడం లేదు" "%1$s ప్రతిస్పందించడం లేదు" @@ -1178,7 +1178,7 @@ "%1$s వాస్తవంగా ప్రారంభించబడింది." "ప్రమాణం" "ఎల్లప్పుడూ చూపు" - "సిస్టమ్ సెట్టింగ్‌లు > అనువర్తనాలు > డౌన్‌లోడ్ చేసినవిలో దీన్ని పునఃప్రారంభించండి." + "సిస్టమ్ సెట్టింగ్‌లు > యాప్‌లు > డౌన్‌లోడ్ చేసినవిలో దీన్ని పునఃప్రారంభించండి." "%1$s ప్రస్తుత ప్రదర్శన పరిమాణ సెట్టింగ్‌కు మద్దతు ఇవ్వదు, దీని వలన ఊహించని సమస్యలు తలెత్తవచ్చు." "ఎల్లప్పుడూ చూపు" "Android OS యొక్క అననుకూల వెర్షన్ కోసం %1$s రూపొందించబడింది మరియు ఊహించని సమస్యలు తలెత్తవచ్చు. యాప్ యొక్క అప్‌డేట్ చేసిన వెర్షన్ అందుబాటులో ఉండవచ్చు." @@ -1323,7 +1323,7 @@ "బగ్ నివేదికను తీస్తోంది…" "బగ్ నివేదికను భాగస్వామ్యం చేయాలా?" "బగ్ నివేదికను భాగస్వామ్యం చేస్తోంది..." - "మీ నిర్వాహకులు ఈ పరికరం సమస్యకు పరిష్కారాన్ని కనుగొనడంలో సహాయం కోసం బగ్ నివేదికను అభ్యర్థించారు. అనువర్తనాలు మరియు డేటా భాగస్వామ్యం చేయబడవచ్చు." + "మీ నిర్వాహకులు ఈ పరికరం సమస్యకు పరిష్కారాన్ని కనుగొనడంలో సహాయం కోసం బగ్ నివేదికను అభ్యర్థించారు. యాప్‌లు మరియు డేటా భాగస్వామ్యం చేయబడవచ్చు." "షేర్ చేయి" "తిరస్కరిస్తున్నాను" "ఇన్‌పుట్ పద్ధతిని ఎంచుకోండి" @@ -1386,13 +1386,13 @@ "చొప్పించబడలేదు" "సరిపోలే కార్యాచరణలు కనుగొనబడలేదు." "మీడియా అవుట్‌పుట్‌ను మళ్లించడం" - "మీడియా అవుట్‌పుట్‌ను ఇతర బాహ్య పరికరాలకు మళ్లించడానికి అనువర్తనాన్ని అనుమతిస్తుంది." + "మీడియా అవుట్‌పుట్‌ను ఇతర బాహ్య పరికరాలకు మళ్లించడానికి యాప్‌ను అనుమతిస్తుంది." "ఇన్‌స్టాల్ సెషన్‌లను చదవడం" - "ఇన్‌స్టాల్ సెషన్‌లను చదవడానికి అనువర్తనాన్ని అనుమతిస్తుంది. ఇది సక్రియ ప్యాకేజీ ఇన్‌స్టాలేషన్‌ల గురించి వివరాలను చూడటానికి అనువర్తనాన్ని అనుమతిస్తుంది." + "ఇన్‌స్టాల్ సెషన్‌లను చదవడానికి యాప్‌ను అనుమతిస్తుంది. ఇది సక్రియ ప్యాకేజీ ఇన్‌స్టాలేషన్‌ల గురించి వివరాలను చూడటానికి యాప్‌ను అనుమతిస్తుంది." "ఇన్‌స్టాల్ ప్యాకేజీలను అభ్యర్థించడం" - "ప్యాకేజీల ఇన్‌స్టాలేషన్ అభ్యర్థించడానికి అనువర్తనాన్ని అనుమతిస్తుంది." + "ప్యాకేజీల ఇన్‌స్టాలేషన్ అభ్యర్థించడానికి యాప్‌ను అనుమతిస్తుంది." "ప్యాకేజీలను తొలగించడానికి అభ్యర్థించు" - "ప్యాకేజీల తొలగింపును అభ్యర్థించడానికి అనువర్తనాన్ని అనుమతిస్తుంది." + "ప్యాకేజీల తొలగింపును అభ్యర్థించడానికి యాప్‌ను అనుమతిస్తుంది." "బ్యాటరీ అనుకూలీకరణలను విస్మరించడానికి అడగాలి" "ఆ యాప్ కోసం బ్యాటరీ అనుకూలీకరణలు విస్మరించేలా అనుమతి కోరడానికి యాప్‌ను అనుమతిస్తుంది." "జూమ్ నియంత్రణ కోసం రెండుసార్లు నొక్కండి" @@ -1413,8 +1413,8 @@ "తిరస్కరించండి" "అనుమతి అభ్యర్థించబడింది" "ఖాతా %s కోసం\nఅనుమతి అభ్యర్థించబడింది." - "మీరు మీ కార్యాలయ ప్రొఫైల్‌కు వెలుపల ఈ అనువర్తనాన్ని ఉపయోగిస్తున్నారు" - "మీరు మీ కార్యాలయ ప్రొఫైల్‌లో ఈ అనువర్తనాన్ని ఉపయోగిస్తున్నారు" + "మీరు మీ కార్యాలయ ప్రొఫైల్‌కు వెలుపల ఈ యాప్‌ను ఉపయోగిస్తున్నారు" + "మీరు మీ కార్యాలయ ప్రొఫైల్‌లో ఈ యాప్‌ను ఉపయోగిస్తున్నారు" "ఇన్‌పుట్ పద్ధతి" "సమకాలీకరణ" "యాక్సెస్ సామర్థ్యం" @@ -1894,7 +1894,7 @@ "ఈ యాప్ పాత వెర్షన్ Android కోసం రూపొందించబడింది మరియు అది సరిగ్గా పని చేయకపోవచ్చు. అప్‌డేట్‌ల కోసం తనిఖీ చేయడానికి ప్రయత్నించండి లేదా డెవలపర్‌ని సంప్రదించండి." "అప్‌డేట్ కోసం తనిఖీ చేయండి" "మీకు కొత్త సందేశాలు ఉన్నాయి" - "వీక్షించడానికి SMS అనువర్తనాన్ని తెరవండి" + "వీక్షించడానికి SMS యాప్‌ను తెరవండి" "కొంత ఫంక్షనాలిటీ పరిమితం కావచ్చు" "కార్యాలయ ప్రొఫైల్ లాక్ అయింది" "కార్యాలయ ప్రొఫైల్ అన్‌లాక్ చేయుటకు నొక్కండి" diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml index 2b83c8214bc7a..31937a00c50c7 100644 --- a/core/res/res/values-uz/strings.xml +++ b/core/res/res/values-uz/strings.xml @@ -1265,15 +1265,15 @@ "<b>%1$s</b> katta miqdordagi SMS xabarlarini jo‘natmoqda. Ushbu ilovaga xabarlar jo‘natishni davom ettirishga ruxsat berasizmi?" "Ruxsat berish" "Rad etish" - "<b>%1$s</b> <b>%2$s</b>ga xabar jo‘natishni xohlaydi." - "Bunda, mobil hisobingizdan ""to‘lov olinishi mumkin""." - "Bunda, mobil hisobingizdan to‘lov olinishi mumkin." + "<b>%1$s</b> ilovasi <b>%2$s</b> raqamiga xabar yubormoqchi." + "Mobil aloqa hisobingizdan ""pul olinishi mumkin""." + "Mobil aloqa hisobingizdan pul olinishi mumkin." "Yuborish" "Bekor qilish" "Tanlovim eslab qolinsin" - "Siz buni keyinroq sozlamalar > ilovalar menusidan o‘zgartirishingiz mumkin" - "Doimo ruxsat berilsin" - "Hech qachon ruxsat berilmasin" + "Buni keyinroq Sozlamalar > Ilovalar menyusidan o‘zgartirishingiz mumkin" + "Doim ruxsat" + "Ruxsat berilmasin" "SIM karta olib tashlandi" "Ishlaydigan SIM kartani qo‘yib, qurilmangizni qaytadan ishga tushirmasangiz, mobayl tarmoq mavjud bo‘lmaydi." "Tayyor" @@ -1397,7 +1397,7 @@ "Ilovaga batareya quvvatidan xohlagancha foydalanish uchun ruxsat so‘rashga imkon beradi." "Ko‘lamini o‘zgartirish uchun ikki marta bosing" "Vidjet qo‘shilmadi." - "O‘tish" + "Tanlash" "Qidirish" "Yuborish" "Keyingisi" From f6247e3d3067fea526382ae32d83f6c650449589 Mon Sep 17 00:00:00 2001 From: raylinhsu Date: Mon, 11 Jan 2021 11:56:27 +0800 Subject: [PATCH 125/288] Added to enable/disable log for DisplayModeDirector Added to enable/disable log for DisplayModeDirector dynamically Bug: 176018998 Test: enable DMD logging with $adb shell cmd display dmd-logging-enable This should start logging the collected for DMD. You can filter it with : $adb logcat | grep 'DisplayModeDirector' Change-Id: I66478dda66d5d89193ef1838ab3afca94bf72313 Merged-In: I66478dda66d5d89193ef1838ab3afca94bf72313 --- .../server/display/DisplayManagerService.java | 8 +++ .../display/DisplayManagerShellCommand.java | 13 ++++ .../server/display/DisplayModeDirector.java | 66 ++++++++++++++++--- 3 files changed, 77 insertions(+), 10 deletions(-) diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java index 852868616afdb..713f9c8f173d7 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -1484,6 +1484,14 @@ public final class DisplayManagerService extends SystemService { } } + void setDisplayModeDirectorLoggingEnabled(boolean enabled) { + synchronized (mSyncRoot) { + if (mDisplayModeDirector != null) { + mDisplayModeDirector.setLoggingEnabled(enabled); + } + } + } + void setAmbientColorTemperatureOverride(float cct) { if (mDisplayPowerController != null) { synchronized (mSyncRoot) { diff --git a/services/core/java/com/android/server/display/DisplayManagerShellCommand.java b/services/core/java/com/android/server/display/DisplayManagerShellCommand.java index 0c6c797b917aa..d1d04966bdecb 100644 --- a/services/core/java/com/android/server/display/DisplayManagerShellCommand.java +++ b/services/core/java/com/android/server/display/DisplayManagerShellCommand.java @@ -54,6 +54,10 @@ class DisplayManagerShellCommand extends ShellCommand { return setDisplayWhiteBalanceLoggingEnabled(true); case "dwb-logging-disable": return setDisplayWhiteBalanceLoggingEnabled(false); + case "dmd-logging-enable": + return setDisplayModeDirectorLoggingEnabled(true); + case "dmd-logging-disable": + return setDisplayModeDirectorLoggingEnabled(false); case "dwb-set-cct": return setAmbientColorTemperatureOverride(); default: @@ -80,6 +84,10 @@ class DisplayManagerShellCommand extends ShellCommand { pw.println(" Enable display white-balance logging."); pw.println(" dwb-logging-disable"); pw.println(" Disable display white-balance logging."); + pw.println(" dmd-logging-enable"); + pw.println(" Enable display mode director logging."); + pw.println(" dmd-logging-disable"); + pw.println(" Disable display mode director logging."); pw.println(" dwb-set-cct CCT"); pw.println(" Sets the ambient color temperature override to CCT (use -1 to disable)."); pw.println(); @@ -132,6 +140,11 @@ class DisplayManagerShellCommand extends ShellCommand { return 0; } + private int setDisplayModeDirectorLoggingEnabled(boolean enabled) { + mService.setDisplayModeDirectorLoggingEnabled(enabled); + return 0; + } + private int setAmbientColorTemperatureOverride() { String cctText = getNextArg(); if (cctText == null) { diff --git a/services/core/java/com/android/server/display/DisplayModeDirector.java b/services/core/java/com/android/server/display/DisplayModeDirector.java index 29a77e2b6ef23..18acd918b94f4 100644 --- a/services/core/java/com/android/server/display/DisplayModeDirector.java +++ b/services/core/java/com/android/server/display/DisplayModeDirector.java @@ -66,7 +66,7 @@ import java.util.Objects; */ public class DisplayModeDirector { private static final String TAG = "DisplayModeDirector"; - private static final boolean DEBUG = false; + private boolean mLoggingEnabled; private static final int MSG_REFRESH_RATE_RANGE_CHANGED = 1; private static final int MSG_LOW_BRIGHTNESS_THRESHOLDS_CHANGED = 2; @@ -147,6 +147,14 @@ public class DisplayModeDirector { } + public void setLoggingEnabled(boolean loggingEnabled) { + if (mLoggingEnabled == loggingEnabled) { + return; + } + mLoggingEnabled = loggingEnabled; + mBrightnessObserver.setLoggingEnabled(loggingEnabled); + } + @NonNull private SparseArray getVotesLocked(int displayId) { SparseArray displayVotes = mVotesByDisplay.get(displayId); @@ -248,7 +256,7 @@ public class DisplayModeDirector { availableModes = filterModes(modes, primarySummary); if (availableModes.length > 0) { - if (DEBUG) { + if (mLoggingEnabled) { Slog.w(TAG, "Found available modes=" + Arrays.toString(availableModes) + " with lowest priority considered " + Vote.priorityToString(lowestConsideredPriority) @@ -261,7 +269,7 @@ public class DisplayModeDirector { break; } - if (DEBUG) { + if (mLoggingEnabled) { Slog.w(TAG, "Couldn't find available modes with lowest priority set to " + Vote.priorityToString(lowestConsideredPriority) + " and with the following constraints: " @@ -283,7 +291,7 @@ public class DisplayModeDirector { Math.min(appRequestSummary.minRefreshRate, primarySummary.minRefreshRate); appRequestSummary.maxRefreshRate = Math.max(appRequestSummary.maxRefreshRate, primarySummary.maxRefreshRate); - if (DEBUG) { + if (mLoggingEnabled) { Slog.i(TAG, String.format("App request range: [%.0f %.0f]", appRequestSummary.minRefreshRate, @@ -310,7 +318,7 @@ public class DisplayModeDirector { for (Display.Mode mode : supportedModes) { if (mode.getPhysicalWidth() != summary.width || mode.getPhysicalHeight() != summary.height) { - if (DEBUG) { + if (mLoggingEnabled) { Slog.w(TAG, "Discarding mode " + mode.getModeId() + ", wrong size" + ": desiredWidth=" + summary.width + ": desiredHeight=" + summary.height @@ -325,7 +333,7 @@ public class DisplayModeDirector { // comparison. if (refreshRate < (summary.minRefreshRate - FLOAT_TOLERANCE) || refreshRate > (summary.maxRefreshRate + FLOAT_TOLERANCE)) { - if (DEBUG) { + if (mLoggingEnabled) { Slog.w(TAG, "Discarding mode " + mode.getModeId() + ", outside refresh rate bounds" + ": minRefreshRate=" + summary.minRefreshRate @@ -425,7 +433,7 @@ public class DisplayModeDirector { } private void updateVoteLocked(int displayId, int priority, Vote vote) { - if (DEBUG) { + if (mLoggingEnabled) { Slog.i(TAG, "updateVoteLocked(displayId=" + displayId + ", priority=" + Vote.priorityToString(priority) + ", vote=" + vote + ")"); @@ -446,7 +454,7 @@ public class DisplayModeDirector { } if (votes.size() == 0) { - if (DEBUG) { + if (mLoggingEnabled) { Slog.i(TAG, "No votes left for display " + displayId + ", removing."); } mVotesByDisplay.remove(displayId); @@ -1148,6 +1156,7 @@ public class DisplayModeDirector { private boolean mShouldObserveAmbientLowChange; private boolean mShouldObserveDisplayHighChange; private boolean mShouldObserveAmbientHighChange; + private boolean mLoggingEnabled; private SensorManager mSensorManager; private Sensor mLightSensor; @@ -1276,6 +1285,14 @@ public class DisplayModeDirector { mDeviceConfigDisplaySettings.startListening(); } + public void setLoggingEnabled(boolean loggingEnabled) { + if (mLoggingEnabled == loggingEnabled) { + return; + } + mLoggingEnabled = loggingEnabled; + mLightSensorListener.setLoggingEnabled(loggingEnabled); + } + public void onRefreshRateSettingChangedLocked(float min, float max) { boolean changeable = (max - min > 1f && max > 60f); if (mRefreshRateChangeable != changeable) { @@ -1552,7 +1569,7 @@ public class DisplayModeDirector { vote = Vote.forRefreshRates(mRefreshRateInHighZone, mRefreshRateInHighZone); } - if (DEBUG) { + if (mLoggingEnabled) { Slog.d(TAG, "Display brightness " + mBrightness + ", ambient lux " + mAmbientLux + ", Vote " + vote); } @@ -1581,6 +1598,11 @@ public class DisplayModeDirector { @VisibleForTesting public void setDefaultDisplayState(int state) { + if (mLoggingEnabled) { + Slog.d(TAG, "setDefaultDisplayState: mDefaultDisplayState = " + + mDefaultDisplayState + ", state = " + state); + } + if (mDefaultDisplayState != state) { mDefaultDisplayState = state; updateSensorStatus(); @@ -1592,13 +1614,28 @@ public class DisplayModeDirector { return; } + if (mLoggingEnabled) { + Slog.d(TAG, "updateSensorStatus: mShouldObserveAmbientLowChange = " + + mShouldObserveAmbientLowChange + ", mShouldObserveAmbientHighChange = " + + mShouldObserveAmbientHighChange); + Slog.d(TAG, "updateSensorStatus: mLowPowerModeEnabled = " + + mLowPowerModeEnabled + ", mRefreshRateChangeable = " + + mRefreshRateChangeable); + } + if ((mShouldObserveAmbientLowChange || mShouldObserveAmbientHighChange) && isDeviceActive() && !mLowPowerModeEnabled && mRefreshRateChangeable) { mSensorManager.registerListener(mLightSensorListener, mLightSensor, LIGHT_SENSOR_RATE_MS * 1000, mHandler); + if (mLoggingEnabled) { + Slog.d(TAG, "updateSensorStatus: registerListener"); + } } else { mLightSensorListener.removeCallbacks(); mSensorManager.unregisterListener(mLightSensorListener); + if (mLoggingEnabled) { + Slog.d(TAG, "updateSensorStatus: unregisterListener"); + } } } @@ -1612,16 +1649,25 @@ public class DisplayModeDirector { final private static int INJECT_EVENTS_INTERVAL_MS = LIGHT_SENSOR_RATE_MS; private float mLastSensorData; private long mTimestamp; + private boolean mLoggingEnabled; public void dumpLocked(PrintWriter pw) { pw.println(" mLastSensorData: " + mLastSensorData); pw.println(" mTimestamp: " + formatTimestamp(mTimestamp)); } + + public void setLoggingEnabled(boolean loggingEnabled) { + if (mLoggingEnabled == loggingEnabled) { + return; + } + mLoggingEnabled = loggingEnabled; + } + @Override public void onSensorChanged(SensorEvent event) { mLastSensorData = event.values[0]; - if (DEBUG) { + if (mLoggingEnabled) { Slog.d(TAG, "On sensor changed: " + mLastSensorData); } From f63122d51e232e59c3fd15916fd0f43a07c155ab Mon Sep 17 00:00:00 2001 From: raylinhsu Date: Fri, 22 Jan 2021 11:41:05 +0800 Subject: [PATCH 126/288] Fix ambient information which did not get for locking refresh rate Sometimes we will see that the display state is ON but the DeviceInteractive is false and then BrightnessObserver can not register the light sensor.Hence, it can not judge if the threshold meets the condition for blocking zones.This patch is for fixing this kind of case. Bug: 176018998 Test: atest DisplayModeDirectorTest Test: no fps transition in the blocking zone when the display state change Test: check if the lux will update when the display state change Change-Id: Idcfcbfa9e41bb9a34e4808db6fdd7f8a5901457b Merged-In: Idcfcbfa9e41bb9a34e4808db6fdd7f8a5901457b --- .../android/server/display/DisplayModeDirector.java | 13 +------------ .../server/display/DisplayModeDirectorTest.java | 5 ----- 2 files changed, 1 insertion(+), 17 deletions(-) diff --git a/services/core/java/com/android/server/display/DisplayModeDirector.java b/services/core/java/com/android/server/display/DisplayModeDirector.java index 18acd918b94f4..9693057778ec9 100644 --- a/services/core/java/com/android/server/display/DisplayModeDirector.java +++ b/services/core/java/com/android/server/display/DisplayModeDirector.java @@ -1173,7 +1173,6 @@ public class DisplayModeDirector { // changeable and low power mode off. After initialization, these states will // be updated from the same handler thread. private int mDefaultDisplayState = Display.STATE_UNKNOWN; - private boolean mIsDeviceActive = false; private boolean mRefreshRateChangeable = false; private boolean mLowPowerModeEnabled = false; @@ -1363,7 +1362,6 @@ public class DisplayModeDirector { pw.println(" mAmbientLux: " + mAmbientLux); pw.println(" mBrightness: " + mBrightness); pw.println(" mDefaultDisplayState: " + mDefaultDisplayState); - pw.println(" mIsDeviceActive: " + mIsDeviceActive); pw.println(" mLowPowerModeEnabled: " + mLowPowerModeEnabled); pw.println(" mRefreshRateChangeable: " + mRefreshRateChangeable); pw.println(" mShouldObserveDisplayLowChange: " + mShouldObserveDisplayLowChange); @@ -1640,9 +1638,7 @@ public class DisplayModeDirector { } private boolean isDeviceActive() { - mIsDeviceActive = mInjector.isDeviceInteractive(mContext); - return (mDefaultDisplayState == Display.STATE_ON) - && mIsDeviceActive; + return mDefaultDisplayState == Display.STATE_ON; } private final class LightSensorEventListener implements SensorEventListener { @@ -1916,8 +1912,6 @@ public class DisplayModeDirector { void registerPeakRefreshRateObserver(@NonNull ContentResolver cr, @NonNull ContentObserver observer); - - boolean isDeviceInteractive(@NonNull Context context); } @VisibleForTesting @@ -1948,11 +1942,6 @@ public class DisplayModeDirector { cr.registerContentObserver(PEAK_REFRESH_RATE_URI, false /*notifyDescendants*/, observer, UserHandle.USER_SYSTEM); } - - @Override - public boolean isDeviceInteractive(@NonNull Context ctx) { - return ctx.getSystemService(PowerManager.class).isInteractive(); - } } } diff --git a/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java b/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java index e202145b7dbee..c6f6fa81db754 100644 --- a/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java +++ b/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java @@ -723,10 +723,5 @@ public class DisplayModeDirectorTest { PEAK_REFRESH_RATE_URI); } } - - @Override - public boolean isDeviceInteractive(@NonNull Context context) { - return true; - } } } From 7a974a5468b8760daeae1890a9c8c52eeed19d87 Mon Sep 17 00:00:00 2001 From: Jonathan Scott Date: Mon, 1 Feb 2021 17:51:13 +0000 Subject: [PATCH 127/288] [RESTRICT AUTOMERGE] Use userId instead of USER_CURRENT in shouldLockKeyguard. USER_CURRENT is not an acceptable input to isSecure(). The test has also been updated as the use of any() for the mock hid this bug. Test: atest LockTaskControllerTest Bug: 176801033 Change-Id: Ic080eddb04ce9c20ebb6118abe8a48d28c7f67e5 --- .../java/com/android/server/wm/LockTaskController.java | 10 +++++----- .../com/android/server/wm/LockTaskControllerTest.java | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/services/core/java/com/android/server/wm/LockTaskController.java b/services/core/java/com/android/server/wm/LockTaskController.java index 892ee717e21f5..998e134e0a984 100644 --- a/services/core/java/com/android/server/wm/LockTaskController.java +++ b/services/core/java/com/android/server/wm/LockTaskController.java @@ -512,7 +512,7 @@ public class LockTaskController { setStatusBarState(mLockTaskModeState, userId); setKeyguardState(mLockTaskModeState, userId); if (oldLockTaskModeState == LOCK_TASK_MODE_PINNED) { - lockKeyguardIfNeeded(); + lockKeyguardIfNeeded(userId); } if (getDevicePolicyManager() != null) { getDevicePolicyManager().notifyLockTaskModeChanged(false, null, userId); @@ -824,15 +824,15 @@ public class LockTaskController { * Helper method for locking the device immediately. This may be necessary when the device * leaves the pinned mode. */ - private void lockKeyguardIfNeeded() { - if (shouldLockKeyguard()) { + private void lockKeyguardIfNeeded(int userId) { + if (shouldLockKeyguard(userId)) { mWindowManager.lockNow(null); mWindowManager.dismissKeyguard(null /* callback */, null /* message */); getLockPatternUtils().requireCredentialEntry(USER_ALL); } } - private boolean shouldLockKeyguard() { + private boolean shouldLockKeyguard(int userId) { // This functionality should be kept consistent with // com.android.settings.security.ScreenPinningSettings (see b/127605586) try { @@ -842,7 +842,7 @@ public class LockTaskController { } catch (Settings.SettingNotFoundException e) { // Log to SafetyNet for b/127605586 android.util.EventLog.writeEvent(0x534e4554, "127605586", -1, ""); - return getLockPatternUtils().isSecure(USER_CURRENT); + return getLockPatternUtils().isSecure(userId); } } diff --git a/services/tests/wmtests/src/com/android/server/wm/LockTaskControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/LockTaskControllerTest.java index a137cde2d351f..1ca32e304fc48 100644 --- a/services/tests/wmtests/src/com/android/server/wm/LockTaskControllerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/LockTaskControllerTest.java @@ -450,7 +450,7 @@ public class LockTaskControllerTest { Settings.Secure.clearProviderForTest(); // AND a password is set - when(mLockPatternUtils.isSecure(anyInt())) + when(mLockPatternUtils.isSecure(TEST_USER_ID)) .thenReturn(true); // AND there is a task record From 9d3b7aacd9424d866327766a98e6e41998669d30 Mon Sep 17 00:00:00 2001 From: Heemin Seog Date: Mon, 1 Feb 2021 13:50:38 -0800 Subject: [PATCH 128/288] DO NOT MERGE Dont restore focus on new HUN window When a HUN window shows for the first time, Android framework can try to find a default focus. As such, the FPV may try to focus the topmost HUN by default, without having nudged to the HUN window. Bug: 175897692 Test: manual (reboot and trigger HUN via kitchen sink) Change-Id: Id4008c587aea353dc0c441593fe32e6e9fea5463 --- packages/CarSystemUI/res/layout/headsup_container_bottom.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/CarSystemUI/res/layout/headsup_container_bottom.xml b/packages/CarSystemUI/res/layout/headsup_container_bottom.xml index f43f02dfcc8cf..c28da39f04b28 100644 --- a/packages/CarSystemUI/res/layout/headsup_container_bottom.xml +++ b/packages/CarSystemUI/res/layout/headsup_container_bottom.xml @@ -35,7 +35,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent"/> + app:layout_constraintTop_toTopOf="parent" + app:shouldRestoreFocus="false"/> Date: Thu, 17 Dec 2020 21:13:31 +0800 Subject: [PATCH 129/288] [DO NOT MERGE] DisplayImeController: fix out-of-sync IME visibility This change is based on CL[1] in rvc-qpr-dev code base. Note: This cherry-picked change isn't completely same as master one, it add a method "getImeRequestedVisibility" in InsetsControlTarget since "getRequestedVisibility" didn't exist in rvc-qpr currently. Fixes an issue where the DisplayImeController would disagree with the InputMethodManagerService about the visibility of the IME. Currently, the Insets component is supposed to execute the visibility as dictated by IMMS; however, when the DisplayImeController became the control target, previously it would just apply the IME visibility that was last requested of it - regardless of the changes to it that may have happened while it was not the control target. Eventually, IME visibility should be driven by the requested IME inset visibility of the focused window, instead of the separate dispatch we have now from IMMS. [1]:I1f140af6bcccbcbe6efb2fde9a789ac4c7bd127f Bug: 167780081 Test: atest ImeInsetsSourceProviderTest Change-Id: I3962f3aa26d9325d7d8a4611f13a637d46337fef --- .../systemui/wm/DisplayImeController.java | 2 ++ .../com/android/server/wm/DisplayContent.java | 5 ++++ .../server/wm/ImeInsetsSourceProvider.java | 26 ++++++++++++++++--- .../server/wm/InsetsControlTarget.java | 7 +++++ .../server/wm/InsetsSourceProvider.java | 2 +- .../server/wm/WindowManagerService.java | 3 +++ .../wm/ImeInsetsSourceProviderTest.java | 20 ++++++++++++++ .../android/server/wm/WindowTestsBase.java | 9 +++++++ 8 files changed, 70 insertions(+), 4 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/wm/DisplayImeController.java b/packages/SystemUI/src/com/android/systemui/wm/DisplayImeController.java index dd4ea578dafef..ab4da83518e40 100644 --- a/packages/SystemUI/src/com/android/systemui/wm/DisplayImeController.java +++ b/packages/SystemUI/src/com/android/systemui/wm/DisplayImeController.java @@ -203,6 +203,8 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged return; } + mImeShowing = insetsState.getSourceOrDefaultVisibility(InsetsState.ITYPE_IME); + final InsetsSource newSource = insetsState.getSource(InsetsState.ITYPE_IME); final Rect newFrame = newSource.getFrame(); final Rect oldFrame = mInsetsState.getSource(InsetsState.ITYPE_IME).getFrame(); diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index adf0b44040d9d..2ef98b59768f5 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -5877,6 +5877,11 @@ class DisplayContent extends WindowContainer Date: Tue, 2 Feb 2021 18:14:42 +0000 Subject: [PATCH 130/288] [RESTRICT AUTOMERGE] Use userId instead of USER_CURRENT in shouldLockKeyguard. USER_CURRENT is not an acceptable input to isSecure(). The test has also been updated as the use of any() for the mock hid this bug. Test: atest LockTaskControllerTest Bug: 176801033 Change-Id: I8aa736bb7b8b60937ad4319e6127c356be5e9b55 --- .../java/com/android/server/wm/LockTaskController.java | 10 +++++----- .../com/android/server/wm/LockTaskControllerTest.java | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/services/core/java/com/android/server/wm/LockTaskController.java b/services/core/java/com/android/server/wm/LockTaskController.java index c4a42ab7e7be2..281d2c9ed9927 100644 --- a/services/core/java/com/android/server/wm/LockTaskController.java +++ b/services/core/java/com/android/server/wm/LockTaskController.java @@ -512,7 +512,7 @@ public class LockTaskController { setStatusBarState(mLockTaskModeState, userId); setKeyguardState(mLockTaskModeState, userId); if (oldLockTaskModeState == LOCK_TASK_MODE_PINNED) { - lockKeyguardIfNeeded(); + lockKeyguardIfNeeded(userId); } if (getDevicePolicyManager() != null) { getDevicePolicyManager().notifyLockTaskModeChanged(false, null, userId); @@ -824,15 +824,15 @@ public class LockTaskController { * Helper method for locking the device immediately. This may be necessary when the device * leaves the pinned mode. */ - private void lockKeyguardIfNeeded() { - if (shouldLockKeyguard()) { + private void lockKeyguardIfNeeded(int userId) { + if (shouldLockKeyguard(userId)) { mWindowManager.lockNow(null); mWindowManager.dismissKeyguard(null /* callback */, null /* message */); getLockPatternUtils().requireCredentialEntry(USER_ALL); } } - private boolean shouldLockKeyguard() { + private boolean shouldLockKeyguard(int userId) { // This functionality should be kept consistent with // com.android.settings.security.ScreenPinningSettings (see b/127605586) try { @@ -842,7 +842,7 @@ public class LockTaskController { } catch (Settings.SettingNotFoundException e) { // Log to SafetyNet for b/127605586 android.util.EventLog.writeEvent(0x534e4554, "127605586", -1, ""); - return getLockPatternUtils().isSecure(USER_CURRENT); + return getLockPatternUtils().isSecure(userId); } } diff --git a/services/tests/wmtests/src/com/android/server/wm/LockTaskControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/LockTaskControllerTest.java index e345becf0499f..fdc01b48398f9 100644 --- a/services/tests/wmtests/src/com/android/server/wm/LockTaskControllerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/LockTaskControllerTest.java @@ -450,7 +450,7 @@ public class LockTaskControllerTest { Settings.Secure.clearProviderForTest(); // AND a password is set - when(mLockPatternUtils.isSecure(anyInt())) + when(mLockPatternUtils.isSecure(TEST_USER_ID)) .thenReturn(true); // AND there is a task record From e1870fd0ee52cf7927359e6eb453d605e8ca8696 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 2 Feb 2021 19:56:58 +0000 Subject: [PATCH 131/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Iaa74e37616c6f43abc3a9a50c2ca3b809d1ee880 --- packages/InputDevices/res/values-eu/strings.xml | 2 +- packages/InputDevices/res/values-ta/strings.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/InputDevices/res/values-eu/strings.xml b/packages/InputDevices/res/values-eu/strings.xml index 30a193f25f543..18d3eb745574a 100644 --- a/packages/InputDevices/res/values-eu/strings.xml +++ b/packages/InputDevices/res/values-eu/strings.xml @@ -41,7 +41,7 @@ "Lituaniera" "Espainiera (Latinoamerika)" "Letoniera" - "Pertsiera" + "Persiarra" "Azerbaijandarra" "Poloniarra" diff --git a/packages/InputDevices/res/values-ta/strings.xml b/packages/InputDevices/res/values-ta/strings.xml index b614a50992266..53ac7b0720fe3 100644 --- a/packages/InputDevices/res/values-ta/strings.xml +++ b/packages/InputDevices/res/values-ta/strings.xml @@ -2,7 +2,7 @@ "உள்ளீட்டுச் சாதனங்கள்" - "Android விசைப்பலகை" + "Android கீபோர்டு" "ஆங்கிலம் (யூகே)" "ஆங்கிலம் (யூஎஸ்)" "ஆங்கிலம் (யூஎஸ்), சர்வதேச நடை" From 43e8c61bee99d04f5bb06f883d61fcaeb7debf70 Mon Sep 17 00:00:00 2001 From: Eugene Susla Date: Fri, 4 Dec 2020 16:01:46 -0800 Subject: [PATCH 132/288] RESTRICT AUTOMERGE Allow CDM to hide overlays Since CDM has sensitive user consent UIs, it should be able to hide non-system overlays Test: use a 3p overlay app with a visible overlay to ensure overlay disappears when CDM is shown Bug: 171221090 Change-Id: I78673b7b95f4c3cb31fab180201eb17c9123bddf Merged-In: I78673b7b95f4c3cb31fab180201eb17c9123bddf --- packages/CompanionDeviceManager/AndroidManifest.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/CompanionDeviceManager/AndroidManifest.xml b/packages/CompanionDeviceManager/AndroidManifest.xml index ea9b52cbf3d51..e4e5b9fa781a2 100644 --- a/packages/CompanionDeviceManager/AndroidManifest.xml +++ b/packages/CompanionDeviceManager/AndroidManifest.xml @@ -31,6 +31,7 @@ + Date: Mon, 26 Oct 2020 09:08:49 -0700 Subject: [PATCH 133/288] RESTRICT AUTOMERGE Prevent non-system overlays from showing over CDM UI Since CDM grants privileges, it should have the same overlay policy as permission UI Test: use an app wit ha visible overlay to ensure the overlay disappears when CDM is shown Fixes: 171221090 Change-Id: I004843edf5a156dc07fb961edf80272f5cb50163 (cherry picked from commit ea4ce4d48eb22e05f03b36e281149f1e944674fa) --- .../android/companiondevicemanager/DeviceChooserActivity.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java index 16ef59f201f17..7bc9993751d40 100644 --- a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java +++ b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java @@ -17,6 +17,7 @@ package com.android.companiondevicemanager; import static android.companion.BluetoothDeviceFilterUtils.getDeviceMacAddress; +import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS; import android.app.Activity; import android.companion.CompanionDeviceManager; @@ -56,6 +57,8 @@ public class DeviceChooserActivity extends Activity { Log.e(LOG_TAG, "About to show UI, but no devices to show"); } + getWindow().addSystemFlags(SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS); + if (getService().mRequest.isSingleDevice()) { setContentView(R.layout.device_confirmation); final DeviceFilterPair selectedDevice = getService().mDevicesFound.get(0); From af2ffd04af8cee4eab8c022daff04ae63dd5b99c Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 3 Feb 2021 08:00:41 +0000 Subject: [PATCH 134/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ie2f36a7e4734e28aa004f70fd7b9ff4394b02ec3 --- packages/PackageInstaller/res/values-ca/strings.xml | 6 +++--- packages/PackageInstaller/res/values-eu/strings.xml | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/PackageInstaller/res/values-ca/strings.xml b/packages/PackageInstaller/res/values-ca/strings.xml index 1833329a9e342..b25b37bec795b 100644 --- a/packages/PackageInstaller/res/values-ca/strings.xml +++ b/packages/PackageInstaller/res/values-ca/strings.xml @@ -80,9 +80,9 @@ "Les accions d\'instal·lar o de desinstal·lar no s\'admeten a Wear." "S\'està preparant la instal·lació de l\'aplicació…" "Desconeguda" - "Per seguretat, la tauleta no pot instal·lar aplicacions desconegudes d\'aquesta font." - "Per seguretat, el televisor no pot instal·lar aplicacions desconegudes d\'aquesta font." - "Per seguretat, el telèfon no pot instal·lar aplicacions desconegudes d\'aquesta font." + "Per la teva seguretat, la tauleta no pot instal·lar aplicacions desconegudes d\'aquesta font." + "Per la teva seguretat, el televisor no pot instal·lar aplicacions desconegudes d\'aquesta font." + "Per la teva seguretat, el telèfon no pot instal·lar aplicacions desconegudes d\'aquesta font." "El telèfon i les dades personals són més vulnerables als atacs d\'aplicacions desconegudes. En instal·lar aquesta aplicació, acceptes que ets responsable de qualsevol dany que es produeixi al telèfon o de la pèrdua de dades que pugui resultar del seu ús." "La tauleta i les dades personals són més vulnerables als atacs d\'aplicacions desconegudes. En instal·lar aquesta aplicació, acceptes que ets responsable de qualsevol dany que es produeixi a la tauleta o de la pèrdua de dades que pugui resultar del seu ús." "El televisor i les dades personals són més vulnerables als atacs d\'aplicacions desconegudes. En instal·lar aquesta aplicació, acceptes que ets responsable de qualsevol dany que es produeixi al televisor o de la pèrdua de dades que pugui resultar del seu ús." diff --git a/packages/PackageInstaller/res/values-eu/strings.xml b/packages/PackageInstaller/res/values-eu/strings.xml index 65e75cdba4056..d411831eef3f9 100644 --- a/packages/PackageInstaller/res/values-eu/strings.xml +++ b/packages/PackageInstaller/res/values-eu/strings.xml @@ -83,9 +83,9 @@ "Segurtasuna bermatzeko, ezin dira instalatu iturburu honetako aplikazio ezezagunak tableta honetan." "Segurtasuna bermatzeko, ezin dira instalatu iturburu honetako aplikazio ezezagunak telebista honetan." "Segurtasuna bermatzeko, ezin dira instalatu iturburu honetako aplikazio ezezagunak telefono honetan." - "Telefonoak eta datu pertsonalek aplikazio ezezagunen erasoak jaso ditzakete. Aplikazio hau instalatzen baduzu, onartu egingo duzu zeu zarela hura erabiltzeagatik telefonoak jasan ditzakeen kalteen edo datu-galeren erantzulea." - "Tabletak eta datu pertsonalek aplikazio ezezagunen erasoak jaso ditzakete. Aplikazio hau instalatzen baduzu, onartu egingo duzu zeu zarela hura erabiltzeagatik tabletak jasan ditzakeen kalteen edo datu-galeren erantzulea." - "Telebistak eta datu pertsonalek aplikazio ezezagunen erasoak jaso ditzakete. Aplikazio hau instalatzen baduzu, onartu egingo duzu zeu zarela hura erabiltzeagatik telebistak jasan ditzakeen kalteen edo datu-galeren erantzulea." + "Telefonoak eta datu pertsonalek aplikazio ezezagunen erasoak jaso ditzakete. Aplikazio hau instalatzen baduzu, onartuko duzu zeu zarela hura erabiltzeagatik telefonoak jasan ditzakeen kalteen edo datu-galeren erantzulea." + "Tabletak eta datu pertsonalek aplikazio ezezagunen erasoak jaso ditzakete. Aplikazio hau instalatzen baduzu, onartuko duzu zeu zarela hura erabiltzeagatik tabletak jasan ditzakeen kalteen edo datu-galeren erantzulea." + "Telebistak eta datu pertsonalek aplikazio ezezagunen erasoak jaso ditzakete. Aplikazio hau instalatzen baduzu, onartuko duzu zeu zarela hura erabiltzeagatik telebistak jasan ditzakeen kalteen edo datu-galeren erantzulea." "Egin aurrera" "Ezarpenak" "Wear aplikazioak instalatzea/desinstalatzea" From 1ed4d9e4604e180b7640d131590be05dc3f88f8a Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 3 Feb 2021 09:33:57 +0000 Subject: [PATCH 135/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I85c9b3c74236cbfbf367a49bd3dc9406585ef337 --- packages/PrintSpooler/res/values-or/strings.xml | 4 ++-- packages/PrintSpooler/res/values-uk/strings.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/PrintSpooler/res/values-or/strings.xml b/packages/PrintSpooler/res/values-or/strings.xml index 7000b95b35d63..15cecd6f46ccc 100644 --- a/packages/PrintSpooler/res/values-or/strings.xml +++ b/packages/PrintSpooler/res/values-or/strings.xml @@ -80,10 +80,10 @@ %1$sଟି ପ୍ରିଣ୍ଟର୍‍ ଖୋଜିବା ପାଇଁ ଇନଷ୍ଟଲ୍‍ କରନ୍ତୁ "%1$s ପ୍ରିଣ୍ଟ କରାଯାଉଛି" - "%1$s କ୍ୟାନ୍ସଲ୍‍ କରାଯାଉଛି" + "%1$s ବାତିଲ୍‍ କରାଯାଉଛି" "%1$s ପ୍ରିଣ୍ଟର୍‍ ତ୍ରୁଟି" "ପ୍ରିଣ୍ଟର୍‍ ଦ୍ୱାରା ରୋକାଯାଇଥିବା %1$s" - "କ୍ୟାନ୍ସଲ୍‍" + "ବାତିଲ୍‍" "ରିଷ୍ଟାର୍ଟ କରନ୍ତୁ" "ପ୍ରିଣ୍ଟର୍‍କୁ କୌଣସି ସଂଯୋଗ ନାହିଁ" "ଅଜଣା" diff --git a/packages/PrintSpooler/res/values-uk/strings.xml b/packages/PrintSpooler/res/values-uk/strings.xml index b5d426e56e606..fc02fa13035b1 100644 --- a/packages/PrintSpooler/res/values-uk/strings.xml +++ b/packages/PrintSpooler/res/values-uk/strings.xml @@ -31,7 +31,7 @@ "Усі %1$s" "Діапазон %1$s" "напр.,1–5, 8, 11–13" - "Версія для друку" + "Попередній перегляд друку" "Установити засіб перегляду PDF" "Програма друку аварійно завершила роботу" "Створюється завдання друку" From 11c590af09a7ba7324c5ffa165880f3398e51c3e Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 3 Feb 2021 11:03:14 +0000 Subject: [PATCH 136/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ib2f07acb90c34869e55a1c5180c5229b6d420183 --- packages/SimAppDialog/res/values-mn/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/SimAppDialog/res/values-mn/strings.xml b/packages/SimAppDialog/res/values-mn/strings.xml index f21b80bc759bd..51298bbda34b9 100644 --- a/packages/SimAppDialog/res/values-mn/strings.xml +++ b/packages/SimAppDialog/res/values-mn/strings.xml @@ -19,8 +19,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Sim аппын харилцах цонх" "Мобайл үйлчилгээг идэвхжүүлэх" - "Та шинэ СИМ-ээ зөв ажиллуулахын тулд %1$s аппыг суулгах хэрэгтэй болно" - "Та шинэ СИМ-ээ зөв ажиллуулахын тулд оператор компанийхаа аппыг суулгах хэрэгтэй болно" + "Та шинэ SIM-ээ зөв ажиллуулахын тулд %1$s аппыг суулгах хэрэгтэй болно" + "Та шинэ SIM-ээ зөв ажиллуулахын тулд оператор компанийхаа аппыг суулгах хэрэгтэй болно" "Одоо биш" "Апп татах" From 07eacd87975758a9bea84d85d873e19c49f0770d Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 3 Feb 2021 14:01:03 +0000 Subject: [PATCH 137/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Iaecbd8915ca89a4b276cdfb31f4396f669c9bd4c --- packages/Shell/res/values-sv/strings.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/Shell/res/values-sv/strings.xml b/packages/Shell/res/values-sv/strings.xml index d9080a82a2f5a..d8877771fa730 100644 --- a/packages/Shell/res/values-sv/strings.xml +++ b/packages/Shell/res/values-sv/strings.xml @@ -25,9 +25,9 @@ "Felrapporten visas på mobilen inom kort" "Tryck för att dela felrapporten" "Tryck om du vill dela felrapporten" - "Svep för att dela felrapporten utan en skärmdump eller vänta tills skärmdumpen är klar" - "Tryck om du vill dela felrapporten utan en skärmdump eller vänta tills skärmdumpen är klar" - "Tryck om du vill dela felrapporten utan en skärmdump eller vänta tills skärmdumpen är klar" + "Svep för att dela felrapporten utan en skärmbild eller vänta tills skärmbilden är klar" + "Tryck om du vill dela felrapporten utan en skärmbild eller vänta tills skärmbilden är klar" + "Tryck om du vill dela felrapporten utan en skärmbild eller vänta tills skärmbilden är klar" "Felrapporter innehåller data från systemets olika loggfiler, vilka kan innehålla data som är känslig för dig (som appanvändning och platsdata). Dela bara felrapporter med personer du litar på." "Visa inte igen" "Felrapporter" @@ -35,8 +35,8 @@ "Det gick inte att lägga till information om felrapporten i ZIP-filen" "namnlös" "Information" - "Skärmdump" - "Skärmdump har tagits." + "Skärmbild" + "Skärmbild har tagits." "Det gick inte att ta skrämdump." "Information för felrapporten #%d" "Filnamn" From a5141a4b9692237110c4361d71dd19d19e31c040 Mon Sep 17 00:00:00 2001 From: Miranda Kephart Date: Mon, 16 Nov 2020 11:22:13 -0500 Subject: [PATCH 138/288] [DO NOT MERGE] Close screenshot process on user switched Currently, we keep the process up even if the user switches, meaning that in some cases (if the user is switched while the screenshot UI is up) we will save images to the wrong profile. This change makes ScreenshotHelper listen for user switches and close the screenshot service, so that a new screenshot is guaranteed to be constructed with the correct user's context. Bug: 170474245 Fix: 170474245 Test: manual -- verified bad state occurs if user switches within the timeout period, ensured that screenshots work immediately after switching with this change. Change-Id: I9d32d0928e6c2bda161d04555438d0dd7afef0ba (cherry picked from commit 7ef1a5dd1506075507412626f2533283d9520144) --- .../internal/util/ScreenshotHelper.java | 40 ++++++++++++++----- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/core/java/com/android/internal/util/ScreenshotHelper.java b/core/java/com/android/internal/util/ScreenshotHelper.java index 9bf05135c4c5c..9ee7c3005b0e9 100644 --- a/core/java/com/android/internal/util/ScreenshotHelper.java +++ b/core/java/com/android/internal/util/ScreenshotHelper.java @@ -1,12 +1,15 @@ package com.android.internal.util; +import static android.content.Intent.ACTION_USER_SWITCHED; import static android.view.WindowManager.ScreenshotSource.SCREENSHOT_OTHER; import android.annotation.NonNull; import android.annotation.Nullable; +import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.content.ServiceConnection; import android.graphics.Insets; import android.graphics.Rect; @@ -161,8 +164,21 @@ public class ScreenshotHelper { private ServiceConnection mScreenshotConnection = null; private final Context mContext; + private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + synchronized (mScreenshotLock) { + if (ACTION_USER_SWITCHED.equals(intent.getAction())) { + resetConnection(); + } + } + } + }; + public ScreenshotHelper(Context context) { mContext = context; + IntentFilter filter = new IntentFilter(ACTION_USER_SWITCHED); + mContext.registerReceiver(mBroadcastReceiver, filter); } /** @@ -279,9 +295,8 @@ public class ScreenshotHelper { final Runnable mScreenshotTimeout = () -> { synchronized (mScreenshotLock) { if (mScreenshotConnection != null) { - mContext.unbindService(mScreenshotConnection); - mScreenshotConnection = null; - mScreenshotService = null; + Log.e(TAG, "Timed out before getting screenshot capture response"); + resetConnection(); notifyScreenshotError(); } } @@ -305,9 +320,7 @@ public class ScreenshotHelper { case SCREENSHOT_MSG_PROCESS_COMPLETE: synchronized (mScreenshotLock) { if (myConn != null && mScreenshotConnection == myConn) { - mContext.unbindService(myConn); - mScreenshotConnection = null; - mScreenshotService = null; + resetConnection(); } } break; @@ -348,9 +361,7 @@ public class ScreenshotHelper { public void onServiceDisconnected(ComponentName name) { synchronized (mScreenshotLock) { if (mScreenshotConnection != null) { - mContext.unbindService(mScreenshotConnection); - mScreenshotConnection = null; - mScreenshotService = null; + resetConnection(); // only log an error if we're still within the timeout period if (handler.hasCallbacks(mScreenshotTimeout)) { handler.removeCallbacks(mScreenshotTimeout); @@ -381,6 +392,17 @@ public class ScreenshotHelper { } } + /** + * Unbinds the current screenshot connection (if any). + */ + private void resetConnection() { + if (mScreenshotConnection != null) { + mContext.unbindService(mScreenshotConnection); + mScreenshotConnection = null; + mScreenshotService = null; + } + } + /** * Notifies the screenshot service to show an error. */ From 44aeb32d9dcc00c54fd69e06956cc436bf3af326 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 3 Feb 2021 17:01:21 +0000 Subject: [PATCH 139/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ic3d09832985aa99be71c3ba982650405574cbda1 --- packages/SystemUI/res/values-af/strings.xml | 3 ++ packages/SystemUI/res/values-am/strings.xml | 3 ++ packages/SystemUI/res/values-ar/strings.xml | 3 ++ packages/SystemUI/res/values-as/strings.xml | 3 ++ packages/SystemUI/res/values-az/strings.xml | 3 ++ .../SystemUI/res/values-b+sr+Latn/strings.xml | 3 ++ packages/SystemUI/res/values-be/strings.xml | 3 ++ packages/SystemUI/res/values-bg/strings.xml | 3 ++ packages/SystemUI/res/values-bn/strings.xml | 3 ++ packages/SystemUI/res/values-bs/strings.xml | 3 ++ packages/SystemUI/res/values-ca/strings.xml | 3 ++ packages/SystemUI/res/values-cs/strings.xml | 3 ++ packages/SystemUI/res/values-da/strings.xml | 5 ++- packages/SystemUI/res/values-de/strings.xml | 5 ++- packages/SystemUI/res/values-el/strings.xml | 3 ++ .../SystemUI/res/values-en-rAU/strings.xml | 3 ++ .../SystemUI/res/values-en-rCA/strings.xml | 3 ++ .../SystemUI/res/values-en-rGB/strings.xml | 3 ++ .../SystemUI/res/values-en-rIN/strings.xml | 3 ++ .../SystemUI/res/values-en-rXC/strings.xml | 3 ++ .../SystemUI/res/values-es-rUS/strings.xml | 3 ++ packages/SystemUI/res/values-es/strings.xml | 3 ++ packages/SystemUI/res/values-et/strings.xml | 3 ++ packages/SystemUI/res/values-eu/strings.xml | 3 ++ packages/SystemUI/res/values-fa/strings.xml | 3 ++ packages/SystemUI/res/values-fi/strings.xml | 3 ++ .../SystemUI/res/values-fr-rCA/strings.xml | 3 ++ packages/SystemUI/res/values-fr/strings.xml | 3 ++ packages/SystemUI/res/values-gl/strings.xml | 3 ++ packages/SystemUI/res/values-gu/strings.xml | 3 ++ packages/SystemUI/res/values-hi/strings.xml | 3 ++ packages/SystemUI/res/values-hr/strings.xml | 3 ++ packages/SystemUI/res/values-hu/strings.xml | 3 ++ packages/SystemUI/res/values-hy/strings.xml | 3 ++ packages/SystemUI/res/values-in/strings.xml | 3 ++ packages/SystemUI/res/values-is/strings.xml | 3 ++ packages/SystemUI/res/values-it/strings.xml | 5 ++- packages/SystemUI/res/values-iw/strings.xml | 3 ++ packages/SystemUI/res/values-ja/strings.xml | 3 ++ packages/SystemUI/res/values-ka/strings.xml | 3 ++ packages/SystemUI/res/values-kk/strings.xml | 15 ++++---- packages/SystemUI/res/values-km/strings.xml | 3 ++ packages/SystemUI/res/values-kn/strings.xml | 3 ++ packages/SystemUI/res/values-ko/strings.xml | 3 ++ packages/SystemUI/res/values-ky/strings.xml | 5 +++ packages/SystemUI/res/values-lo/strings.xml | 3 ++ packages/SystemUI/res/values-lt/strings.xml | 3 ++ packages/SystemUI/res/values-lv/strings.xml | 3 ++ packages/SystemUI/res/values-mk/strings.xml | 3 ++ packages/SystemUI/res/values-ml/strings.xml | 3 ++ packages/SystemUI/res/values-mn/strings.xml | 3 ++ packages/SystemUI/res/values-mr/strings.xml | 3 ++ packages/SystemUI/res/values-ms/strings.xml | 3 ++ packages/SystemUI/res/values-my/strings.xml | 3 ++ packages/SystemUI/res/values-nb/strings.xml | 3 ++ packages/SystemUI/res/values-ne/strings.xml | 3 ++ packages/SystemUI/res/values-nl/strings.xml | 3 ++ packages/SystemUI/res/values-or/strings.xml | 3 ++ packages/SystemUI/res/values-pa/strings.xml | 3 ++ packages/SystemUI/res/values-pl/strings.xml | 3 ++ .../SystemUI/res/values-pt-rBR/strings.xml | 5 ++- .../SystemUI/res/values-pt-rPT/strings.xml | 3 ++ packages/SystemUI/res/values-pt/strings.xml | 5 ++- packages/SystemUI/res/values-ro/strings.xml | 3 ++ packages/SystemUI/res/values-ru/strings.xml | 3 ++ packages/SystemUI/res/values-si/strings.xml | 3 ++ packages/SystemUI/res/values-sk/strings.xml | 3 ++ packages/SystemUI/res/values-sl/strings.xml | 3 ++ packages/SystemUI/res/values-sq/strings.xml | 3 ++ packages/SystemUI/res/values-sr/strings.xml | 3 ++ packages/SystemUI/res/values-sv/strings.xml | 27 +++++++------- packages/SystemUI/res/values-sw/strings.xml | 5 ++- packages/SystemUI/res/values-ta/strings.xml | 13 ++++--- packages/SystemUI/res/values-te/strings.xml | 35 ++++++++++--------- packages/SystemUI/res/values-th/strings.xml | 7 ++-- packages/SystemUI/res/values-tl/strings.xml | 3 ++ packages/SystemUI/res/values-tr/strings.xml | 3 ++ packages/SystemUI/res/values-uk/strings.xml | 3 ++ packages/SystemUI/res/values-ur/strings.xml | 3 ++ packages/SystemUI/res/values-uz/strings.xml | 5 ++- packages/SystemUI/res/values-vi/strings.xml | 3 ++ .../SystemUI/res/values-zh-rCN/strings.xml | 7 ++-- .../SystemUI/res/values-zh-rHK/strings.xml | 3 ++ .../SystemUI/res/values-zh-rTW/strings.xml | 3 ++ packages/SystemUI/res/values-zu/strings.xml | 3 ++ 85 files changed, 307 insertions(+), 50 deletions(-) diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index 9de89960c763f..ad70a67421b9f 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -181,6 +181,7 @@ "Battery, twee stawe." "Battery, drie stawe." "Battery vol." + "Batterypersentasie is onbekend." "Geen foon nie." "Foon, een staaf." "Foon, twee stawe." @@ -1097,4 +1098,6 @@ "%1$s (ontkoppel)" "Kon nie koppel nie. Probeer weer." "Bind nuwe toestel saam" + "Kon nie jou batterymeter lees nie" + "Tik vir meer inligting" diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index e29ba4f4d33d8..a129f6767f077 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -181,6 +181,7 @@ "ባትሪ ሁለት አሞሌዎች።" "ባትሪ ሦስት አሞሌዎች።" "ባትሪ ሙሉ ነው።" + "የባትሪ መቶኛ አይታወቅም።" "ምንም ስልክ የለም።" "የስልክ አንድ አሞሌ" "የስልክ ሁለት አሞሌ" @@ -1097,4 +1098,6 @@ "%1$s (ግንኙነት ተቋርጧል)" "ማገናኘት አልተቻለም። እንደገና ይሞክሩ።" "አዲስ መሣሪያ ያጣምሩ" + "የባትሪ መለኪያዎን የማንበብ ችግር" + "ለበለጠ መረጃ መታ ያድርጉ" diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 7690c92add1ab..3f3e8710730ac 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -181,6 +181,7 @@ "إشارة البطارية تتكون من شريطين." "إشارة البطارية تتكون من ثلاثة أشرطة." "إشارة البطارية كاملة." + "نسبة شحن البطارية غير معروفة." "ليست هناك إشارة بالهاتف." "إشارة الهاتف تتكون من شريط واحد." "إشارة الهاتف تتكون من شريطين." @@ -1121,4 +1122,6 @@ "%1$s (غير متّصل)" "تعذّر الاتصال. يُرجى إعادة المحاولة." "إقران جهاز جديد" + "حدثت مشكلة أثناء قراءة مقياس مستوى شحن البطارية." + "انقر للحصول على مزيد من المعلومات." diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index 610b03cfab228..2fb0bd7c39b6c 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -181,6 +181,7 @@ "বেটাৰিৰ দুডাল দণ্ড।" "বেটাৰিৰ তিনিডাল দণ্ড।" "বেটাৰি পূৰাকৈ চ্চাৰ্জ হৈছে।" + "বেটাৰীৰ চাৰ্জৰ শতাংশ অজ্ঞাত।" "ফ\'নত ছিগনেল নাই৷" "ফ\'ন ছিগনেলৰ এডাল দণ্ড।" "ফ\'ন ছিগনেলৰ দুডাল দণ্ড।" @@ -1097,4 +1098,6 @@ "%1$s (সংযোগ বিচ্ছিন্ন হৈছে)" "সংযোগ কৰিব পৰা নগ’ল। পুনৰ চেষ্টা কৰক।" "নতুন ডিভাইচ পেয়াৰ কৰক" + "আপোনাৰ বেটাৰী মিটাৰ পঢ়োঁতে সমস্যা হৈছে" + "অধিক তথ্যৰ বাবে টিপক" diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index b5e925549162d..701927f32714d 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -181,6 +181,7 @@ "Batareya iki xətdir." "Batareya üç xətdir." "Batareya doludur" + "Batareyanın faizi naməlumdur." "Telefon yoxdur." "Şəbəkə bir xətdir." "Şəbəkə iki xətdir." @@ -1097,4 +1098,6 @@ "%1$s (bağlantı kəsilib)" "Qoşulmaq alınmadı. Yenə cəhd edin." "Yeni cihazı qoşalaşdırın" + "Batareya ölçüsünü oxuyarkən problem yarandı" + "Ətraflı məlumat üçün toxunun" diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index 7f0ea04d0f464..6c01ceed9fff8 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -181,6 +181,7 @@ "Baterija od dve crte." "Baterija od tri crte." "Baterija je puna." + "Procenat napunjenosti baterije nije poznat." "Nema telefona." "Signal telefona ima jednu crtu." "Signal telefona od dve crte." @@ -1103,4 +1104,6 @@ "%1$s (veza je prekinuta)" "Povezivanje nije uspelo. Probajte ponovo." "Upari novi uređaj" + "Problem sa očitavanjem merača baterije" + "Dodirnite za više informacija" diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index 216880003e238..806f068252aef 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -181,6 +181,7 @@ "2 планкі акумулятара." "Тры планкі акумулятара." "Акумулятар поўны." + "Працэнт зараду акумулятара невядомы." "Няма тэлефона." "Адна планка на тэлефоне." "2 планкі тэлефона." @@ -1109,4 +1110,6 @@ "%1$s (адключана)" "Не ўдалося падключыцца. Паўтарыце спробу." "Спалучыць з новай прыладай" + "Праблема з чытаннем індыкатара зараду акумулятара" + "Націсніце, каб убачыць больш" diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index ec02f2a6f3f57..81199dd95a58d 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -181,6 +181,7 @@ "Батерията е с две чертички." "Батерията е с три чертички." "Батерията е пълна." + "Процентът на батерията е неизвестен." "Няма телефон." "Телефонът е с една чертичка." "Телефонът е с две чертички." @@ -1097,4 +1098,6 @@ "%1$s (връзката е прекратена)" "Неуспешно свързване. Опитайте отново." "Сдвояване на ново устройство" + "Възникна проблем при четенето на данните за нивото на батерията" + "Докоснете за още информация" diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index 9e6bb6eb492d9..535dd2f76d20c 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -181,6 +181,7 @@ "দুই দন্ড ব্যাটারি রয়েছে৷" "তিন দন্ড ব্যাটারি রয়েছে৷" "ব্যাটারি পূর্ণ রয়েছে৷" + "ব্যাটারি কত শতাংশ আছে তা জানা যায়নি।" "কোনো ফোনের সংকেত নেই৷" "এক দন্ড ফোনের সংকেত রয়েছে৷" "দুই দন্ড ফোনের সংকেত রয়েছে৷" @@ -1097,4 +1098,6 @@ "%1$s (কানেক্ট করা নেই)" "কানেক্ট করা যায়নি। আবার চেষ্টা করুন।" "নতুন ডিভাইস পেয়ার করুন" + "ব্যাটারির মিটারের রিডিং নেওয়ার সময় সমস্যা হয়েছে" + "আরও তথ্যের জন্য ট্যাপ করুন" diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index ef2d50480e54c..7730dcf3450f4 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -181,6 +181,7 @@ "Baterija na dvije crtice." "Baterija na tri crtice." "Baterija je puna." + "Postotak napunjenosti baterije nije poznat" "Nema telefonskog signala." "Telefonski signal na jednoj crtici." "Telefonski signal na dvije crtice." @@ -1103,4 +1104,6 @@ "%1$s (veza je prekinuta)" "Povezivanje nije uspjelo. Pokušajte ponovo." "Uparite novi uređaj" + "Došlo je do problema prilikom očitavanja mjerača stanja baterije" + "Dodirnite za više informacija" diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index b6b4f050313c1..02f69c6e7e318 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -181,6 +181,7 @@ "Bateria: dues barres." "Bateria: tres barres." "Bateria carregada." + "Es desconeix el percentatge de bateria." "No hi ha senyal de telèfon." "Senyal de telèfon: una barra" "Senyal de telèfon: dues barres." @@ -1097,4 +1098,6 @@ "%1$s (desconnectat)" "No s\'ha pogut connectar. Torna-ho a provar." "Vincula un dispositiu nou" + "Hi ha hagut un problema en llegir el mesurador de la bateria" + "Toca per obtenir més informació" diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index 4cab09fd3df17..2459ed187b96c 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -181,6 +181,7 @@ "Dvě čárky baterie." "Tři čárky baterie." "Baterie je nabitá." + "Procento baterie není známé." "Žádná telefonní síť." "Jedna čárka signálu telefonní sítě." "Dvě čárky signálu telefonní sítě." @@ -1109,4 +1110,6 @@ "%1$s (odpojeno)" "Spojení se nezdařilo. Zkuste to znovu." "Spárovat nové zařízení" + "Problém s načtením měřiče baterie" + "Klepnutím zobrazíte další informace" diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index c34b498cdbb21..c711df1d0ee2a 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -181,6 +181,7 @@ "Batteri to bjælker." "Batteri tre bjælker." "Batteri fuldt." + "Batteriniveauet er ukendt." "Ingen telefon." "Telefon en bjælke." "Telefon to bjælker." @@ -779,7 +780,7 @@ "Tab" "Mellemrumstast" "Enter" - "Tilbagetast" + "Backspace" "Afspil/pause" "Stop" "Næste" @@ -1097,4 +1098,6 @@ "%1$s (ingen forbindelse)" "Der kunne ikke oprettes forbindelse. Prøv igen." "Par ny enhed" + "Der er problemer med at aflæse dit batteriniveau" + "Tryk for at få flere oplysninger" diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 38b57be632aef..4f4fdb6683c1e 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -181,6 +181,7 @@ "Akku - zwei Balken" "Akku - drei Balken" "Akku voll" + "Akkustand unbekannt." "Kein Telefon" "Telefonsignal - ein Balken" "Telefonsignal - zwei Balken" @@ -962,7 +963,7 @@ "%1$s, %2$s" "WLAN ist deaktiviert" "Bluetooth ist deaktiviert" - "\"Bitte nicht stören\" ist deaktiviert" + "„Bitte nicht stören“ ist deaktiviert" "\"Bitte nicht stören\" wurde von einer automatischen Regel aktiviert (%s)." "\"Bitte nicht stören\" wurde von einer App aktiviert (%s)." "\"Bitte nicht stören\" wurde von einer automatischen Regel oder einer App aktiviert." @@ -1097,4 +1098,6 @@ "%1$s (nicht verbunden)" "Verbindung nicht möglich. Versuch es noch einmal." "Neues Gerät koppeln" + "Problem beim Lesen des Akkustands" + "Für weitere Informationen tippen" diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index e95bad0c01a74..0f83590f8ec34 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -181,6 +181,7 @@ "Δύο γραμμές μπαταρίας." "Τρεις γραμμές μπαταρίας." "Πλήρης μπαταρία." + "Άγνωστο ποσοστό μπαταρίας." "Δεν υπάρχει τηλέφωνο." "Μία γραμμή τηλεφώνου." "Δύο γραμμές τηλεφώνου." @@ -1097,4 +1098,6 @@ "%1$s (αποσυνδέθηκε)" "Δεν ήταν δυνατή η σύνδεση. Δοκιμάστε ξανά." "Σύζευξη νέας συσκευής" + "Υπάρχει κάποιο πρόβλημα με την ανάγνωση του μετρητή μπαταρίας" + "Πατήστε για περισσότερες πληροφορίες." diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index 58af3dff1654e..0adf19447e8ce 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -181,6 +181,7 @@ "Battery two bars." "Battery three bars." "Battery full." + "Battery percentage unknown." "No phone." "Phone one bar." "Phone two bars." @@ -1097,4 +1098,6 @@ "%1$s (disconnected)" "Couldn\'t connect. Try again." "Pair new device" + "Problem reading your battery meter" + "Tap for more information" diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml index c0378edc2a990..9265f71410502 100644 --- a/packages/SystemUI/res/values-en-rCA/strings.xml +++ b/packages/SystemUI/res/values-en-rCA/strings.xml @@ -181,6 +181,7 @@ "Battery two bars." "Battery three bars." "Battery full." + "Battery percentage unknown." "No phone." "Phone one bar." "Phone two bars." @@ -1097,4 +1098,6 @@ "%1$s (disconnected)" "Couldn\'t connect. Try again." "Pair new device" + "Problem reading your battery meter" + "Tap for more information" diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index 58af3dff1654e..0adf19447e8ce 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -181,6 +181,7 @@ "Battery two bars." "Battery three bars." "Battery full." + "Battery percentage unknown." "No phone." "Phone one bar." "Phone two bars." @@ -1097,4 +1098,6 @@ "%1$s (disconnected)" "Couldn\'t connect. Try again." "Pair new device" + "Problem reading your battery meter" + "Tap for more information" diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index 58af3dff1654e..0adf19447e8ce 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -181,6 +181,7 @@ "Battery two bars." "Battery three bars." "Battery full." + "Battery percentage unknown." "No phone." "Phone one bar." "Phone two bars." @@ -1097,4 +1098,6 @@ "%1$s (disconnected)" "Couldn\'t connect. Try again." "Pair new device" + "Problem reading your battery meter" + "Tap for more information" diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml index 808ce2bf7cf72..2120e835c3085 100644 --- a/packages/SystemUI/res/values-en-rXC/strings.xml +++ b/packages/SystemUI/res/values-en-rXC/strings.xml @@ -181,6 +181,7 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‎‏‎‎‏‏‎‏‏‏‏‎‏‏‎‎‏‎‏‎‏‏‏‏‎‎‎‏‏‏‎‏‎‏‎‎‎‏‎‏‏‏‎‎‏‏‎‏‎‎‏‏‏‏‎Battery two bars.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‎‏‏‏‎‏‎‎‏‎‎‎‏‏‎‏‏‏‏‎‏‎‏‏‎‏‎‎‏‎‎‏‏‎‎‎‎‎‏‎‎‎‎‏‎‎‎‏‏‎‎‏‎‏‎‎‎‏‏‎Battery three bars.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‎‏‎‎‎‏‎‏‏‏‎‏‎‏‎‏‎‎‎‎‏‏‎‏‏‏‏‎‏‎‎‎‎‏‎‎‏‎‎‎‎‎‎‏‎‏‏‎‏‎‎‏‎‏‏‏‎‎Battery full.‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‏‎‎‎‏‎‏‏‎‏‎‎‎‏‏‏‏‎‎‎‎‎‏‎‏‏‎‎‏‎‏‏‏‏‎‏‎‏‎‏‎‏‎‎‎‎‏‏‎‎‏‏‏‏‎‎‎‎Battery percentage unknown.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‎‏‎‎‏‏‎‏‎‎‏‎‎‎‎‏‎‎‏‎‎‎‎‎‎‏‏‏‏‎‎‎‎‎‏‎‎‏‏‎‏‏‎‎‎‏‏‏‎‎‎‏‎No phone.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‏‏‏‎‎‏‎‏‎‏‏‎‏‎‎‏‎‏‎‏‏‎‏‎‎‎‏‎‏‏‎‎‏‎‏‏‏‎‎‏‏‏‏‎‎‏‏‏‎‏‎‎‎Phone one bar.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‎‎‎‎‎‏‎‎‎‎‎‎‎‎‏‏‏‏‎‏‏‏‎‎‎‎‎‎‎‏‎‏‏‎‎‎‎‎‏‎‏‏‎‏‏‎‏‎‏‎‏‎‏‎‎‏‎‎Phone two bars.‎‏‎‎‏‎" @@ -1097,4 +1098,6 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‏‎‏‏‏‎‏‎‏‎‏‎‏‏‎‏‏‏‎‎‏‎‎‎‏‏‏‎‎‎‎‏‏‏‏‎‏‎‎‎‏‎‎‎‎‎‏‎‎‏‎‏‏‏‏‏‎‎‎‏‎‎‏‏‎%1$s‎‏‎‎‏‏‏‎ (disconnected)‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‎‏‏‎‎‎‎‏‎‎‎‏‎‏‏‎‏‏‏‎‎‏‎‏‏‎‏‎‎‎‏‏‎‏‎‎‏‎‎‎‏‏‎‏‎‏‎‏‎‏‏‎‎‎‎‏‎‎Couldn\'t connect. Try again.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‏‏‎‎‏‎‏‎‏‏‎‎‏‏‎‎‎‏‎‏‎‎‏‎‎‏‏‏‎‏‏‎‏‎‎‏‏‎‎Pair new device‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‏‏‎‎‎‏‎‏‎‏‎‏‏‎‎‎‏‏‏‎‎‏‏‏‏‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‏‎‎‎‎‎‎‏‏‏‎‎Problem reading your battery meter‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‎‏‏‎‏‏‎‎‎‎‏‎‏‏‏‏‏‏‎‎‎‏‏‏‏‎‏‏‎‎‏‎‎‏‏‏‏‎‏‎‎‎‎‎‎‎‎‎‏‎‎‎‏‎‎‎‏‏‎Tap for more information‎‏‎‎‏‎" diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index 7e67ab5031a2c..7b1f162402169 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -181,6 +181,7 @@ "Dos barras de batería" "Tres barras de batería" "Batería completa" + "Se desconoce el porcentaje de la batería." "Sin teléfono" "Una barra de teléfono" "Dos barras de teléfono" @@ -1097,4 +1098,6 @@ "%1$s (desconectado)" "No se pudo establecer la conexión. Vuelve a intentarlo." "Vincular dispositivo nuevo" + "Problema al leer el medidor de batería" + "Presiona para obtener más información" diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index d4ec4e5f63cd3..8eb5bf50758bb 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -181,6 +181,7 @@ "Dos barras de batería" "Tres barras de batería" "Batería completa" + "Porcentaje de batería desconocido." "Sin teléfono" "Una barra de cobertura" "Dos barras de cobertura" @@ -1097,4 +1098,6 @@ "%1$s (desconectado)" "No se ha podido conectar. Inténtalo de nuevo." "Vincular nuevo dispositivo" + "No se ha podido leer el indicador de batería" + "Toca la pantalla para consultar más información" diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index 319630cdbfa85..a41e69e9f91e7 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -181,6 +181,7 @@ "Aku: kaks pulka." "Aku: kolm pulka." "Aku täis." + "Aku laetuse protsent on teadmata." "Telefonisignaal puudub" "Telefonisignaal: üks pulk." "Telefonisignaal: kaks pulka." @@ -1097,4 +1098,6 @@ "%1$s (pole ühendatud)" "Ühenduse loomine ebaõnnestus. Proovige uuesti." "Uue seadme sidumine" + "Probleem akumõõdiku lugemisel" + "Puudutage lisateabe saamiseks" diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index 092e331963a85..1b0b931540c42 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -181,6 +181,7 @@ "Bateriak bi barra ditu." "Bateriak hiru barra ditu." "Bateria beteta dago." + "Bateriaren ehunekoa ezezaguna da." "Ez dago telefono-zenbakirik." "Telefono-seinaleak barra bat du." "Telefono-seinaleak bi barra ditu." @@ -1097,4 +1098,6 @@ "%1$s (deskonektatuta)" "Ezin izan da konektatu. Saiatu berriro." "Parekatu beste gailu batekin" + "Arazo bat gertatu da bateria-neurgailua irakurtzean" + "Informazio gehiago lortzeko, sakatu hau" diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index 769aa19d03a2d..8781456ab9930 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -181,6 +181,7 @@ "دو نوار برای باتری." "سه نوار برای باتری." "باتری پر است." + "درصد شارژ باتری مشخص نیست." "بدون تلفن." "یک نوار برای تلفن." "دو نوار برای تلفن." @@ -1097,4 +1098,6 @@ "%1$s (اتصال قطع شد)" "متصل نشد. دوباره امتحان کنید." "مرتبط کردن دستگاه جدید" + "مشکلی در خواندن میزان باتری وجود دارد" + "برای اطلاعات بیشتر ضربه بزنید" diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 4debb6477d0e9..e0bb8c37e3c0f 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -181,6 +181,7 @@ "Akun virta - kaksi palkkia." "Akun virta - kolme palkkia." "Akku täynnä." + "Akun varaustaso ei tiedossa." "Ei puhelinverkkoyhteyttä." "Puhelinverkkosignaali - yksi palkki." "Puhelinverkkosignaali - kaksi palkkia." @@ -1097,4 +1098,6 @@ "%1$s (yhteys katkaistu)" "Ei yhteyttä. Yritä uudelleen." "Muodosta uusi laitepari" + "Ongelma akkumittarin lukemisessa" + "Saat lisätietoja napauttamalla" diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index d2b2e5f411b7a..0459ca9457023 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -181,6 +181,7 @@ "Niveau de batterie : moyen" "Niveau de batterie : bon" "Batterie pleine" + "Pourcentage de la pile inconnu." "Aucun signal" "Signal : faible" "Signal : moyen" @@ -1097,4 +1098,6 @@ "%1$s (déconnecté)" "Impossible de se connecter. Réessayez." "Associer un autre appareil" + "Un problème est survenu lors de la lecture du niveau de charge de la pile" + "Touchez pour en savoir plus" diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 63a3ead8e4e7d..2d9083a07a1ac 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -181,6 +181,7 @@ "Niveau de batterie : moyen" "Niveau de batterie : bon" "Batterie pleine" + "Pourcentage de la batterie inconnu." "Aucun signal" "Signal : faible" "Signal : moyen" @@ -1097,4 +1098,6 @@ "%1$s (déconnecté)" "Impossible de se connecter. Réessayez." "Associer un nouvel appareil" + "Un problème est survenu au niveau de la lecture de votre outil de mesure de batterie" + "Appuyer pour en savoir plus" diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index abb831595da87..70a486d6c47f0 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -181,6 +181,7 @@ "Dúas barras de batería" "Tres barras de batería" "Batería cargada" + "Descoñécese a porcentaxe da batería." "Sen teléfono" "Unha barra de cobertura" "Dúas barras de cobertura" @@ -1097,4 +1098,6 @@ "%1$s (dispositivo desconectado)" "Non se puido establecer a conexión. Téntao de novo." "Vincular dispositivo novo" + "Produciuse un problema ao ler o medidor da batería" + "Toca para obter máis información" diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index 5eb8db7a73caf..d3a59a0eb9381 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -181,6 +181,7 @@ "બૅટરી બે બાર." "બૅટરી ત્રણ બાર." "બૅટરી પૂર્ણ." + "બૅટરીની ટકાવારી અજાણ છે." "કોઈ ફોન નથી." "ફોન એક બાર." "ફોન બે બાર." @@ -1097,4 +1098,6 @@ "%1$s (ડિસ્કનેક્ટ થયેલું)" "કનેક્ટ કરી શકાયું નહીં. ફરી પ્રયાસ કરો." "નવા ડિવાઇસ સાથે જોડાણ કરો" + "તમારું બૅટરી મીટર વાંચવામાં સમસ્યા આવી" + "વધુ માહિતી માટે ટૅપ કરો" diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index f1c9cc9bd5b84..73c9f619e6c3b 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -181,6 +181,7 @@ "बैटरी दो बार." "बैटरी तीन बार." "बैटरी पूरी है." + "इस बारे में जानकारी नहीं है कि अभी बैटरी कितने प्रतिशत चार्ज है." "कोई फ़ोन नहीं." "फ़ोन एक बार." "फ़ोन दो बार." @@ -1099,4 +1100,6 @@ "%1$s (डिसकनेक्ट किया गया)" "कनेक्ट नहीं किया जा सका. फिर से कोशिश करें." "नया डिवाइस जोड़ें" + "आपके डिवाइस के बैटरी मीटर की रीडिंग लेने में समस्या आ रही है" + "ज़्यादा जानकारी के लिए टैप करें" diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index 9a659ccad10d6..a4881a7c0a231 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -181,6 +181,7 @@ "Baterija dva stupca." "Baterija tri stupca." "Baterija je puna." + "Postotak baterije nije poznat." "Nema telefona." "Telefonski signal jedan stupac." "Telefonski signal dva stupca." @@ -1103,4 +1104,6 @@ "%1$s (nije povezano)" "Povezivanje nije bilo moguće. Pokušajte ponovo." "Upari novi uređaj" + "Problem s očitavanjem mjerača baterije" + "Dodirnite za više informacija" diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index 98c520bce3d81..a6799008b669e 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -181,6 +181,7 @@ "Akkumulátor két sáv." "Akkumulátor három sáv." "Akkumulátor feltöltve." + "Az akkumulátor töltöttségi szintje ismeretlen." "Nincs telefon." "Telefon egy sáv." "Telefon két sáv." @@ -1097,4 +1098,6 @@ "%1$s (leválasztva)" "Sikertelen csatlakozás. Próbálja újra." "Új eszköz párosítása" + "Probléma merült fel az akkumulátor-töltésmérő olvasásakor" + "Koppintással további információkat érhet el." diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index d3f0791c08fa5..af9a11635cac7 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -181,6 +181,7 @@ "Մարտկոցի երկու գիծ:" "Մարտկոցի երեք գիծ:" "Մարտկոցը լիքն է:" + "Մարտկոցի լիցքի մակարդակն անհայտ է։" "Հեռախոս չկա:" "Հեռախոսի մեկ գիծ:" "Հեռախոսի երկու գիծ:" @@ -1097,4 +1098,6 @@ "%1$s (անջատված է)" "Չհաջողվեց միանալ։ Նորից փորձեք։" "Նոր սարքի զուգակցում" + "Մարտկոցի ցուցիչի ցուցմունքը կարդալու հետ կապված խնդիր կա" + "Հպեք՝ ավելին իմանալու համար" diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index 954562764ee0f..6c8633dae9429 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -181,6 +181,7 @@ "Baterai dua batang." "Baterai tiga batang." "Baterai penuh." + "Persentase baterai tidak diketahui." "Tidak dapat melakukan panggilan." "Ponsel satu batang." "Ponsel dua batang." @@ -1097,4 +1098,6 @@ "%1$s (terputus)" "Tidak dapat terhubung. Coba lagi." "Sambungkan perangkat baru" + "Terjadi masalah saat membaca indikator baterai" + "Ketuk untuk informasi selengkapnya" diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index 9a380757dd5bf..324abb5084909 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -181,6 +181,7 @@ "Tvö strik á rafhlöðu." "Þrjú strik á rafhlöðu." "Rafhlaða fullhlaðin." + "Staða rafhlöðu óþekkt." "Ekkert símasamband." "Styrkur símasambands er eitt strik." "Styrkur símasambands er tvö strik." @@ -1097,4 +1098,6 @@ "%1$s (aftengt)" "Tenging mistókst. Reyndu aftur." "Para nýtt tæki" + "Vandamál við að lesa stöðu rafhlöðu" + "Ýttu til að fá frekari upplýsingar" diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index 6e4daae0a08d0..ffcc3b5f31bc6 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -63,7 +63,7 @@ "Consenti" "Debug USB non consentito" "L\'utente che ha eseguito l\'accesso a questo dispositivo non può attivare il debug USB. Per utilizzare questa funzione, passa all\'utente principale." - "Consentire debug wireless su questa rete?" + "Consentire il debug wireless su questa rete?" "Nome della rete (SSID)\n%1$s\n\nIndirizzo Wi‑Fi (BSSID)\n%2$s" "Consenti sempre su questa rete" "Consenti" @@ -181,6 +181,7 @@ "Batteria: due barre." "Batteria: tre barre." "Batteria carica." + "Percentuale della batteria sconosciuta." "Nessun telefono." "Telefono: una barra." "Telefono: due barre." @@ -1097,4 +1098,6 @@ "%1$s (disconnesso)" "Impossibile connettersi. Riprova." "Accoppia nuovo dispositivo" + "Problema durante la lettura dell\'indicatore di livello della batteria" + "Tocca per ulteriori informazioni" diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index b81129924cd88..c0961822f74bc 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -181,6 +181,7 @@ "שני פסים של סוללה." "שלושה פסים של סוללה." "סוללה מלאה." + "אחוז טעינת הסוללה לא ידוע." "אין טלפון." "פס אחד של טלפון." "שני פסים של טלפון." @@ -1109,4 +1110,6 @@ "%1$s (מנותק)" "לא ניתן היה להתחבר. יש לנסות שוב." "התאמה של מכשיר חדש" + "בעיה בקריאת מדדי הסוללה" + "יש להקיש כדי להציג מידע נוסף" diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index 2c71a21081e1e..91488fa7094f0 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -181,6 +181,7 @@ "電池残量:レベル2" "電池残量:レベル3" "電池残量:満" + "電池残量は不明です。" "電波状態:なし" "電波状態:レベル1" "電波状態:レベル2" @@ -1097,4 +1098,6 @@ "%1$s(未接続)" "接続できませんでした。もう一度お試しください。" "新しいデバイスとのペア設定" + "電池残量の読み込み中に問題が発生しました" + "タップすると詳細が表示されます" diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml index 4e7493cb27381..a2e1b7f251985 100644 --- a/packages/SystemUI/res/values-ka/strings.xml +++ b/packages/SystemUI/res/values-ka/strings.xml @@ -181,6 +181,7 @@ "ბატარეა ორ ზოლზე." "ბატარეა სამ ზოლზე." "ბატარეა სავსეა." + "ბატარეის პროცენტული მაჩვენებელი უცნობია." "ტელეფონი არ არის." "ტელეფონის სიგნალი ერთ ზოლზეა." "ტელეფონის სიგნალი ორ ზოლზეა." @@ -1097,4 +1098,6 @@ "%1$s (კავშირი გაწყვეტილია)" "დაკავშირება ვერ მოხერხდა. ცადეთ ხელახლა." "ახალი მოწყობილობის დაწყვილება" + "თქვენი ბატარეის მზომის წაკითხვასთან დაკავშირებით პრობლემა დაფიქსირდა" + "შეეხეთ მეტი ინფორმაციისთვის" diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index db520088c48b3..ebb59de27c2b4 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -181,6 +181,7 @@ "Батарея екі баған." "Батарея үш баған." "Батарея толы." + "Батарея зарядының мөлшері белгісіз." "Телефон жоқ." "Телефон бір баған." "Телефон екі баған." @@ -305,8 +306,8 @@ "Жұмыс режимі қосулы." "Жұмыс режимі өшірілді." "Жұмыс режимі қосылды." - "Data Saver өшірілді." - "Data Saver қосылды." + "Трафикті үнемдеу режимі өшірілді." + "Трафикті үнемдеу режимі қосылды." "Sensor Privacy функциясы өшірулі." "Sensor Privacy функциясы қосулы." "Дисплей жарықтығы" @@ -397,7 +398,7 @@ "Тетеринг" "Хотспот" "Қосылуда…" - "Data Saver қосулы" + "Трафикті үнемдеу режимі қосулы" %d құрылғы %d құрылғы @@ -820,9 +821,9 @@ "Параметрлерді ашу" "Құлақаспап қосылды" "Құлақаспап жинағы қосылды" - "Data Saver" - "Дерек сақтағыш қосулы" - "Дерек сақтағышы өшірулі" + "Трафикті үнемдеу" + "Трафикті үнемдеу режимі қосулы" + "Трафикті үнемдеу режимі өшірулі" "Қосулы" "Өшірулі" "Қолжетімді емес" @@ -1097,4 +1098,6 @@ "%1$s (ажыратылған)" "Қосылмады. Қайта қосылып көріңіз." "Жаңа құрылғымен жұптау" + "Батарея зарядының дерегі алынбай жатыр" + "Толығырақ ақпарат алу үшін түртіңіз." diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index 4d88cfd5cd2e3..29a9491bfa1d9 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -181,6 +181,7 @@ "ថ្ម​ពីរ​កាំ។" "ថ្ម​ទាំង​បី​​កាំ​។" "ថ្ម​ពេញ​ហើយ។" + "មិនដឹងអំពី​ភាគរយថ្មទេ។" "គ្មាន​ទូរស័ព្ទ។" "សេវា​ទូរស័ព្ទ​មួយ​កាំ។" "សេវា​ទូរស័ព្ទ​ពីរ​កាំ។" @@ -1097,4 +1098,6 @@ "%1$s (បាន​ផ្ដាច់)" "មិន​អាច​ភ្ជាប់​បាន​ទេ។ សូមព្យាយាមម្ដងទៀត។" "ផ្គូផ្គង​ឧបករណ៍ថ្មី" + "មានបញ្ហាក្នុង​ការអាន​ឧបករណ៍រង្វាស់កម្រិតថ្មរបស់អ្នក" + "ចុចដើម្បីទទួលបាន​ព័ត៌មានបន្ថែម" diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index ffa1ede2e58cc..64e71af99d648 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -181,6 +181,7 @@ "ಬ್ಯಾಟರಿ ಎರಡು ಪಟ್ಟಿಗಳು." "ಬ್ಯಾಟರಿ ಮೂರು ಪಟ್ಟಿಗಳು." "ಬ್ಯಾಟರಿ ಭರ್ತಿಯಾಗಿದೆ." + "ಬ್ಯಾಟರಿ ಶೇಕಡಾವಾರು ತಿಳಿದಿಲ್ಲ." "ಯಾವುದೇ ಫೋನ್ ಇಲ್ಲ." "ಪೋನ್ ಒಂದು ಪಟ್ಟಿ." "ಫೋನ್ ಎರಡು ಪಟ್ಟಿಗಳು." @@ -1097,4 +1098,6 @@ "%1$s (ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಲಾಗಿದೆ)" "ಸಂಪರ್ಕಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ. ಪುನಃ ಪ್ರಯತ್ನಿಸಿ." "ಹೊಸ ಸಾಧನವನ್ನು ಜೋಡಿಸಿ" + "ನಿಮ್ಮ ಬ್ಯಾಟರಿ ಮೀಟರ್ ಓದುವಾಗ ಸಮಸ್ಯೆ ಎದುರಾಗಿದೆ" + "ಇನ್ನಷ್ಟು ಮಾಹಿತಿಗಾಗಿ ಟ್ಯಾಪ್ ಮಾಡಿ" diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index 03114e0a3b248..970f49e832055 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -181,6 +181,7 @@ "배터리 막대가 두 개입니다." "배터리 막대가 세 개입니다." "배터리 충전이 완료되었습니다." + "배터리 잔량을 알 수 없습니다." "휴대전화의 신호가 없습니다." "휴대전화 신호 막대가 하나입니다." "휴대전화 신호 막대가 두 개입니다." @@ -1097,4 +1098,6 @@ "%1$s(연결 끊김)" "연결할 수 없습니다. 다시 시도하세요." "새 기기와 페어링" + "배터리 수준을 읽는 중에 문제가 발생함" + "탭하여 자세한 정보를 확인하세요." diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index 42d63a8024f3c..27f144a03481e 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -181,6 +181,9 @@ "Эки таякча батарея." "Үч таякча батарея." "Батарея толук." + + + "Телефон сигналы жок." "Телефон сигналы бир таякча." "Телефон сигналы эки таякча." @@ -1097,4 +1100,6 @@ "%1$s (ажыратылды)" "Байланышпай койду. Кайталоо." "Жаңы түзмөктү жупташтыруу" + "Батареяңыздын кубаты аныкталбай жатат" + "Кеңири маалымат алуу үчүн таптап коюңуз" diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index 5ee3d00f26641..731af42208eb1 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -181,6 +181,7 @@ "ແບັດເຕີຣີສອງຂີດ." "ແບັດເຕີຣີສາມຂີດ." "ແບັດເຕີຣີເຕັມ." + "ບໍ່ຮູ້ເປີເຊັນແບັດເຕີຣີ." "ບໍ່ມີໂທລະສັບ." "ສັນຍານນຶ່ງຂີດ." "ສັນຍານສອງຂີດ." @@ -1097,4 +1098,6 @@ "%1$s (ຕັດການເຊື່ອມຕໍ່ແລ້ວ)" "ບໍ່ສາມາດເຊື່ອມຕໍ່ໄດ້. ລອງໃໝ່." "ຈັບຄູ່ອຸປະກອນໃໝ່" + "ເກີດບັນຫາໃນການອ່ານຕົວວັດແທກແບັດເຕີຣີຂອງທ່ານ" + "ແຕະເພື່ອເບິ່ງຂໍ້ມູນເພີ່ມເຕີມ" diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index 56df8d6e75b7b..54a32470f91d8 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -181,6 +181,7 @@ "Dvi akumuliatoriaus juostos." "Trys akumuliatoriaus juostos." "Akumuliatorius įkrautas." + "Akumuliatoriaus energija procentais nežinoma." "Nėra telefono." "Viena telefono juosta." "Dvi telefono juostos." @@ -1109,4 +1110,6 @@ "„%1$s“ (atjungta)" "Nepavyko prijungti. Bandykite dar kartą." "Naujo įrenginio susiejimas" + "Nuskaitant akumuliatoriaus skaitiklį iškilo problema" + "Palieskite, kad sužinotumėte daugiau informacijos" diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index fde18e50c1d19..56709cf683ba6 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -181,6 +181,7 @@ "Akumulators: divas joslas." "Akumulators: trīs joslas." "Akumulators ir pilnīgi uzlādēts." + "Akumulatora uzlādes līmenis procentos nav zināms." "Nav tālruņa." "Tālrunis: viena josla." "Tālrunis: divas joslas." @@ -1103,4 +1104,6 @@ "%1$s (savienojums pārtraukts)" "Nevarēja izveidot savienojumu. Mēģiniet vēlreiz." "Savienošana pārī ar jaunu ierīci" + "Nevar iegūt informāciju par akumulatora uzlādes līmeni." + "Pieskarieties, lai iegūtu plašāku informāciju." diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index 56a63c5f48635..1df6f2de19f4f 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -181,6 +181,7 @@ "Батерија две цртички." "Батерија три цртички." "Батеријата е полна." + "Процентот на батеријата е непознат." "Нема сигнал." "Телефон една цртичка.." "Телефон две цртички." @@ -1097,4 +1098,6 @@ "%1$s (исклучен)" "Не може да се поврзе. Обидете се повторно." "Спарете нов уред" + "Проблем при читањето на мерачот на батеријата" + "Допрете за повеќе информации" diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index f0f6982ac3d63..817ce6653727a 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -181,6 +181,7 @@ "ബാറ്ററി രണ്ട് ബാർ." "ബാറ്ററി മൂന്ന് ബാർ." "ബാറ്ററി നിറഞ്ഞു." + "ബാറ്ററി ശതമാനം അജ്ഞാതമാണ്." "ഫോൺ സിഗ്‌നൽ ഒന്നുമില്ല." "ഫോണിൽ ഒരു ബാർ." "ഫോണിൽ രണ്ട് ബാർ." @@ -1097,4 +1098,6 @@ "%1$s (വിച്ഛേദിച്ചു)" "കണക്റ്റ് ചെയ്യാനായില്ല. വീണ്ടും ശ്രമിക്കുക." "പുതിയ ഉപകരണവുമായി ജോടിയാക്കുക" + "നിങ്ങളുടെ ബാറ്ററി മീറ്റർ വായിക്കുന്നതിൽ പ്രശ്‌നമുണ്ട്" + "കൂടുതൽ വിവരങ്ങൾക്ക് ടാപ്പ് ചെയ്യുക" diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index 95624983b0cd0..8c8e5d117babc 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -181,6 +181,7 @@ "Батерей хоёр баганатай." "Батерей гурван баганатай." "Батерей дүүрэн." + "Батарейн хувь тодорхойгүй байна." "Утас байхгүй." "Утас нэг баганатай." "Утас хоёр баганатай." @@ -1097,4 +1098,6 @@ "%1$s (салсан)" "Холбогдож чадсангүй. Дахин оролдоно уу." "Шинэ төхөөрөмж хослуулах" + "Таны батарей хэмжигчийг уншихад асуудал гарлаа" + "Нэмэлт мэдээлэл авахын тулд товшино уу" diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index 61f2b67dcca48..1a608dae038f8 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -181,6 +181,7 @@ "बॅटरी दोन बार." "बॅटरी तीन बार." "बॅटरी पूर्ण भरली." + "बॅटरीच्या चार्जिंगची टक्केवारी माहित नाही." "कोणताही फोन नाही." "फोन एक बार." "फोन दोन बार." @@ -1097,4 +1098,6 @@ "%1$s (डिस्कनेक्ट केले)" "कनेक्ट करू शकलो नाही. पुन्हा प्रयत्न करा." "नवीन डिव्हाइससोबत पेअर करा" + "तुमचे बॅटरी मीटर वाचताना समस्या आली" + "अधिक माहितीसाठी टॅप करा" diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index d8878c8ce20b1..e82f0afe1ab8b 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -181,6 +181,7 @@ "Bateri dua bar." "Bateri tiga bar." "Bateri penuh." + "Peratusan kuasa bateri tidak diketahui." "Tiada telefon." "Telefon satu bar." "Telefon dua bar." @@ -1097,4 +1098,6 @@ "%1$s (diputuskan sambungan)" "Tidak boleh menyambung. Cuba lagi." "Gandingkan peranti baharu" + "Masalah membaca meter bateri anda" + "Ketik untuk mendapatkan maklumat lanjut" diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index 90eca8912ed03..4367ad123ff05 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -181,6 +181,7 @@ "ဘတ္တရီနှစ်ဘား။" "ဘတ္တရီသုံးဘား။" "ဘတ္တရီအပြည့်။" + "ဘက်ထရီရာခိုင်နှုန်းကို မသိပါ။" "ဖုန်းလိုင်းမရှိပါ။" "ဖုန်းလိုင်းတစ်ဘား။" "ဖုန်းလိုင်းနှစ်ဘား။" @@ -1097,4 +1098,6 @@ "%1$s (ချိတ်ဆက်မထားပါ)" "ချိတ်ဆက်၍ မရပါ။ ထပ်စမ်းကြည့်ပါ။" "စက်အသစ် တွဲချိတ်ရန်" + "သင်၏ ဘက်ထရီမီတာကို ဖတ်ရာတွင် ပြဿနာရှိနေသည်" + "နောက်ထပ်အချက်အလက်များအတွက် တို့ပါ" diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index dc004ddd399ab..ead1fd5ab488a 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -181,6 +181,7 @@ "Batteri – to stolper." "Batteri – tre stolper." "Batteriet er fullt." + "Batteriprosenten er ukjent." "Ingen telefon." "Telefon – én stolpe." "Telefon – to stolper." @@ -1097,4 +1098,6 @@ "%1$s (frakoblet)" "Kunne ikke koble til. Prøv på nytt." "Koble til en ny enhet" + "Kunne ikke lese batterimåleren" + "Trykk for å få mer informasjon" diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index 075f6737087b6..602d6416bccc6 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -181,6 +181,7 @@ "ब्याट्रिका दुईवटा पट्टिहरू" "ब्याट्रिका तिनवटा पट्टिहरू" "ब्याट्री पूर्ण छ।" + "ब्याट्रीमा कति प्रतिशत चार्ज छ भन्ने कुराको जानाकरी छैन।" "फोन छैन्।" "फोन एउटा पट्टि।" "फोन दुई पट्टि।" @@ -1097,4 +1098,6 @@ "%1$s (डिस्कनेक्ट गरिएको)" "कनेक्ट गर्न सकिएन। फेरि प्रयास गर्नुहोस्।" "नयाँ यन्त्रको जोडा बनाउनुहोस्" + "यन्त्रको ब्याट्रीको मिटर रिडिङ क्रममा समस्या भयो" + "थप जानकारी प्राप्त गर्न ट्याप गर्नुहोस्" diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index d8331bfd82066..c6772f500ee8e 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -181,6 +181,7 @@ "Batterij: twee streepjes." "Batterij: drie streepjes." "Batterij is vol." + "Batterijpercentage onbekend." "Geen telefoonsignaal." "Telefoon: één streepje." "Telefoon: twee streepjes." @@ -1097,4 +1098,6 @@ "%1$s (verbinding verbroken)" "Kan geen verbinding maken. Probeer het nog eens." "Nieuw apparaat koppelen" + "Probleem bij het lezen van je batterijmeter" + "Tik hier voor meer informatie" diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index a6927218d5cbe..1812a8d2676f6 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -181,6 +181,7 @@ "ବ୍ୟାଟେରୀର ଦୁଇଟି ବାର୍‍ ଅଛି।" "ବ୍ୟାଟେରୀର ତିନୋଟି ବାର୍‍ ଅଛି।" "ବ୍ୟାଟେରୀ ପୂର୍ଣ୍ଣ‍।" + "ବ୍ୟାଟେରୀ ଶତକଡ଼ା ଅଜଣା ଅଟେ।" "କୌଣସି ଫୋନ୍ ନାହିଁ।" "ଫୋନର ଗୋଟିଏ ବାର ଅଛି।" "ଫୋନର ଦୁଇଟି ବାର୍‌ ଅଛି।" @@ -1097,4 +1098,6 @@ "%1$s (ବିଚ୍ଛିନ୍ନ କରାଯାଇଛି)" "ସଂଯୋଗ କରାଯାଇପାରିଲା ନାହିଁ। ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।" "ନୂଆ ଡିଭାଇସକୁ ପେୟାର୍ କରନ୍ତୁ" + "ଆପଣଙ୍କ ବ୍ୟାଟେରୀ ମିଟର୍ ପଢ଼ିବାରେ ସମସ୍ୟା ହେଉଛି" + "ଅଧିକ ସୂଚନା ପାଇଁ ଟାପ୍ କରନ୍ତୁ" diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index 4db23a63c0bbe..0e3c64b1109a3 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -181,6 +181,7 @@ "ਬੈਟਰੀ ਦੋ ਬਾਰਸ।" "ਬੈਟਰੀ ਤਿੰਨ ਬਾਰਸ।" "ਬੈਟਰੀ ਪੂਰੀ।" + "ਬੈਟਰੀ ਪ੍ਰਤੀਸ਼ਤ ਅਗਿਆਤ ਹੈ।" "ਕੋਈ ਫ਼ੋਨ ਨਹੀਂ।" "ਫ਼ੋਨ ਇੱਕ ਬਾਰ।" "ਫ਼ੋਨ ਦੋ ਬਾਰਸ।" @@ -1097,4 +1098,6 @@ "%1$s (ਡਿਸਕਨੈਕਟ ਹੋਇਆ)" "ਕਨੈਕਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।" "ਨਵਾਂ ਡੀਵਾਈਸ ਜੋੜਾਬੱਧ ਕਰੋ" + "ਤੁਹਾਡੇ ਬੈਟਰੀ ਮੀਟਰ ਨੂੰ ਪੜ੍ਹਨ ਵਿੱਚ ਸਮੱਸਿਆ ਹੋ ਰਹੀ ਹੈ" + "ਹੋਰ ਜਾਣਕਾਰੀ ਲਈ ਟੈਪ ਕਰੋ" diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index ad41a59a5a680..adecfa4c1f33c 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -181,6 +181,7 @@ "Bateria: dwa paski." "Bateria: trzy paski." "Bateria naładowana." + "Poziom naładowania baterii jest nieznany." "Brak sygnału telefonu." "Telefon: jeden pasek." "Telefon: dwa paski." @@ -1109,4 +1110,6 @@ "%1$s (rozłączono)" "Nie udało się połączyć. Spróbuj ponownie." "Sparuj nowe urządzenie" + "Problem z odczytaniem pomiaru wykorzystania baterii" + "Kliknij, aby uzyskać więcej informacji" diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index 43f6b2b4ea2d6..3d26f8dca388b 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -181,6 +181,7 @@ "Duas barras de bateria." "Três barras de bateria." "Bateria cheia." + "Porcentagem da bateria desconhecida." "Sem telefone." "Uma barra de sinal do telefone." "Duas barras de sinal do telefone." @@ -843,7 +844,7 @@ "Inclinação à esquerda" "Inclinação à direita" - "Alternador de teclado" + "Seletor de teclado" "Salvar" "Redefinir" "Ajustar largura do botão" @@ -1097,4 +1098,6 @@ "%1$s (desconectado)" "Não foi possível conectar. Tente novamente." "Parear novo dispositivo" + "Problema para ler seu medidor de bateria" + "Toque para mais informações" diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index c707ad6be72ac..e3da3b84a181f 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -181,6 +181,7 @@ "Duas barras de bateria." "Três barras de bateria." "Bateria carregada." + "Percentagem da bateria desconhecida." "Sem telefone." "Uma barra de telefone." "Duas barras de telefone." @@ -1097,4 +1098,6 @@ "%1$s (desligado)" "Não foi possível ligar. Tente novamente." "Sincronize o novo dispositivo" + "Ocorreu um problema ao ler o medidor da bateria" + "Toque para obter mais informações" diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 43f6b2b4ea2d6..3d26f8dca388b 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -181,6 +181,7 @@ "Duas barras de bateria." "Três barras de bateria." "Bateria cheia." + "Porcentagem da bateria desconhecida." "Sem telefone." "Uma barra de sinal do telefone." "Duas barras de sinal do telefone." @@ -843,7 +844,7 @@ "Inclinação à esquerda" "Inclinação à direita" - "Alternador de teclado" + "Seletor de teclado" "Salvar" "Redefinir" "Ajustar largura do botão" @@ -1097,4 +1098,6 @@ "%1$s (desconectado)" "Não foi possível conectar. Tente novamente." "Parear novo dispositivo" + "Problema para ler seu medidor de bateria" + "Toque para mais informações" diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index 5dbee8ff9b0c9..6046383df3306 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -181,6 +181,7 @@ "Baterie: două bare." "Baterie: trei bare." "Baterie: complet." + "Procentajul bateriei este necunoscut." "Nu există semnal pentru telefon." "Semnal pentru telefon: o bară." "Semnal pentru telefon: două bare." @@ -1103,4 +1104,6 @@ "%1$s (s-a deconectat)" "Nu s-a putut conecta. Reîncercați." "Asociați un nou dispozitiv" + "Problemă la citirea măsurării bateriei" + "Atingeți pentru mai multe informații" diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index 33bcc77926b73..405cbdb22a484 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -181,6 +181,7 @@ "Заряд батареи: два деления." "Заряд батареи: три деления." "Батарея полностью заряжена." + "Уровень заряда батареи в процентах неизвестен." "Сигнал телефонной сети отсутствует." "Сигнал телефонной сети: одно деление." "Сигнал телефонной сети: два деления." @@ -1109,4 +1110,6 @@ "%1$s (отключено)" "Не удалось подключиться. Повторите попытку." "Подключить новое устройство" + "Не удается получить данные об уровне заряда батареи" + "Нажмите, чтобы узнать больше." diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index 2d9879b93ad0b..8c061fcea8ae4 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -181,6 +181,7 @@ "බැටරිය තීරු දෙකයි." "බැටරිය තීරු තුනයි." "බැටරිය පිරී ඇත." + "බැටරි ප්‍රතිශතය නොදනී." "දුරකථනයක් නැත." "දුරකථනය තීරු එකයි." "දුරකථනය තීරු දෙකයි." @@ -1097,4 +1098,6 @@ "%1$s (විසන්ධි විය)" "සම්බන්ධ වීමට නොහැකි විය. නැවත උත්සාහ කරන්න." "නව උපාංගය යුගල කරන්න" + "ඔබගේ බැටරි මනුව කියවීමේ දෝෂයකි" + "තවත් තොරතුරු සඳහා තට්ටු කරන්න" diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index a1724a4f62c32..4a29d87f44b05 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -181,6 +181,7 @@ "Dve čiarky batérie." "Tri čiarky batérie." "Batéria je nabitá." + "Percento batérie nie je známe." "Žiadna telefónna sieť." "Jeden stĺpec signálu telefónnej siete." "Dve čiarky signálu telefónnej siete." @@ -1109,4 +1110,6 @@ "%1$s (odpojené)" "Nepodarilo sa pripojiť. Skúste to znova." "Spárovať nové zariadenie" + "Pri čítaní meradla batérie sa vyskytol problém" + "Klepnutím si zobrazíte ďalšie informácie" diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index 11d3fc53fbc6a..5c0318768f5cb 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -181,6 +181,7 @@ "Baterija z dvema črticama." "Baterija s tremi črticami." "Baterija je polna." + "Neznan odstotek napolnjenosti baterije." "Ni telefona." "Telefon z eno črtico." "Telefon z dvema črticama." @@ -1109,4 +1110,6 @@ "%1$s (povezava prekinjena)" "Povezave ni bilo mogoče vzpostaviti. Poskusite znova." "Seznanitev nove naprave" + "Težava z branjem indikatorja stanja napolnjenosti baterije" + "Dotaknite se za več informacij" diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index 99b2ed553ff63..de80901363760 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -181,6 +181,7 @@ "Bateria ka edhe dy vija." "Bateria ka edhe tre vija." "Bateria u mbush." + "Përqindja e baterisë e panjohur." "Nuk ka telefon." "Telefoni ka edhe një vijë." "Telefoni ka dy vija." @@ -1097,4 +1098,6 @@ "%1$s (e shkëputur)" "Nuk mund të lidhej. Provo sërish." "Çifto pajisjen e re" + "Problem me leximin e matësit të baterisë" + "Trokit për më shumë informacione" diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index 69d596841ff42..425ce213c1c33 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -181,6 +181,7 @@ "Батерија од две црте." "Батерија од три црте." "Батерија је пуна." + "Проценат напуњености батерије није познат." "Нема телефона." "Сигнал телефона има једну црту." "Сигнал телефона од две црте." @@ -1103,4 +1104,6 @@ "%1$s (веза је прекинута)" "Повезивање није успело. Пробајте поново." "Упари нови уређај" + "Проблем са очитавањем мерача батерије" + "Додирните за више информација" diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index 26ab0dd18d5e5..ee57aabdb7930 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -76,18 +76,18 @@ "Läs mer" "Zooma för att fylla skärm" "Dra för att fylla skärmen" - "Skärmdump" + "Skärmbild" "har skickat en bild" - "Skärmdumpen sparas ..." - "Skärmdumpen sparas ..." - "Skärmdumpen har sparats" - "Visa skärmdumpen genom att trycka här" - "Det gick inte att spara skärmdumpen" - "Testa att ta en skärmdump igen" - "Det går inte att spara skärmdumpen eftersom lagringsutrymmet inte räcker" - "Appen eller organisationen tillåter inte att du tar skärmdumpar" - "Stäng skärmdump" - "Förhandsgranskning av skärmdump" + "Skärmbilden sparas ..." + "Skärmbilden sparas ..." + "Skärmbilden har sparats" + "Visa skärmbilden genom att trycka här" + "Det gick inte att spara skärmbilden" + "Testa att ta en skärmbild igen" + "Det går inte att spara skärmbilden eftersom lagringsutrymmet inte räcker" + "Appen eller organisationen tillåter inte att du tar skärmbilder" + "Stäng skärmbild" + "Förhandsgranskning av skärmbild" "Skärminspelare" "Behandlar skärminspelning" "Avisering om att skärminspelning pågår" @@ -181,6 +181,7 @@ "Batteri: två staplar." "Batteri: tre staplar." "Batteriet är fulladdat." + "Okänd batterinivå." "Ingen telefon." "Telefon: en stapel." "Telefon: två staplar." @@ -947,7 +948,7 @@ "Appen %1$s" "Aviseringar" "Batteri" - "Skärmdumpar" + "Skärmbilder" "Allmänna meddelanden" "Lagring" "Tips" @@ -1097,4 +1098,6 @@ "%1$s (frånkopplad)" "Det gick inte att ansluta. Försök igen." "Parkoppla en ny enhet" + "Batteriindikatorn visas inte" + "Tryck för mer information" diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index b5ac5eb512e53..6321b2bf2c0ba 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -24,7 +24,7 @@ "Hakuna arifa" "Inaendelea" "Arifa" - "Huenda chaji itaisha hivi karibuni" + "Chaji inaweza kuisha hivi karibuni" "Imebakisha %s" "Imesalia %1$s, itadumu takribani %2$s kulingana na jinsi unavyotumia" "Imesalia %1$s, itadumu takribani %2$s" @@ -181,6 +181,7 @@ "Pau mbili za betri" "Pau tatu za betri." "Betri imejaa." + "Asilimia ya betri haijulikani." "Hakuna simu" "Mwambaa mmoja wa simu." "Miambaa miwili ya simu" @@ -1097,4 +1098,6 @@ "%1$s (hakijaunganishwa)" "Imeshindwa kuunganisha. Jaribu tena." "Oanisha kifaa kipya" + "Tatizo la kusoma mita ya betri yako" + "Gusa ili upate maelezo zaidi" diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index f809ec15fed1a..18afe7dd5f228 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -45,7 +45,7 @@ "அறிவிப்புகள்" "புளூடூத் இணைக்கப்பட்டது" "உள்ளீட்டு முறைகளை அமை" - "கைமுறை விசைப்பலகை" + "கைமுறை கீபோர்டு" "%2$sஐ அணுக, %1$s ஆப்ஸை அனுமதிக்கவா?" "%2$sஐப் பயன்படுத்த %1$sஐ அனுமதிக்கவா?\nஇந்த ஆப்ஸிற்கு ரெக்கார்டு செய்வதற்கான அனுமதி வழங்கப்படவில்லை, எனினும் இந்த USB சாதனம் மூலம் ஆடியோவைப் பதிவுசெய்யும்." "%2$sஐ அணுக, %1$s ஆப்ஸை அனுமதிக்கவா?" @@ -181,6 +181,7 @@ "பேட்டரி சக்தி இரண்டு பார் அளவில் உள்ளது." "பேட்டரி சக்தி மூன்று பார் அளவில் உள்ளது." "பேட்டரி முழுமையாக உள்ளது." + "பேட்டரி சதவீதம் தெரியவில்லை." "சிக்னல் இல்லை." "சிக்னல் ஒரு கோட்டில் உள்ளது." "சிக்னல் இரண்டு கோட்டில் உள்ளது." @@ -676,7 +677,7 @@ "விரைவு அமைப்புகளில் ஒளிர்வுப் பட்டியைக் காட்டு" "பரிசோதனை முயற்சி" "புளூடூத்தை இயக்கவா?" - "உங்கள் டேப்லெட்டுடன் விசைப்பலகையை இணைக்க, முதலில் புளூடூத்தை இயக்க வேண்டும்." + "உங்கள் டேப்லெட்டுடன் கீபோர்டை இணைக்க, முதலில் புளூடூத்தை இயக்க வேண்டும்." "இயக்கு" "ஒலியின்றி அறிவிப்புகளைக் காட்டு" "எல்லா அறிவிப்புகளையும் தடு" @@ -799,7 +800,7 @@ "சமீபத்தியவை" "முந்தையது" "அறிவிப்புகள்" - "கீபோர்ட் ஷார்ட்கட்கள்" + "கீபோர்டு ஷார்ட்கட்கள்" "கீபோர்டு லே அவுட்டை மாற்று" "ஆப்ஸ்" "அசிஸ்ட்" @@ -834,7 +835,7 @@ "கிளிப்போர்டு" "விசைக்குறியீடு" - "சுழற்ற உறுதிப்படுத்து, விசைப்பலகை மாற்றி" + "சுழற்ற உறுதிப்படுத்து, கீபோர்டு மாற்றி" "ஏதுமில்லை" @@ -843,7 +844,7 @@ "இடப்புறம் சாய்ந்தது" "வலப்புறம் சாய்ந்தது" - "விசைப்பலகை மாற்றி" + "கீபோர்டு மாற்றி" "சேமி" "மீட்டமை" "பட்டனின் அகலத்தை மாற்று" @@ -1097,4 +1098,6 @@ "%1$s (இணைப்பு துண்டிக்கப்பட்டது)" "இணைக்க முடியவில்லை. மீண்டும் முயலவும்." "புதிய சாதனத்தை இணைத்தல்" + "பேட்டரி அளவை அறிவதில் சிக்கல்" + "மேலும் தகவல்களுக்கு தட்டவும்" diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index d56c1e1ddb09d..84a4ff8b6283b 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -52,7 +52,7 @@ "%2$sని నిర్వహించడానికి %1$sని తెరవాలా?" "%2$sని హ్యాండిల్ చేయడానికి %1$sను తెరవాలా?\nఈ యాప్‌కు రికార్డ్ చేసే అనుమతి మంజూరు కాలేదు, అయినా ఈ USB పరికరం ద్వారా ఆడియోను క్యాప్చర్ చేయగలదు." "%2$sని నిర్వహించడానికి %1$sని తెరవాలా?" - "ఈ USB ఉపకరణంతో ఇన్‌స్టాల్ చేయబడిన అనువర్తనాలు ఏవీ పని చేయవు. ఈ ఉపకరణం గురించి %1$sలో మరింత తెలుసుకోండి" + "ఈ USB ఉపకరణంతో ఇన్‌స్టాల్ చేయబడిన యాప్‌లు ఏవీ పని చేయవు. ఈ ఉపకరణం గురించి %1$sలో మరింత తెలుసుకోండి" "USB ఉపకరణం" "వీక్షించండి" "%2$s కనెక్ట్ అయి ఉన్న ఎల్లప్పుడూ %1$sని తెరవండి" @@ -181,6 +181,7 @@ "బ్యాటరీ రెండు బార్లు." "బ్యాటరీ మూడు బార్లు." "బ్యాటరీ నిండింది." + "బ్యాటరీ శాతం తెలియదు." "ఫోన్ లేదు." "ఫోన్ ఒక బారు." "ఫోన్ రెండు బార్లు." @@ -475,14 +476,14 @@ "వినియోగదారుని జోడించండి" "కొత్త వినియోగదారు" "అతిథిని తీసివేయాలా?" - "ఈ సెషన్‌లోని అన్ని అనువర్తనాలు మరియు డేటా తొలగించబడతాయి." + "ఈ సెషన్‌లోని అన్ని యాప్‌లు మరియు డేటా తొలగించబడతాయి." "తీసివేయి" "పునఃస్వాగతం, అతిథి!" "మీరు మీ సెషన్‌ని కొనసాగించాలనుకుంటున్నారా?" "మొదటి నుండి ప్రారంభించు" "అవును, కొనసాగించు" "అతిథి వినియోగదారు" - "అనువర్తనాలు, డేటా తొలగించేందుకు అతిథి వినియోగదారు తీసివేయండి" + "యాప్‌లు, డేటా తొలగించేందుకు అతిథి వినియోగదారు తీసివేయండి" "అతిథిని తీసివేయి" "వినియోగదారుని లాగ్ అవుట్ చేయండి" "ప్రస్తుత వినియోగదారును లాగ్ అవుట్ చేయండి" @@ -495,7 +496,7 @@ ఒక్క వినియోగదారుని మాత్రమే సృష్టించవచ్చు. "వినియోగదారుని తీసివేయాలా?" - "ఈ వినియోగదారుకు సంబంధించిన అన్ని అనువర్తనాలు మరియు డేటా తొలగించబడతాయి." + "ఈ వినియోగదారుకు సంబంధించిన అన్ని యాప్‌లు మరియు డేటా తొలగించబడతాయి." "తీసివేయి" "బ్యాటరీ సేవర్ ఆన్‌లో ఉంది" "పనితీరుని మరియు నేపథ్య డేటాను తగ్గిస్తుంది" @@ -549,29 +550,29 @@ "మీ కార్యాలయ ప్రొఫైల్‌లో మీ సంస్థ ఒక ప్రమాణపత్ర అధికారాన్ని ఇన్‌స్టాల్ చేసింది. మీ సురక్షిత నెట్‌వర్క్ ట్రాఫిక్ పర్యవేక్షించబడవచ్చు లేదా సవరించబడవచ్చు." "ఈ పరికరంలో ప్రమాణపత్ర అధికారం ఇన్‌స్టాల్ చేయబడింది. మీ సురక్షిత నెట్‌వర్క్ ట్రాఫిక్ పర్యవేక్షించబడవచ్చు లేదా సవరించబడవచ్చు." "మీ నిర్వాహకులు మీ పరికరంలోని ట్రాఫిక్‌ని పర్యవేక్షించగల నెట్‌వర్క్ లాగింగ్‌ని ఆన్ చేసారు." - "మీరు %1$sకి కనెక్ట్ చేయబడ్డారు, ఇది ఇమెయిల్‌లు, అనువర్తనాలు మరియు వెబ్‌సైట్‌లతో సహా మీ నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగలదు." - "మీరు ఇమెయిల్‌లు, అనువర్తనాలు మరియు వెబ్‌సైట్‌లతో సహా మీ నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగల %1$s మరియు %2$sకి కనెక్ట్ చేయబడ్డారు." - "మీ కార్యాలయ ప్రొఫైల్ ఇమెయిల్‌లు, అనువర్తనాలు మరియు వెబ్‌సైట్‌లతో సహా మీ నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగల %1$sకి కనెక్ట్ చేయబడింది." - "మీ వ్యక్తిగత ప్రొఫైల్ ఇమెయిల్‌లు, అనువర్తనాలు మరియు వెబ్‌సైట్‌లతో సహా మీ నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగల %1$sకి కనెక్ట్ చేయబడింది." + "మీరు %1$sకి కనెక్ట్ చేయబడ్డారు, ఇది ఇమెయిల్‌లు, యాప్‌లు మరియు వెబ్‌సైట్‌లతో సహా మీ నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగలదు." + "మీరు ఇమెయిల్‌లు, యాప్‌లు మరియు వెబ్‌సైట్‌లతో సహా మీ నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగల %1$s మరియు %2$sకి కనెక్ట్ చేయబడ్డారు." + "మీ కార్యాలయ ప్రొఫైల్ ఇమెయిల్‌లు, యాప్‌లు మరియు వెబ్‌సైట్‌లతో సహా మీ నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగల %1$sకి కనెక్ట్ చేయబడింది." + "మీ వ్యక్తిగత ప్రొఫైల్ ఇమెయిల్‌లు, యాప్‌లు మరియు వెబ్‌సైట్‌లతో సహా మీ నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగల %1$sకి కనెక్ట్ చేయబడింది." "మీ పరికరం %1$s ద్వారా నిర్వహించబడుతోంది." "%1$s మీ పరికరాన్ని నిర్వహించడానికి %2$sని ఉపయోగిస్తుంది." "మీ పరికరంతో అనుబంధించబడిన సెట్టింగ్‌లు, కార్పొరేట్ యాక్సెస్, యాప్‌లు, డేటా మరియు మీ పరికరం యొక్క స్థాన సమాచారాన్ని మీ నిర్వాహకులు పర్యవేక్షించగలరు మరియు నిర్వహించగలరు." " " "మరింత తెలుసుకోండి" - "మీరు %1$sకి కనెక్ట్ చేయబడ్డారు, ఇది ఇమెయిల్‌లు, అనువర్తనాలు మరియు వెబ్‌సైట్‌లతో సహా మీ వ్యక్తిగత నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగలదు." + "మీరు %1$sకి కనెక్ట్ చేయబడ్డారు, ఇది ఇమెయిల్‌లు, యాప్‌లు మరియు వెబ్‌సైట్‌లతో సహా మీ వ్యక్తిగత నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగలదు." " " "VPN సెట్టింగ్‌లను తెరవండి" " " "విశ్వసనీయ ఆధారాలను తెరువు" "మీ నిర్వాహకులు మీ పరికరంలోని ట్రాఫిక్‌ని పర్యవేక్షించగల నెట్‌వర్క్ లాగింగ్‌ని ఆన్ చేసారు.\n\nమరింత సమాచారం కావాలంటే, మీ నిర్వాహకులను సంప్రదించండి." "మీరు VPN కనెక్షన్ సెటప్ చేయడానికి ఒక యాప్‌నకు అనుమతి ఇచ్చారు.\n\nఈ యాప్ ఇమెయిల్‌లు,యాప్‌లు మరియు వెబ్‌సైట్‌లతో సహా మీ డివైజ్ మరియు నెట్‌వర్క్ కార్యకలాపాన్ని పర్యవేక్షించగలదు." - "%1$s ద్వారా మీ కార్యాలయ ప్రొఫైల్ నిర్వహించబడుతోంది.\n\nఇమెయిల్‌లు, అనువర్తనాలు మరియు వెబ్‌సైట్‌లతో సహా మీ నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగల సామర్థ్యం మీ నిర్వాహకులకు ఉంది.\n\nమరింత సమాచారం కావాలంటే, మీ నిర్వాహకులను సంప్రదించండి.\n\nమీరు VPNకి కూడా కనెక్ట్ అయ్యారు, ఇది మీ నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగలదు." + "%1$s ద్వారా మీ కార్యాలయ ప్రొఫైల్ నిర్వహించబడుతోంది.\n\nఇమెయిల్‌లు, యాప్‌లు మరియు వెబ్‌సైట్‌లతో సహా మీ నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగల సామర్థ్యం మీ నిర్వాహకులకు ఉంది.\n\nమరింత సమాచారం కావాలంటే, మీ నిర్వాహకులను సంప్రదించండి.\n\nమీరు VPNకి కూడా కనెక్ట్ అయ్యారు, ఇది మీ నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగలదు." "VPN" - "మీరు ఇమెయిల్‌లు, అనువర్తనాలు మరియు వెబ్‌సైట్‌లతో సహా మీ నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగల %1$sకి కనెక్ట్ చేయబడ్డారు." - "మీరు %1$sకి కనెక్ట్ చేయబడ్డారు, ఇది ఇమెయిల్‌లు, అనువర్తనాలు మరియు వెబ్‌‍సైట్‌లతో సహా మీ వ్యక్తిగత నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగలదు." - "మీరు %1$sకి కనెక్ట్ చేయబడ్డారు, ఇది ఇమెయిల్‌లు, అనువర్తనాలు మరియు వెబ్‌సైట్‌లతో సహా మీ వ్యక్తిగత నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగలదు." - "మీ కార్యాలయ ప్రొఫైల్ %1$s నిర్వహణలో ఉంది. ఇమెయిల్‌లు, అనువర్తనాలు మరియు వెబ్‌సైట్‌లతో సహా మీ కార్యాలయ నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగల %2$sకి ప్రొఫైల్ కనెక్ట్ చేయబడింది.\n\nమరింత సమాచారం కోసం, మీ నిర్వాహకులను సంప్రదించండి." - "మీ కార్యాలయ ప్రొఫైల్ %1$s నిర్వహణలో ఉంది. ఇమెయిల్‌లు, అనువర్తనాలు మరియు వెబ్‌సైట్‌లతో సహా మీ కార్యాలయ నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగల %2$sకి ప్రొఫైల్ కనెక్ట్ చేయబడింది.\n\nమీ వ్యక్తిగత నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగల %3$sకి కూడా మీరు కనెక్ట్ చేయబడ్డారు." + "మీరు ఇమెయిల్‌లు, యాప్‌లు మరియు వెబ్‌సైట్‌లతో సహా మీ నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగల %1$sకి కనెక్ట్ చేయబడ్డారు." + "మీరు %1$sకి కనెక్ట్ చేయబడ్డారు, ఇది ఇమెయిల్‌లు, యాప్‌లు మరియు వెబ్‌‍సైట్‌లతో సహా మీ వ్యక్తిగత నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగలదు." + "మీరు %1$sకి కనెక్ట్ చేయబడ్డారు, ఇది ఇమెయిల్‌లు, యాప్‌లు మరియు వెబ్‌సైట్‌లతో సహా మీ వ్యక్తిగత నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగలదు." + "మీ కార్యాలయ ప్రొఫైల్ %1$s నిర్వహణలో ఉంది. ఇమెయిల్‌లు, యాప్‌లు మరియు వెబ్‌సైట్‌లతో సహా మీ కార్యాలయ నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగల %2$sకి ప్రొఫైల్ కనెక్ట్ చేయబడింది.\n\nమరింత సమాచారం కోసం, మీ నిర్వాహకులను సంప్రదించండి." + "మీ కార్యాలయ ప్రొఫైల్ %1$s నిర్వహణలో ఉంది. ఇమెయిల్‌లు, యాప్‌లు మరియు వెబ్‌సైట్‌లతో సహా మీ కార్యాలయ నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగల %2$sకి ప్రొఫైల్ కనెక్ట్ చేయబడింది.\n\nమీ వ్యక్తిగత నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగల %3$sకి కూడా మీరు కనెక్ట్ చేయబడ్డారు." "TrustAgent ద్వారా అన్‌లాక్ చేయబడింది" "మీరు మాన్యువల్‌గా అన్‌లాక్ చేస్తే మినహా పరికరం లాక్ చేయబడి ఉంటుంది" "%1$s\n%2$s" @@ -922,7 +923,7 @@ "పరిమాణం మార్చు" "వేడెక్కినందుకు ఫోన్ ఆఫ్ చేయబడింది" "మీ ఫోన్ ఇప్పుడు సాధారణంగా పని చేస్తోంది.\nమరింత సమాచారం కోసం ట్యాప్ చేయండి" - "మీ ఫోన్ చాలా వేడిగా ఉంది, కనుక చల్లబర్చడానికి ఆఫ్ చేయబడింది. మీ ఫోన్ ఇప్పుడు సాధారణంగా పని చేస్తుంది.\n\nమీరు ఇలా చేస్తే మీ ఫోన్ చాలా వేడెక్కవచ్చు:\n • వనరు-ఆధారిత అనువర్తనాలు (గేమింగ్, వీడియో లేదా నావిగేషన్ వంటి అనువర్తనాలు) ఉపయోగించడం\n • పెద్ద ఫైల్‌లను డౌన్‌లోడ్ లేదా అప్‌లోడ్ చేయడం\n • అధిక ఉష్ణోగ్రతలలో మీ ఫోన్‌ని ఉపయోగించడం" + "మీ ఫోన్ చాలా వేడిగా ఉంది, కనుక చల్లబర్చడానికి ఆఫ్ చేయబడింది. మీ ఫోన్ ఇప్పుడు సాధారణంగా పని చేస్తుంది.\n\nమీరు ఇలా చేస్తే మీ ఫోన్ చాలా వేడెక్కవచ్చు:\n • వనరు-ఆధారిత యాప్‌లు (గేమింగ్, వీడియో లేదా నావిగేషన్ వంటి యాప్‌లు) ఉపయోగించడం\n • పెద్ద ఫైల్‌లను డౌన్‌లోడ్ లేదా అప్‌లోడ్ చేయడం\n • అధిక ఉష్ణోగ్రతలలో మీ ఫోన్‌ని ఉపయోగించడం" "తీసుకోవాల్సిన జాగ్రత్తలు ఏమిటో చూడండి" "ఫోన్ వేడెక్కుతోంది" "ఫోన్‌ను చల్లబరిచే క్రమంలో కొన్ని ఫీచర్లు పరిమితం చేయబడ్డాయి.\nమరింత సమాచారం కోసం ట్యాప్ చేయండి" @@ -1097,4 +1098,6 @@ "%1$s (డిస్‌కనెక్ట్ అయ్యింది)" "కనెక్ట్ చేయడం సాధ్యపడలేదు. మళ్లీ ట్రై చేయండి." "కొత్త పరికరాన్ని పెయిర్ చేయండి" + "మీ బ్యాటరీ మీటర్‌ను చదవడంలో సమస్య" + "మరింత సమాచారం కోసం ట్యాప్ చేయండి" diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index 2bde0db6c8e82..3475c85d04f15 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -88,7 +88,7 @@ "แอปหรือองค์กรของคุณไม่อนุญาตให้จับภาพหน้าจอ" "ปิดภาพหน้าจอ" "ตัวอย่างภาพหน้าจอ" - "โปรแกรมอัดหน้าจอ" + "โปรแกรมบันทึกหน้าจอ" "กำลังประมวลผลการอัดหน้าจอ" "การแจ้งเตือนต่อเนื่องสำหรับเซสชันการบันทึกหน้าจอ" "เริ่มบันทึกเลยไหม" @@ -181,6 +181,7 @@ "แบตเตอรี่สองขีด" "แบตเตอรี่สามขีด" "แบตเตอรี่เต็ม" + "ไม่ทราบเปอร์เซ็นต์แบตเตอรี่" "ไม่มีสัญญาณโทรศัพท์" "สัญญาณโทรศัพท์หนึ่งขีด" "สัญญาณโทรศัพท์สองขีด" @@ -751,7 +752,7 @@ "เพิ่มลงในหน้าจอหลัก" "%1$s %2$s" "ส่วนควบคุมการแจ้งเตือน" - "ตัวเลือกการปิดเสียงแจ้งเตือนชั่วคราว" + "ตัวเลือกการเลื่อนการแจ้งเตือน" "เตือนฉัน" "การตั้งค่า" "เลิกทำ" @@ -1097,4 +1098,6 @@ "%1$s (ยกเลิกการเชื่อมต่อแล้ว)" "เชื่อมต่อไม่ได้ ลองใหม่" "จับคู่อุปกรณ์ใหม่" + "พบปัญหาในการอ่านเครื่องวัดแบตเตอรี่" + "แตะดูข้อมูลเพิ่มเติม" diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index 53c889dbbda1e..9499461966e1d 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -181,6 +181,7 @@ "Baterya na dalawang bar." "Baterya na tatlong bar." "Puno na ang baterya." + "Hindi alam ang porsyento ng baterya." "Walang telepono." "Telepono na isang bar." "Telepono na dalawang bar." @@ -1097,4 +1098,6 @@ "%1$s (nakadiskonekta)" "Hindi makakonekta. Subukan ulit." "Magpares ng bagong device" + "Nagkaproblema sa pagbabasa ng iyong battery meter" + "I-tap para sa higit pang impormasyon" diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 74bfb7542c03a..2bc6c6ab8774b 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -181,6 +181,7 @@ "Pil gücü iki çubuk." "Pil gücü üç çubuk." "Pil tam dolu." + "Pil yüzdesi bilinmiyor." "Telefon sinyali yok." "Telefon sinyali bir çubuk." "Telefon sinyali iki çubuk." @@ -1097,4 +1098,6 @@ "%1$s (bağlı değil)" "Bağlanılamadı. Tekrar deneyin." "Yeni cihaz eşle" + "Pil ölçeriniz okunurken sorun oluştu" + "Daha fazla bilgi için dokunun" diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index de1f6362c31f8..39f915fbc5683 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -181,6 +181,7 @@ "Заряд акумулятора: дві смужки." "Заряд акумулятора: три смужки." "Акумулятор заряджений." + "Відсоток заряду акумулятора невідомий." "Немає сигналу телефону." "Одна смужка сигналу телефону." "Дві смужки сигналу телефону." @@ -1109,4 +1110,6 @@ "%1$s (відключено)" "Не вдалося підключитися. Повторіть спробу." "Підключити новий пристрій" + "Не вдалось отримати дані лічильника акумулятора" + "Натисніть, щоб дізнатися більше" diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index 39d251b079bdc..0a3853ecfc04f 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -181,6 +181,7 @@ "بیٹری کے دو بارز۔" "بیٹری کے تین بارز۔" "بیٹری بھری ہے۔" + "بیٹری کی فیصد نامعلوم ہے۔" "کوئی فون نہیں ہے۔" "فون کا ایک بار۔" "فون کے دو بارز۔" @@ -1097,4 +1098,6 @@ "%1$s (غیر منسلک ہو گیا)" "منسلک نہیں ہو سکا۔ پھر کوشش کریں۔" "نئے آلہ کا جوڑا بنائیں" + "آپ کے بیٹری میٹر کو پڑھنے میں دشواری" + "مزید معلومات کے لیے تھپتھپائیں" diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index 80f5d6fc33041..6371ecd1fab8c 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -181,6 +181,7 @@ "Batareya ikkta panelda." "Batareya uchta panelda." "Batareya to‘la." + "Batareya quvvati foizi nomaʼlum." "Signal yo‘q." "Telefon bitta panelda." "Telefon ikkita panelda." @@ -513,7 +514,7 @@ "Bildirishnomalar" "Suhbatlar" "Barcha sokin bildirishnomalarni tozalash" - "Bezovta qilinmasin rejimida bildirishnomalar pauza qilingan" + "Bezovta qilinmasin rejimida bildirishnomalar pauza qilinadi" "Boshlash" "Bildirishnomalar yo‘q" "Profil kuzatilishi mumkin" @@ -1097,4 +1098,6 @@ "%1$s (uzilgan)" "Ulanmadi. Qayta urining." "Yangi qurilmani ulash" + "Batareya quvvati aniqlanmadi" + "Batafsil axborot olish uchun bosing" diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 378a47c0b3215..8ae1e1a01bf85 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -181,6 +181,7 @@ "Mức pin hai vạch." "Mức pin ba vạch." "Mức pin đầy." + "Tỷ lệ phần trăm pin không xác định." "Không có điện thoại nào." "Tín hiệu điện thoại một vạch." "Tín hiệu điện thoại hai vạch." @@ -1097,4 +1098,6 @@ "%1$s (đã ngắt kết nối)" "Không thể kết nối. Hãy thử lại." "Ghép nối thiết bị mới" + "Đã xảy ra vấn đề khi đọc dung lượng pin của bạn" + "Nhấn để biết thêm thông tin" diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index 44d0264eeec49..9efdf7005773f 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -63,9 +63,9 @@ "允许" "不允许使用 USB 调试功能" "目前已登录此设备的用户无法开启 USB 调试功能。要使用此功能,请切换为主要用户的帐号。" - "要允许在此网络上进行无线调试吗?" + "要允许通过此网络上进行无线调试吗?" "网络名称 (SSID)\n%1$s\n\nWLAN 地址 (BSSID)\n%2$s" - "在此网络上始终允许" + "始终允许通过此网络进行调试" "允许" "不允许使用无线调试功能" "目前已登录此设备的用户无法开启无线调试功能。要使用此功能,请切换为主要用户的帐号。" @@ -181,6 +181,7 @@ "电池电量为两格。" "电池电量为三格。" "电池电量满格。" + "电池电量百分比未知。" "没有手机信号。" "手机信号强度为一格。" "手机信号强度为两格。" @@ -1097,4 +1098,6 @@ "%1$s(已断开连接)" "无法连接。请重试。" "与新设备配对" + "读取电池计量器时出现问题" + "点按即可了解详情" diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index 259a975d81f14..29eb279d72d16 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -181,6 +181,7 @@ "電池電量為兩格。" "電池電量為三格。" "電池已滿。" + "電量百分比不明。" "沒有電話訊號。" "電話訊號強度為一格。" "電話訊號強度為兩格。" @@ -1097,4 +1098,6 @@ "%1$s (已中斷連線)" "無法連線,請再試一次。" "配對新裝置" + "讀取電池計量器時發生問題" + "輕按即可瞭解詳情" diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 05ff15513b682..010f954059a95 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -181,6 +181,7 @@ "電池電量兩格。" "電池電量三格。" "電池電量已滿。" + "電池電量不明。" "沒有電話訊號。" "電話訊號強度一格。" "電話訊號強度兩格。" @@ -1097,4 +1098,6 @@ "%1$s (已中斷連線)" "無法連線,請再試一次。" "配對新裝置" + "讀取電池計量器時發生問題" + "輕觸即可瞭解詳情" diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index eda3079e2868a..c8356fa25c111 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -181,6 +181,7 @@ "Amabha amabili ebhethri" "Amabha amathathu ebhethri" "Ibhethri igcwele." + "Iphesenti lebhethri alaziwa." "Ayikho ifoni." "Ibha eyodwa yefoni" "Amabha amabilil efoni." @@ -1097,4 +1098,6 @@ "%1$s (inqamukile)" "Ayikwazanga ukuxhumeka. Zama futhi." "Bhangqa idivayisi entsha" + "Kube khona inkinga ngokufunda imitha yakho yebhethri" + "Thepha ukuze uthole olunye ulwazi" From cedf9e55c8f49f7bb81e67090a277fbdbdbb2699 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 3 Feb 2021 18:12:10 +0000 Subject: [PATCH 140/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I08a2c5dd92bb39b48e4eb0ffc8c0703f4f60e25a --- packages/SystemUI/res-keyguard/values-ar/strings.xml | 2 +- packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml | 2 +- packages/SystemUI/res-keyguard/values-bg/strings.xml | 2 +- packages/SystemUI/res-keyguard/values-ca/strings.xml | 2 +- packages/SystemUI/res-keyguard/values-eu/strings.xml | 2 +- packages/SystemUI/res-keyguard/values-gl/strings.xml | 2 +- packages/SystemUI/res-keyguard/values-hy/strings.xml | 2 +- packages/SystemUI/res-keyguard/values-is/strings.xml | 2 +- packages/SystemUI/res-keyguard/values-it/strings.xml | 2 +- packages/SystemUI/res-keyguard/values-kk/strings.xml | 2 +- packages/SystemUI/res-keyguard/values-kn/strings.xml | 2 +- packages/SystemUI/res-keyguard/values-ml/strings.xml | 2 +- packages/SystemUI/res-keyguard/values-mn/strings.xml | 2 +- packages/SystemUI/res-keyguard/values-pa/strings.xml | 2 +- packages/SystemUI/res-keyguard/values-pl/strings.xml | 2 +- packages/SystemUI/res-keyguard/values-si/strings.xml | 2 +- packages/SystemUI/res-keyguard/values-sr/strings.xml | 2 +- packages/SystemUI/res-keyguard/values-te/strings.xml | 2 +- packages/SystemUI/res-keyguard/values-uk/strings.xml | 2 +- packages/SystemUI/res-keyguard/values-uz/strings.xml | 2 +- packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml | 2 +- packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml | 2 +- 22 files changed, 22 insertions(+), 22 deletions(-) diff --git a/packages/SystemUI/res-keyguard/values-ar/strings.xml b/packages/SystemUI/res-keyguard/values-ar/strings.xml index 459d162c65db0..c027f8df1f667 100644 --- a/packages/SystemUI/res-keyguard/values-ar/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ar/strings.xml @@ -38,7 +38,7 @@ "%s • جارٍ الشحن" "%s • جارٍ الشحن سريعًا" "%s • جارٍ الشحن ببطء" - "%s • التحسين لسلامة البطارية" + "%s • التحسين للحفاظ على سلامة البطارية" "توصيل جهاز الشحن." "اضغط على \"القائمة\" لإلغاء التأمين." "الشبكة مؤمّنة" diff --git a/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml b/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml index 3468740607597..4220526635f7b 100644 --- a/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml @@ -38,7 +38,7 @@ "%s • Puni se" "%s • Brzo se puni" "%s • Sporo se puni" - "%s • Optimizuje se radi dobrog stanja baterije" + "%s • Optimizuje se radi boljeg stanja baterije" "Priključite punjač." "Pritisnite Meni da biste otključali." "Mreža je zaključana" diff --git a/packages/SystemUI/res-keyguard/values-bg/strings.xml b/packages/SystemUI/res-keyguard/values-bg/strings.xml index 0911efade7067..dc4ee693d89c8 100644 --- a/packages/SystemUI/res-keyguard/values-bg/strings.xml +++ b/packages/SystemUI/res-keyguard/values-bg/strings.xml @@ -38,7 +38,7 @@ "%s • Зарежда се" "%s • Зарежда се бързо" "%s • Зарежда се бавно" - "%s • Оптимизиране за състоянието на батерията" + "%s • Оптимизиране с цел състоянието на батерията" "Свържете зарядното си устройство." "Натиснете „Меню“, за да отключите." "Мрежата е заключена" diff --git a/packages/SystemUI/res-keyguard/values-ca/strings.xml b/packages/SystemUI/res-keyguard/values-ca/strings.xml index 421ddb6d31e63..2e3b4af4a68f6 100644 --- a/packages/SystemUI/res-keyguard/values-ca/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ca/strings.xml @@ -38,7 +38,7 @@ "%s • S\'està carregant" "%s • S\'està carregant ràpidament" "%s • S\'està carregant lentament" - "%s • S\'està optimitzant per mantenir el bon estat de la bateria" + "%s • S\'està optimitzant per preservar l\'estat de la bateria" "Connecta el carregador." "Prem Menú per desbloquejar." "La xarxa està bloquejada" diff --git a/packages/SystemUI/res-keyguard/values-eu/strings.xml b/packages/SystemUI/res-keyguard/values-eu/strings.xml index ce8ef202a0380..93fe516a8aa66 100644 --- a/packages/SystemUI/res-keyguard/values-eu/strings.xml +++ b/packages/SystemUI/res-keyguard/values-eu/strings.xml @@ -38,7 +38,7 @@ "%s • Kargatzen" "%s • Bizkor kargatzen" "%s • Mantso kargatzen" - "%s • Optimizatzen bateria egoera onean mantentzeko" + "%s • Optimizatzen, bateria egoera onean mantentzeko" "Konektatu kargagailua." "Desblokeatzeko, sakatu Menua." "Sarea blokeatuta dago" diff --git a/packages/SystemUI/res-keyguard/values-gl/strings.xml b/packages/SystemUI/res-keyguard/values-gl/strings.xml index 01a0fac580166..f8c5ebac95175 100644 --- a/packages/SystemUI/res-keyguard/values-gl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-gl/strings.xml @@ -38,7 +38,7 @@ "%s • Cargando" "%s • Cargando rapidamente" "%s • Cargando lentamente" - "%s • Optimizando para manter a batería en bo estado" + "%s • Optimizando a preservación da batería" "Conecta o cargador." "Preme Menú para desbloquear." "Bloqueada pola rede" diff --git a/packages/SystemUI/res-keyguard/values-hy/strings.xml b/packages/SystemUI/res-keyguard/values-hy/strings.xml index c8ed16d10327b..ab07ba46c14dd 100644 --- a/packages/SystemUI/res-keyguard/values-hy/strings.xml +++ b/packages/SystemUI/res-keyguard/values-hy/strings.xml @@ -38,7 +38,7 @@ "%s • Լիցքավորում" "%s • Արագ լիցքավորում" "%s • Դանդաղ լիցքավորում" - "%s • Օպտիմալացվում է մարտկոցի աշխատանքային հզորության համար" + "%s • Օպտիմալացվում է մարտկոցի պահպանման համար" "Միացրեք լիցքավորիչը:" "Ապակողպելու համար սեղմեք Ընտրացանկը:" "Ցանցը կողպված է" diff --git a/packages/SystemUI/res-keyguard/values-is/strings.xml b/packages/SystemUI/res-keyguard/values-is/strings.xml index 3f3bec9b8c8ce..bb8a908d20f7b 100644 --- a/packages/SystemUI/res-keyguard/values-is/strings.xml +++ b/packages/SystemUI/res-keyguard/values-is/strings.xml @@ -38,7 +38,7 @@ "%s • Í hleðslu" "%s • Hröð hleðsla" "%s • Hæg hleðsla" - "%s • Fínstillir til að bæta rafhlöðuendingu" + "%s • Fínstillir fyrir rafhlöðuendingu" "Tengdu hleðslutækið." "Ýttu á valmyndarhnappinn til að taka úr lás." "Net læst" diff --git a/packages/SystemUI/res-keyguard/values-it/strings.xml b/packages/SystemUI/res-keyguard/values-it/strings.xml index 47d17ce578929..c1baadf47de0f 100644 --- a/packages/SystemUI/res-keyguard/values-it/strings.xml +++ b/packages/SystemUI/res-keyguard/values-it/strings.xml @@ -38,7 +38,7 @@ "%s • In carica" "%s • Ricarica veloce" "%s • Ricarica lenta" - "%s • È in corso l\'ottimizzazione per l\'integrità della batteria" + "%s • Ottimizzazione per integrità batteria" "Collega il caricabatterie." "Premi Menu per sbloccare." "Rete bloccata" diff --git a/packages/SystemUI/res-keyguard/values-kk/strings.xml b/packages/SystemUI/res-keyguard/values-kk/strings.xml index b20cb05ea86f0..8e701fe86430d 100644 --- a/packages/SystemUI/res-keyguard/values-kk/strings.xml +++ b/packages/SystemUI/res-keyguard/values-kk/strings.xml @@ -38,7 +38,7 @@ "%s • Зарядталуда" "%s • Жылдам зарядталуда" "%s • Баяу зарядталуда" - "%s • Батареяның жұмыс істеу қабілеті оңтайландырылуда" + "%s • Батарея жұмысын оңтайландыру" "Зарядтағышты қосыңыз." "Ашу үшін \"Мәзір\" пернесін басыңыз." "Желі құлыптаулы" diff --git a/packages/SystemUI/res-keyguard/values-kn/strings.xml b/packages/SystemUI/res-keyguard/values-kn/strings.xml index a527123797763..96865419cbf73 100644 --- a/packages/SystemUI/res-keyguard/values-kn/strings.xml +++ b/packages/SystemUI/res-keyguard/values-kn/strings.xml @@ -38,7 +38,7 @@ "%s • ಚಾರ್ಜ್‌ ಮಾಡಲಾಗುತ್ತಿದೆ" "%s • ವೇಗವಾಗಿ ಚಾರ್ಜ್‌ಮಾಡಲಾಗುತ್ತಿದೆ" "%s • ನಿಧಾನವಾಗಿ ಚಾರ್ಜ್ ಮಾಡಲಾಗುತ್ತಿದೆ" - "%s • ಬ್ಯಾಟರಿಯ ಆರೋಗ್ಯಕ್ಕಾಗಿ ಆಪ್ಟಿಮೈಸ್ ಮಾಡಲಾಗುತ್ತಿದೆ" + "%s • ಬ್ಯಾಟರಿಯ ಸುಸ್ಥಿತಿಗಾಗಿ ಆಪ್ಟಿಮೈಸ್ ಮಾಡಲಾಗುತ್ತಿದೆ" "ನಿಮ್ಮ ಚಾರ್ಜರ್ ಸಂಪರ್ಕಗೊಳಿಸಿ." "ಅನ್‌ಲಾಕ್ ಮಾಡಲು ಮೆನು ಒತ್ತಿರಿ." "ನೆಟ್‌ವರ್ಕ್ ಲಾಕ್ ಆಗಿದೆ" diff --git a/packages/SystemUI/res-keyguard/values-ml/strings.xml b/packages/SystemUI/res-keyguard/values-ml/strings.xml index 66d0ac756bf5d..80761591e0bf3 100644 --- a/packages/SystemUI/res-keyguard/values-ml/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ml/strings.xml @@ -38,7 +38,7 @@ "%s • ചാർജ് ചെയ്യുന്നു" "%s • വേഗത്തിൽ ചാർജ് ചെയ്യുന്നു" "%s • പതുക്കെ ചാർജ് ചെയ്യുന്നു" - "%s • ബാറ്ററി നില ഒപ്റ്റിമൈസ് ചെയ്യുന്നു" + "%s • ബാറ്ററിയുടെ ആയുസിനായി ഒപ്റ്റിമൈസ് ചെയ്യുന്നു" "നിങ്ങളുടെ ചാർജർ കണക്റ്റുചെയ്യുക." "അൺലോക്കുചെയ്യാൻ മെനു അമർത്തുക." "നെറ്റ്‌വർക്ക് ലോക്കുചെയ്‌തു" diff --git a/packages/SystemUI/res-keyguard/values-mn/strings.xml b/packages/SystemUI/res-keyguard/values-mn/strings.xml index 2ff4a22d6737a..13c152f8f38b0 100644 --- a/packages/SystemUI/res-keyguard/values-mn/strings.xml +++ b/packages/SystemUI/res-keyguard/values-mn/strings.xml @@ -38,7 +38,7 @@ "%s • Цэнэглэж байна" "%s • Хурдан цэнэглэж байна" "%s • Удаан цэнэглэж байна" - "%s • Батарейн чанарыг оновчилж байна" + "%s • Батарейн барилтыг оновчилж байна" "Цэнэглэгчээ холбоно уу." "Түгжээг тайлах бол цэсийг дарна уу." "Сүлжээ түгжигдсэн" diff --git a/packages/SystemUI/res-keyguard/values-pa/strings.xml b/packages/SystemUI/res-keyguard/values-pa/strings.xml index 43d549c92e6b6..04419e039b58a 100644 --- a/packages/SystemUI/res-keyguard/values-pa/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pa/strings.xml @@ -38,7 +38,7 @@ "%s • ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੈ" "%s • ਤੇਜ਼ੀ ਨਾਲ ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੈ" "%s • ਹੌਲੀ-ਹੌਲੀ ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੈ" - "%s • ਬੈਟਰੀ ਸਥਿਤੀ ਲਈ ਅਨੁਕੂਲ ਬਣਾਇਆ ਜਾ ਰਿਹਾ" + "%s • ਬੈਟਰੀ ਦੀ ਸਥਿਤੀ ਲਈ ਅਨੁਕੂਲ ਬਣਾਇਆ ਜਾ ਰਿਹਾ ਹੈ" "ਆਪਣਾ ਚਾਰਜਰ ਕਨੈਕਟ ਕਰੋ।" "ਅਣਲਾਕ ਕਰਨ ਲਈ \"ਮੀਨੂ\" ਦਬਾਓ।" "ਨੈੱਟਵਰਕ ਲਾਕ ਕੀਤਾ ਗਿਆ" diff --git a/packages/SystemUI/res-keyguard/values-pl/strings.xml b/packages/SystemUI/res-keyguard/values-pl/strings.xml index 76f755c2b96a9..01427be041adf 100644 --- a/packages/SystemUI/res-keyguard/values-pl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pl/strings.xml @@ -38,7 +38,7 @@ "%s • Ładowanie" "%s • Szybkie ładowanie" "%s • Wolne ładowanie" - "%s • Optymalizuję, by utrzymać baterię w dobrym stanie" + "%s • Optymalizuję, aby utrzymać baterię w dobrym stanie" "Podłącz ładowarkę." "Naciśnij Menu, aby odblokować." "Sieć zablokowana" diff --git a/packages/SystemUI/res-keyguard/values-si/strings.xml b/packages/SystemUI/res-keyguard/values-si/strings.xml index 3a6078224be29..64609b3020698 100644 --- a/packages/SystemUI/res-keyguard/values-si/strings.xml +++ b/packages/SystemUI/res-keyguard/values-si/strings.xml @@ -38,7 +38,7 @@ "%s • ආරෝපණය වෙමින්" "%s • වේගයෙන් ආරෝපණය වෙමින්" "%s • සෙමින් ආරෝපණය වෙමින්" - "%s • බැටරි සෞඛ්‍යය සඳහා ප්‍රශස්ත කරමින්" + "%s • බැටරි ආයු කාලය වැඩි දියුණු කරමින්" "ඔබගේ ආරෝපකයට සම්බන්ධ කරන්න." "අගුලු හැරීමට මෙනුව ඔබන්න." "ජාලය අගුළු දමා ඇත" diff --git a/packages/SystemUI/res-keyguard/values-sr/strings.xml b/packages/SystemUI/res-keyguard/values-sr/strings.xml index 90b8a3e362fd0..7ca04ce8198ad 100644 --- a/packages/SystemUI/res-keyguard/values-sr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sr/strings.xml @@ -38,7 +38,7 @@ "%s • Пуни се" "%s • Брзо се пуни" "%s • Споро се пуни" - "%s • Оптимизује се ради доброг стања батерије" + "%s • Оптимизује се ради бољег стања батерије" "Прикључите пуњач." "Притисните Мени да бисте откључали." "Мрежа је закључана" diff --git a/packages/SystemUI/res-keyguard/values-te/strings.xml b/packages/SystemUI/res-keyguard/values-te/strings.xml index c69a8f56b933c..990253a7862fa 100644 --- a/packages/SystemUI/res-keyguard/values-te/strings.xml +++ b/packages/SystemUI/res-keyguard/values-te/strings.xml @@ -38,7 +38,7 @@ "%s • ఛార్జ్ అవుతోంది" "%s • వేగంగా ఛార్జ్ అవుతోంది" "%s • నెమ్మదిగా ఛార్జ్ అవుతోంది" - "%s • బ్యాటరీ జీవితకాలాన్ని ఆప్టిమైజ్ చేయడం కోసం" + "%s • బ్యాటరీ జీవితకాలాన్ని పెంచడం కోసం ఆప్టిమైజ్ చేస్తోంది" "మీ ఛార్జర్‌ను కనెక్ట్ చేయండి." "అన్‌లాక్ చేయడానికి మెనుని నొక్కండి." "నెట్‌వర్క్ లాక్ చేయబడింది" diff --git a/packages/SystemUI/res-keyguard/values-uk/strings.xml b/packages/SystemUI/res-keyguard/values-uk/strings.xml index a16576d37e9c2..62950e29c70e6 100644 --- a/packages/SystemUI/res-keyguard/values-uk/strings.xml +++ b/packages/SystemUI/res-keyguard/values-uk/strings.xml @@ -38,7 +38,7 @@ "%s • Заряджання" "%s • Швидке заряджання" "%s • Повільне заряджання" - "%s • Стан акумулятора оптимізується" + "%s • Оптимізація для збереження заряду акумулятора" "Підключіть зарядний пристрій." "Натисніть меню, щоб розблокувати." "Мережу заблоковано" diff --git a/packages/SystemUI/res-keyguard/values-uz/strings.xml b/packages/SystemUI/res-keyguard/values-uz/strings.xml index 44e419180f6aa..f2ca159bff0d2 100644 --- a/packages/SystemUI/res-keyguard/values-uz/strings.xml +++ b/packages/SystemUI/res-keyguard/values-uz/strings.xml @@ -38,7 +38,7 @@ "%s • Quvvat olmoqda" "%s • Tezkor quvvat olmoqda" "%s • Sekin quvvat olmoqda" - "%s • Batareya quvvati muvozanatlanmoqda" + "%s • Batareya uchun optimizatsiya" "Quvvatlash moslamasini ulang." "Qulfdan chiqarish uchun Menyu tugmasini bosing." "Tarmoq qulflangan" diff --git a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml index 1054e36fc0489..b4006e8b7341f 100644 --- a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml @@ -38,7 +38,7 @@ "%s • 正在充電" "%s • 正在快速充電" "%s •正在慢速充電" - "%s • 正在優化電池狀態" + "%s • 優化電池效能" "請連接充電器。" "按下 [選單] 即可解鎖。" "網絡已鎖定" diff --git a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml index 7efa2f934d956..757bf56f3050c 100644 --- a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml @@ -38,7 +38,7 @@ "%s • 充電中" "%s • 快速充電中" "%s • 慢速充電中" - "%s • 針對電池狀態進行最佳化調整" + "%s • 最佳化調整電池狀態" "請連接充電器。" "按選單鍵解鎖。" "網路已鎖定" From 24a1d2c990d7ae59d14a78b769dfc64da5cf3819 Mon Sep 17 00:00:00 2001 From: Evan Laird Date: Fri, 28 Aug 2020 11:25:04 -0400 Subject: [PATCH 141/288] DO NOT MERGE: Associate notif cancels with notif posts CancelNotificationRunnables just spin on the work handler of NotificationManagerService, hoping that they get executed at the correct moment after a PostNotificationRunnable and before the next EnqueueNotificationRunnable completes. Otherwise, you end up in a bad state where the cancel either is canceling notifications before they get a chance to post, or missing its only chance to cancel the notification (for instance, ActivityManagerService is the only caller that can cancel FGS notifications). This change attempts to execute a CancelNotificationRunnable at the moment its run() method is called, otherwise it associates the runnable with the latest enqueued notificaiton record which has yet to post. It then associates PostNotificationRunnable with the delayed cancel list, executing any missed cancel operations immediately upon finishing the PostNotificationRunnable. Test: atest SystemUITests NotificationManagerServiceTest; manual Bug: 162652224 Bug: 119041698 Change-Id: I88d3c5f4fd910a83974c2f84ae3e8a9498d18133 --- .../notification/InjectableSystemClock.java | 44 +++ .../InjectableSystemClockImpl.java | 51 +++ .../NotificationManagerService.java | 298 ++++++++++++------ .../notification/BuzzBeepBlinkTest.java | 3 +- .../server/notification/FakeSystemClock.java | 111 +++++++ .../NotificationManagerServiceTest.java | 146 ++++++++- .../server/notification/RoleObserverTest.java | 6 +- 7 files changed, 547 insertions(+), 112 deletions(-) create mode 100644 services/core/java/com/android/server/notification/InjectableSystemClock.java create mode 100644 services/core/java/com/android/server/notification/InjectableSystemClockImpl.java create mode 100644 services/tests/uiservicestests/src/com/android/server/notification/FakeSystemClock.java diff --git a/services/core/java/com/android/server/notification/InjectableSystemClock.java b/services/core/java/com/android/server/notification/InjectableSystemClock.java new file mode 100644 index 0000000000000..4d993d19e57bc --- /dev/null +++ b/services/core/java/com/android/server/notification/InjectableSystemClock.java @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.notification; + +/** + * Testable wrapper around {@link android.os.SystemClock}. + * + * The default implementation at InjectableSystemClockImpl just proxies calls to the real + * SystemClock + * + * In tests, pass an instance of FakeSystemClock, which allows you to control the values returned by + * the various getters below. + */ +public interface InjectableSystemClock { + /** @see android.os.SystemClock#uptimeMillis() */ + long uptimeMillis(); + + /** @see android.os.SystemClock#elapsedRealtime() */ + long elapsedRealtime(); + + /** @see android.os.SystemClock#elapsedRealtimeNanos() */ + long elapsedRealtimeNanos(); + + /** @see android.os.SystemClock#currentThreadTimeMillis() */ + long currentThreadTimeMillis(); + + /** @see System#currentTimeMillis() */ + long currentTimeMillis(); +} + diff --git a/services/core/java/com/android/server/notification/InjectableSystemClockImpl.java b/services/core/java/com/android/server/notification/InjectableSystemClockImpl.java new file mode 100644 index 0000000000000..43d756f46176a --- /dev/null +++ b/services/core/java/com/android/server/notification/InjectableSystemClockImpl.java @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.notification; + +/** + * Default implementation of {@link InjectableSystemClock}. + * + * @hide + */ +public class InjectableSystemClockImpl implements InjectableSystemClock { + public InjectableSystemClockImpl() {} + + @Override + public long uptimeMillis() { + return android.os.SystemClock.uptimeMillis(); + } + + @Override + public long elapsedRealtime() { + return android.os.SystemClock.elapsedRealtime(); + } + + @Override + public long elapsedRealtimeNanos() { + return android.os.SystemClock.elapsedRealtimeNanos(); + } + + @Override + public long currentThreadTimeMillis() { + return android.os.SystemClock.currentThreadTimeMillis(); + } + + @Override + public long currentTimeMillis() { + return System.currentTimeMillis(); + } +} diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 2fe783387e239..e94507bccea0e 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -186,7 +186,6 @@ import android.os.RemoteException; import android.os.ResultReceiver; import android.os.ServiceManager; import android.os.ShellCallback; -import android.os.SystemClock; import android.os.SystemProperties; import android.os.Trace; import android.os.UserHandle; @@ -472,6 +471,11 @@ public class NotificationManagerService extends SystemService { final ArrayMap> mAutobundledSummaries = new ArrayMap<>(); final ArrayList mToastQueue = new ArrayList<>(); final ArrayMap mSummaryByGroupKey = new ArrayMap<>(); + // Keep track of `CancelNotificationRunnable`s which have been delayed due to awaiting + // enqueued notifications to post + @GuardedBy("mNotificationLock") + final ArrayMap> mDelayedCancelations = + new ArrayMap<>(); // The last key in this list owns the hardware. ArrayList mLights = new ArrayList<>(); @@ -534,6 +538,7 @@ public class NotificationManagerService extends SystemService { private NotificationRecordLogger mNotificationRecordLogger; private InstanceIdSequence mNotificationInstanceIdSequence; private Set mMsgPkgsAllowedAsConvos = new HashSet(); + private final InjectableSystemClock mSystemClock; static class Archive { final SparseArray mEnabled; @@ -747,7 +752,7 @@ public class NotificationManagerService extends SystemService { parser, mAllowedManagedServicePackages, forRestore, userId); migratedManagedServices = true; } else if (mSnoozeHelper.XML_TAG_NAME.equals(parser.getName())) { - mSnoozeHelper.readXml(parser, System.currentTimeMillis()); + mSnoozeHelper.readXml(parser, mSystemClock.currentTimeMillis()); } if (LOCKSCREEN_ALLOW_SECURE_NOTIFICATIONS_TAG.equals(parser.getName())) { if (forRestore && userId != UserHandle.USER_SYSTEM) { @@ -900,7 +905,7 @@ public class NotificationManagerService extends SystemService { Slog.w(TAG, "No notification with key: " + key); return; } - final long now = System.currentTimeMillis(); + final long now = mSystemClock.currentTimeMillis(); MetricsLogger.action(r.getItemLogMaker() .setType(MetricsEvent.TYPE_ACTION) .addTaggedData(MetricsEvent.NOTIFICATION_SHADE_INDEX, nv.rank) @@ -932,7 +937,7 @@ public class NotificationManagerService extends SystemService { Slog.w(TAG, "No notification with key: " + key); return; } - final long now = System.currentTimeMillis(); + final long now = mSystemClock.currentTimeMillis(); MetricsLogger.action(r.getLogMaker(now) .setCategory(MetricsEvent.NOTIFICATION_ITEM_ACTION) .setType(MetricsEvent.TYPE_ACTION) @@ -1696,15 +1701,18 @@ public class NotificationManagerService extends SystemService { public NotificationManagerService(Context context) { this(context, new NotificationRecordLoggerImpl(), + new InjectableSystemClockImpl(), new InstanceIdSequence(NOTIFICATION_INSTANCE_ID_MAX)); } @VisibleForTesting public NotificationManagerService(Context context, NotificationRecordLogger notificationRecordLogger, + InjectableSystemClock systemClock, InstanceIdSequence notificationInstanceIdSequence) { super(context); mNotificationRecordLogger = notificationRecordLogger; + mSystemClock = systemClock; mNotificationInstanceIdSequence = notificationInstanceIdSequence; Notification.processWhitelistToken = WHITELIST_TOKEN; } @@ -2056,6 +2064,11 @@ public class NotificationManagerService extends SystemService { return getContext().getResources().getStringArray(key); } + @VisibleForTesting + protected Handler getWorkHandler() { + return mHandler; + } + @Override public void onStart() { SnoozeHelper snoozeHelper = new SnoozeHelper(getContext(), (userId, r, muteOnReturn) -> { @@ -2329,7 +2342,8 @@ public class NotificationManagerService extends SystemService { mHistoryManager.onBootPhaseAppsCanStart(); registerDeviceConfigChange(); } else if (phase == SystemService.PHASE_ACTIVITY_MANAGER_READY) { - mSnoozeHelper.scheduleRepostsForPersistedNotifications(System.currentTimeMillis()); + mSnoozeHelper.scheduleRepostsForPersistedNotifications( + mSystemClock.currentTimeMillis()); } } @@ -2689,7 +2703,7 @@ public class NotificationManagerService extends SystemService { .setUserId(r.getSbn().getNormalizedUserId()) .setChannelId(r.getChannel().getId()) .setChannelName(r.getChannel().getName().toString()) - .setPostedTimeMs(System.currentTimeMillis()) + .setPostedTimeMs(mSystemClock.currentTimeMillis()) .setTitle(getHistoryTitle(r.getNotification())) .setText(getHistoryText( r.getSbn().getPackageContext(getContext()), r.getNotification())) @@ -5215,7 +5229,7 @@ public class NotificationManagerService extends SystemService { GroupHelper.AUTOGROUP_KEY, adjustedSbn.getUid(), adjustedSbn.getInitialPid(), summaryNotification, adjustedSbn.getUser(), GroupHelper.AUTOGROUP_KEY, - System.currentTimeMillis()); + mSystemClock.currentTimeMillis()); summaryRecord = new NotificationRecord(getContext(), summarySbn, notificationRecord.getChannel()); summaryRecord.setIsAppImportanceLocked( @@ -5450,6 +5464,22 @@ public class NotificationManagerService extends SystemService { mSnoozeHelper.dump(pw, filter); } + + // Log delayed notification cancels + pw.println(); + pw.println(" Delayed notification cancels:"); + if (mDelayedCancelations.isEmpty()) { + pw.println(" None"); + } else { + Set delayedKeys = mDelayedCancelations.keySet(); + for (NotificationRecord record : delayedKeys) { + ArrayList queuedCancels = + mDelayedCancelations.get(record); + pw.println(" (" + queuedCancels.size() + ") cancels enqueued for" + + record.getKey()); + } + } + pw.println(); } if (!zenOnly) { @@ -5668,7 +5698,7 @@ public class NotificationManagerService extends SystemService { final StatusBarNotification n = new StatusBarNotification( pkg, opPkg, id, tag, notificationUid, callingPid, notification, - user, null, System.currentTimeMillis()); + user, null, mSystemClock.currentTimeMillis()); // setup local book-keeping String channelId = notification.getChannelId(); @@ -6001,7 +6031,7 @@ public class NotificationManagerService extends SystemService { final float appEnqueueRate = mUsageStats.getAppEnqueueRate(pkg); if (appEnqueueRate > mMaxPackageEnqueueRate) { mUsageStats.registerOverRateQuota(pkg); - final long now = SystemClock.elapsedRealtime(); + final long now = mSystemClock.elapsedRealtime(); if ((now - mLastOverRateLogTime) > MIN_PACKAGE_OVERRATE_LOG_INTERVAL) { Slog.e(TAG, "Package enqueue rate is " + appEnqueueRate + ". Shedding " + r.getSbn().getKey() + ". package=" + pkg); @@ -6213,7 +6243,73 @@ public class NotificationManagerService extends SystemService { this.mRank = rank; this.mCount = count; this.mListener = listener; - this.mWhen = System.currentTimeMillis(); + this.mWhen = mSystemClock.currentTimeMillis(); + } + + // Move the work to this function so it can be called from PostNotificationRunnable + private void doNotificationCancelLocked() { + // Look for the notification in the posted list, since we already checked enqueued. + String listenerName = mListener == null ? null : mListener.component.toShortString(); + NotificationRecord r = + findNotificationByListLocked(mNotificationList, mPkg, mTag, mId, mUserId); + if (r != null) { + // The notification was found, check if it should be removed. + + // Ideally we'd do this in the caller of this method. However, that would + // require the caller to also find the notification. + if (mReason == REASON_CLICK) { + mUsageStats.registerClickedByUser(r); + } + + if (mReason == REASON_LISTENER_CANCEL + && (r.getNotification().flags & FLAG_BUBBLE) != 0) { + mNotificationDelegate.onBubbleNotificationSuppressionChanged( + r.getKey(), /* suppressed */ true); + return; + } + + if ((r.getNotification().flags & mMustHaveFlags) != mMustHaveFlags) { + return; + } + if ((r.getNotification().flags & mMustNotHaveFlags) != 0) { + return; + } + + // Bubbled children get to stick around if the summary was manually cancelled + // (user removed) from systemui. + FlagChecker childrenFlagChecker = null; + if (mReason == REASON_CANCEL + || mReason == REASON_CLICK + || mReason == REASON_CANCEL_ALL) { + childrenFlagChecker = (flags) -> { + if ((flags & FLAG_BUBBLE) != 0) { + return false; + } + return true; + }; + } + + // Cancel the notification. + boolean wasPosted = removePreviousFromNotificationListsLocked(r, mWhen); + cancelNotificationLocked( + r, mSendDelete, mReason, mRank, mCount, wasPosted, listenerName); + cancelGroupChildrenLocked(r, mCallingUid, mCallingPid, listenerName, + mSendDelete, childrenFlagChecker, mReason); + updateLightsLocked(); + if (mShortcutHelper != null) { + mShortcutHelper.maybeListenForShortcutChangesForBubbles(r, + true /* isRemoved */, + mHandler); + } + } else { + // No notification was found, assume that it is snoozed and cancel it. + if (mReason != REASON_SNOOZED) { + final boolean wasSnoozed = mSnoozeHelper.cancel(mUserId, mPkg, mTag, mId); + if (wasSnoozed) { + handleSavePolicyFile(); + } + } + } } @Override @@ -6229,89 +6325,24 @@ public class NotificationManagerService extends SystemService { // chance to post yet. List enqueued = findEnqueuedNotificationsForCriteria( mPkg, mTag, mId, mUserId); - boolean repost = false; if (enqueued.size() > 0) { - // Found something, let's see what it was - repost = true; - // If all enqueues happened before this cancel then wait for them to happen, - // otherwise we should let this cancel through so the next enqueue happens - for (NotificationRecord r : enqueued) { - if (r.mUpdateTimeMs > mWhen) { - // At least one enqueue was posted after the cancel, so we're invalid - return; - } + // We have found notifications that were enqueued before this cancel, but not + // yet posted. Attach this cancel to the last enqueue (the most recent), and + // we will be executed in that notification's PostNotificationRunnable + NotificationRecord enqueuedToAttach = enqueued.get(enqueued.size() - 1); + + ArrayList delayed = + mDelayedCancelations.get(enqueuedToAttach); + if (delayed == null) { + delayed = new ArrayList<>(); } - } - if (repost) { - mHandler.post(this); + + delayed.add(this); + mDelayedCancelations.put(enqueuedToAttach, delayed); return; } - // Look for the notification in the posted list, since we already checked enqueued. - NotificationRecord r = - findNotificationByListLocked(mNotificationList, mPkg, mTag, mId, mUserId); - if (r != null) { - // The notification was found, check if it should be removed. - - // Ideally we'd do this in the caller of this method. However, that would - // require the caller to also find the notification. - if (mReason == REASON_CLICK) { - mUsageStats.registerClickedByUser(r); - } - - if (mReason == REASON_LISTENER_CANCEL - && (r.getNotification().flags & FLAG_BUBBLE) != 0) { - mNotificationDelegate.onBubbleNotificationSuppressionChanged( - r.getKey(), /* suppressed */ true); - return; - } - - if ((r.getNotification().flags & mMustHaveFlags) != mMustHaveFlags) { - return; - } - if ((r.getNotification().flags & mMustNotHaveFlags) != 0) { - return; - } - if (r.getUpdateTimeMs() > mWhen) { - // In this case, a post must have slipped by when this runnable reposted - return; - } - - // Bubbled children get to stick around if the summary was manually cancelled - // (user removed) from systemui. - FlagChecker childrenFlagChecker = null; - if (mReason == REASON_CANCEL - || mReason == REASON_CLICK - || mReason == REASON_CANCEL_ALL) { - childrenFlagChecker = (flags) -> { - if ((flags & FLAG_BUBBLE) != 0) { - return false; - } - return true; - }; - } - - // Cancel the notification. - boolean wasPosted = removeFromNotificationListsLocked(r); - cancelNotificationLocked( - r, mSendDelete, mReason, mRank, mCount, wasPosted, listenerName); - cancelGroupChildrenLocked(r, mCallingUid, mCallingPid, listenerName, - mSendDelete, childrenFlagChecker, mReason); - updateLightsLocked(); - if (mShortcutHelper != null) { - mShortcutHelper.maybeListenForShortcutChangesForBubbles(r, - true /* isRemoved */, - mHandler); - } - } else { - // No notification was found, assume that it is snoozed and cancel it. - if (mReason != REASON_SNOOZED) { - final boolean wasSnoozed = mSnoozeHelper.cancel(mUserId, mPkg, mTag, mId); - if (wasSnoozed) { - handleSavePolicyFile(); - } - } - } + doNotificationCancelLocked(); } } } @@ -6334,7 +6365,7 @@ public class NotificationManagerService extends SystemService { mSnoozeHelper.getSnoozeTimeForUnpostedNotification( r.getUser().getIdentifier(), r.getSbn().getPackageName(), r.getSbn().getKey()); - final long currentTime = System.currentTimeMillis(); + final long currentTime = mSystemClock.currentTimeMillis(); if (snoozeAt.longValue() > currentTime) { (new SnoozeNotificationRunnable(r.getSbn().getKey(), snoozeAt.longValue() - currentTime, null)).snoozeLocked(r); @@ -6394,18 +6425,29 @@ public class NotificationManagerService extends SystemService { enqueueStatus); } - // tell the assistant service about the notification - if (mAssistants.isEnabled()) { - mAssistants.onNotificationEnqueuedLocked(r); - mHandler.postDelayed(new PostNotificationRunnable(r.getKey()), - DELAY_FOR_ASSISTANT_TIME); - } else { - mHandler.post(new PostNotificationRunnable(r.getKey())); - } + postPostNotificationRunnableMaybeDelayedLocked( + r, new PostNotificationRunnable(r.getKey())); } } } + /** + * Mainly needed as a hook for tests which require setting up enqueued-but-not-posted + * notification records + */ + @GuardedBy("mNotificationLock") + protected void postPostNotificationRunnableMaybeDelayedLocked( + NotificationRecord r, + PostNotificationRunnable runnable) { + // tell the assistant service about the notification + if (mAssistants.isEnabled()) { + mAssistants.onNotificationEnqueuedLocked(r); + mHandler.postDelayed(runnable, DELAY_FOR_ASSISTANT_TIME); + } else { + mHandler.post(runnable); + } + } + @GuardedBy("mNotificationLock") boolean isPackagePausedOrSuspended(String pkg, int uid) { boolean isPaused; @@ -6554,13 +6596,23 @@ public class NotificationManagerService extends SystemService { buzzBeepBlinkLoggingCode, getGroupInstanceId(n.getGroupKey())); } finally { int N = mEnqueuedNotifications.size(); + NotificationRecord enqueued = null; for (int i = 0; i < N; i++) { - final NotificationRecord enqueued = mEnqueuedNotifications.get(i); + enqueued = mEnqueuedNotifications.get(i); if (Objects.equals(key, enqueued.getKey())) { mEnqueuedNotifications.remove(i); break; } } + + // If the enqueued notification record had a cancel attached after it, execute + // it right now + if (enqueued != null && mDelayedCancelations.get(enqueued) != null) { + for (CancelNotificationRunnable r : mDelayedCancelations.get(enqueued)) { + r.doNotificationCancelLocked(); + } + mDelayedCancelations.remove(enqueued); + } } } } @@ -6789,7 +6841,8 @@ public class NotificationManagerService extends SystemService { .putExtra(EXTRA_KEY, record.getKey()), PendingIntent.FLAG_UPDATE_CURRENT); mAlarmManager.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP, - SystemClock.elapsedRealtime() + record.getNotification().getTimeoutAfter(), pi); + mSystemClock.elapsedRealtime() + record.getNotification().getTimeoutAfter(), + pi); } } @@ -7310,7 +7363,7 @@ public class NotificationManagerService extends SystemService { || visibilityChanged || interruptiveChanged; if (interceptBefore && !record.isIntercepted() - && record.isNewEnoughForAlerting(System.currentTimeMillis())) { + && record.isNewEnoughForAlerting(mSystemClock.currentTimeMillis())) { buzzBeepBlinkLocked(record); } } @@ -7597,6 +7650,34 @@ public class NotificationManagerService extends SystemService { return wasPosted; } + /** + * Similar to the above method, removes all NotificationRecords with the same key as the given + * NotificationRecord, but skips any records which are newer than the given one. + */ + private boolean removePreviousFromNotificationListsLocked(NotificationRecord r, + long removeBefore) { + // Remove notification records that occurred before the given record from both lists, + // specifically allowing newer ones to respect ordering + boolean wasPosted = false; + List matching = + findNotificationsByListLocked(mNotificationList, r.getKey()); + for (NotificationRecord record : matching) { + // We don't need to check against update time for posted notifs + mNotificationList.remove(record); + mNotificationsByKey.remove(record.getSbn().getKey()); + wasPosted = true; + } + + matching = findNotificationsByListLocked(mEnqueuedNotifications, r.getKey()); + for (NotificationRecord record : matching) { + if (record.getUpdateTimeMs() <= removeBefore) { + mNotificationList.remove(record); + } + } + + return wasPosted; + } + @GuardedBy("mNotificationLock") private void cancelNotificationLocked(NotificationRecord r, boolean sendDelete, @NotificationListenerService.NotificationCancelReason int reason, @@ -7712,7 +7793,7 @@ public class NotificationManagerService extends SystemService { // Save it for users of getHistoricalNotifications() mArchive.record(r.getSbn(), reason); - final long now = System.currentTimeMillis(); + final long now = mSystemClock.currentTimeMillis(); final LogMaker logMaker = r.getItemLogMaker() .setType(MetricsEvent.TYPE_DISMISS) .setSubtype(reason); @@ -8246,6 +8327,21 @@ public class NotificationManagerService extends SystemService { return null; } + @GuardedBy("mNotificationLock") + private List findNotificationsByListLocked( + ArrayList list, + String key) { + List matching = new ArrayList<>(); + final int n = list.size(); + for (int i = 0; i < n; i++) { + NotificationRecord r = list.get(i); + if (key.equals(r.getKey())) { + matching.add(r); + } + } + return matching; + } + /** * There may be multiple records that match your criteria. For instance if there have been * multiple notifications posted which are enqueued for the same pkg, tag, id, userId. This diff --git a/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java b/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java index afd10ddb8ec26..2e0f1992478d0 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java @@ -103,6 +103,7 @@ public class BuzzBeepBlinkTest extends UiServiceTestCase { NotificationRecordLoggerFake mNotificationRecordLogger = new NotificationRecordLoggerFake(); private InstanceIdSequence mNotificationInstanceIdSequence = new InstanceIdSequenceFake( 1 << 30); + private InjectableSystemClock mSystemClock = new FakeSystemClock(); private NotificationManagerService mService; private String mPkg = "com.android.server.notification"; @@ -154,7 +155,7 @@ public class BuzzBeepBlinkTest extends UiServiceTestCase { assertTrue(accessibilityManager.isEnabled()); mService = spy(new NotificationManagerService(getContext(), mNotificationRecordLogger, - mNotificationInstanceIdSequence)); + mSystemClock, mNotificationInstanceIdSequence)); mService.setAudioManager(mAudioManager); mService.setVibrator(mVibrator); mService.setSystemReady(true); diff --git a/services/tests/uiservicestests/src/com/android/server/notification/FakeSystemClock.java b/services/tests/uiservicestests/src/com/android/server/notification/FakeSystemClock.java new file mode 100644 index 0000000000000..c960f1766612a --- /dev/null +++ b/services/tests/uiservicestests/src/com/android/server/notification/FakeSystemClock.java @@ -0,0 +1,111 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.notification; + +import java.util.ArrayList; +import java.util.List; + +/** + * A fake {@link InjectableSystemClock} + * + * Attempts to simulate the behavior of a real system clock. Time can be moved forward but not + * backwards. uptimeMillis, elapsedRealtime, and currentThreadTimeMillis are all kept in sync. + * + * Unless otherwise specified, uptimeMillis and elapsedRealtime will advance the same amount with + * every call to {@link #advanceTime(long)}. Thread time always lags by 50% of the uptime + * advancement to simulate time loss due to scheduling. + * + * @hide + */ +public class FakeSystemClock implements InjectableSystemClock { + private long mUptimeMillis = 10000; + private long mElapsedRealtime = 10000; + private long mCurrentThreadTimeMillis = 10000; + + private long mCurrentTimeMillis = 1555555500000L; + + private final List mListeners = new ArrayList<>(); + @Override + public long uptimeMillis() { + return mUptimeMillis; + } + + @Override + public long elapsedRealtime() { + return mElapsedRealtime; + } + + @Override + public long elapsedRealtimeNanos() { + return mElapsedRealtime * 1000000 + 447; + } + + @Override + public long currentThreadTimeMillis() { + return mCurrentThreadTimeMillis; + } + + @Override + public long currentTimeMillis() { + return mCurrentTimeMillis; + } + + public void setUptimeMillis(long uptime) { + advanceTime(uptime - mUptimeMillis); + } + + public void setCurrentTimeMillis(long millis) { + mCurrentTimeMillis = millis; + } + + public void advanceTime(long uptime) { + advanceTime(uptime, 0); + } + + public void advanceTime(long uptime, long sleepTime) { + if (uptime < 0 || sleepTime < 0) { + throw new IllegalArgumentException("Time cannot go backwards."); + } + + if (uptime > 0 || sleepTime > 0) { + mUptimeMillis += uptime; + mElapsedRealtime += uptime + sleepTime; + mCurrentTimeMillis += uptime + sleepTime; + + mCurrentThreadTimeMillis += Math.ceil(uptime * 0.5); + + for (ClockTickListener listener : mListeners) { + listener.onClockTick(); + } + } + } + + public void addListener(ClockTickListener listener) { + mListeners.add(listener); + } + + public void removeListener(ClockTickListener listener) { + mListeners.remove(listener); + } + + public interface ClockTickListener { + void onClockTick(); + } + + private static final long START_TIME = 10000; +} + diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java index 16aa87b3e59cf..a55d28ee60655 100755 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -178,7 +178,6 @@ import com.android.server.wm.WindowManagerInternal; import org.junit.After; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; @@ -199,6 +198,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.function.Consumer; @@ -287,18 +287,26 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { 1 << 30); @Mock StatusBarManagerInternal mStatusBar; + private final FakeSystemClock mSystemClock = new FakeSystemClock(); // Use a Testable subclass so we can simulate calls from the system without failing. private static class TestableNotificationManagerService extends NotificationManagerService { int countSystemChecks = 0; boolean isSystemUid = true; int countLogSmartSuggestionsVisible = 0; + // If true, don't enqueue the PostNotificationRunnables, just trap them + boolean trapEnqueuedNotifications = false; + final ArrayList trappedRunnables = + new ArrayList<>(); @Nullable NotificationAssistantAccessGrantedCallback mNotificationAssistantAccessGrantedCallback; - TestableNotificationManagerService(Context context, NotificationRecordLogger logger, + TestableNotificationManagerService( + Context context, + NotificationRecordLogger logger, + InjectableSystemClock systemClock, InstanceIdSequence notificationInstanceIdSequence) { - super(context, logger, notificationInstanceIdSequence); + super(context, logger, systemClock, notificationInstanceIdSequence); } RankingHelper getRankingHelper() { @@ -353,6 +361,23 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { return new String[] {PKG_O}; } + @Override + protected void postPostNotificationRunnableMaybeDelayedLocked(NotificationRecord record, + PostNotificationRunnable runnable) { + if (trapEnqueuedNotifications) { + trappedRunnables.add(runnable); + return; + } + + super.postPostNotificationRunnableMaybeDelayedLocked(record, runnable); + } + + void drainTrappedRunnableQueue() { + for (Runnable r : trappedRunnables) { + getWorkHandler().post(r); + } + } + private void setNotificationAssistantAccessGrantedCallback( @Nullable NotificationAssistantAccessGrantedCallback callback) { this.mNotificationAssistantAccessGrantedCallback = callback; @@ -402,7 +427,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { doNothing().when(mContext).sendBroadcastAsUser(any(), any(), any()); mService = new TestableNotificationManagerService(mContext, mNotificationRecordLogger, - mNotificationInstanceIdSequence); + mSystemClock, mNotificationInstanceIdSequence); // Use this testable looper. mTestableLooper = TestableLooper.get(this); @@ -1344,10 +1369,10 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { final StatusBarNotification sbn = generateNotificationRecord(null).getSbn(); mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag", sbn.getId(), sbn.getNotification(), sbn.getUserId()); - Thread.sleep(1); // make sure the system clock advances before the next step + mSystemClock.advanceTime(1); // THEN it is canceled mBinderService.cancelNotificationWithTag(PKG, PKG, "tag", sbn.getId(), sbn.getUserId()); - Thread.sleep(1); // here too + mSystemClock.advanceTime(1); // THEN it is posted again (before the cancel has a chance to finish) mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag", sbn.getId(), sbn.getNotification(), sbn.getUserId()); @@ -1361,6 +1386,60 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { assertEquals(1, mService.getNotificationRecordCount()); } + @Test + public void testChangeSystemTimeAfterPost_thenCancel_noFgs() throws Exception { + // GIVEN time X + mSystemClock.setCurrentTimeMillis(10000); + + // GIVEN a notification is posted + final StatusBarNotification sbn = generateNotificationRecord(null).getSbn(); + mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag", sbn.getId(), + sbn.getNotification(), sbn.getUserId()); + mSystemClock.advanceTime(1); + waitForIdle(); + + // THEN the system time is changed to an earlier time + mSystemClock.setCurrentTimeMillis(5000); + + // THEN a cancel is requested + mBinderService.cancelNotificationWithTag(PKG, PKG, "tag", sbn.getId(), sbn.getUserId()); + waitForIdle(); + + // It should work + StatusBarNotification[] notifs = + mBinderService.getActiveNotifications(PKG); + assertEquals(0, notifs.length); + assertEquals(0, mService.getNotificationRecordCount()); + } + + @Test + public void testChangeSystemTimeAfterPost_thenCancel_fgs() throws Exception { + // GIVEN time X + mSystemClock.setCurrentTimeMillis(10000); + + // GIVEN a notification is posted + final StatusBarNotification sbn = generateNotificationRecord(null).getSbn(); + sbn.getNotification().flags = + Notification.FLAG_ONGOING_EVENT | FLAG_FOREGROUND_SERVICE; + mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag", sbn.getId(), + sbn.getNotification(), sbn.getUserId()); + mSystemClock.advanceTime(1); + waitForIdle(); + + // THEN the system time is changed to an earlier time + mSystemClock.setCurrentTimeMillis(5000); + + // THEN a cancel is requested + mBinderService.cancelNotificationWithTag(PKG, PKG, "tag", sbn.getId(), sbn.getUserId()); + waitForIdle(); + + // It should work + StatusBarNotification[] notifs = + mBinderService.getActiveNotifications(PKG); + assertEquals(0, notifs.length); + assertEquals(0, mService.getNotificationRecordCount()); + } + @Test public void testCancelNotificationWhilePostedAndEnqueued() throws Exception { mBinderService.enqueueNotificationWithTag(PKG, PKG, @@ -1382,6 +1461,56 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { assertEquals(NotificationStats.DISMISSAL_OTHER, captor.getValue().getDismissalSurface()); } + @Test + public void testDelayCancelWhenEnqueuedHasNotPosted() throws Exception { + // Don't allow PostNotificationRunnables to execute so we can set up problematic state + mService.trapEnqueuedNotifications = true; + // GIVEN an enqueued notification + mBinderService.enqueueNotificationWithTag(PKG, PKG, + "testDelayCancelWhenEnqueuedHasNotPosted", 0, + generateNotificationRecord(null).getNotification(), 0); + mSystemClock.advanceTime(1); + // WHEN a cancel is requested before it has posted + mBinderService.cancelNotificationWithTag(PKG, PKG, + "testDelayCancelWhenEnqueuedHasNotPosted", 0, 0); + + waitForIdle(); + + // THEN the cancel notification runnable is captured and associated with that record + ArrayMap> delayed = + mService.mDelayedCancelations; + Set keySet = delayed.keySet(); + assertEquals(1, keySet.size()); + } + + @Test + public void testDelayedCancelsExecuteAfterPost() throws Exception { + // Don't allow PostNotificationRunnables to execute so we can set up problematic state + mService.trapEnqueuedNotifications = true; + // GIVEN an enqueued notification + mBinderService.enqueueNotificationWithTag(PKG, PKG, + "testDelayCancelWhenEnqueuedHasNotPosted", 0, + generateNotificationRecord(null).getNotification(), 0); + mSystemClock.advanceTime(1); + // WHEN a cancel is requested before it has posted + mBinderService.cancelNotificationWithTag(PKG, PKG, + "testDelayCancelWhenEnqueuedHasNotPosted", 0, 0); + + waitForIdle(); + + // We're now in a state with an a notification awaiting PostNotificationRunnable to execute + // WHEN the PostNotificationRunnable is allowed to execute + mService.drainTrappedRunnableQueue(); + waitForIdle(); + + // THEN the cancel executes and the notification is removed + StatusBarNotification[] notifs = + mBinderService.getActiveNotifications(PKG); + assertEquals(0, notifs.length); + assertEquals(0, mService.getNotificationRecordCount()); + } + @Test public void testCancelNotificationsFromListenerImmediatelyAfterEnqueue() throws Exception { NotificationRecord r = generateNotificationRecord(null); @@ -2529,8 +2658,9 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { @Test public void testHasCompanionDevice_noService() { - mService = new TestableNotificationManagerService(mContext, mNotificationRecordLogger, - mNotificationInstanceIdSequence); + mService = + new TestableNotificationManagerService(mContext, mNotificationRecordLogger, + mSystemClock, mNotificationInstanceIdSequence); assertFalse(mService.hasCompanionDevice(mListener)); } diff --git a/services/tests/uiservicestests/src/com/android/server/notification/RoleObserverTest.java b/services/tests/uiservicestests/src/com/android/server/notification/RoleObserverTest.java index 3281c3f4cfb95..ac2c6193c6774 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/RoleObserverTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/RoleObserverTest.java @@ -103,12 +103,14 @@ public class RoleObserverTest extends UiServiceTestCase { private InstanceIdSequence mNotificationInstanceIdSequence = new InstanceIdSequenceFake( 1 << 30); private List mUsers; + private InjectableSystemClock mSystemClock = new FakeSystemClock(); private static class TestableNotificationManagerService extends NotificationManagerService { TestableNotificationManagerService(Context context, NotificationRecordLogger logger, + InjectableSystemClock systemClock, InstanceIdSequence notificationInstanceIdSequence) { - super(context, logger, notificationInstanceIdSequence); + super(context, logger, systemClock, notificationInstanceIdSequence); } @Override @@ -136,7 +138,7 @@ public class RoleObserverTest extends UiServiceTestCase { when(mUm.getUsers()).thenReturn(mUsers); mService = new TestableNotificationManagerService(mContext, mNotificationRecordLogger, - mNotificationInstanceIdSequence); + mSystemClock, mNotificationInstanceIdSequence); mRoleObserver = mService.new RoleObserver(mRoleManager, mPm, mExecutor); try { From ef02e3e5f4080a894650a550b1fa3d9e7bd7e8c1 Mon Sep 17 00:00:00 2001 From: Cole Faust Date: Wed, 3 Feb 2021 14:43:58 -0800 Subject: [PATCH 142/288] Create ux restricted customizations for DeviceDefault buttons and switches In automotive, onscreen components can be "ux restricted", which means you can't use them at the moment for safety reasons, for example while driving. Make DeviceDefaults buttons and switches visually change to indicate to the user that they are ux restricted. Fixes: 178644245 Test: Manually Change-Id: I5bccf4c0331fa496be9b90fb41381c9b674bf237 --- .../car_borderless_button_text_color.xml | 1 + core/res/res/color-car/car_switch_track.xml | 27 +++++++++++++++++++ .../drawable-car/car_button_background.xml | 22 +++++++++++++++ .../res/res/drawable-car/car_switch_track.xml | 2 +- core/res/res/values/attrs_car.xml | 24 +++++++++++++++++ 5 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 core/res/res/color-car/car_switch_track.xml create mode 100644 core/res/res/values/attrs_car.xml diff --git a/core/res/res/color-car/car_borderless_button_text_color.xml b/core/res/res/color-car/car_borderless_button_text_color.xml index 1cdd6cd901af2..0a86e4012e998 100644 --- a/core/res/res/color-car/car_borderless_button_text_color.xml +++ b/core/res/res/color-car/car_borderless_button_text_color.xml @@ -16,5 +16,6 @@ limitations under the License. + diff --git a/core/res/res/color-car/car_switch_track.xml b/core/res/res/color-car/car_switch_track.xml new file mode 100644 index 0000000000000..8ca67dd8dda90 --- /dev/null +++ b/core/res/res/color-car/car_switch_track.xml @@ -0,0 +1,27 @@ + + + + + + + + + diff --git a/core/res/res/drawable-car/car_button_background.xml b/core/res/res/drawable-car/car_button_background.xml index e568aebfe81d4..13b0ec13f3559 100644 --- a/core/res/res/drawable-car/car_button_background.xml +++ b/core/res/res/drawable-car/car_button_background.xml @@ -25,6 +25,22 @@ limitations under the License. android:color="#0059B3"/> + + + + + + + + + + + + + + @@ -47,6 +63,12 @@ limitations under the License. + + + + + + diff --git a/core/res/res/drawable-car/car_switch_track.xml b/core/res/res/drawable-car/car_switch_track.xml index cb0b9beeeab6f..51e9f7eb4ebc9 100644 --- a/core/res/res/drawable-car/car_switch_track.xml +++ b/core/res/res/drawable-car/car_switch_track.xml @@ -41,7 +41,7 @@ android:right="@dimen/car_switch_track_margin_size"> + android:tint="@color/car_switch_track"> diff --git a/core/res/res/values/attrs_car.xml b/core/res/res/values/attrs_car.xml new file mode 100644 index 0000000000000..6bfea9728b696 --- /dev/null +++ b/core/res/res/values/attrs_car.xml @@ -0,0 +1,24 @@ + + + + + + + + From 9762f014fa6616d6b74626bddd241b261d2fbde4 Mon Sep 17 00:00:00 2001 From: Sarah Chin Date: Thu, 7 Jan 2021 16:40:16 -0800 Subject: [PATCH 143/288] Update setSubscriptionOverride API to allow network types Allow 5G unmetered override via a different API than setSubscriptionPlans. OVERRIDE_UNMETERED can be set without defining SubscriptionPlans, but OVERRIDE_CONGESTED behavior remains the same. Both the unmetered and congested case of setSubscriptionOverride take in networkTypes as an additional parameter Test: atest FrameworksTelephonyTests Test: atest SubscriptionManagerTest Bug: 175723642 Change-Id: Ie196db5e236e478f1c29c3dfd1ca31acc205c54b Merged-In: Ie196db5e236e478f1c29c3dfd1ca31acc205c54b --- core/api/current.txt | 2 + .../android/net/INetworkPolicyListener.aidl | 2 +- .../android/net/INetworkPolicyManager.aidl | 2 +- .../android/net/NetworkPolicyManager.java | 21 +++--- .../net/NetworkPolicyManagerService.java | 50 +++++++++---- .../telephony/SubscriptionManager.java | 72 +++++++++++++++++-- 6 files changed, 122 insertions(+), 27 deletions(-) diff --git a/core/api/current.txt b/core/api/current.txt index 285506f0556d3..214527ba683cb 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -41154,7 +41154,9 @@ package android.telephony { method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void removeSubscriptionsFromGroup(@NonNull java.util.List, @NonNull android.os.ParcelUuid); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setOpportunistic(boolean, int); method public void setSubscriptionOverrideCongested(int, boolean, long); + method public void setSubscriptionOverrideCongested(int, boolean, @NonNull int[], long); method public void setSubscriptionOverrideUnmetered(int, boolean, long); + method public void setSubscriptionOverrideUnmetered(int, boolean, @NonNull int[], long); method public void setSubscriptionPlans(int, @NonNull java.util.List); method @RequiresPermission("android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS") public void switchToSubscription(int, @NonNull android.app.PendingIntent); field public static final String ACTION_DEFAULT_SMS_SUBSCRIPTION_CHANGED = "android.telephony.action.DEFAULT_SMS_SUBSCRIPTION_CHANGED"; diff --git a/core/java/android/net/INetworkPolicyListener.aidl b/core/java/android/net/INetworkPolicyListener.aidl index fe9141cb6a202..dfb1e996c55ac 100644 --- a/core/java/android/net/INetworkPolicyListener.aidl +++ b/core/java/android/net/INetworkPolicyListener.aidl @@ -23,6 +23,6 @@ oneway interface INetworkPolicyListener { void onMeteredIfacesChanged(in String[] meteredIfaces); void onRestrictBackgroundChanged(boolean restrictBackground); void onUidPoliciesChanged(int uid, int uidPolicies); - void onSubscriptionOverride(int subId, int overrideMask, int overrideValue); + void onSubscriptionOverride(int subId, int overrideMask, int overrideValue, in int[] networkTypes); void onSubscriptionPlansChanged(int subId, in SubscriptionPlan[] plans); } diff --git a/core/java/android/net/INetworkPolicyManager.aidl b/core/java/android/net/INetworkPolicyManager.aidl index 29a3fdf59e8ba..84a2acc165c49 100644 --- a/core/java/android/net/INetworkPolicyManager.aidl +++ b/core/java/android/net/INetworkPolicyManager.aidl @@ -76,7 +76,7 @@ interface INetworkPolicyManager { SubscriptionPlan[] getSubscriptionPlans(int subId, String callingPackage); void setSubscriptionPlans(int subId, in SubscriptionPlan[] plans, String callingPackage); String getSubscriptionPlansOwner(int subId); - void setSubscriptionOverride(int subId, int overrideMask, int overrideValue, long timeoutMillis, String callingPackage); + void setSubscriptionOverride(int subId, int overrideMask, int overrideValue, in int[] networkTypes, long timeoutMillis, String callingPackage); void factoryReset(String subscriber); diff --git a/core/java/android/net/NetworkPolicyManager.java b/core/java/android/net/NetworkPolicyManager.java index 82b035b084286..d56f2efacba04 100644 --- a/core/java/android/net/NetworkPolicyManager.java +++ b/core/java/android/net/NetworkPolicyManager.java @@ -34,6 +34,7 @@ import android.net.wifi.WifiInfo; import android.os.Build; import android.os.Process; import android.os.RemoteException; +import android.telephony.Annotation; import android.telephony.SubscriptionPlan; import android.util.DebugUtils; import android.util.Pair; @@ -377,6 +378,8 @@ public class NetworkPolicyManager { * @param overrideMask the bitmask that specifies which of the overrides is being * set or cleared. * @param overrideValue the override values to set or clear. + * @param networkTypes the network types this override applies to. + * {@see TelephonyManager#getAllNetworkTypes()} * @param timeoutMillis the timeout after which the requested override will * be automatically cleared, or {@code 0} to leave in the * requested state until explicitly cleared, or the next reboot, @@ -385,11 +388,12 @@ public class NetworkPolicyManager { * @hide */ public void setSubscriptionOverride(int subId, @SubscriptionOverrideMask int overrideMask, - @SubscriptionOverrideMask int overrideValue, long timeoutMillis, - @NonNull String callingPackage) { + @SubscriptionOverrideMask int overrideValue, + @NonNull @Annotation.NetworkType int[] networkTypes, long timeoutMillis, + @NonNull String callingPackage) { try { - mService.setSubscriptionOverride(subId, overrideMask, overrideValue, timeoutMillis, - callingPackage); + mService.setSubscriptionOverride(subId, overrideMask, overrideValue, networkTypes, + timeoutMillis, callingPackage); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -613,9 +617,10 @@ public class NetworkPolicyManager { * @param subId the subscriber this override applies to. * @param overrideMask a bitmask that specifies which of the overrides is set. * @param overrideValue a bitmask that specifies the override values. + * @param networkTypes the network types this override applies to. */ public void onSubscriptionOverride(int subId, @SubscriptionOverrideMask int overrideMask, - @SubscriptionOverrideMask int overrideValue) {} + @SubscriptionOverrideMask int overrideValue, int[] networkTypes) {} /** * Notify of subscription plans change about a given subscription. @@ -639,8 +644,8 @@ public class NetworkPolicyManager { @Override public void onSubscriptionOverride(int subId, @SubscriptionOverrideMask int overrideMask, - @SubscriptionOverrideMask int overrideValue) { - mCallback.onSubscriptionOverride(subId, overrideMask, overrideValue); + @SubscriptionOverrideMask int overrideValue, int[] networkTypes) { + mCallback.onSubscriptionOverride(subId, overrideMask, overrideValue, networkTypes); } @Override @@ -656,7 +661,7 @@ public class NetworkPolicyManager { @Override public void onRestrictBackgroundChanged(boolean restrictBackground) { } @Override public void onUidPoliciesChanged(int uid, int uidPolicies) { } @Override public void onSubscriptionOverride(int subId, int overrideMask, - int overrideValue) { } + int overrideValue, int[] networkTypes) { } @Override public void onSubscriptionPlansChanged(int subId, SubscriptionPlan[] plans) { } } } diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java index 01d4faf5c5941..1719be9eb0511 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java @@ -70,6 +70,7 @@ import static android.net.NetworkPolicyManager.RULE_REJECT_ALL; import static android.net.NetworkPolicyManager.RULE_REJECT_METERED; import static android.net.NetworkPolicyManager.RULE_REJECT_RESTRICTED_MODE; import static android.net.NetworkPolicyManager.RULE_TEMPORARY_ALLOW_METERED; +import static android.net.NetworkPolicyManager.SUBSCRIPTION_OVERRIDE_UNMETERED; import static android.net.NetworkPolicyManager.isProcStateAllowedWhileIdleOrPowerSaveMode; import static android.net.NetworkPolicyManager.isProcStateAllowedWhileOnRestrictBackground; import static android.net.NetworkPolicyManager.resolveNetworkId; @@ -231,6 +232,7 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.messages.nano.SystemMessageProto.SystemMessage; import com.android.internal.notification.SystemNotificationChannels; +import com.android.internal.os.SomeArgs; import com.android.internal.util.ArrayUtils; import com.android.internal.util.CollectionUtils; import com.android.internal.util.ConcurrentUtils; @@ -3486,13 +3488,27 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { @Override public void setSubscriptionOverride(int subId, int overrideMask, int overrideValue, - long timeoutMillis, String callingPackage) { + int[] networkTypes, long timeoutMillis, String callingPackage) { enforceSubscriptionPlanAccess(subId, Binder.getCallingUid(), callingPackage); - // We can only override when carrier told us about plans + final ArraySet allNetworksSet = new ArraySet<>(); + addAll(allNetworksSet, TelephonyManager.getAllNetworkTypes()); + final IntArray applicableNetworks = new IntArray(); + + // ensure all network types are valid + for (int networkType : networkTypes) { + if (allNetworksSet.contains(networkType)) { + applicableNetworks.add(networkType); + } else { + Log.d(TAG, "setSubscriptionOverride removing invalid network type: " + networkType); + } + } + + // We can only override when carrier told us about plans. For the unmetered case, + // allow override without having plans defined. synchronized (mNetworkPoliciesSecondLock) { final SubscriptionPlan plan = getPrimarySubscriptionPlanLocked(subId); - if (plan == null + if (overrideMask != SUBSCRIPTION_OVERRIDE_UNMETERED && plan == null || plan.getDataLimitBehavior() == SubscriptionPlan.LIMIT_BEHAVIOR_UNKNOWN) { throw new IllegalStateException( "Must provide valid SubscriptionPlan to enable overriding"); @@ -3504,11 +3520,16 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { final boolean overrideEnabled = Settings.Global.getInt(mContext.getContentResolver(), NETPOLICY_OVERRIDE_ENABLED, 1) != 0; if (overrideEnabled || overrideValue == 0) { - mHandler.sendMessage(mHandler.obtainMessage(MSG_SUBSCRIPTION_OVERRIDE, - overrideMask, overrideValue, subId)); + SomeArgs args = SomeArgs.obtain(); + args.arg1 = subId; + args.arg2 = overrideMask; + args.arg3 = overrideValue; + args.arg4 = applicableNetworks.toArray(); + mHandler.sendMessage(mHandler.obtainMessage(MSG_SUBSCRIPTION_OVERRIDE, args)); if (timeoutMillis > 0) { - mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_SUBSCRIPTION_OVERRIDE, - overrideMask, 0, subId), timeoutMillis); + args.arg3 = 0; + mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_SUBSCRIPTION_OVERRIDE, args), + timeoutMillis); } } } @@ -4775,10 +4796,10 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } private void dispatchSubscriptionOverride(INetworkPolicyListener listener, int subId, - int overrideMask, int overrideValue) { + int overrideMask, int overrideValue, int[] networkTypes) { if (listener != null) { try { - listener.onSubscriptionOverride(subId, overrideMask, overrideValue); + listener.onSubscriptionOverride(subId, overrideMask, overrideValue, networkTypes); } catch (RemoteException ignored) { } } @@ -4910,13 +4931,16 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { return true; } case MSG_SUBSCRIPTION_OVERRIDE: { - final int overrideMask = msg.arg1; - final int overrideValue = msg.arg2; - final int subId = (int) msg.obj; + final SomeArgs args = (SomeArgs) msg.obj; + final int subId = (int) args.arg1; + final int overrideMask = (int) args.arg2; + final int overrideValue = (int) args.arg3; + final int[] networkTypes = (int[]) args.arg4; final int length = mListeners.beginBroadcast(); for (int i = 0; i < length; i++) { final INetworkPolicyListener listener = mListeners.getBroadcastItem(i); - dispatchSubscriptionOverride(listener, subId, overrideMask, overrideValue); + dispatchSubscriptionOverride(listener, subId, overrideMask, overrideValue, + networkTypes); } mListeners.finishBroadcast(); return true; diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java index 904232b54b8f5..4e481b3ad837d 100644 --- a/telephony/java/android/telephony/SubscriptionManager.java +++ b/telephony/java/android/telephony/SubscriptionManager.java @@ -2589,14 +2589,45 @@ public class SubscriptionManager { * requested state until explicitly cleared, or the next reboot, * whichever happens first. * @throws SecurityException if the caller doesn't meet the requirements - * outlined above. + * outlined above. */ public void setSubscriptionOverrideUnmetered(int subId, boolean overrideUnmetered, @DurationMillisLong long timeoutMillis) { + setSubscriptionOverrideUnmetered(subId, overrideUnmetered, + TelephonyManager.getAllNetworkTypes(), timeoutMillis); + } + /** + * Temporarily override the billing relationship plan between a carrier and + * a specific subscriber to be considered unmetered. This will be reflected + * to apps via {@link NetworkCapabilities#NET_CAPABILITY_NOT_METERED}. + *

+ * This method is only accessible to the following narrow set of apps: + *

+ * + * @param subId the subscriber this override applies to. + * @param overrideUnmetered set if the billing relationship should be + * considered unmetered. + * @param networkTypes the network types this override applies to. + * {@see TelephonyManager#getAllNetworkTypes()} + * @param timeoutMillis the timeout after which the requested override will + * be automatically cleared, or {@code 0} to leave in the + * requested state until explicitly cleared, or the next reboot, + * whichever happens first. + * @throws SecurityException if the caller doesn't meet the requirements + * outlined above. + */ + public void setSubscriptionOverrideUnmetered(int subId, boolean overrideUnmetered, + @NonNull @Annotation.NetworkType int[] networkTypes, + @DurationMillisLong long timeoutMillis) { final int overrideValue = overrideUnmetered ? SUBSCRIPTION_OVERRIDE_UNMETERED : 0; getNetworkPolicyManager().setSubscriptionOverride(subId, SUBSCRIPTION_OVERRIDE_UNMETERED, - overrideValue, timeoutMillis, mContext.getOpPackageName()); + overrideValue, networkTypes, timeoutMillis, mContext.getOpPackageName()); } /** @@ -2621,13 +2652,46 @@ public class SubscriptionManager { * requested state until explicitly cleared, or the next reboot, * whichever happens first. * @throws SecurityException if the caller doesn't meet the requirements - * outlined above. + * outlined above. */ public void setSubscriptionOverrideCongested(int subId, boolean overrideCongested, @DurationMillisLong long timeoutMillis) { + setSubscriptionOverrideCongested(subId, overrideCongested, + TelephonyManager.getAllNetworkTypes(), timeoutMillis); + } + + /** + * Temporarily override the billing relationship plan between a carrier and + * a specific subscriber to be considered congested. This will cause the + * device to delay certain network requests when possible, such as developer + * jobs that are willing to run in a flexible time window. + *

+ * This method is only accessible to the following narrow set of apps: + *

+ * + * @param subId the subscriber this override applies to. + * @param overrideCongested set if the subscription should be considered + * congested. + * @param networkTypes the network types this override applies to. + * {@see TelephonyManager#getAllNetworkTypes()} + * @param timeoutMillis the timeout after which the requested override will + * be automatically cleared, or {@code 0} to leave in the + * requested state until explicitly cleared, or the next reboot, + * whichever happens first. + * @throws SecurityException if the caller doesn't meet the requirements + * outlined above. + */ + public void setSubscriptionOverrideCongested(int subId, boolean overrideCongested, + @NonNull @Annotation.NetworkType int[] networkTypes, + @DurationMillisLong long timeoutMillis) { final int overrideValue = overrideCongested ? SUBSCRIPTION_OVERRIDE_CONGESTED : 0; getNetworkPolicyManager().setSubscriptionOverride(subId, SUBSCRIPTION_OVERRIDE_CONGESTED, - overrideValue, timeoutMillis, mContext.getOpPackageName()); + overrideValue, networkTypes, timeoutMillis, mContext.getOpPackageName()); } /** From c6bda518dae6ae473cc73d2487e4ac0e0838c6ad Mon Sep 17 00:00:00 2001 From: Antoan Angelov Date: Tue, 2 Feb 2021 19:46:24 +0000 Subject: [PATCH 144/288] [RESTRICT AUTOMERGE] Revert "[RESTRICT AUTOMERGE] Remove DPMS#getProfileOwner in favor of getProfileOwnerAsUser" This reverts commit 10f79644fc7db512daa6dcf71685dc4f71f8f11b. Reason for revert: Explained in b/153995973#comment40 Bug: 153995973 Change-Id: I437400528cb98e9ce665ebc308bfe05f4f24ca13 --- .../app/admin/DevicePolicyManager.java | 2 +- .../app/admin/IDevicePolicyManager.aidl | 1 + .../devicepolicy/CertificateMonitor.java | 2 +- .../DevicePolicyManagerService.java | 30 +++++++++++-------- .../devicepolicy/DevicePolicyManagerTest.java | 10 ------- 5 files changed, 21 insertions(+), 24 deletions(-) diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index d6056d23699e6..322cac81d58b3 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -6994,7 +6994,7 @@ public class DevicePolicyManager { throwIfParentInstance("isProfileOwnerApp"); if (mService != null) { try { - ComponentName profileOwner = mService.getProfileOwnerAsUser(myUserId()); + ComponentName profileOwner = mService.getProfileOwner(myUserId()); return profileOwner != null && profileOwner.getPackageName().equals(packageName); } catch (RemoteException re) { diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl index 86058d9933df2..9c6a274ccf8cf 100644 --- a/core/java/android/app/admin/IDevicePolicyManager.aidl +++ b/core/java/android/app/admin/IDevicePolicyManager.aidl @@ -156,6 +156,7 @@ interface IDevicePolicyManager { boolean setProfileOwner(in ComponentName who, String ownerName, int userHandle); ComponentName getProfileOwnerAsUser(int userHandle); + ComponentName getProfileOwner(int userHandle); ComponentName getProfileOwnerOrDeviceOwnerSupervisionComponent(in UserHandle userHandle); String getProfileOwnerName(int userHandle); void setProfileEnabled(in ComponentName who); diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/CertificateMonitor.java b/services/devicepolicy/java/com/android/server/devicepolicy/CertificateMonitor.java index a33a512b3be0e..aa38880d6d7db 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/CertificateMonitor.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/CertificateMonitor.java @@ -177,7 +177,7 @@ public class CertificateMonitor { int parentUserId = userHandle.getIdentifier(); - if (mService.getProfileOwnerAsUser(userHandle.getIdentifier()) != null) { + if (mService.getProfileOwner(userHandle.getIdentifier()) != null) { contentText = resources.getString(R.string.ssl_ca_cert_noti_managed, mService.getProfileOwnerName(userHandle.getIdentifier())); smallIconId = R.drawable.stat_sys_certificate_info; diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 15cb5bff01d9d..c6b93d6ca4f48 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -4714,7 +4714,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { public boolean isSeparateProfileChallengeAllowed(int userHandle) { enforceSystemCaller("query separate challenge support"); - ComponentName profileOwner = getProfileOwnerAsUser(userHandle); + ComponentName profileOwner = getProfileOwner(userHandle); // Profile challenge is supported on N or newer release. return profileOwner != null && getTargetSdk(profileOwner.getPackageName(), userHandle) > Build.VERSION_CODES.M; @@ -6622,7 +6622,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { final UserHandle caller = mInjector.binderGetCallingUserHandle(); // If there is a profile owner, redirect to that; otherwise query the device owner. - ComponentName aliasChooser = getProfileOwnerAsUser(caller.getIdentifier()); + ComponentName aliasChooser = getProfileOwner(caller.getIdentifier()); if (aliasChooser == null && caller.isSystem()) { synchronized (getLockObject()) { final ActiveAdmin deviceOwnerAdmin = getDeviceOwnerAdminLocked(); @@ -8744,7 +8744,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } public boolean isProfileOwner(ComponentName who, int userId) { - final ComponentName profileOwner = getProfileOwnerAsUser(userId); + final ComponentName profileOwner = getProfileOwner(userId); return who != null && who.equals(profileOwner); } @@ -9302,10 +9302,16 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { @Override public ComponentName getProfileOwnerAsUser(int userHandle) { + enforceCrossUsersPermission(userHandle); + + return getProfileOwner(userHandle); + } + + @Override + public ComponentName getProfileOwner(int userHandle) { if (!mHasFeature) { return null; } - enforceCrossUsersPermission(userHandle); synchronized (getLockObject()) { return mOwners.getProfileOwnerComponent(userHandle); } @@ -9348,9 +9354,9 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { return mInjector.binderWithCleanCallingIdentity(() -> { for (UserInfo userInfo : mUserManager.getProfiles(userHandle)) { if (userInfo.isManagedProfile()) { - if (getProfileOwnerAsUser(userInfo.id) != null + if (getProfileOwner(userInfo.id) != null && isProfileOwnerOfOrganizationOwnedDevice(userInfo.id)) { - ComponentName who = getProfileOwnerAsUser(userInfo.id); + ComponentName who = getProfileOwner(userInfo.id); return getActiveAdminUncheckedLocked(who, userInfo.id); } } @@ -9390,7 +9396,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { return null; } enforceManageUsers(); - ComponentName profileOwner = getProfileOwnerAsUser(userHandle); + ComponentName profileOwner = getProfileOwner(userHandle); if (profileOwner == null) { return null; } @@ -9787,7 +9793,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { return false; } - final ComponentName profileOwner = getProfileOwnerAsUser(userId); + final ComponentName profileOwner = getProfileOwner(userId); if (profileOwner == null) { return false; } @@ -13362,7 +13368,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { // Managed-profiles cannot be setup on the system user. return CODE_SPLIT_SYSTEM_USER_DEVICE_SYSTEM_USER; } - if (getProfileOwnerAsUser(callingUserId) != null) { + if (getProfileOwner(callingUserId) != null) { // Managed user cannot have a managed profile. return CODE_USER_HAS_PROFILE_OWNER; } @@ -14016,7 +14022,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { return true; } - final ComponentName profileOwner = getProfileOwnerAsUser(userId); + final ComponentName profileOwner = getProfileOwner(userId); if (profileOwner == null) { return false; } @@ -14226,7 +14232,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { enforceUserUnlocked(userId); - final ComponentName profileOwner = getProfileOwnerAsUser(userId); + final ComponentName profileOwner = getProfileOwner(userId); if (profileOwner != null && packageName.equals(profileOwner.getPackageName())) { throw new IllegalArgumentException("Cannot uninstall a package with a profile owner"); } @@ -15762,7 +15768,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { final List admins = new ArrayList<>(); int[] users = mUserManager.getProfileIdsWithDisabled(UserHandle.getCallingUserId()); for (int i = 0; i < users.length; i++) { - final ComponentName componentName = getProfileOwnerAsUser(users[i]); + final ComponentName componentName = getProfileOwner(users[i]); if (componentName != null) { ActiveAdmin admin = getActiveAdminUncheckedLocked(componentName, users[i]); if (admin != null) { diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java index 82c23e5051c93..daaabf8141fff 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java @@ -666,7 +666,6 @@ public class DevicePolicyManagerTest extends DpmTestBase { */ public void testRemoveActiveAdmin_fromDifferentUserWithINTERACT_ACROSS_USERS_FULL() { mContext.callerPermissions.add(android.Manifest.permission.MANAGE_DEVICE_ADMINS); - mContext.callerPermissions.add(permission.INTERACT_ACROSS_USERS); // Add admin1. @@ -2685,7 +2684,6 @@ public class DevicePolicyManagerTest extends DpmTestBase { mContext.callerPermissions.add(permission.MANAGE_DEVICE_ADMINS); mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS); mContext.callerPermissions.add(permission.INTERACT_ACROSS_USERS_FULL); - mContext.callerPermissions.add(permission.INTERACT_ACROSS_USERS); // Check that the system user is unaffiliated. mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID; @@ -4222,8 +4220,6 @@ public class DevicePolicyManagerTest extends DpmTestBase { } public void testGetBindDeviceAdminTargetUsers() throws Exception { - mContext.callerPermissions.add(permission.INTERACT_ACROSS_USERS); - // Setup device owner. mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID; setupDeviceOwner(); @@ -6055,7 +6051,6 @@ public class DevicePolicyManagerTest extends DpmTestBase { } public void testGetAllCrossProfilePackages_notSet_returnsEmpty() throws Exception { - mContext.callerPermissions.add(permission.INTERACT_ACROSS_USERS); addManagedProfile(admin1, mServiceContext.binder.callingUid, admin1); mContext.packageName = admin1.getPackageName(); @@ -6067,7 +6062,6 @@ public class DevicePolicyManagerTest extends DpmTestBase { public void testGetAllCrossProfilePackages_notSet_dpmsReinitialized_returnsEmpty() throws Exception { - mContext.callerPermissions.add(permission.INTERACT_ACROSS_USERS); addManagedProfile(admin1, mServiceContext.binder.callingUid, admin1); mContext.packageName = admin1.getPackageName(); @@ -6079,7 +6073,6 @@ public class DevicePolicyManagerTest extends DpmTestBase { } public void testGetAllCrossProfilePackages_whenSet_returnsCombinedSet() throws Exception { - mContext.callerPermissions.add(permission.INTERACT_ACROSS_USERS); addManagedProfile(admin1, mServiceContext.binder.callingUid, admin1); final Set packages = Sets.newSet("TEST_PACKAGE", "TEST_COMMON_PACKAGE"); mContext.packageName = admin1.getPackageName(); @@ -6097,7 +6090,6 @@ public class DevicePolicyManagerTest extends DpmTestBase { public void testGetAllCrossProfilePackages_whenSet_dpmsReinitialized_returnsCombinedSet() throws Exception { - mContext.callerPermissions.add(permission.INTERACT_ACROSS_USERS); addManagedProfile(admin1, mServiceContext.binder.callingUid, admin1); final Set packages = Sets.newSet("TEST_PACKAGE", "TEST_COMMON_PACKAGE"); mContext.packageName = admin1.getPackageName(); @@ -6269,8 +6261,6 @@ public class DevicePolicyManagerTest extends DpmTestBase { public void testSetAccountTypesWithManagementDisabledOnOrgOwnedManagedProfile() throws Exception { - mContext.callerPermissions.add(permission.INTERACT_ACROSS_USERS); - final int managedProfileUserId = 15; final int managedProfileAdminUid = UserHandle.getUid(managedProfileUserId, 19436); From e2307d9a48180a0001a0e2b51777fc151a698cd4 Mon Sep 17 00:00:00 2001 From: Taran Singh Date: Wed, 30 Sep 2020 14:21:52 -0700 Subject: [PATCH 145/288] Handle cancelled Insets animation If an Insets animation was cancelled before it could complete, handle it gracefully. Fix: 154381667 Test: Run monkey runner that on any window that has edit text atest InsetsControllerTests Change-Id: I052a0455f536a1c839a2782e54f19143295ba6c6 --- core/java/android/view/InsetsAnimationThreadControlRunner.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/java/android/view/InsetsAnimationThreadControlRunner.java b/core/java/android/view/InsetsAnimationThreadControlRunner.java index 123604489da49..09e4557135b54 100644 --- a/core/java/android/view/InsetsAnimationThreadControlRunner.java +++ b/core/java/android/view/InsetsAnimationThreadControlRunner.java @@ -108,6 +108,9 @@ public class InsetsAnimationThreadControlRunner implements InsetsAnimationContro mControl = new InsetsAnimationControlImpl(controls, frame, state, listener, types, mCallbacks, durationMs, interpolator, animationType); InsetsAnimationThread.getHandler().post(() -> { + if (mControl.isCancelled()) { + return; + } Trace.asyncTraceBegin(Trace.TRACE_TAG_VIEW, "InsetsAsyncAnimation: " + WindowInsets.Type.toString(types), types); listener.onReady(mControl, types); From feb3d04f239b41bb368127cd3011cefd321b876d Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 7 Feb 2021 04:38:32 +0000 Subject: [PATCH 146/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I5da7c7256fc62de8672c76d3b59d2d25d1d5d544 --- packages/SettingsLib/res/values-az/strings.xml | 2 +- packages/SettingsLib/res/values-de/strings.xml | 2 +- packages/SettingsLib/res/values-es-rUS/strings.xml | 4 ++-- packages/SettingsLib/res/values-fa/strings.xml | 6 +++--- packages/SettingsLib/res/values-fr-rCA/strings.xml | 4 ++-- packages/SettingsLib/res/values-is/strings.xml | 4 ++-- packages/SettingsLib/res/values-lt/strings.xml | 2 +- packages/SettingsLib/res/values-mn/strings.xml | 4 ++-- packages/SettingsLib/res/values-te/strings.xml | 12 ++++++------ packages/SettingsLib/res/values-uz/strings.xml | 2 +- 10 files changed, 21 insertions(+), 21 deletions(-) diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml index 4f82eea6e66ff..44a27ad672189 100644 --- a/packages/SettingsLib/res/values-az/strings.xml +++ b/packages/SettingsLib/res/values-az/strings.xml @@ -311,7 +311,7 @@ "Adsız Bluetooth cihazları (yalnız MAC ünvanları) göstəriləcək" "Uzaqdan idarə olunan cihazlarda dözülməz yüksək səs həcmi və ya nəzarət çatışmazlığı kimi səs problemləri olduqda Bluetooth mütləq səs həcmi xüsusiyyətini deaktiv edir." "Bluetooth Gabeldorsche funksiyasını aktiv edir." - "Təkmilləşdirilmiş Bağlantı funksiyasını aktiv edir." + "Qabaqcıl məlumat mübadiləsini aktiv edir." "Yerli terminal" "Yerli örtük girişini təklif edən terminal tətbiqi aktiv edin" "HDCP yoxlanılır" diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml index b7be0493e8117..e7c4e3e0cdaab 100644 --- a/packages/SettingsLib/res/values-de/strings.xml +++ b/packages/SettingsLib/res/values-de/strings.xml @@ -285,7 +285,7 @@ "Verringert den Akkuverbrauch und verbessert die Netzwerkleistung" "Wenn dieser Modus aktiviert ist, kann sich die MAC-Adresse dieses Geräts bei jeder Verbindung mit einem Netzwerk ändern, bei dem die MAC-Adressen randomisiert werden." "Kostenpflichtig" - "Kostenlos" + "Ohne Datenlimit" "Logger-Puffergrößen" "Größe pro Protokollpuffer wählen" "Speicher der dauerhaften Protokollierung löschen?" diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml index 56efd5c8edc88..74fe05f5c0577 100644 --- a/packages/SettingsLib/res/values-es-rUS/strings.xml +++ b/packages/SettingsLib/res/values-es-rUS/strings.xml @@ -116,8 +116,8 @@ "SINCRONIZAR" "Cancelar" "La sincronización te permite acceder a los contactos y al historial de llamadas cuando el dispositivo está conectado." - "No se pudo sincronizar con %1$s." - "No se pudo sincronizar con %1$s debido a que el PIN o la clave de acceso son incorrectos." + "No se pudo vincular con %1$s." + "No se pudo vincular con %1$s debido a que el PIN o la clave de acceso son incorrectos." "No se puede establecer la comunicación con %1$s." "Vínculo rechazado por %1$s" "Computadora" diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml index 08932756ae963..114519c107a47 100644 --- a/packages/SettingsLib/res/values-fa/strings.xml +++ b/packages/SettingsLib/res/values-fa/strings.xml @@ -37,7 +37,7 @@ "دسترسی به اینترنت ندارد" "ذخیره‌شده توسط %1$s" "‏اتصال خودکار ازطریق %1$s" - "اتصال خودکار ازطریق ارائه‌دهنده رتبه‌بندی شبکه" + "اتصال خودکار ازطریق ارائه‌دهنده رده‌بندی شبکه" "‏متصل از طریق %1$s" "متصل شده ازطریق %1$s" "‏در دسترس از طریق %1$s" @@ -263,8 +263,8 @@ "‏انتخاب نسخه MAP بلوتوث" "کدک بلوتوث صوتی" "راه‌اندازی کدک صوتی بلوتوثی\nانتخاب" - "سرعت نمونه بلوتوث صوتی" - "راه‌اندازی کدک صوتی بلوتوثی\nانتخاب: سرعت نمونه" + "بسامد نمونه صوتی بلوتوث" + "راه‌اندازی کدک صوتی بلوتوثی\nانتخاب: بسامد نمونه" "«خاکستری» به این معناست که تلفن یا هدست از آن پشتیبانی نمی‌کند" "بیت‌های بلوتوث صوتی در هر نمونه" "راه‌اندازی کدک صوتی بلوتوثی\nانتخاب: تعداد بیت در نمونه" diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml index c42bcdefeb682..58db5a60b5098 100644 --- a/packages/SettingsLib/res/values-fr-rCA/strings.xml +++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml @@ -225,8 +225,8 @@ "Associer avec l\'appareil" "Code d\'association Wi-Fi" "Échec de l\'association" - "Vérifier que l\'appareil est connecté au même réseau." - "Associer un appareil par Wi-Fi en numérisant un code QR" + "Vérifiez que l\'appareil est connecté au même réseau." + "Associez l\'appareil par Wi-Fi en numérisant un code QR" "Association de l\'appareil en cours…" "Échec de l\'association de l\'appareil Soit le code QR est incorrect, soit l\'appareil n\'est pas connecté au même réseau." "Adresse IP et port" diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml index c5bcfc0bbeab1..f20f5117a7552 100644 --- a/packages/SettingsLib/res/values-is/strings.xml +++ b/packages/SettingsLib/res/values-is/strings.xml @@ -226,12 +226,12 @@ "Wi-Fi pörunarkóði" "Pörun mistókst" "Gakktu úr skugga um að tækið sé tengt sama neti." - "Tengja tæki með Wi-Fi með því að skanna QR-kóða" + "Para tæki gegnum Wi-Fi með því að skanna QR-kóða" "Parar tæki…" "Ekki tókst að para við tækið. Annað hvort var QR-kóðinn rangur eða tækið ekki tengt sama neti." "IP-tala og gátt" "Skanna QR-kóða" - "Tengja tæki með Wi-Fi með því að skanna QR-kóða" + "Para tæki gegnum Wi-Fi með því að skanna QR-kóða" "Tengstu Wi-Fi neti" "adb, villuleit, dev" "Flýtileið í villutilkynningu" diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml index b5894f6bdf517..e1345bff66d12 100644 --- a/packages/SettingsLib/res/values-lt/strings.xml +++ b/packages/SettingsLib/res/values-lt/strings.xml @@ -206,7 +206,7 @@ "USB perkrova" "Derinimo režimas, kai prijungtas USB" "Panaikinti USB derinimo prieigos teises" - "Belaidžio ryšio derinimas" + "Belaidžio ryšio derin." "Derinimo režimas, kai prisijungta prie „Wi‑Fi“" "Klaida" "Belaidžio ryšio derinimas" diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml index ec79127b9029b..d8ddefd33a3a7 100644 --- a/packages/SettingsLib/res/values-mn/strings.xml +++ b/packages/SettingsLib/res/values-mn/strings.xml @@ -396,8 +396,8 @@ "Дижитал агуулгад зориулан тааруулсан өнгө" "Зогсолтын горимын апп" - "Идэвхгүй байна. Унтраах/асаахын тулд дарна уу." - "Идэвхтэй байна. Унтраах/асаахын тулд дарна уу." + "Идэвхгүй байна. Асаах/унтраахын тулд дарна уу." + "Идэвхтэй байна. Асаах/унтраахын тулд дарна уу." "Апп зогсолтын горимын төлөв: %s" "Ажиллаж байгаа үйлчилгээнүүд" "Одоо ажиллаж байгаа үйлчилгээнүүдийг харах болон хянах" diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml index 6f2da08810ea0..4aa8040c6db36 100644 --- a/packages/SettingsLib/res/values-te/strings.xml +++ b/packages/SettingsLib/res/values-te/strings.xml @@ -140,15 +140,15 @@ "ఓపెన్ నెట్‌వర్క్" "సురక్షిత నెట్‌వర్క్" "Android OS" - "తీసివేయబడిన అనువర్తనాలు" - "తీసివేయబడిన అనువర్తనాలు మరియు వినియోగదారులు" + "తీసివేయబడిన యాప్‌లు" + "తీసివేయబడిన యాప్‌లు మరియు వినియోగదారులు" "సిస్టమ్ అప్‌డేట్‌లు" "USB టీథరింగ్" "పోర్టబుల్ హాట్‌స్పాట్" "బ్లూటూత్ టెథెరింగ్" "టీథరింగ్" "టీథరింగ్ & పోర్టబుల్ హాట్‌స్పాట్" - "అన్ని కార్యాలయ అనువర్తనాలు" + "అన్ని కార్యాలయ యాప్‌లు" "అతిథి" "తెలియదు" "వినియోగదారు: %1$s" @@ -313,14 +313,14 @@ "బ్లూటూత్ Gabeldorsche ఫీచర్ స్ట్యాక్‌ను ఎనేబుల్ చేస్తుంది." "మెరుగైన కనెక్టివిటీ ఫీచర్‌ను ఎనేబుల్ చేస్తుంది." "స్థానిక టెర్మినల్" - "స్థానిక షెల్ ప్రాప్యతను అందించే టెర్మినల్ అనువర్తనాన్ని ప్రారంభించు" + "స్థానిక షెల్ ప్రాప్యతను అందించే టెర్మినల్ యాప్‌ను ప్రారంభించు" "HDCP తనిఖీ" "HDCP తనిఖీ ప్రవర్తనను సెట్ చేయండి" "డీబగ్గింగ్" "డీబగ్ యాప్‌ను ఎంచుకోండి" "డీబగ్ యాప్ సెట్ చేయబడలేదు" "డీబగ్గింగ్ యాప్: %1$s" - "అనువర్తనాన్ని ఎంచుకోండి" + "యాప్‌ను ఎంచుకోండి" "ఏదీ వద్దు" "డీబగ్గర్ కోసం వేచి ఉండండి" "డీబగ్ చేయబడిన యాప్ అమలు కావడానికి ముందు జోడించాల్సిన డీబగ్గర్ కోసం వేచి ఉంటుంది" @@ -543,7 +543,7 @@ "కొత్త ప్రొఫైల్" "వినియోగదారు సమాచారం" "ప్రొఫైల్ సమాచారం" - "మీరు పరిమితం చేయబడిన ప్రొఫైల్‌ను సృష్టించడానికి ముందు, మీ అనువర్తనాలు మరియు వ్యక్తిగత డేటాను రక్షించడానికి స్క్రీన్ లాక్‌ను సెటప్ చేయాల్సి ఉంటుంది." + "మీరు పరిమితం చేయబడిన ప్రొఫైల్‌ను సృష్టించడానికి ముందు, మీ యాప్‌లు మరియు వ్యక్తిగత డేటాను రక్షించడానికి స్క్రీన్ లాక్‌ను సెటప్ చేయాల్సి ఉంటుంది." "లాక్‌ను సెట్ చేయి" "%sకు మార్చు" "అతిథిని జోడించండి" diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml index 7f63b12fea1d9..b456241ac21e6 100644 --- a/packages/SettingsLib/res/values-uz/strings.xml +++ b/packages/SettingsLib/res/values-uz/strings.xml @@ -154,7 +154,7 @@ "Foydalanuvchi: %1$s" "Ba’zi birlamchi sozlamalar o‘rnatilgan" "Birlamchi sozlamalar belgilanmagan" - "Nutq sintezi sozlamalari" + "Matnni nutqqa aylantirish sozlamalari" "Nutq sintezi" "Nutq tezligi" "Matnni o‘qish tezligi" From 87adff6976791968f9cd54a340bdae8bcb2c05a4 Mon Sep 17 00:00:00 2001 From: Miranda Kephart Date: Mon, 8 Feb 2021 11:30:34 -0500 Subject: [PATCH 147/288] [DO NOT MERGE] Make screenshot error notification PendingIntent immutable Bug: 178189250 Test: manual (using POC in bug) Change-Id: I787915c0493d18500e7531bd0ca7191532441f93 --- .../systemui/screenshot/ScreenshotNotificationsController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotNotificationsController.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotNotificationsController.java index 42dde4064a971..b8a468e0ce450 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotNotificationsController.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotNotificationsController.java @@ -252,7 +252,7 @@ public class ScreenshotNotificationsController { dpm.createAdminSupportIntent(DevicePolicyManager.POLICY_DISABLE_SCREEN_CAPTURE); if (intent != null) { final PendingIntent pendingIntent = PendingIntent.getActivityAsUser( - mContext, 0, intent, 0, null, UserHandle.CURRENT); + mContext, 0, intent, PendingIntent.FLAG_IMMUTABLE, null, UserHandle.CURRENT); b.setContentIntent(pendingIntent); } From 1eecc874b6bda42a5a191684704e3bf424cf47da Mon Sep 17 00:00:00 2001 From: Miranda Kephart Date: Mon, 8 Feb 2021 11:30:34 -0500 Subject: [PATCH 148/288] [DO NOT MERGE] Make screenshot error notification PendingIntent immutable Bug: 178189250 Test: manual (using POC in bug) Change-Id: I787915c0493d18500e7531bd0ca7191532441f93 --- .../systemui/screenshot/ScreenshotNotificationsController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotNotificationsController.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotNotificationsController.java index 42dde4064a971..b8a468e0ce450 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotNotificationsController.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotNotificationsController.java @@ -252,7 +252,7 @@ public class ScreenshotNotificationsController { dpm.createAdminSupportIntent(DevicePolicyManager.POLICY_DISABLE_SCREEN_CAPTURE); if (intent != null) { final PendingIntent pendingIntent = PendingIntent.getActivityAsUser( - mContext, 0, intent, 0, null, UserHandle.CURRENT); + mContext, 0, intent, PendingIntent.FLAG_IMMUTABLE, null, UserHandle.CURRENT); b.setContentIntent(pendingIntent); } From 6b232cc0583b264cb1194de2edb10c6883dd0915 Mon Sep 17 00:00:00 2001 From: Calin Juravle Date: Tue, 2 Feb 2021 17:07:45 -0800 Subject: [PATCH 149/288] Fix the the proto definition for app startup and fully drawn events. ActivityMetricsLoggers build the proto with the compilation reason first and then the compilation filter. Instead of changing the logging code, we prefer to change the proto field order: this will facilitate the speed up the resolution without the need to purge data or wait for further release builds. It is ok, because both fields are in fact int32 proto values so the ABI does not change. Test: m Bug: 178108751 (cherry picked from commit cf676e8028c2611461dc3e009dd9fe771f44bdb2) Merged-In: I36ec354d273dceace5245d7634c68ac63dc5a8cd Change-Id: I03c701efe2181ae7796547267902f884007593eb --- cmds/statsd/src/atoms.proto | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index 55e1186d86104..8416ff4d557e5 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -3612,11 +3612,11 @@ message AppStartOccurred { // Empty if not set. optional string launch_token = 13; - // The compiler filter used when when the package was optimized. - optional int32 package_optimization_compilation_filter = 14; - // The reason why the package was optimized. - optional int32 package_optimization_compilation_reason = 15; + optional int32 package_optimization_compilation_reason = 14; + + // The compiler filter used when when the package was optimized. + optional int32 package_optimization_compilation_filter = 15; } message AppStartCanceled { @@ -3662,11 +3662,11 @@ message AppStartFullyDrawn { // App startup time (until call to Activity#reportFullyDrawn()). optional int64 app_startup_time_millis = 6; - // The compiler filter used when when the package was optimized. - optional int32 package_optimization_compilation_filter = 7; - // The reason why the package was optimized. - optional int32 package_optimization_compilation_reason = 8; + optional int32 package_optimization_compilation_reason = 7; + + // The compiler filter used when when the package was optimized. + optional int32 package_optimization_compilation_filter = 8; } /** From 5ac203445f01e3f06d3ae8946541f2f306291c85 Mon Sep 17 00:00:00 2001 From: Richard Gaywood Date: Fri, 5 Feb 2021 15:53:00 +0000 Subject: [PATCH 150/288] Stop passing in statsFile fds as they will be leaked when returned to the caller. This is safe, as getCommittedStatsMerged() supports null-able values for the List. Test: local compile and test; atom still pulls successfully. Change-Id: I083ea1150f54c5970fbf60ae320809d27c4f3207 Merged-In: I083ea1150f54c5970fbf60ae320809d27c4f3207 Bug: 179008261 (cherry picked from commit e451771a8fd90d4edcc5a93b607d51560ca46905) --- .../com/android/server/stats/pull/StatsPullAtomService.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java index 96b53f0baa354..279f9b8c4c297 100644 --- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java +++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java @@ -2621,7 +2621,6 @@ public class StatsPullAtomService extends SystemService { try { // force procstats to flush & combine old files into one store long lastHighWaterMark = readProcStatsHighWaterMark(section); - List statsFiles = new ArrayList<>(); ProtoOutputStream[] protoStreams = new ProtoOutputStream[MAX_PROCSTATS_SHARDS]; for (int i = 0; i < protoStreams.length; i++) { @@ -2631,7 +2630,7 @@ public class StatsPullAtomService extends SystemService { ProcessStats procStats = new ProcessStats(false); // Force processStatsService to aggregate all in-storage and in-memory data. long highWaterMark = processStatsService.getCommittedStatsMerged( - lastHighWaterMark, section, true, statsFiles, procStats); + lastHighWaterMark, section, true, null, procStats); procStats.dumpAggregatedProtoForStatsd(protoStreams, MAX_PROCSTATS_RAW_SHARD_SIZE); for (int i = 0; i < protoStreams.length; i++) { From 911519f25a423f0332c03409a23c7b34a09d24f6 Mon Sep 17 00:00:00 2001 From: Marco Ballesio Date: Mon, 8 Feb 2021 17:08:41 -0800 Subject: [PATCH 151/288] freezer: handle exception in locks file format Safeguard /proc/locks processing from wrongly formatted /proc/locks files Bug: 179171387 Test: could not reproduce the issue, but verified that no crashes occurred in a prolonged test (4hrs+) Change-Id: Ia8a12903f2e520e51780c8b05876aa1c9083e92b (cherry picked from commit fb4f4073f6eae95d236687a857e64acf262fa215) --- core/java/android/os/Process.java | 11 ++++++++--- .../com/android/server/am/CachedAppOptimizer.java | 4 ++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java index 47598cf35974e..34664a4085e55 100644 --- a/core/java/android/os/Process.java +++ b/core/java/android/os/Process.java @@ -1406,7 +1406,7 @@ public class Process { * * @hide */ - public static boolean hasFileLocks(int pid) throws IOException { + public static boolean hasFileLocks(int pid) throws Exception { BufferedReader br = null; try { @@ -1418,8 +1418,13 @@ public class Process { for (int i = 0; i < 5 && st.hasMoreTokens(); i++) { String str = st.nextToken(); - if (i == 4 && Integer.parseInt(str) == pid) { - return true; + try { + if (i == 4 && Integer.parseInt(str) == pid) { + return true; + } + } catch (NumberFormatException nfe) { + throw new Exception("Exception parsing /proc/locks at \" " + + line + " \", token #" + i); } } } diff --git a/services/core/java/com/android/server/am/CachedAppOptimizer.java b/services/core/java/com/android/server/am/CachedAppOptimizer.java index dd09a1c856826..cb9271c6bf531 100644 --- a/services/core/java/com/android/server/am/CachedAppOptimizer.java +++ b/services/core/java/com/android/server/am/CachedAppOptimizer.java @@ -1114,7 +1114,7 @@ public final class CachedAppOptimizer { } return; } - } catch (IOException e) { + } catch (Exception e) { Slog.e(TAG_AM, "Not freezing. Unable to check file locks for " + name + "(" + pid + "): " + e); return; @@ -1192,7 +1192,7 @@ public final class CachedAppOptimizer { unfreezeAppLocked(proc); } } - } catch (IOException e) { + } catch (Exception e) { Slog.e(TAG_AM, "Unable to check file locks for " + name + "(" + pid + "): " + e); synchronized (mAm) { unfreezeAppLocked(proc); From b29834bc15dc9de1a1b138741c3c0d4fa8169110 Mon Sep 17 00:00:00 2001 From: Nate Myren Date: Mon, 30 Nov 2020 12:06:26 -0800 Subject: [PATCH 152/288] Revoke storage on SDK downgrade or new full storage request When an app downgrades from above API 28 to below, or when an app begins requesting full storage in api 29, revoke storage permissions Test: Atest StorageEscalationTest Bug: 171430330 Merged-In: Ia6bd5658b77a26ab15fea013ec875050457473e0 Change-Id: Ia6bd5658b77a26ab15fea013ec875050457473e0 --- .../server/pm/PackageManagerService.java | 1 + .../permission/PermissionManagerService.java | 62 +++++++++++++++++++ .../PermissionManagerServiceInternal.java | 11 ++++ 3 files changed, 74 insertions(+) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 40723e073ba10..0603708a6120a 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -12508,6 +12508,7 @@ public class PackageManagerService extends IPackageManager.Stub if (hasOldPkg) { mPermissionManager.revokeRuntimePermissionsIfGroupChanged(pkg, oldPkg, allPackageNames); + mPermissionManager.revokeStoragePermissionsIfScopeExpanded(pkg, oldPkg); } if (hasPermissionDefinitionChanges) { mPermissionManager.revokeRuntimePermissionsIfPermissionDefinitionChanged( diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java index 3ffca028b1c00..b500e1631fb52 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -206,6 +206,9 @@ public class PermissionManagerService extends IPermissionManager.Stub { private static final int USER_PERMISSION_FLAGS = FLAG_PERMISSION_USER_SET | FLAG_PERMISSION_USER_FIXED; + /** All storage permissions */ + private static final List STORAGE_PERMISSIONS = new ArrayList<>(); + /** If the permission of the value is granted, so is the key */ private static final Map FULLER_PERMISSION_MAP = new HashMap<>(); @@ -214,6 +217,9 @@ public class PermissionManagerService extends IPermissionManager.Stub { Manifest.permission.ACCESS_FINE_LOCATION); FULLER_PERMISSION_MAP.put(Manifest.permission.INTERACT_ACROSS_USERS, Manifest.permission.INTERACT_ACROSS_USERS_FULL); + STORAGE_PERMISSIONS.add(Manifest.permission.READ_EXTERNAL_STORAGE); + STORAGE_PERMISSIONS.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); + STORAGE_PERMISSIONS.add(Manifest.permission.ACCESS_MEDIA_LOCATION); } /** Lock to protect internal data access */ @@ -2265,6 +2271,49 @@ public class PermissionManagerService extends IPermissionManager.Stub { return protectionLevel; } + /** + * If the app is updated, and has scoped storage permissions, then it is possible that the + * app updated in an attempt to get unscoped storage. If so, revoke all storage permissions. + * @param newPackage The new package that was installed + * @param oldPackage The old package that was updated + */ + private void revokeStoragePermissionsIfScopeExpanded( + @NonNull AndroidPackage newPackage, + @NonNull AndroidPackage oldPackage, + @NonNull PermissionCallback permissionCallback) { + boolean downgradedSdk = oldPackage.getTargetSdkVersion() >= Build.VERSION_CODES.Q + && newPackage.getTargetSdkVersion() < Build.VERSION_CODES.Q; + boolean upgradedSdk = oldPackage.getTargetSdkVersion() < Build.VERSION_CODES.Q + && newPackage.getTargetSdkVersion() >= Build.VERSION_CODES.Q; + boolean newlyRequestsLegacy = !upgradedSdk && !oldPackage.isRequestLegacyExternalStorage() + && newPackage.isRequestLegacyExternalStorage(); + + if (!newlyRequestsLegacy && !downgradedSdk) { + return; + } + + final int callingUid = Binder.getCallingUid(); + final int userId = UserHandle.getUserId(newPackage.getUid()); + int numRequestedPermissions = newPackage.getRequestedPermissions().size(); + for (int i = 0; i < numRequestedPermissions; i++) { + PermissionInfo permInfo = getPermissionInfo(newPackage.getRequestedPermissions().get(i), + newPackage.getPackageName(), 0); + if (permInfo == null || !STORAGE_PERMISSIONS.contains(permInfo.name)) { + continue; + } + + EventLog.writeEvent(0x534e4554, "171430330", newPackage.getUid(), + "Revoking permission " + permInfo.name + " from package " + + newPackage.getPackageName() + " as either the sdk downgraded " + + downgradedSdk + " or newly requested legacy full storage " + + newlyRequestsLegacy); + + revokeRuntimePermissionInternal(permInfo.name, newPackage.getPackageName(), + false, callingUid, userId, null, permissionCallback); + } + + } + /** * We might auto-grant permissions if any permission of the group is already granted. Hence if * the group of a granted permission changes we need to revoke it to avoid having permissions of @@ -4734,6 +4783,19 @@ public class PermissionManagerService extends IPermissionManager.Stub { @UserIdInt int userId) { return PermissionManagerService.this.isPermissionsReviewRequired(pkg, userId); } + /** + * If the app is updated, and has scoped storage permissions, then it is possible that the + * app updated in an attempt to get unscoped storage. If so, revoke all storage permissions. + * @param newPackage The new package that was installed + * @param oldPackage The old package that was updated + */ + public void revokeStoragePermissionsIfScopeExpanded( + @NonNull AndroidPackage newPackage, + @NonNull AndroidPackage oldPackage + ) { + PermissionManagerService.this.revokeStoragePermissionsIfScopeExpanded(newPackage, + oldPackage, mDefaultPermissionCallback); + } @Override public void revokeRuntimePermissionsIfGroupChanged( diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java index 31a65ba35f5eb..df0edfa16924b 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java @@ -265,6 +265,17 @@ public abstract class PermissionManagerServiceInternal extends PermissionManager @NonNull List permissionsToRevoke, @NonNull ArrayList allPackageNames); + /** + * If the app is updated, and has scoped storage permissions, then it is possible that the + * app updated in an attempt to get unscoped storage. If so, revoke all storage permissions. + * @param newPackage The new package that was installed + * @param oldPackage The old package that was updated + */ + public abstract void revokeStoragePermissionsIfScopeExpanded( + @NonNull AndroidPackage newPackage, + @NonNull AndroidPackage oldPackage + ); + /** * Add all permissions in the given package. *

From 8f5e00025778f3b34af9095edb173b0939e7f0b4 Mon Sep 17 00:00:00 2001 From: Tim Murray Date: Fri, 15 Jan 2021 13:22:48 -0800 Subject: [PATCH 153/288] CachedAppOptimizer: don't take AM lock when freezer is not enabled Freezing and unfreezing don't reqiure the AM lock when freezer is not enabled. Test: boot, no lock contention on unfreezeTemporarily Bug: 161866124 Change-Id: Ic650456aa8938db38b368042ce3f42fa43e7a130 Merged-In: Ic650456aa8938db38b368042ce3f42fa43e7a130 --- .../java/com/android/server/am/CachedAppOptimizer.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/am/CachedAppOptimizer.java b/services/core/java/com/android/server/am/CachedAppOptimizer.java index cb9271c6bf531..edd0c5b72c5e8 100644 --- a/services/core/java/com/android/server/am/CachedAppOptimizer.java +++ b/services/core/java/com/android/server/am/CachedAppOptimizer.java @@ -722,10 +722,12 @@ public final class CachedAppOptimizer { // This will ensure app will be out of the freezer for at least FREEZE_TIMEOUT_MS void unfreezeTemporarily(ProcessRecord app) { - synchronized (mAm) { - if (app.frozen) { - unfreezeAppLocked(app); - freezeAppAsync(app); + if (mUseFreezer) { + synchronized (mAm) { + if (app.frozen) { + unfreezeAppLocked(app); + freezeAppAsync(app); + } } } } From a3f107c0e81a115e22f193e5ddd4cfb5eacdabd2 Mon Sep 17 00:00:00 2001 From: Evan Rosky Date: Wed, 10 Feb 2021 16:08:29 -0800 Subject: [PATCH 154/288] Apply split-screen resize on sync queue This keeps it synchronized with dismissal and thus avoids a race between pending and sync transaction application Bug: 170801863 Test: launch a forced-multiwindow sizecompat app in split and then dismiss split to that app. App should not be cropped. Change-Id: I686605928ededcd5c5d032789fd883e17f437948 Merged-in: I4d89be443af5616174ea44e62774133e3b99597c --- .../src/com/android/systemui/stackdivider/DividerView.java | 4 ++-- .../android/systemui/stackdivider/WindowManagerProxy.java | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java index b6c6afd523b3a..be4009838fcc4 100644 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java +++ b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java @@ -618,7 +618,7 @@ public class DividerView extends FrameLayout implements OnTouchListener, mEntranceAnimationRunning = false; mExitAnimationRunning = false; if (!dismissed && !wasMinimizeInteraction) { - WindowManagerProxy.applyResizeSplits(snapTarget.position, mSplitLayout); + mWindowManagerProxy.applyResizeSplits(snapTarget.position, mSplitLayout); } if (mCallback != null) { mCallback.onDraggingEnd(); @@ -889,7 +889,7 @@ public class DividerView extends FrameLayout implements OnTouchListener, t.hide(sc).apply(); mTiles.releaseTransaction(t); int midPos = mSplitLayout.getSnapAlgorithm().getMiddleTarget().position; - WindowManagerProxy.applyResizeSplits(midPos, mSplitLayout); + mWindowManagerProxy.applyResizeSplits(midPos, mSplitLayout); } public void setMinimizedDockStack(boolean minimized, long animDuration, diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/WindowManagerProxy.java b/packages/SystemUI/src/com/android/systemui/stackdivider/WindowManagerProxy.java index 410e3dd39a0b2..e593db86bd12e 100644 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/WindowManagerProxy.java +++ b/packages/SystemUI/src/com/android/systemui/stackdivider/WindowManagerProxy.java @@ -37,7 +37,6 @@ import android.view.WindowManagerGlobal; import android.window.TaskOrganizer; import android.window.WindowContainerToken; import android.window.WindowContainerTransaction; -import android.window.WindowOrganizer; import com.android.internal.annotations.GuardedBy; import com.android.systemui.TransactionPool; @@ -112,10 +111,10 @@ public class WindowManagerProxy { mExecutor.execute(mSetTouchableRegionRunnable); } - static void applyResizeSplits(int position, SplitDisplayLayout splitLayout) { + void applyResizeSplits(int position, SplitDisplayLayout splitLayout) { WindowContainerTransaction t = new WindowContainerTransaction(); splitLayout.resizeSplits(position, t); - WindowOrganizer.applyTransaction(t); + applySyncTransaction(t); } private static boolean getHomeAndRecentsTasks(List out, From 1cff69d2c9b6f5c39830c6ce6e079217a9f22a7c Mon Sep 17 00:00:00 2001 From: Rafal Slawik Date: Thu, 11 Feb 2021 10:54:24 +0000 Subject: [PATCH 155/288] Do not keep the input array with CPU times CpuTimePerUidFreq puller kept the input array with CPU times to avoid copies, but that array is owned by the reader and is mutated for each callback invocation. This corrupted the aggregated data. Bug: 157535126 Test: cmd stats pull-source 10010 Test: atest CpuStatsTests Change-Id: Icda6a71f558e582c5d5b497e2cca1d84deed8b99 Merged-In: Icda6a71f558e582c5d5b497e2cca1d84deed8b99 --- .../stats/pull/StatsPullAtomService.java | 27 ++++++------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java index 96b53f0baa354..eb6b734807b09 100644 --- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java +++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java @@ -1565,9 +1565,6 @@ public class StatsPullAtomService extends SystemService { // Aggregate times for the same uids. SparseArray aggregated = new SparseArray<>(); mCpuUidFreqTimeReader.readAbsolute((uid, cpuFreqTimeMs) -> { - // For uids known to be aggregated from many entries allow mutating in place to avoid - // many copies. Otherwise, copy before aggregating. - boolean mutateInPlace = false; if (UserHandle.isIsolated(uid)) { // Skip individual isolated uids because they are recycled and quickly removed from // the underlying data source. @@ -1575,26 +1572,18 @@ public class StatsPullAtomService extends SystemService { } else if (UserHandle.isSharedAppGid(uid)) { // All shared app gids are accounted together. uid = LAST_SHARED_APPLICATION_GID; - mutateInPlace = true; - } else if (UserHandle.isApp(uid)) { - // Apps are accounted under their app id. + } else { + // Everything else is accounted under their base uid. uid = UserHandle.getAppId(uid); } long[] aggCpuFreqTimeMs = aggregated.get(uid); - if (aggCpuFreqTimeMs != null) { - if (!mutateInPlace) { - aggCpuFreqTimeMs = Arrays.copyOf(aggCpuFreqTimeMs, cpuFreqTimeMs.length); - aggregated.put(uid, aggCpuFreqTimeMs); - } - for (int freqIndex = 0; freqIndex < cpuFreqTimeMs.length; ++freqIndex) { - aggCpuFreqTimeMs[freqIndex] += cpuFreqTimeMs[freqIndex]; - } - } else { - if (mutateInPlace) { - cpuFreqTimeMs = Arrays.copyOf(cpuFreqTimeMs, cpuFreqTimeMs.length); - } - aggregated.put(uid, cpuFreqTimeMs); + if (aggCpuFreqTimeMs == null) { + aggCpuFreqTimeMs = new long[cpuFreqTimeMs.length]; + aggregated.put(uid, aggCpuFreqTimeMs); + } + for (int freqIndex = 0; freqIndex < cpuFreqTimeMs.length; ++freqIndex) { + aggCpuFreqTimeMs[freqIndex] += cpuFreqTimeMs[freqIndex]; } }); From 985d71551d9c756daf758c900b70cae5f2afdc7e Mon Sep 17 00:00:00 2001 From: Winson Date: Fri, 22 Jan 2021 11:24:33 -0800 Subject: [PATCH 156/288] Parcel queriesProviders in ParsingPackageImpl This was broken in the original migration, causing this field to be dropped on reboot. Bug: 178209505 Test: TODO, separate change will include comprehensive parceling test Change-Id: I67219fe00c7b92677391fd46305bf0424d74e5f3 (cherry picked from commit 00f69942be8edd0ee1e32c5f400e35eba6c8da58) --- core/java/android/content/pm/parsing/ParsingPackageImpl.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/java/android/content/pm/parsing/ParsingPackageImpl.java b/core/java/android/content/pm/parsing/ParsingPackageImpl.java index f932bc250e28e..2da93ca340194 100644 --- a/core/java/android/content/pm/parsing/ParsingPackageImpl.java +++ b/core/java/android/content/pm/parsing/ParsingPackageImpl.java @@ -98,6 +98,8 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable { public static ForInternedStringValueMap sForInternedStringValueMap = Parcelling.Cache.getOrCreate(ForInternedStringValueMap.class); public static ForStringSet sForStringSet = Parcelling.Cache.getOrCreate(ForStringSet.class); + public static ForInternedStringSet sForInternedStringSet = + Parcelling.Cache.getOrCreate(ForInternedStringSet.class); protected static ParsedIntentInfo.StringPairListParceler sForIntentInfoPairs = Parcelling.Cache.getOrCreate(ParsedIntentInfo.StringPairListParceler.class); @@ -1026,6 +1028,7 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable { dest.writeBoolean(this.forceQueryable); dest.writeParcelableList(this.queriesIntents, flags); sForInternedStringList.parcel(this.queriesPackages, dest, flags); + sForInternedStringSet.parcel(this.queriesProviders, dest, flags); dest.writeString(this.appComponentFactory); dest.writeString(this.backupAgentName); dest.writeInt(this.banner); @@ -1188,6 +1191,7 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable { this.forceQueryable = in.readBoolean(); this.queriesIntents = in.createTypedArrayList(Intent.CREATOR); this.queriesPackages = sForInternedStringList.unparcel(in); + this.queriesProviders = sForInternedStringSet.unparcel(in); this.appComponentFactory = in.readString(); this.backupAgentName = in.readString(); this.banner = in.readInt(); From 2628cf48a15acf1f1126d15ba9d1b3c43d934967 Mon Sep 17 00:00:00 2001 From: Fabian Kozynski Date: Thu, 11 Feb 2021 14:15:42 -0500 Subject: [PATCH 157/288] DO NOT MERGE Disable privacy indicators Test: manual Fixes: 180018342 Change-Id: Ia5057e23a9974ef8ff3652c50adc0216844a7099 --- .../systemui/privacy/PrivacyItemController.kt | 8 +- .../privacy/PrivacyItemControllerFlagsTest.kt | 219 ------------ .../privacy/PrivacyItemControllerTest.kt | 329 ------------------ 3 files changed, 2 insertions(+), 554 deletions(-) delete mode 100644 packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyItemControllerFlagsTest.kt delete mode 100644 packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyItemControllerTest.kt diff --git a/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItemController.kt b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItemController.kt index 59118bf3534e2..cd01cb703877a 100644 --- a/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItemController.kt +++ b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItemController.kt @@ -104,9 +104,9 @@ class PrivacyItemController @Inject constructor( uiExecutor.execute(notifyChanges) } - var allIndicatorsAvailable = isAllIndicatorsEnabled() + var allIndicatorsAvailable = false private set - var micCameraAvailable = isMicCameraEnabled() + var micCameraAvailable = false private set private val devicePropertiesChangedListener = @@ -158,10 +158,6 @@ class PrivacyItemController @Inject constructor( } init { - deviceConfigProxy.addOnPropertiesChangedListener( - DeviceConfig.NAMESPACE_PRIVACY, - uiExecutor, - devicePropertiesChangedListener) dumpManager.registerDumpable(TAG, this) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyItemControllerFlagsTest.kt b/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyItemControllerFlagsTest.kt deleted file mode 100644 index 4ba29e6e02a61..0000000000000 --- a/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyItemControllerFlagsTest.kt +++ /dev/null @@ -1,219 +0,0 @@ -/* - * Copyright (C) 2020 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.privacy - -import android.os.UserManager -import android.provider.DeviceConfig -import android.testing.AndroidTestingRunner -import androidx.test.filters.SmallTest -import com.android.internal.config.sysui.SystemUiDeviceConfigFlags -import com.android.systemui.SysuiTestCase -import com.android.systemui.appops.AppOpsController -import com.android.systemui.broadcast.BroadcastDispatcher -import com.android.systemui.dump.DumpManager -import com.android.systemui.util.DeviceConfigProxy -import com.android.systemui.util.DeviceConfigProxyFake -import com.android.systemui.util.concurrency.FakeExecutor -import com.android.systemui.util.time.FakeSystemClock -import org.junit.Assert.assertFalse -import org.junit.Assert.assertTrue -import org.junit.Before -import org.junit.Test -import org.junit.runner.RunWith -import org.mockito.ArgumentCaptor -import org.mockito.Mock -import org.mockito.Mockito -import org.mockito.Mockito.anyBoolean -import org.mockito.Mockito.atLeastOnce -import org.mockito.Mockito.never -import org.mockito.Mockito.verify -import org.mockito.MockitoAnnotations - -@RunWith(AndroidTestingRunner::class) -@SmallTest -class PrivacyItemControllerFlagsTest : SysuiTestCase() { - companion object { - fun capture(argumentCaptor: ArgumentCaptor): T = argumentCaptor.capture() - fun eq(value: T): T = Mockito.eq(value) ?: value - fun any(): T = Mockito.any() - - private const val ALL_INDICATORS = - SystemUiDeviceConfigFlags.PROPERTY_PERMISSIONS_HUB_ENABLED - private const val MIC_CAMERA = SystemUiDeviceConfigFlags.PROPERTY_MIC_CAMERA_ENABLED - } - - @Mock - private lateinit var appOpsController: AppOpsController - @Mock - private lateinit var callback: PrivacyItemController.Callback - @Mock - private lateinit var userManager: UserManager - @Mock - private lateinit var broadcastDispatcher: BroadcastDispatcher - @Mock - private lateinit var dumpManager: DumpManager - - private lateinit var privacyItemController: PrivacyItemController - private lateinit var executor: FakeExecutor - private lateinit var deviceConfigProxy: DeviceConfigProxy - - fun PrivacyItemController(): PrivacyItemController { - return PrivacyItemController( - appOpsController, - executor, - executor, - broadcastDispatcher, - deviceConfigProxy, - userManager, - dumpManager - ) - } - - @Before - fun setup() { - MockitoAnnotations.initMocks(this) - executor = FakeExecutor(FakeSystemClock()) - deviceConfigProxy = DeviceConfigProxyFake() - - privacyItemController = PrivacyItemController() - privacyItemController.addCallback(callback) - - executor.runAllReady() - } - - @Test - fun testNotListeningByDefault() { - assertFalse(privacyItemController.allIndicatorsAvailable) - assertFalse(privacyItemController.micCameraAvailable) - - verify(appOpsController, never()).addCallback(any(), any()) - } - - @Test - fun testMicCameraChanged() { - changeMicCamera(true) - executor.runAllReady() - - verify(callback).onFlagMicCameraChanged(true) - verify(callback, never()).onFlagAllChanged(anyBoolean()) - - assertTrue(privacyItemController.micCameraAvailable) - assertFalse(privacyItemController.allIndicatorsAvailable) - } - - @Test - fun testAllChanged() { - changeAll(true) - executor.runAllReady() - - verify(callback).onFlagAllChanged(true) - verify(callback, never()).onFlagMicCameraChanged(anyBoolean()) - - assertTrue(privacyItemController.allIndicatorsAvailable) - assertFalse(privacyItemController.micCameraAvailable) - } - - @Test - fun testBothChanged() { - changeAll(true) - changeMicCamera(true) - executor.runAllReady() - - verify(callback, atLeastOnce()).onFlagAllChanged(true) - verify(callback, atLeastOnce()).onFlagMicCameraChanged(true) - - assertTrue(privacyItemController.allIndicatorsAvailable) - assertTrue(privacyItemController.micCameraAvailable) - } - - @Test - fun testAll_listeningToAll() { - changeAll(true) - executor.runAllReady() - - verify(appOpsController).addCallback(eq(PrivacyItemController.OPS), any()) - } - - @Test - fun testMicCamera_listening() { - changeMicCamera(true) - executor.runAllReady() - - verify(appOpsController).addCallback(eq(PrivacyItemController.OPS), any()) - } - - @Test - fun testAll_listening() { - changeAll(true) - executor.runAllReady() - - verify(appOpsController).addCallback(eq(PrivacyItemController.OPS), any()) - } - - @Test - fun testAllFalse_notListening() { - changeAll(true) - executor.runAllReady() - changeAll(false) - executor.runAllReady() - - verify(appOpsController).removeCallback(any(), any()) - } - - @Test - fun testSomeListening_stillListening() { - changeAll(true) - changeMicCamera(true) - executor.runAllReady() - changeAll(false) - executor.runAllReady() - - verify(appOpsController, never()).removeCallback(any(), any()) - } - - @Test - fun testAllDeleted_stopListening() { - changeAll(true) - executor.runAllReady() - changeAll(null) - executor.runAllReady() - - verify(appOpsController).removeCallback(any(), any()) - } - - @Test - fun testMicDeleted_stopListening() { - changeMicCamera(true) - executor.runAllReady() - changeMicCamera(null) - executor.runAllReady() - - verify(appOpsController).removeCallback(any(), any()) - } - - private fun changeMicCamera(value: Boolean?) = changeProperty(MIC_CAMERA, value) - private fun changeAll(value: Boolean?) = changeProperty(ALL_INDICATORS, value) - - private fun changeProperty(name: String, value: Boolean?) { - deviceConfigProxy.setProperty( - DeviceConfig.NAMESPACE_PRIVACY, - name, - value?.toString(), - false - ) - } -} \ No newline at end of file diff --git a/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyItemControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyItemControllerTest.kt deleted file mode 100644 index 5c5df2639cdd9..0000000000000 --- a/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyItemControllerTest.kt +++ /dev/null @@ -1,329 +0,0 @@ -/* - * Copyright (C) 2020 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.privacy - -import android.app.ActivityManager -import android.app.AppOpsManager -import android.content.Intent -import android.content.pm.UserInfo -import android.os.UserHandle -import android.os.UserManager -import android.provider.DeviceConfig -import android.testing.AndroidTestingRunner -import android.testing.TestableLooper.RunWithLooper -import androidx.test.filters.SmallTest -import com.android.internal.config.sysui.SystemUiDeviceConfigFlags -import com.android.systemui.SysuiTestCase -import com.android.systemui.appops.AppOpItem -import com.android.systemui.appops.AppOpsController -import com.android.systemui.broadcast.BroadcastDispatcher -import com.android.systemui.dump.DumpManager -import com.android.systemui.util.DeviceConfigProxy -import com.android.systemui.util.DeviceConfigProxyFake -import com.android.systemui.util.concurrency.FakeExecutor -import com.android.systemui.util.time.FakeSystemClock -import org.hamcrest.Matchers.hasItem -import org.hamcrest.Matchers.not -import org.hamcrest.Matchers.nullValue -import org.junit.Assert.assertEquals -import org.junit.Assert.assertThat -import org.junit.Assert.assertTrue -import org.junit.Before -import org.junit.Test -import org.junit.runner.RunWith -import org.mockito.ArgumentCaptor -import org.mockito.ArgumentMatchers.anyInt -import org.mockito.ArgumentMatchers.anyList -import org.mockito.Captor -import org.mockito.Mock -import org.mockito.Mockito -import org.mockito.Mockito.atLeastOnce -import org.mockito.Mockito.doReturn -import org.mockito.Mockito.mock -import org.mockito.Mockito.never -import org.mockito.Mockito.reset -import org.mockito.Mockito.verify -import org.mockito.Mockito.verifyNoMoreInteractions -import org.mockito.MockitoAnnotations - -@RunWith(AndroidTestingRunner::class) -@SmallTest -@RunWithLooper -class PrivacyItemControllerTest : SysuiTestCase() { - - companion object { - val CURRENT_USER_ID = ActivityManager.getCurrentUser() - val TEST_UID = CURRENT_USER_ID * UserHandle.PER_USER_RANGE - const val TEST_PACKAGE_NAME = "test" - - private const val ALL_INDICATORS = - SystemUiDeviceConfigFlags.PROPERTY_PERMISSIONS_HUB_ENABLED - private const val MIC_CAMERA = SystemUiDeviceConfigFlags.PROPERTY_MIC_CAMERA_ENABLED - fun capture(argumentCaptor: ArgumentCaptor): T = argumentCaptor.capture() - fun eq(value: T): T = Mockito.eq(value) ?: value - fun any(): T = Mockito.any() - } - - @Mock - private lateinit var appOpsController: AppOpsController - @Mock - private lateinit var callback: PrivacyItemController.Callback - @Mock - private lateinit var userManager: UserManager - @Mock - private lateinit var broadcastDispatcher: BroadcastDispatcher - @Mock - private lateinit var dumpManager: DumpManager - @Captor - private lateinit var argCaptor: ArgumentCaptor> - @Captor - private lateinit var argCaptorCallback: ArgumentCaptor - - private lateinit var privacyItemController: PrivacyItemController - private lateinit var executor: FakeExecutor - private lateinit var deviceConfigProxy: DeviceConfigProxy - - fun PrivacyItemController(): PrivacyItemController { - return PrivacyItemController( - appOpsController, - executor, - executor, - broadcastDispatcher, - deviceConfigProxy, - userManager, - dumpManager - ) - } - - @Before - fun setup() { - MockitoAnnotations.initMocks(this) - executor = FakeExecutor(FakeSystemClock()) - deviceConfigProxy = DeviceConfigProxyFake() - - changeAll(true) - - doReturn(listOf(object : UserInfo() { - init { - id = CURRENT_USER_ID - } - })).`when`(userManager).getProfiles(anyInt()) - - privacyItemController = PrivacyItemController() - } - - @Test - fun testSetListeningTrueByAddingCallback() { - privacyItemController.addCallback(callback) - executor.runAllReady() - verify(appOpsController).addCallback(eq(PrivacyItemController.OPS), - any()) - verify(callback).onPrivacyItemsChanged(anyList()) - } - - @Test - fun testSetListeningFalseByRemovingLastCallback() { - privacyItemController.addCallback(callback) - executor.runAllReady() - verify(appOpsController, never()).removeCallback(any(), - any()) - privacyItemController.removeCallback(callback) - executor.runAllReady() - verify(appOpsController).removeCallback(eq(PrivacyItemController.OPS), - any()) - verify(callback).onPrivacyItemsChanged(emptyList()) - } - - @Test - fun testDistinctItems() { - doReturn(listOf(AppOpItem(AppOpsManager.OP_CAMERA, TEST_UID, "", 0), - AppOpItem(AppOpsManager.OP_CAMERA, TEST_UID, "", 1))) - .`when`(appOpsController).getActiveAppOpsForUser(anyInt()) - - privacyItemController.addCallback(callback) - executor.runAllReady() - verify(callback).onPrivacyItemsChanged(capture(argCaptor)) - assertEquals(1, argCaptor.value.size) - } - - @Test - fun testRegisterReceiver_allUsers() { - privacyItemController.addCallback(callback) - executor.runAllReady() - verify(broadcastDispatcher, atLeastOnce()).registerReceiver( - eq(privacyItemController.userSwitcherReceiver), any(), eq(null), eq(UserHandle.ALL)) - verify(broadcastDispatcher, never()) - .unregisterReceiver(eq(privacyItemController.userSwitcherReceiver)) - } - - @Test - fun testReceiver_ACTION_USER_FOREGROUND() { - privacyItemController.userSwitcherReceiver.onReceive(context, - Intent(Intent.ACTION_USER_SWITCHED)) - executor.runAllReady() - verify(userManager).getProfiles(anyInt()) - } - - @Test - fun testReceiver_ACTION_MANAGED_PROFILE_ADDED() { - privacyItemController.userSwitcherReceiver.onReceive(context, - Intent(Intent.ACTION_MANAGED_PROFILE_AVAILABLE)) - executor.runAllReady() - verify(userManager).getProfiles(anyInt()) - } - - @Test - fun testReceiver_ACTION_MANAGED_PROFILE_REMOVED() { - privacyItemController.userSwitcherReceiver.onReceive(context, - Intent(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE)) - executor.runAllReady() - verify(userManager).getProfiles(anyInt()) - } - - @Test - fun testAddMultipleCallbacks() { - val otherCallback = mock(PrivacyItemController.Callback::class.java) - privacyItemController.addCallback(callback) - executor.runAllReady() - verify(callback).onPrivacyItemsChanged(anyList()) - - privacyItemController.addCallback(otherCallback) - executor.runAllReady() - verify(otherCallback).onPrivacyItemsChanged(anyList()) - // Adding a callback should not unnecessarily call previous ones - verifyNoMoreInteractions(callback) - } - - @Test - fun testMultipleCallbacksAreUpdated() { - doReturn(emptyList()).`when`(appOpsController).getActiveAppOpsForUser(anyInt()) - - val otherCallback = mock(PrivacyItemController.Callback::class.java) - privacyItemController.addCallback(callback) - privacyItemController.addCallback(otherCallback) - executor.runAllReady() - reset(callback) - reset(otherCallback) - - verify(appOpsController).addCallback(any(), capture(argCaptorCallback)) - argCaptorCallback.value.onActiveStateChanged(0, TEST_UID, "", true) - executor.runAllReady() - verify(callback).onPrivacyItemsChanged(anyList()) - verify(otherCallback).onPrivacyItemsChanged(anyList()) - } - - @Test - fun testRemoveCallback() { - doReturn(emptyList()).`when`(appOpsController).getActiveAppOpsForUser(anyInt()) - val otherCallback = mock(PrivacyItemController.Callback::class.java) - privacyItemController.addCallback(callback) - privacyItemController.addCallback(otherCallback) - executor.runAllReady() - executor.runAllReady() - reset(callback) - reset(otherCallback) - - verify(appOpsController).addCallback(any(), capture(argCaptorCallback)) - privacyItemController.removeCallback(callback) - argCaptorCallback.value.onActiveStateChanged(0, TEST_UID, "", true) - executor.runAllReady() - verify(callback, never()).onPrivacyItemsChanged(anyList()) - verify(otherCallback).onPrivacyItemsChanged(anyList()) - } - - @Test - fun testListShouldNotHaveNull() { - doReturn(listOf(AppOpItem(AppOpsManager.OP_ACTIVATE_VPN, TEST_UID, "", 0), - AppOpItem(AppOpsManager.OP_COARSE_LOCATION, TEST_UID, "", 0))) - .`when`(appOpsController).getActiveAppOpsForUser(anyInt()) - privacyItemController.addCallback(callback) - executor.runAllReady() - executor.runAllReady() - - verify(callback).onPrivacyItemsChanged(capture(argCaptor)) - assertEquals(1, argCaptor.value.size) - assertThat(argCaptor.value, not(hasItem(nullValue()))) - } - - @Test - fun testListShouldBeCopy() { - val list = listOf(PrivacyItem(PrivacyType.TYPE_CAMERA, - PrivacyApplication("", TEST_UID))) - privacyItemController.privacyList = list - val privacyList = privacyItemController.privacyList - assertEquals(list, privacyList) - assertTrue(list !== privacyList) - } - - @Test - fun testNotListeningWhenIndicatorsDisabled() { - changeAll(false) - privacyItemController.addCallback(callback) - executor.runAllReady() - verify(appOpsController, never()).addCallback(eq(PrivacyItemController.OPS), - any()) - } - - @Test - fun testNotSendingLocationWhenOnlyMicCamera() { - changeAll(false) - changeMicCamera(true) - executor.runAllReady() - - doReturn(listOf(AppOpItem(AppOpsManager.OP_CAMERA, TEST_UID, "", 0), - AppOpItem(AppOpsManager.OP_COARSE_LOCATION, TEST_UID, "", 0))) - .`when`(appOpsController).getActiveAppOpsForUser(anyInt()) - - privacyItemController.addCallback(callback) - executor.runAllReady() - - verify(callback).onPrivacyItemsChanged(capture(argCaptor)) - - assertEquals(1, argCaptor.value.size) - assertEquals(PrivacyType.TYPE_CAMERA, argCaptor.value[0].privacyType) - } - - @Test - fun testNotUpdated_LocationChangeWhenOnlyMicCamera() { - doReturn(listOf(AppOpItem(AppOpsManager.OP_COARSE_LOCATION, TEST_UID, "", 0))) - .`when`(appOpsController).getActiveAppOpsForUser(anyInt()) - - privacyItemController.addCallback(callback) - changeAll(false) - changeMicCamera(true) - executor.runAllReady() - reset(callback) // Clean callback - - verify(appOpsController).addCallback(any(), capture(argCaptorCallback)) - argCaptorCallback.value.onActiveStateChanged( - AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME, true) - - verify(callback, never()).onPrivacyItemsChanged(any()) - } - - private fun changeMicCamera(value: Boolean?) = changeProperty(MIC_CAMERA, value) - private fun changeAll(value: Boolean?) = changeProperty(ALL_INDICATORS, value) - - private fun changeProperty(name: String, value: Boolean?) { - deviceConfigProxy.setProperty( - DeviceConfig.NAMESPACE_PRIVACY, - name, - value?.toString(), - false - ) - } -} \ No newline at end of file From 9a0b987af2a28892d04204c9df05281aa12f405a Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 11 Feb 2021 22:38:13 +0000 Subject: [PATCH 158/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ie1cbc3f141b21c2797464f00223bb5be3b5ae68f --- packages/SettingsLib/res/values-ky/arrays.xml | 16 ++++++++-------- packages/SettingsLib/res/values-ky/strings.xml | 6 +++--- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/SettingsLib/res/values-ky/arrays.xml b/packages/SettingsLib/res/values-ky/arrays.xml index f5e812dab9c97..3e65c45164c79 100644 --- a/packages/SettingsLib/res/values-ky/arrays.xml +++ b/packages/SettingsLib/res/values-ky/arrays.xml @@ -86,7 +86,7 @@ "карта14" - "Тутум тандаганды колдонуу (демейки)" + "Система тандаганды колдонуу (демейки)" "SBC" "AAC" "Qualcomm® aptX™ аудио" @@ -94,7 +94,7 @@ "LDAC" - "Тутум тандаганды колдонуу (демейки)" + "Система тандаганды колдонуу (демейки)" "SBC" "AAC" "Qualcomm® aptX™ аудио" @@ -102,38 +102,38 @@ "LDAC" - "Тутум тандаганды колдонуу (демейки)" + "Система тандаганды колдонуу (демейки)" "44,1 кГц" "48,0 кГц" "88,2 кГц" "96,0 кГц" - "Тутум тандаганды колдонуу (демейки)" + "Система тандаганды колдонуу (демейки)" "44,1 кГц" "48,0 кГц" "88,2 кГц" "96,0 кГц" - "Тутум тандаганды колдонуу (демейки)" + "Система тандаганды колдонуу (демейки)" "16 бит/үлгү" "24 бит/үлгү" "32 бит/үлгү" - "Тутум тандаганды колдонуу (демейки)" + "Система тандаганды колдонуу (демейки)" "16 бит/үлгү" "24 бит/үлгү" "32 бит/үлгү" - "Тутум тандаганды колдонуу (демейки)" + "Система тандаганды колдонуу (демейки)" "Моно" "Стерео" - "Тутум тандаганды колдонуу (демейки)" + "Система тандаганды колдонуу (демейки)" "Моно" "Стерео" diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml index ce5313061e2d8..82286ab72c29b 100644 --- a/packages/SettingsLib/res/values-ky/strings.xml +++ b/packages/SettingsLib/res/values-ky/strings.xml @@ -142,7 +142,7 @@ "Android OS" "Алынып салынган колдонмолор" "Өчүрүлгөн колдонмолор жана колдонуучулар" - "Тутум жаңыртуулары" + "Системанын жаңыртуулары" "USB модем" "Wi-Fi байланыш түйүнү" "Bluetooth модем" @@ -161,7 +161,7 @@ "Негизги тон" "Синтезделген кептин интонациясына таасирин тийгизет" "Тил" - "Тутум тилин колдонуу" + "Системанын тилин колдонуу" "Тил тандалган жок" "Текстти окуй турган тилди тандоо" "Үлгүнү угуу" @@ -478,7 +478,7 @@ "Кийинки" "Сырсөз талап кылынат" "Жигердүү киргизүү ыкмалары" - "Тутум тилдерин колдонуу" + "Системанын тилдерин колдонуу" "%1$s тууралоолору ачылган жок" "Бул киргизүү ыкмасы сиз терген бардык тексттер, сырсөздөр жана кредиттик карталар сыяктуу жеке маалыматтарды кошо чогултушу мүмкүн. Бул %1$s колдонмосу менен байланыштуу. Ушул киргизүү ыкма колдонулсунбу?" "Эскертүү: Өчүрүп-күйгүзгөндөн кийин, бул колдонмо телефондун кулпусу ачылмайынча иштебейт" From 6e1dc4f73597467f0895b9abe186dafd7ea23f2e Mon Sep 17 00:00:00 2001 From: Hall Liu Date: Mon, 27 Jan 2020 15:23:25 -0800 Subject: [PATCH 159/288] Allow empty tokens in strict grammar Allow empty tokens in SQLiteQueryBuilder's strict grammar enforcement Bug: 143230980 Test: atest SQLiteQueryBuilderTest, manual Change-Id: Ie82dded77a3eaa75095333b0e77f10e21c9f7caf (cherry picked from commit ea5b2c08df2e01139b8607f6bc0085bc70a17f1d) Merged-In: Ie82dded77a3eaa75095333b0e77f10e21c9f7caf --- core/java/android/provider/CallLog.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/core/java/android/provider/CallLog.java b/core/java/android/provider/CallLog.java index a0e92b398c4e9..276f16216b4de 100644 --- a/core/java/android/provider/CallLog.java +++ b/core/java/android/provider/CallLog.java @@ -98,6 +98,13 @@ public class CallLog { */ public static final String LIMIT_PARAM_KEY = "limit"; + /** + * Form of {@link #CONTENT_URI} which limits the query results to a single result. + */ + private static final Uri CONTENT_URI_LIMIT_1 = CONTENT_URI.buildUpon() + .appendQueryParameter(LIMIT_PARAM_KEY, "1") + .build(); + /** * Query parameter used to specify the starting record to return. *

@@ -932,11 +939,11 @@ public class CallLog { Cursor c = null; try { c = resolver.query( - CONTENT_URI, + CONTENT_URI_LIMIT_1, new String[] {NUMBER}, TYPE + " = " + OUTGOING_TYPE, null, - DEFAULT_SORT_ORDER + " LIMIT 1"); + DEFAULT_SORT_ORDER); if (c == null || !c.moveToFirst()) { return ""; } From 02b4a387aa85f3a084b22716c1221bc2b2ad9133 Mon Sep 17 00:00:00 2001 From: Hall Liu Date: Wed, 11 Mar 2020 15:15:42 -0700 Subject: [PATCH 160/288] Allow empty tokens in strict grammar In SQLiteQueryBuilder, allow empty tokens when checking for invalid tokens during the strict grammar check. Fixes: 151151800 Test: atest SQLiteQueryBuilderTest#testStrictQueryEmptyToken Change-Id: Iac1cdd643253fd186a164b863d65d6e92698fd38 (cherry picked from commit e409ec2492f47be9a0f3917bbbb324624eec7b5e) Merged-In: Iac1cdd643253fd186a164b863d65d6e92698fd38 --- core/java/android/database/sqlite/SQLiteQueryBuilder.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core/java/android/database/sqlite/SQLiteQueryBuilder.java b/core/java/android/database/sqlite/SQLiteQueryBuilder.java index 669d0466fdf2a..e9c59f55a418d 100644 --- a/core/java/android/database/sqlite/SQLiteQueryBuilder.java +++ b/core/java/android/database/sqlite/SQLiteQueryBuilder.java @@ -798,6 +798,7 @@ public class SQLiteQueryBuilder { } private void enforceStrictToken(@NonNull String token) { + if (TextUtils.isEmpty(token)) return; if (isTableOrColumn(token)) return; if (SQLiteTokenizer.isFunction(token)) return; if (SQLiteTokenizer.isType(token)) return; From 7f05371d11fc321eac54ae86f2c4dc9a5d86fc87 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 12 Feb 2021 01:22:37 -0800 Subject: [PATCH 161/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Iaf80e007e929c511d0af1afbfc6343debfbd3814 --- packages/SettingsLib/res/values-ky/arrays.xml | 16 ++++++++-------- packages/SettingsLib/res/values-ky/strings.xml | 6 +++--- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/SettingsLib/res/values-ky/arrays.xml b/packages/SettingsLib/res/values-ky/arrays.xml index f5e812dab9c97..3e65c45164c79 100644 --- a/packages/SettingsLib/res/values-ky/arrays.xml +++ b/packages/SettingsLib/res/values-ky/arrays.xml @@ -86,7 +86,7 @@ "карта14" - "Тутум тандаганды колдонуу (демейки)" + "Система тандаганды колдонуу (демейки)" "SBC" "AAC" "Qualcomm® aptX™ аудио" @@ -94,7 +94,7 @@ "LDAC" - "Тутум тандаганды колдонуу (демейки)" + "Система тандаганды колдонуу (демейки)" "SBC" "AAC" "Qualcomm® aptX™ аудио" @@ -102,38 +102,38 @@ "LDAC" - "Тутум тандаганды колдонуу (демейки)" + "Система тандаганды колдонуу (демейки)" "44,1 кГц" "48,0 кГц" "88,2 кГц" "96,0 кГц" - "Тутум тандаганды колдонуу (демейки)" + "Система тандаганды колдонуу (демейки)" "44,1 кГц" "48,0 кГц" "88,2 кГц" "96,0 кГц" - "Тутум тандаганды колдонуу (демейки)" + "Система тандаганды колдонуу (демейки)" "16 бит/үлгү" "24 бит/үлгү" "32 бит/үлгү" - "Тутум тандаганды колдонуу (демейки)" + "Система тандаганды колдонуу (демейки)" "16 бит/үлгү" "24 бит/үлгү" "32 бит/үлгү" - "Тутум тандаганды колдонуу (демейки)" + "Система тандаганды колдонуу (демейки)" "Моно" "Стерео" - "Тутум тандаганды колдонуу (демейки)" + "Система тандаганды колдонуу (демейки)" "Моно" "Стерео" diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml index ce5313061e2d8..82286ab72c29b 100644 --- a/packages/SettingsLib/res/values-ky/strings.xml +++ b/packages/SettingsLib/res/values-ky/strings.xml @@ -142,7 +142,7 @@ "Android OS" "Алынып салынган колдонмолор" "Өчүрүлгөн колдонмолор жана колдонуучулар" - "Тутум жаңыртуулары" + "Системанын жаңыртуулары" "USB модем" "Wi-Fi байланыш түйүнү" "Bluetooth модем" @@ -161,7 +161,7 @@ "Негизги тон" "Синтезделген кептин интонациясына таасирин тийгизет" "Тил" - "Тутум тилин колдонуу" + "Системанын тилин колдонуу" "Тил тандалган жок" "Текстти окуй турган тилди тандоо" "Үлгүнү угуу" @@ -478,7 +478,7 @@ "Кийинки" "Сырсөз талап кылынат" "Жигердүү киргизүү ыкмалары" - "Тутум тилдерин колдонуу" + "Системанын тилдерин колдонуу" "%1$s тууралоолору ачылган жок" "Бул киргизүү ыкмасы сиз терген бардык тексттер, сырсөздөр жана кредиттик карталар сыяктуу жеке маалыматтарды кошо чогултушу мүмкүн. Бул %1$s колдонмосу менен байланыштуу. Ушул киргизүү ыкма колдонулсунбу?" "Эскертүү: Өчүрүп-күйгүзгөндөн кийин, бул колдонмо телефондун кулпусу ачылмайынча иштебейт" From 57a62cee7c6c72cb119d6e4c98f4c5c06bc58ef3 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 12 Feb 2021 17:11:31 -0800 Subject: [PATCH 162/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I920db49c330b356d569f40a4d85303a67c15eb85 --- core/res/res/values-az/strings.xml | 8 ++++---- core/res/res/values-eu/strings.xml | 12 ++++++------ core/res/res/values-fa/strings.xml | 2 +- core/res/res/values-hi/strings.xml | 2 +- core/res/res/values-ja/strings.xml | 6 +++--- core/res/res/values-km/strings.xml | 2 +- core/res/res/values-ky/strings.xml | 10 +++++----- core/res/res/values-mn/strings.xml | 10 +++++----- core/res/res/values-ms/strings.xml | 8 ++++---- core/res/res/values-nl/strings.xml | 10 +++++----- 10 files changed, 35 insertions(+), 35 deletions(-) diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml index 1d5d6d87b2c52..36c293c491c6d 100644 --- a/core/res/res/values-az/strings.xml +++ b/core/res/res/values-az/strings.xml @@ -317,7 +317,7 @@ "Həyati əlamətlər haqqında sensor dataya daxil olun" "Pəncərənin məzmununu əldə edin" "Əlaqədə olduğunuz pəncərənin məzmununu nəzərdən keçirin." - "Toxunaraq Kəşf et funksiyasını yandırın" + "Toxunuşla öyrənmə funksiyasını aktiv edin" "Tıklanan hissələr səsləndiriləcək və ekran jestlərlə idarə oluna biləcək." "Yazdığınız mətni izləyin" "Kredit kartı nömrələri və parollar kimi şəxsi məlumatlar daxildir." @@ -1615,7 +1615,7 @@ "Android TV cihazını kiliddən çıxarmaq üçün %d dəfə yanlış cəhd etdiniz. Android TV cihazınız defolt fabrik dəyərlərinə sıfırlanacaq." "Siz telefonun kilidini açmaq üçün %d yanlış cəhd etmisiniz. Telefon artıq defolt zavod halına sıfırlanacaq." "Siz kilidi açmaq üçün şablonu %1$d dəfə səhv çəkdiniz. %2$d daha uğursuz cəhddən sonra planşetinizin kilidini e-poçt hesabınızla açmaq tələb olunacaq.\n\n %3$d saniyə ərzində bir daha yoxlayın." - "Kiliddən çıxarma modelini %1$d dəfə yanlış çəkdiniz. Daha %2$d yanlış cəhddən sonra Android TV cihazını e-poçt hesabınızla kiliddən çıxarmağınız tələb olunacaq.\n\n %3$d saniyə sonra yenidən cəhd edin." + "Kiliddən çıxarma modelini %1$d dəfə yanlış çəkdiniz. Daha %2$d yanlış cəhddən sonra Android TV cihazını e-poçt hesabınızla kiliddən çıxarmağınız tələb olunacaq.\n\n %3$d saniyə sonra cəhd edin." "Siz artıq modeli %1$d dəfə yanlış daxil etmisiniz.%2$d dəfə də yanlış daxil etsəniz, telefonun kilidinin açılması üçün elektron poçt ünvanınız tələb olunacaq.\n\n %3$d saniyə ərzində yenidən cəhd edin." " - " "Yığışdır" @@ -1623,10 +1623,10 @@ "Əlçatımlılıq Qısayolu istifadə edilsin?" "Qısayol aktiv olduqda, hər iki səs düyməsinə 3 saniyə basıb saxlamaqla əlçatımlılıq funksiyası başladılacaq." "Əlçatımlılıq funksiyaları aktiv edilsin?" - "Hər iki səs səviyyəsi düyməsinə bir neçə saniyə basıb saxladıqda əlçatımlılıq funksiyaları aktiv olur. Bu, cihazınızın işləmə qaydasını dəyişə bilər.\n\nCari funksiyalar:\n%1$s\nAyarlar və Əlçatımlılıq bölməsində seçilmiş funksiyaları dəyişə bilərsiniz." + "Hər iki səs səviyyəsi düyməsinə bir neçə saniyə basıb saxladıqda əlçatımlılıq funksiyaları aktiv olur. Cihazınızın işləmə qaydasını dəyişə bilər.\n\nCari funksiyalar:\n%1$s\nAyarlar və Əlçatımlılıq bölməsində seçilmiş funksiyaları dəyişə bilərsiniz." " • %1$s\n" "%1$s aktiv edilsin?" - "Hər iki səs səviyyəsi düyməsinə bir neçə saniyə basıb saxladıqda əlçatımlılıq funksiyası olan %1$s aktiv olur. Bu, cihazınızın işləmə qaydasını dəyişə bilər.\n\nAyarlar və Əlçatımlılıq bölməsində bu qısayolu başqa bir funksiyata dəyişə bilərsiniz." + "Hər iki səs səviyyəsi düyməsinə bir neçə saniyə basıb saxladıqda əlçatımlılıq funksiyası olan %1$s aktiv olur. Cihazınızın işləmə qaydasını dəyişə bilər.\n\nAyarlar və Əlçatımlılıq bölməsində bu qısayolu başqa bir funksiyaya dəyişə bilərsiniz." "Aktiv edin" "Aktiv etməyin" "AKTİV" diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index b69c08ddfbe5c..15e9548fa3b9a 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -93,7 +93,7 @@ "Datu-konexioaren egoera" "SMS mezuak" "Erantzungailuko mezuak" - "Wi-Fi bidezko deiak" + "Wifi bidezko deiak" "SIMaren egoera" "SIM txartelaren lehentasun handiko jakinarazpenak" "Beste gailuak TTY osagarria FULL moduan erabiltzea eskatu du" @@ -122,23 +122,23 @@ "Ibiltaritzari buruzko jakinarazpena aktibatuta" "Ibiltaritzari buruzko jakinarazpena desaktibatuta" "Zerbitzu bila" - "Ezin izan dira konfiguratu Wi‑Fi bidezko deiak" + "Ezin izan dira konfiguratu wifi bidezko deiak" - "Wi-Fi bidez deiak egiteko eta mezuak bidaltzeko, eskatu operadoreari zerbitzu hori gaitzeko. Ondoren, aktibatu Wi-Fi bidezko deiak Ezarpenak atalean. (Errore-kodea: %1$s)" + "Wifi bidez deiak egiteko eta mezuak bidaltzeko, eskatu operadoreari zerbitzu hori gaitzeko. Ondoren, aktibatu Wifi bidezko deiak Ezarpenak atalean. (Errore-kodea: %1$s)" - "Arazo bat izan da Wi‑Fi bidezko deiak zure operadorearekin erregistratzean: %1$s" + "Arazo bat izan da wifi bidezko deiak zure operadorearekin erregistratzean: %1$s" - "%s Wi-Fi bidezko deiak" + "%s operadorearen wifi bidezko deiak" "%s operadorearen wifi bidezko deiak" "WLAN bidezko deia" "%s WLAN bidezko deia" "%s wifia" "Wi-Fi bidezko deiak | %s" "%s VoWifi" - "Wi-Fi bidezko deiak" + "Wifi bidezko deiak" "Wifia" "Wi-Fi bidezko deiak" "VoWifi" diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 03a1456d00c56..737bb8f18b8b2 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -1423,7 +1423,7 @@ "شنونده اعلان" "‏شنونده VR" "ارائه‌دهنده وضعیت" - "سرویس رتبه‌بندی اعلان" + "سرویس رده‌بندی اعلان" "‏VPN فعال شد" "‏VPN را %s فعال کرده است" "برای مدیریت شبکه ضربه بزنید." diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 86af9a7186877..cd307dfb9d40e 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -295,7 +295,7 @@ "प्रोफ़ाइल बदलकर वर्क प्रोफ़ाइल पर जाएं" "संपर्क" "अपने संपर्कों को ऐक्सेस करने की" - "जगह" + "जगह की जानकारी" "इस डिवाइस की जगह तक पहुंचने दें" "कैलेंडर" "अपने कैलेंडर को ऐक्सेस करने" diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index 44c901cebacc3..78927ca0995f5 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -2040,9 +2040,9 @@ "電源ダイアログ" "ロック画面" "スクリーンショット" - "画面上のユーザー補助のショートカット" - "画面上のユーザー補助のショートカットの選択メニュー" - "ユーザー補助のショートカット" + "画面上のユーザー補助機能のショートカット" + "画面上のユーザー補助機能のショートカットの選択メニュー" + "ユーザー補助機能のショートカット" "%1$s のキャプション バーです。" "%1$s は RESTRICTED バケットに移動しました。" "%1$s:" diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml index 43f0a1ce43bce..95b253f25d78c 100644 --- a/core/res/res/values-km/strings.xml +++ b/core/res/res/values-km/strings.xml @@ -1093,7 +1093,7 @@ "កាត់" "ចម្លង" "មិនអាច​ចម្លងទៅ​អង្គចងចាំទេ" - "បិទ​ភ្ជាប់" + "ដាក់ចូល" "បិទភ្ជាប់ជាអត្ថបទធម្មតា" "ជំនួស..." "លុប" diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index d9ea68602cf42..a76ded2155556 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -290,7 +290,7 @@ "Батареянын кубаты жана трафиктин көлөмү жөнүндө билүү үчүн таптап коюңуз" "%1$s, %2$s" "Коопсуз режим" - "Android тутуму" + "Android системасы" "Жеке профилге которулуу" "Жумуш профилине которулуу" "Байланыштар" @@ -324,7 +324,7 @@ "Көрүнүштү чоңойтуп кичирейтет" "Экрандагы сүрөттү тууралап жайгаштырып, өлчөмүн өзгөртөт." "Жаңсоолорду аткаруу" - "Таптап, серпип, чымчып жана башка жаңсоолорду аткара алат." + "Таптап, сүрүп, чымчып жана башка жаңсоолорду аткара алат." "Манжа изинин жаңсоолору" "Түзмөктөгү манжа изинин сенсорунда жасалган жаңсоолорду жаздырып алат." "Скриншот тартып алуу" @@ -871,7 +871,7 @@ "Сиз телефонду бөгөттөн чыгарууга %d жолу туура эмес аракет кылдыңыз. Телефон баштапкы абалына келтирилет." "%d секунддан кийин кайталаңыз." "Сүрөт үлгүсүн унутуп калдыңызбы?" - "Каттоо эсеби менен кулпусун ачуу" + "Аккаунт менен кулпусун ачуу" "Өтө көп үлгү киргизүү аракети болду" "Бөгөттөн чыгарыш үчүн, Google эсебиңиз менен кириңиз." "Колдонуучунун аты (электрондук почта)" @@ -1654,8 +1654,8 @@ "Үндү катуулатуу/акырындатуу баскычтары басылып, %1$s өчүрүлдү." "%1$s кызматын колдонуу үчүн үнүн чоңойтуп/кичирейтүү баскычтарын үч секунд коё бербей басып туруңуз" "Атайын мүмкүнчүлүктөр баскычын таптаганыңызда иштей турган функцияны тандаңыз:" - "Атайын мүмкүнчүлүктөр жаңсоосу үчүн функцияны тандаңыз (эки манжаңыз менен экрандын ылдый жагынан өйдө карай сүрүңүз):" - "Атайын мүмкүнчүлүктөр жаңсоосу аркылуу иштетиле турган функцияны тандаңыз (үч манжаңыз менен экрандын ылдый жагынан өйдө карай сүрүңүз):" + "Атайын мүмкүнчүлүктөр жаңсоосу үчүн функцияны тандаңыз (эки манжаңыз менен экранды ылдыйдан өйдө сүрүңүз):" + "Атайын мүмкүнчүлүктөр жаңсоосу аркылуу иштетиле турган функцияны тандаңыз (үч манжаңыз менен экранды ылдыйдан өйдө сүрүңүз):" "Функцияларды которуштуруу үчүн, Атайын мүмкүнчүлүктөр баскычын басып, кармап туруңуз." "Функцияларды которуштуруу үчүн, эки манжаңыз менен өйдө сүрүп, кармап туруңуз." "Башка функцияга которулуу үчүн үч манжаңыз менен экранды өйдө сүрүп, кармап туруңуз." diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml index 5034c4239d1d3..ed77e86a2ad16 100644 --- a/core/res/res/values-mn/strings.xml +++ b/core/res/res/values-mn/strings.xml @@ -317,7 +317,7 @@ "таны биеийн байдлын талаарх мэдрэгч бүхий өгөгдөлд нэвтрэх" "Цонхны агуулгыг авах" "Таны харилцан үйлчлэх цонхны контентоос шалгах." - "Хүрч танихыг асаах" + "Хүрэлтээр сонсохыг асаах" "Товшсон зүйлсийг чангаар хэлэх ба дэлгэцийг дохио ашиглан таних боломжтой." "Бичсэн текстээ ажиглах" "Кредит картын дугаар болон нууц үг зэрэг хувийн датаг агуулж байна." @@ -987,9 +987,9 @@ "Асуулгыг цэвэрлэх" "Асуулгыг илгээх" "Дуут хайлт" - "Хүрч хайх функцийг идэвхтэй болгох уу?" - "%1$s нь Хүрч танихыг идэвхжүүлэхийг шаардаж байна. Хүрч таних идэвхжсэн үед та хуруун доороо юу байгааг сонсох, тайлбарыг харах боломжтой ба таблеттайгаа дохиогоор харилцах боломжтой." - "%1$s нь Хүрч танихыг идэвхжүүлэхийг шаардаж байна. Хүрч таних идэвхжсэн тохиолдолд та хуруун доороо юу байгааг сонсох, тайлбарыг харах боломжтой ба утастайгаа дохиогоор харилцах боломжтой." + "Хүрэлтээр сонсохыг идэвхжүүлэх үү?" + "%1$s нь Хүрэлтээр сонсохыг идэвхжүүлэхийг шаардаж байна. Хүрэлтээр сонсох идэвхжсэн үед та хуруун доороо юу байгааг сонсох, тайлбарыг харах боломжтой ба таблеттайгаа дохиогоор харилцах боломжтой." + "%1$s нь Хүрэлтээр сонсохыг идэвхжүүлэхийг шаардаж байна. Хүрэлтээр сонсох идэвхжсэн тохиолдолд та хуруун доороо юу байгааг сонсох, тайлбарыг харах боломжтой ба утастайгаа дохиогоор харилцах боломжтой." "1 сарын өмнө" "1 сарын өмнө" @@ -1856,7 +1856,7 @@ "Мэдэгдсэн" "Дэлгэх" "Буулгах" - "унтраах/асаах өргөтгөл" + "асаах/унтраах өргөтгөл" "Андройд USB Peripheral Port" "Android" "USB Peripheral Port" diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml index f715dc60459fe..f8efcfd5216a9 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -317,7 +317,7 @@ "akses data penderia tentang tanda vital anda" "Dapatkan kembali kandungan tetingkap" "Periksa kandungan tetingkap yang berinteraksi dengan anda." - "Hidupkan Jelajah melalui Sentuhan" + "Hidupkan Teroka melalui Sentuhan" "Item yang diketik akan dituturkan dengan lantang dan skrin boleh dijelajah menggunakan gerak isyarat." "Perhatikan teks yang anda taip" "Termasuk data peribadi seperti nombor kad kredit dan kata laluan." @@ -987,9 +987,9 @@ "Pertanyaan jelas" "Serah pertanyaan" "Carian suara" - "Dayakan Jelajah melalui Sentuhan?" - "%1$s ingin mendayakan Jelajah melalui Sentuhan. Apabila Jelajah melalui Sentuhan didayakan, anda boleh mendengar atau melihat penerangan tentang apa di bawah jari anda atau melakukan gerak isyarat untuk berinteraksi dengan tablet." - "%1$s ingin mendayakan Jelajah melalui Sentuhan. Apabila Jelajah melalui Sentuhan didayakan, anda boleh mendengar atau melihat penerangan tentang apa di bawah jari anda atau melakukan gerak isyarat untuk berinteraksi dengan telefon." + "Dayakan Teroka melalui Sentuhan?" + "%1$s ingin mendayakan Teroka melalui Sentuhan. Apabila Teroka melalui Sentuhan didayakan, anda boleh mendengar atau melihat penerangan tentang apa-apa di bawah jari anda atau melakukan gerak isyarat untuk berinteraksi dengan tablet." + "%1$s ingin mendayakan Teroka melalui Sentuhan. Apabila Teroka melalui Sentuhan didayakan, anda boleh mendengar atau melihat penerangan tentang apa-apa di bawah jari anda atau melakukan gerak isyarat untuk berinteraksi dengan telefon." "1 bulan yang lalu" "Sebelum 1 bulan yang lalu" diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 594ea618e2a78..c226b58fa1ab9 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -501,9 +501,9 @@ "Hiermee kan de app pakketten ontvangen die via multicastadressen naar alle apparaten in een wifi-netwerk worden verzonden, niet alleen naar je Android TV-apparaat. Het stroomgebruik ligt hierbij hoger dan in de niet-multicastmodus." "Hiermee kan de app pakketten ontvangen die via multicastadressen naar alle apparaten in een wifi-netwerk worden verzonden, niet alleen naar je telefoon. Het stroomgebruik ligt hierbij hoger dan in de niet-multicastmodus." "Bluetooth-instellingen openen" - "Hiermee kan de app de lokale bluetooth-tablet configureren en externe apparaten zoeken en koppelen." - "Hiermee kan de app Bluetooth op je Android TV-apparaat configureren en externe apparaten zoeken en koppelen." - "Hiermee kan de app de lokale bluetooth-telefoon configureren en externe apparaten zoeken en koppelen." + "Hiermee kan de app de lokale bluetooth-tablet instellen en externe apparaten zoeken en koppelen." + "Hiermee kan de app Bluetooth op je Android TV-apparaat isntellen en externe apparaten zoeken en koppelen." + "Hiermee kan de app de lokale bluetooth-telefoon instellen en externe apparaten zoeken en koppelen." "WiMAX-verbinding maken en verbreken" "Hiermee kan de app bepalen of WiMAX is ingeschakeld en informatie bekijken over alle WiMAX-netwerken waarmee verbinding is gemaakt." "WiMAX-status wijzigen" @@ -1329,7 +1329,7 @@ "Invoermethode selecteren" "Dit op het scherm weergeven terwijl het fysieke toetsenbord actief is" "Virtueel toetsenbord tonen" - "Fysiek toetsenbord configureren" + "Fysiek toetsenbord instellen" "Tik om een taal en indeling te selecteren" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" @@ -1352,7 +1352,7 @@ "Je moet het apparaat misschien opnieuw formatteren. Tik om het uit te werpen." "%s niet ondersteund" "%s werkt niet" - "Dit apparaat biedt geen ondersteuning voor deze %s. Tik om te configureren in een ondersteunde indeling." + "Dit apparaat biedt geen ondersteuning voor deze %s. Tik om in te stellen in een ondersteunde indeling." "Dit apparaat biedt geen ondersteuning voor deze %s. Selecteer om in te stellen in een ondersteunde indeling." "Je moet het apparaat misschien opnieuw formatteren" "%s is onverwacht verwijderd" From c26eaefedae7ea93f8616bb13c23667cbbc23907 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 13 Feb 2021 01:40:28 -0800 Subject: [PATCH 163/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I5a5b6676a580376ae20dc1713886f56d830760bd --- packages/PrintSpooler/res/values-fa/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/PrintSpooler/res/values-fa/strings.xml b/packages/PrintSpooler/res/values-fa/strings.xml index 719fc92194507..e69ca7664b535 100644 --- a/packages/PrintSpooler/res/values-fa/strings.xml +++ b/packages/PrintSpooler/res/values-fa/strings.xml @@ -50,8 +50,8 @@ "جستجو" "همه چاپگرها" "افزودن سرویس" - "کادر جستجو نمایان شد" - "کادر جستجو پنهان شد" + "چارگوش جستجو نمایان شد" + "چارگوش جستجو پنهان شد" "افزودن چاپگر" "انتخاب چاپگر" "فراموش کردن چاپگر" From de10e134506c893cf7ce824471452c0f0dad81eb Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 13 Feb 2021 03:16:31 -0800 Subject: [PATCH 164/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Id49401c227b5707affd6b07b90f79690e4384ea4 --- packages/Shell/res/values-ky/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/Shell/res/values-ky/strings.xml b/packages/Shell/res/values-ky/strings.xml index 3567ac276e635..d73ee2fdb4e93 100644 --- a/packages/Shell/res/values-ky/strings.xml +++ b/packages/Shell/res/values-ky/strings.xml @@ -25,7 +25,7 @@ "Мүчүлүштүктөр жөнүндө кабар жакында телефонго чыгат" "Мүчүлүштүк тууралуу кабарды жөнөтүү үчүн таптап коюңуз" "Мүчүлүштүк тууралуу билдирүүңүздү бөлүшүү үчүн таптап коюңуз" - "Мүчүлүштүк тууралуу кабарды скриншотсуз жөнөтүү үчүн солго серпиңиз же скриншот даяр болгуча күтүңүз" + "Мүчүлүштүк тууралуу кабарды скриншотсуз жөнөтүү үчүн солго сүрүңүз же скриншот даяр болгуча күтүңүз" "Мүчүлүштүк тууралуу билдирүүңүздү скриншотсуз бөлүшүү үчүн таптап коюңуз же скриншот даяр болгуча күтө туруңуз" "Мүчүлүштүк тууралуу билдирүүңүздү скриншотсуз бөлүшүү үчүн таптап коюңуз же скриншот даяр болгуча күтө туруңуз" "Мүчүлүштүктөр тууралуу билдирүүлөрдө тутумдун ар кандай таржымалдарынан алынган дайындар, ошондой эле купуя маалымат камтылышы мүмкүн (мисалы, жайгашкан жер сыяктуу). Мындай билдирүүлөрдү бир гана ишеничтүү адамдар жана колдонмолор менен бөлүшүңүз." From a6d7c030defced3333e6a4088d4f1265f6951f4c Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 13 Feb 2021 03:48:46 -0800 Subject: [PATCH 165/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I5dbcafcca06381b60c05cfdb2ee0b745c88a8b57 --- packages/SystemUI/res/values-eu/strings.xml | 4 ++-- packages/SystemUI/res/values-ky/strings.xml | 10 +++++----- packages/SystemUI/res/values-mn/strings.xml | 2 +- packages/SystemUI/res/values-nl/strings.xml | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index 1b0b931540c42..e59074c9ebed6 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -918,8 +918,8 @@ "Ez baduzu nahi %s zerbitzuak eginbide hori erabiltzea, sakatu hau ezarpenak ireki eta aukera desaktibatzeko." "Erreproduzitu" "Pausatu" - "Saltatu hurrengora" - "Saltatu aurrekora" + "Joan hurrengora" + "Joan aurrekora" "Aldatu tamaina" "Beroegi egoteagatik itzali da" "Ohi bezala ari da funtzionatzen telefonoa orain.\nInformazio gehiago lortzeko, sakatu hau." diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index 27f144a03481e..616cda92274a7 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -92,7 +92,7 @@ "Экрандан жаздырылып алынган видео иштетилүүдө" "Экранды жаздыруу сеансы боюнча учурдагы билдирме" "Жаздырып баштайсызбы?" - "Жаздыруу учурунда Android тутуму экраныңызда көрүнүп турган жана түзмөктө ойноп жаткан бардык купуя маалыматты жаздырып алат. Буга сырсөздөр, төлөм маалыматы, сүрөттөр, билдирүүлөр жана аудио файлдар кирет." + "Жаздыруу учурунда Android системасы экраныңызда көрүнүп турган жана түзмөктө ойноп жаткан бардык купуя маалыматты жаздырып алат. Буга сырсөздөр, төлөм маалыматы, сүрөттөр, билдирүүлөр жана аудио файлдар кирет." "Аудио жаздыруу" "Түзмөктүн аудиосу" "Музыка, чалуулар жана шыңгырлар сыяктуу түзмөгүңүздөгү добуштар" @@ -434,7 +434,7 @@ "Баштадык" "Токтотуу" "Түзмөк" - "Башка колдонмого которулуу үчүн,, өйдө сүрүңүз" + "Башка колдонмого которулуу үчүн өйдө сүрүңүз" "Колдонмолорду тез которуштуруу үчүн, оңго сүйрөңүз" "Сереп салууну өчүрүү/күйгүзүү" "Кубатталды" @@ -457,9 +457,9 @@ "Кайталоо үчүн экранды өйдө сүрүңүз" "Бул түзмөк уюмуңузга таандык" "Бул түзмөк төмөнкүгө таандык: %s" - "Сүрөтчөнү серпип телефонго өтүңүз" - "Сүрөтчөнү серпип үн жардамчысына өтүңүз" - "Сүрөтчөнү серпип камерага өтүңүз" + "Сүрөтчөнү сүрүп телефонго өтүңүз" + "Сүрөтчөнү сүрүп үн жардамчысына өтүңүз" + "Сүрөтчөнү сүрүп камерага өтүңүз" "Толук жымжырттык талап кылынат. Бул экрандагыны окугучтарды да тынчтандырат." "Тымтырс" "Шашылыш билдирүүлөр гана" diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index 8c8e5d117babc..9befbcb18e7ff 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -434,7 +434,7 @@ "Төхөөрөмж" "Апп сэлгэхийн тулд дээш шударна уу" "Аппуудыг хурдан сэлгэхийн тулд баруун тийш чирнэ үү" - "Тоймыг унтраах/асаах" + "Тоймыг асаах/унтраах" "Цэнэглэгдсэн" "Цэнэглэж байна" "дүүргэхэд %s" diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index c6772f500ee8e..b721369c8a7d5 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -722,7 +722,7 @@ "Geen recente bubbels" "Recente bubbels en gesloten bubbels worden hier weergegeven" "Deze meldingen kunnen niet worden aangepast." - "Deze groep meldingen kan hier niet worden geconfigureerd" + "Deze groep meldingen kan hier niet worden ingesteld" "Melding via proxy" "Alle meldingen van %1$s" "Meer weergeven" From 603f3ee7215e78c30cf024de4b4cb6548360be92 Mon Sep 17 00:00:00 2001 From: Rubin Xu Date: Sun, 14 Feb 2021 19:14:40 +0000 Subject: [PATCH 166/288] add MANAGE_CREDENTIALS appop This is part of the work to support a credential management app on unmanaged devices. Bug: 179180345 Test: atest android.appsecurity.cts.AppOpsTest Merged-In: Ifd87b5e38f341db4b34bf9f61480e29e49148846 Change-Id: Ifd87b5e38f341db4b34bf9f61480e29e49148846 --- core/java/android/app/AppOpsManager.java | 26 ++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index 87aa12bc0be5c..62f0946ce508e 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -1139,9 +1139,16 @@ public class AppOpsManager { // TODO: Add as AppProtoEnums public static final int OP_RECORD_AUDIO_HOTWORD = 102; + /** + * Manage credentials in the system KeyChain. + * + * @hide + */ + public static final int OP_MANAGE_CREDENTIALS = AppProtoEnums.APP_OP_MANAGE_CREDENTIALS; + /** @hide */ - @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) - public static final int _NUM_OP = 104; + @UnsupportedAppUsage + public static final int _NUM_OP = 105; /** Access to coarse location information. */ public static final String OPSTR_COARSE_LOCATION = "android:coarse_location"; @@ -1488,6 +1495,13 @@ public class AppOpsManager { */ public static final String OPSTR_RECORD_AUDIO_HOTWORD = "android:record_audio_hotword"; + /** + * Manage credentials in the system KeyChain. + * + * @hide + */ + public static final String OPSTR_MANAGE_CREDENTIALS = "android:manage_credentials"; + /** {@link #sAppOpsToNote} not initialized yet for this op */ private static final byte SHOULD_COLLECT_NOTE_OP_NOT_INITIALIZED = 0; /** Should not collect noting of this app-op in {@link #sAppOpsToNote} */ @@ -1682,6 +1696,7 @@ public class AppOpsManager { OP_PHONE_CALL_CAMERA, // OP_PHONE_CALL_CAMERA OP_RECORD_AUDIO_HOTWORD, // RECORD_AUDIO_HOTWORD OP_MANAGE_ONGOING_CALLS, // MANAGE_ONGOING_CALLS + OP_MANAGE_CREDENTIALS, // MANAGE_CREDENTIALS }; /** @@ -1792,6 +1807,7 @@ public class AppOpsManager { OPSTR_PHONE_CALL_CAMERA, OPSTR_RECORD_AUDIO_HOTWORD, OPSTR_MANAGE_ONGOING_CALLS, + OPSTR_MANAGE_CREDENTIALS, }; /** @@ -1903,6 +1919,7 @@ public class AppOpsManager { "PHONE_CALL_CAMERA", "RECORD_AUDIO_HOTWORD", "MANAGE_ONGOING_CALLS", + "MANAGE_CREDENTIALS", }; /** @@ -2015,6 +2032,7 @@ public class AppOpsManager { null, // no permission for OP_PHONE_CALL_CAMERA null, // no permission for OP_RECORD_AUDIO_HOTWORD Manifest.permission.MANAGE_ONGOING_CALLS, + null, // no permission for OP_MANAGE_CREDENTIALS }; /** @@ -2127,6 +2145,7 @@ public class AppOpsManager { null, // PHONE_CALL_MICROPHONE null, // RECORD_AUDIO_HOTWORD null, // MANAGE_ONGOING_CALLS + null, // MANAGE_CREDENTIALS }; /** @@ -2238,6 +2257,7 @@ public class AppOpsManager { null, // PHONE_CALL_CAMERA null, // RECORD_AUDIO_HOTWORD null, // MANAGE_ONGOING_CALLS + null, // MANAGE_CREDENTIALS }; /** @@ -2348,6 +2368,7 @@ public class AppOpsManager { AppOpsManager.MODE_ALLOWED, // PHONE_CALL_CAMERA AppOpsManager.MODE_ALLOWED, // OP_RECORD_AUDIO_HOTWORD AppOpsManager.MODE_DEFAULT, // MANAGE_ONGOING_CALLS + AppOpsManager.MODE_DEFAULT, // MANAGE_CREDENTIALS }; /** @@ -2462,6 +2483,7 @@ public class AppOpsManager { false, // PHONE_CALL_CAMERA false, // RECORD_AUDIO_HOTWORD true, // MANAGE_ONGOING_CALLS + false, // MANAGE_CREDENTIALS }; /** From 6021f3f5bc4fe725056f355c44bf992f115e250a Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 15 Feb 2021 07:55:29 -0800 Subject: [PATCH 167/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ic41c36cbc0349642d9bdda7f72c8a3d17de9648c --- packages/SystemUI/res-product/values-az/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/SystemUI/res-product/values-az/strings.xml b/packages/SystemUI/res-product/values-az/strings.xml index ee86ae23d48f1..c0668dbcea07f 100644 --- a/packages/SystemUI/res-product/values-az/strings.xml +++ b/packages/SystemUI/res-product/values-az/strings.xml @@ -38,8 +38,8 @@ "Telefonun kilidini açmaq üçün %1$d dəfə yanlış cəhd etmisiniz. Daha %2$d uğursuz cəhddən sonra iş profili silinəcək və bütün profil datası ləğv ediləcək." "Planşetin kilidini açmaq üçün %d dəfə yanlış cəhd etmisiniz. İş profili silinəcək və bütün data ləğv ediləcək." "Telefonun kilidini açmaq üçün %d dəfə yanlış cəhd etmisiniz. İş profili silinəcək və bütün data ləğv ediləcək." - "Kilid açma modelini %1$d dəfə yanlış çəkmisiniz. Daha %2$d uğursuz cəhddən sonra planşet kilidini e-poçt hesabınızla açmaq tələb olunacaq.\n\n %3$d saniyə sonra yenidən cəhd edin." - "Kilid açma modelini artıq %1$d dəfə yanlış çəkmisiniz. Daha %2$d uğursuz cəhddən sonra telefon kilidini e-poçt hesabınızla açmaq tələb olunacaq.\n\n %3$d saniyə sonra yenidən cəhd edin." + "Kilid açma modelini %1$d dəfə yanlış çəkmisiniz. Daha %2$d uğursuz cəhddən sonra planşet kilidini e-poçt hesabınızla açmaq tələb olunacaq.\n\n %3$d saniyə sonra cəhd edin." + "Kilid açma modelini artıq %1$d dəfə yanlış çəkmisiniz. Daha %2$d uğursuz cəhddən sonra telefon kilidini e-poçt hesabınızla açmaq tələb olunacaq.\n\n %3$d saniyə sonra cəhd edin." "Daha çox seçim üçün telefonu kiliddən çıxarın" "Daha çox seçim üçün planşeti kiliddən çıxarın" "Daha çox seçim üçün cihazı kiliddən çıxarın" From 784edef8e5f1de3a156c61414f2b09ee67d79e7d Mon Sep 17 00:00:00 2001 From: Bob Badour Date: Fri, 12 Feb 2021 17:07:05 -0800 Subject: [PATCH 168/288] [LSC] Add LOCAL_LICENSE_KINDS to frameworks/base Added SPDX-license-identifier-Apache-2.0 to: apct-tests/perftests/autofill/Android.bp apct-tests/perftests/blobstore/Android.bp apct-tests/perftests/core/Android.bp apct-tests/perftests/core/apps/overlay/Android.bp apct-tests/perftests/core/apps/reources_manager/Android.bp apct-tests/perftests/core/jni/Android.bp apct-tests/perftests/multiuser/Android.bp apct-tests/perftests/multiuser/apps/dummyapp/Android.bp apct-tests/perftests/packagemanager/Android.bp apct-tests/perftests/packagemanager/apps/query-all/Android.bp apct-tests/perftests/textclassifier/Android.bp apct-tests/perftests/utils/Android.bp apct-tests/perftests/windowmanager/Android.bp apex/Android.bp apex/blobstore/framework/Android.bp apex/blobstore/service/Android.bp apex/jobscheduler/framework/Android.bp apex/jobscheduler/service/Android.bp apex/media/Android.bp apex/media/aidl/Android.bp apex/media/framework/Android.bp cmds/am/Android.bp cmds/app_process/Android.bp cmds/appops/Android.bp cmds/appwidget/Android.bp cmds/backup/Android.bp cmds/bmgr/Android.bp cmds/bootanimation/Android.bp cmds/bu/Android.bp cmds/content/Android.bp cmds/dpm/Android.bp cmds/hid/Android.bp cmds/hid/jni/Android.bp cmds/idmap2/Android.bp cmds/ime/Android.bp cmds/incident/Android.bp cmds/incident_helper/Android.bp cmds/incidentd/Android.bp cmds/input/Android.bp cmds/interrupter/Android.bp cmds/locksettings/Android.bp cmds/pm/Android.bp cmds/requestsync/Android.bp cmds/screencap/Android.bp cmds/sm/Android.bp cmds/svc/Android.bp cmds/telecom/Android.bp cmds/uiautomator/Android.bp cmds/uiautomator/cmds/uiautomator/Android.bp cmds/uiautomator/instrumentation/Android.bp cmds/uiautomator/library/Android.bp cmds/vr/Android.bp cmds/wm/Android.bp config/Android.bp core/java/android/service/wallpaper/Android.bp core/jni/Android.bp core/sysprop/Android.bp core/tests/BroadcastRadioTests/Android.bp core/tests/ConnectivityManagerTest/Android.bp core/tests/PackageInstallerSessions/Android.bp core/tests/PlatformCompatFramework/Android.bp core/tests/bandwidthtests/Android.bp core/tests/benchmarks/Android.bp core/tests/bluetoothtests/Android.bp core/tests/bugreports/Android.bp core/tests/coretests/Android.bp core/tests/coretests/BinderDeathRecipientHelperApp/Android.bp core/tests/coretests/BinderProxyCountingTestApp/Android.bp core/tests/coretests/BinderProxyCountingTestService/Android.bp core/tests/coretests/BstatsTestApp/Android.bp core/tests/coretests/DisabledTestApp/Android.bp core/tests/coretests/EnabledTestApp/Android.bp core/tests/coretests/aidl/Android.bp core/tests/coretests/apks/Android.bp core/tests/coretests/apks/install/Android.bp core/tests/coretests/apks/install_bad_dex/Android.bp core/tests/coretests/apks/install_complete_package_info/Android.bp core/tests/coretests/apks/install_decl_perm/Android.bp core/tests/coretests/apks/install_jni_lib/Android.bp core/tests/coretests/apks/install_jni_lib_open_from_apk/Android.bp core/tests/coretests/apks/install_loc_auto/Android.bp core/tests/coretests/apks/install_loc_internal/Android.bp core/tests/coretests/apks/install_loc_sdcard/Android.bp core/tests/coretests/apks/install_loc_unspecified/Android.bp core/tests/coretests/apks/install_use_perm_good/Android.bp core/tests/coretests/apks/install_uses_feature/Android.bp core/tests/coretests/apks/install_verifier_bad/Android.bp core/tests/coretests/apks/install_verifier_good/Android.bp core/tests/coretests/apks/keyset/Android.bp core/tests/coretests/apks/locales/Android.bp core/tests/coretests/apks/overlay_config/Android.bp core/tests/coretests/apks/version/Android.bp core/tests/coretests/apks/version_nosys/Android.bp core/tests/featureflagtests/Android.bp core/tests/hdmitests/Android.bp core/tests/hosttests/test-apps/AutoLocTestApp/Android.bp core/tests/hosttests/test-apps/AutoLocVersionedTestApp_v1/Android.bp core/tests/hosttests/test-apps/AutoLocVersionedTestApp_v2/Android.bp core/tests/hosttests/test-apps/ExternalLocAllPermsTestApp/Android.bp core/tests/hosttests/test-apps/ExternalLocPermsFLTestApp/Android.bp core/tests/hosttests/test-apps/ExternalLocTestApp/Android.bp core/tests/hosttests/test-apps/ExternalLocVersionedTestApp_v1/Android.bp core/tests/hosttests/test-apps/ExternalLocVersionedTestApp_v2/Android.bp core/tests/hosttests/test-apps/ExternalSharedPerms/Android.bp core/tests/hosttests/test-apps/ExternalSharedPermsBT/Android.bp core/tests/hosttests/test-apps/ExternalSharedPermsDiffKey/Android.bp core/tests/hosttests/test-apps/ExternalSharedPermsFL/Android.bp core/tests/hosttests/test-apps/InternalLocTestApp/Android.bp core/tests/hosttests/test-apps/MultiDexLegacyTestServicesTests/Android.bp core/tests/hosttests/test-apps/NoLocTestApp/Android.bp core/tests/hosttests/test-apps/NoLocVersionedTestApp_v1/Android.bp core/tests/hosttests/test-apps/NoLocVersionedTestApp_v2/Android.bp core/tests/hosttests/test-apps/SharedUid/32/Android.bp core/tests/hosttests/test-apps/SharedUid/32/jni/Android.bp core/tests/hosttests/test-apps/SharedUid/64/Android.bp core/tests/hosttests/test-apps/SharedUid/64/jni/Android.bp core/tests/hosttests/test-apps/SharedUid/dual/Android.bp core/tests/hosttests/test-apps/SharedUid/dual/jni/Android.bp core/tests/hosttests/test-apps/SharedUid/java_only/Android.bp core/tests/hosttests/test-apps/SimpleTestApp/Android.bp core/tests/hosttests/test-apps/UpdateExtToIntLocTestApp_v1_ext/Android.bp core/tests/hosttests/test-apps/UpdateExtToIntLocTestApp_v2_int/Android.bp core/tests/hosttests/test-apps/UpdateExternalLocTestApp_v1_ext/Android.bp core/tests/hosttests/test-apps/UpdateExternalLocTestApp_v2_none/Android.bp core/tests/hosttests/test-apps/VersatileTestApp_Auto/Android.bp core/tests/hosttests/test-apps/VersatileTestApp_External/Android.bp core/tests/hosttests/test-apps/VersatileTestApp_Internal/Android.bp core/tests/hosttests/test-apps/VersatileTestApp_None/Android.bp core/tests/mockingcoretests/Android.bp core/tests/notificationtests/Android.bp core/tests/overlaytests/device/Android.bp core/tests/overlaytests/device/test-apps/AppOverlayOne/Android.bp core/tests/overlaytests/device/test-apps/AppOverlayTwo/Android.bp core/tests/overlaytests/device/test-apps/FrameworkOverlay/Android.bp core/tests/overlaytests/host/Android.bp core/tests/overlaytests/remount/Android.bp core/tests/overlaytests/remount/test-apps/Overlay/Android.bp core/tests/overlaytests/remount/test-apps/SharedLibrary/Android.bp core/tests/overlaytests/remount/test-apps/SharedLibraryOverlay/Android.bp core/tests/overlaytests/remount/test-apps/Target/Android.bp core/tests/packagemanagertests/Android.bp core/tests/privacytests/Android.bp core/tests/screenshothelpertests/Android.bp core/tests/systemproperties/Android.bp core/tests/utillib/Android.bp core/tests/utiltests/Android.bp core/tests/utiltests/jni/Android.bp core/tests/uwbtests/Android.bp core/xsd/Android.bp core/xsd/vts/Android.bp data/etc/Android.bp data/etc/car/Android.bp data/fonts/Android.bp data/keyboards/Android.mk drm/jni/Android.bp errorprone/Android.bp graphics/proto/Android.bp keystore/Android.bp keystore/tests/Android.bp libs/WindowManager/Jetpack/Android.bp libs/WindowManager/Shell/Android.bp libs/WindowManager/Shell/tests/Android.bp libs/androidfw/Android.bp libs/androidfw/fuzz/resourcefile_fuzzer/Android.bp libs/hostgraphics/Android.bp libs/incident/Android.bp libs/input/Android.bp libs/input/tests/Android.bp libs/protoutil/Android.bp libs/services/Android.bp libs/storage/Android.bp libs/usb/tests/AccessoryChat/Android.bp libs/usb/tests/AccessoryChat/accessorychat/Android.bp location/lib/Android.bp location/tests/Android.bp location/tests/locationtests/Android.bp lowpan/tests/Android.bp media/Android.bp media/java/Android.bp media/java/android/media/tv/tunerresourcemanager/Android.bp media/jni/Android.bp media/jni/audioeffect/Android.bp media/jni/soundpool/Android.bp media/jni/soundpool/tests/Android.bp media/lib/remotedisplay/Android.bp media/lib/signer/Android.bp media/lib/tvremote/Android.bp media/lib/tvremote/tests/Android.bp media/mca/filterfw/Android.bp media/mca/filterfw/native/Android.bp media/mca/filterpacks/Android.bp media/mca/samples/CameraEffectsRecordingSample/Android.bp media/mca/tests/Android.bp media/native/midi/Android.bp media/packages/BluetoothMidiService/Android.bp media/packages/BluetoothMidiService/tests/unit/Android.bp media/tests/AudioPolicyTest/Android.bp media/tests/CameraBrowser/Android.bp media/tests/EffectsTest/Android.bp media/tests/MediaDump/Android.bp media/tests/MediaFrameworkTest/Android.bp media/tests/MediaRouter/Android.bp media/tests/MtpTests/Android.bp media/tests/ScoAudioTest/Android.bp media/tests/SoundPoolTest/Android.bp media/tests/TunerTest/Android.bp media/tests/audiotests/Android.bp media/tests/players/Android.bp mime/Android.bp native/android/Android.bp native/graphics/jni/Android.bp native/webview/loader/Android.bp nfc-extras/Android.bp nfc-extras/tests/Android.bp packages/AppPredictionLib/Android.bp packages/BackupEncryption/Android.bp packages/BackupEncryption/test/robolectric-integration/Android.bp packages/BackupEncryption/test/robolectric/Android.bp packages/BackupEncryption/test/unittest/Android.bp packages/BackupRestoreConfirmation/Android.bp packages/CarSystemUI/Android.bp packages/CarrierDefaultApp/Android.bp packages/CarrierDefaultApp/tests/unit/Android.bp packages/CompanionDeviceManager/Android.bp packages/Connectivity/framework/Android.bp packages/Connectivity/service/Android.bp packages/CtsShim/Android.bp packages/CtsShim/build/Android.bp packages/CtsShim/build/jni/Android.bp packages/DynamicSystemInstallationService/Android.bp packages/DynamicSystemInstallationService/tests/Android.bp packages/EasterEgg/Android.bp packages/EncryptedLocalTransport/Android.bp packages/ExtShared/Android.bp packages/ExternalStorageProvider/Android.bp packages/ExternalStorageProvider/tests/Android.bp packages/FakeOemFeatures/Android.bp packages/FusedLocation/Android.bp packages/InputDevices/Android.bp packages/LocalTransport/Android.bp packages/PackageInstaller/Android.bp packages/PrintRecommendationService/Android.bp packages/PrintSpooler/Android.bp packages/PrintSpooler/jni/Android.bp packages/PrintSpooler/tests/outofprocess/Android.bp packages/SettingsLib/ActionBarShadow/Android.bp packages/SettingsLib/ActionButtonsPreference/Android.bp packages/SettingsLib/AdaptiveIcon/Android.bp packages/SettingsLib/Android.bp packages/SettingsLib/AppPreference/Android.bp packages/SettingsLib/BarChartPreference/Android.bp packages/SettingsLib/DisplayDensityUtils/Android.bp packages/SettingsLib/EntityHeaderWidgets/Android.bp packages/SettingsLib/HelpUtils/Android.bp packages/SettingsLib/LayoutPreference/Android.bp packages/SettingsLib/ProgressBar/Android.bp packages/SettingsLib/RadioButtonPreference/Android.bp packages/SettingsLib/RestrictedLockUtils/Android.bp packages/SettingsLib/SchedulesProvider/Android.bp packages/SettingsLib/SearchProvider/Android.bp packages/SettingsLib/SearchWidget/Android.bp packages/SettingsLib/SettingsSpinner/Android.bp packages/SettingsLib/SettingsTheme/Android.bp packages/SettingsLib/Tile/Android.bp packages/SettingsLib/Utils/Android.bp packages/SettingsLib/search/Android.bp packages/SettingsLib/tests/integ/Android.bp packages/SettingsLib/tests/robotests/Android.bp packages/SettingsProvider/Android.bp packages/SharedStorageBackup/Android.bp packages/Shell/Android.bp packages/Shell/tests/Android.bp packages/SimAppDialog/Android.bp packages/SoundPicker/Android.bp packages/StatementService/Android.bp packages/SystemUI/Android.bp packages/SystemUI/plugin/Android.bp packages/SystemUI/plugin/ExamplePlugin/Android.bp packages/SystemUI/plugin_core/Android.bp packages/SystemUI/shared/Android.bp packages/VpnDialogs/Android.bp packages/WAPPushManager/Android.bp packages/WAPPushManager/tests/Android.bp packages/WallpaperBackup/Android.bp packages/WallpaperCropper/Android.bp packages/overlays/Android.mk packages/overlays/tests/Android.bp packages/services/PacProcessor/Android.bp packages/services/PacProcessor/jni/Android.bp packages/services/Proxy/Android.bp proto/Android.bp rs/jni/Android.mk samples/demo/haptic-assessment/Android.bp sax/tests/saxtests/Android.bp services/Android.bp services/accessibility/Android.bp services/appprediction/Android.bp services/appwidget/Android.bp services/autofill/Android.bp services/backup/Android.bp services/backup/backuplib/Android.bp services/companion/Android.bp services/contentcapture/Android.bp services/contentsuggestions/Android.bp services/core/Android.bp services/core/java/com/android/server/vcn/Android.bp services/core/jni/Android.bp services/core/xsd/Android.bp services/core/xsd/vts/Android.bp services/coverage/Android.bp services/devicepolicy/Android.bp services/incremental/Android.bp services/midi/Android.bp services/net/Android.bp services/people/Android.bp services/print/Android.bp services/profcollect/Android.bp services/restrictions/Android.bp services/robotests/Android.bp services/robotests/backup/Android.bp services/systemcaptions/Android.bp services/tests/PackageManagerComponentOverrideTests/Android.bp services/tests/PackageManagerServiceTests/host/Android.bp services/tests/PackageManagerServiceTests/host/test-apps/Android.bp services/tests/mockingservicestests/Android.bp services/tests/rescueparty/Android.bp services/tests/servicestests/Android.bp services/tests/servicestests/aidl/Android.bp services/tests/servicestests/apks/Android.bp services/tests/servicestests/apks/install-split-base/Android.bp services/tests/servicestests/apks/install-split-feature-a/Android.bp services/tests/servicestests/apks/install_intent_filters/Android.bp services/tests/servicestests/apks/install_uses_sdk/Android.bp services/tests/servicestests/test-apps/ConnTestApp/Android.bp services/tests/servicestests/test-apps/JobTestApp/Android.bp services/tests/servicestests/test-apps/PackageParserApp/Android.bp services/tests/servicestests/test-apps/PackageParsingTestManifests/Android.bp services/tests/servicestests/test-apps/SimpleServiceTestApp/Android.bp services/tests/servicestests/test-apps/SuspendTestApp/Android.bp services/tests/shortcutmanagerutils/Android.bp services/tests/uiservicestests/Android.bp services/tests/wmtests/Android.bp services/usage/Android.bp services/usb/Android.bp services/voiceinteraction/Android.bp services/wifi/Android.bp startop/apps/test/Android.bp startop/iorap/Android.bp startop/iorap/functional_tests/Android.bp startop/iorap/stress/Android.bp startop/iorap/tests/Android.bp startop/view_compiler/Android.bp startop/view_compiler/dex_builder_test/Android.bp test-base/hiddenapi/Android.bp test-mock/Android.bp test-runner/tests/Android.bp tests/AccessibilityEventsLogger/Android.bp tests/AccessoryDisplay/common/Android.bp tests/AccessoryDisplay/sink/Android.bp tests/AccessoryDisplay/source/Android.bp tests/ActivityManagerPerfTests/stub-app/Android.bp tests/ActivityManagerPerfTests/test-app/Android.bp tests/ActivityManagerPerfTests/tests/Android.bp tests/ActivityManagerPerfTests/utils/Android.bp tests/ActivityTests/Android.bp tests/ActivityViewTest/Android.bp tests/AmSlam/Android.bp tests/ApkVerityTest/Android.bp tests/ApkVerityTest/ApkVerityTestApp/Android.bp tests/ApkVerityTest/block_device_writer/Android.bp tests/AppLaunch/Android.bp tests/AppLaunchWear/Android.bp tests/AppResourcesLoaders/Android.bp tests/AppResourcesLoaders/Overlay/Android.bp tests/Assist/Android.bp tests/AutoVerify/app1/Android.bp tests/AutoVerify/app2/Android.bp tests/AutoVerify/app3/Android.bp tests/AutoVerify/app4/Android.bp tests/BackgroundDexOptServiceIntegrationTests/Android.bp tests/BandwidthTests/Android.bp tests/BatteryWaster/Android.bp tests/BiDiTests/Android.bp tests/BlobStoreTestUtils/Android.bp tests/BootImageProfileTest/Android.bp tests/BrowserPowerTest/Android.bp tests/Camera2Tests/SmartCamera/SimpleCamera/jni/Android.bp tests/CameraPrewarmTest/Android.bp tests/Codegen/Android.bp tests/Compatibility/Android.bp tests/CoreTests/android/Android.bp tests/DataIdleTest/Android.bp tests/DozeTest/Android.bp tests/DpiTest/Android.bp tests/DynamicCodeLoggerIntegrationTests/Android.mk tests/FeatureSplit/base/Android.bp tests/FeatureSplit/feature1/Android.bp tests/FeatureSplit/feature2/Android.bp tests/FixVibrateSetting/Android.bp tests/FlickerTests/Android.bp tests/FlickerTests/test-apps/Android.bp tests/FlickerTests/test-apps/flickerapp/Android.bp tests/FrameworkPerf/Android.bp tests/GamePerformance/Android.bp tests/GridLayoutTest/Android.bp tests/HierarchyViewerTest/Android.bp tests/HugeBackup/Android.bp tests/HwAccelerationTest/Android.bp tests/Internal/Android.bp tests/JankBench/Android.bp tests/JobSchedulerPerfTests/Android.bp tests/JobSchedulerTestApp/Android.bp tests/LargeAssetTest/Android.bp tests/LegacyAssistant/Android.bp tests/LocalizationTest/Android.bp tests/LocationTracker/Android.bp tests/LotsOfApps/Android.bp tests/LowStorageTest/Android.bp tests/ManagedProfileLifecycleStressTest/Android.bp tests/ManagedProfileLifecycleStressTest/app/DummyDPC/Android.bp tests/MemoryUsage/Android.bp tests/MirrorSurfaceTest/Android.bp tests/NativeProcessesMemoryTest/Android.bp tests/NetworkSecurityConfigTest/Android.bp tests/NullHomeTest/Android.bp tests/OdmApps/Android.bp tests/OdmApps/app/Android.bp tests/OdmApps/priv-app/Android.bp tests/OneMedia/Android.bp tests/PackageWatchdog/Android.bp tests/PlatformCompatGating/Android.bp tests/PlatformCompatGating/test-rules/Android.bp tests/ProtoInputStreamTests/Android.bp tests/RemoteDisplayProvider/Android.bp tests/RenderThreadTest/Android.bp tests/RollbackTest/Android.bp tests/SerialChat/Android.bp tests/ServiceCrashTest/Android.bp tests/SharedLibrary/client/Android.bp tests/SharedLibrary/lib/Android.bp tests/ShowWhenLockedApp/Android.bp tests/SmokeTest/Android.bp tests/SmokeTest/tests/Android.bp tests/SmokeTestApps/Android.bp tests/SoundTriggerTestApp/Android.bp tests/Split/Android.bp tests/StagedInstallTest/Android.bp tests/StatusBar/Android.bp tests/SurfaceComposition/Android.bp tests/SurfaceControlViewHostTest/Android.bp tests/SystemMemoryTest/device/Android.bp tests/SystemMemoryTest/host/Android.bp tests/SystemUIDemoModeController/Android.bp tests/TaskOrganizerTest/Android.bp tests/TelephonyCommonTests/Android.bp tests/TouchLatency/Android.bp tests/TransformTest/Android.bp tests/TtsTests/Android.bp tests/UiBench/Android.bp tests/UsageReportingTest/Android.bp tests/UsageStatsPerfTests/Android.bp tests/UsageStatsTest/Android.bp tests/UsbHostExternalManagmentTest/AoapTestDevice/Android.bp tests/UsbHostExternalManagmentTest/AoapTestHost/Android.bp tests/UsbHostExternalManagmentTest/UsbHostExternalManagmentTestApp/Android.bp tests/UsbManagerTests/Android.bp tests/UsbManagerTests/lib/Android.bp tests/UsbTests/Android.bp tests/UsesFeature2Test/Android.bp tests/VectorDrawableTest/Android.bp tests/VoiceEnrollment/Android.bp tests/VoiceInteraction/Android.bp tests/WallpaperTest/Android.bp tests/WindowAnimationJank/Android.bp tests/WindowInsetsTests/Android.bp tests/appwidgets/AppWidgetHostTest/Android.bp tests/appwidgets/AppWidgetProviderTest/Android.bp tests/backup/Android.mk tests/benchmarks/Android.bp tests/libs-permissions/Android.bp tests/net/Android.bp tests/net/common/Android.bp tests/net/deflake/Android.bp tests/net/integration/Android.bp tests/net/jni/Android.bp tests/net/smoketest/Android.bp tests/notification/Android.bp tests/permission/Android.bp tests/privapp-permissions/Android.bp tests/testables/Android.bp tests/testables/tests/Android.bp tests/utils/StubIME/Android.bp tests/utils/hostutils/Android.bp tests/utils/testutils/Android.bp tests/vcn/Android.bp tools/aapt/Android.bp tools/aapt2/Android.bp tools/aapt2/integration-tests/AutoVersionTest/Android.bp tools/aapt2/integration-tests/BasicTest/Android.bp tools/aapt2/integration-tests/MergeOnlyTest/LeafLib/Android.mk tools/aapt2/integration-tests/MergeOnlyTest/LocalLib/Android.mk tools/aapt2/integration-tests/NamespaceTest/LibOne/Android.mk tools/aapt2/integration-tests/NamespaceTest/LibTwo/Android.mk tools/aapt2/integration-tests/StaticLibTest/App/Android.bp tools/aapt2/integration-tests/StaticLibTest/LibOne/Android.bp tools/aapt2/integration-tests/StaticLibTest/LibTwo/Android.bp tools/aapt2/integration-tests/SymlinkTest/Android.bp tools/bit/Android.bp tools/codegen/Android.bp tools/dump-coverage/Android.bp tools/incident_report/Android.bp tools/incident_section_gen/Android.bp tools/lock_agent/Android.bp tools/locked_region_code_injection/Android.bp tools/obbtool/Android.bp tools/powermodel/Android.bp tools/preload-check/Android.bp tools/preload-check/device/Android.bp tools/preload/loadclass/Android.bp tools/processors/staledataclass/Android.bp tools/processors/view_inspector/Android.bp tools/protologtool/Android.bp tools/sdkparcelables/Android.bp tools/split-select/Android.bp tools/streaming_proto/Android.bp tools/validatekeymaps/Android.bp wifi/java/Android.bp wifi/tests/Android.bp Added SPDX-license-identifier-Apache-2.0 SPDX-license-identifier-BSD to: libs/hwui/Android.bp native/webview/plat_support/Android.bp obex/Android.bp Added SPDX-license-identifier-Apache-2.0 SPDX-license-identifier-BSD SPDX-license-identifier-CC-BY SPDX-license-identifier-CPL-1.0 SPDX-license-identifier-GPL SPDX-license-identifier-GPL-2.0 SPDX-license-identifier-MIT SPDX-license-identifier-Unicode-DFS SPDX-license-identifier-W3C legacy_unencumbered to: Android.bp Added SPDX-license-identifier-Apache-2.0 SPDX-license-identifier-BSD legacy_unencumbered to: core/java/Android.bp Added SPDX-license-identifier-Apache-2.0 SPDX-license-identifier-CPL-1.0 to: test-base/Android.bp test-runner/Android.bp Added SPDX-license-identifier-Apache-2.0 SPDX-license-identifier-GPL to: core/res/Android.bp Added SPDX-license-identifier-Apache-2.0 SPDX-license-identifier-GPL-2.0 to: libs/usb/Android.bp libs/usb/tests/accessorytest/Android.bp Added SPDX-license-identifier-Apache-2.0 SPDX-license-identifier-MIT to: tools/preload/Android.bp Added SPDX-license-identifier-Apache-2.0 SPDX-license-identifier-MIT SPDX-license-identifier-Unicode-DFS to: api/Android.bp boot/Android.bp cmds/device_config/Android.bp cmds/settings/Android.bp core/api/Android.bp core/tests/coretests/certs/Android.bp core/tests/overlaytests/remount/test-apps/certs/Android.bp core/tests/overlaytests/remount/test-apps/overlaid_apex/Android.bp core/tests/overlaytests/remount/test-apps/overlay_apex/Android.bp libs/tracingproxy/Android.bp services/startop/Android.bp test-legacy/Android.mk tests/ApkVerityTest/testdata/Android.bp tests/TransitionTests/Android.bp Bug: 68860345 Bug: 151177513 Bug: 151953481 Test: m all Exempt-From-Owner-Approval: janitorial work Change-Id: Ic44d662936d1ff0cae7fbe915932b37aa4e4869a Merged-in: Ic44d662936d1ff0cae7fbe915932b37aa4e4869a --- Android.bp | 38 +++++++++++++++++++ apct-tests/perftests/autofill/Android.bp | 9 +++++ apct-tests/perftests/blobstore/Android.bp | 11 +++++- apct-tests/perftests/core/Android.bp | 9 +++++ .../perftests/core/apps/overlay/Android.bp | 11 +++++- .../core/apps/reources_manager/Android.bp | 11 +++++- apct-tests/perftests/core/jni/Android.bp | 9 +++++ apct-tests/perftests/multiuser/Android.bp | 9 +++++ .../multiuser/apps/dummyapp/Android.bp | 9 +++++ .../perftests/packagemanager/Android.bp | 9 +++++ .../packagemanager/apps/query-all/Android.bp | 9 +++++ .../perftests/textclassifier/Android.bp | 9 +++++ apct-tests/perftests/utils/Android.bp | 9 +++++ apct-tests/perftests/windowmanager/Android.bp | 9 +++++ apex/Android.bp | 6 +++ apex/blobstore/framework/Android.bp | 9 +++++ apex/blobstore/service/Android.bp | 9 +++++ apex/jobscheduler/framework/Android.bp | 9 +++++ apex/jobscheduler/service/Android.bp | 9 +++++ apex/media/Android.bp | 6 +++ apex/media/aidl/Android.bp | 9 +++++ apex/media/framework/Android.bp | 9 +++++ api/Android.bp | 8 ++++ boot/Android.bp | 11 ++++++ cmds/am/Android.bp | 17 +++++++++ cmds/app_process/Android.bp | 17 +++++++++ cmds/appops/Android.bp | 17 +++++++++ cmds/appwidget/Android.bp | 17 +++++++++ cmds/backup/Android.bp | 17 +++++++++ cmds/bmgr/Android.bp | 17 +++++++++ cmds/bootanimation/Android.bp | 9 +++++ cmds/bu/Android.bp | 17 +++++++++ cmds/content/Android.bp | 17 +++++++++ cmds/device_config/Android.bp | 11 ++++++ cmds/dpm/Android.bp | 17 +++++++++ cmds/hid/Android.bp | 17 +++++++++ cmds/hid/jni/Android.bp | 9 +++++ cmds/idmap2/Android.bp | 9 +++++ cmds/ime/Android.bp | 17 +++++++++ cmds/incident/Android.bp | 9 +++++ cmds/incident_helper/Android.bp | 9 +++++ cmds/incidentd/Android.bp | 9 +++++ cmds/input/Android.bp | 17 +++++++++ cmds/interrupter/Android.bp | 9 +++++ cmds/locksettings/Android.bp | 9 +++++ cmds/pm/Android.bp | 17 +++++++++ cmds/requestsync/Android.bp | 17 +++++++++ cmds/screencap/Android.bp | 9 +++++ cmds/settings/Android.bp | 11 ++++++ cmds/sm/Android.bp | 17 +++++++++ cmds/svc/Android.bp | 17 +++++++++ cmds/telecom/Android.bp | 17 +++++++++ cmds/uiautomator/Android.bp | 9 +++++ cmds/uiautomator/cmds/uiautomator/Android.bp | 9 +++++ cmds/uiautomator/instrumentation/Android.bp | 9 +++++ cmds/uiautomator/library/Android.bp | 9 +++++ cmds/vr/Android.bp | 17 +++++++++ cmds/wm/Android.bp | 17 +++++++++ config/Android.bp | 17 +++++++++ core/api/Android.bp | 8 ++++ core/java/Android.bp | 11 ++++++ .../java/android/service/wallpaper/Android.bp | 9 +++++ core/jni/Android.bp | 17 +++++++++ core/res/Android.bp | 30 +++++++++++++++ core/sysprop/Android.bp | 9 +++++ core/tests/BroadcastRadioTests/Android.bp | 9 +++++ core/tests/ConnectivityManagerTest/Android.bp | 9 +++++ .../tests/PackageInstallerSessions/Android.bp | 9 +++++ core/tests/PlatformCompatFramework/Android.bp | 9 +++++ core/tests/bandwidthtests/Android.bp | 9 +++++ core/tests/benchmarks/Android.bp | 9 +++++ core/tests/bluetoothtests/Android.bp | 9 +++++ core/tests/bugreports/Android.bp | 9 +++++ core/tests/coretests/Android.bp | 9 +++++ .../BinderDeathRecipientHelperApp/Android.bp | 9 +++++ .../BinderProxyCountingTestApp/Android.bp | 9 +++++ .../BinderProxyCountingTestService/Android.bp | 9 +++++ core/tests/coretests/BstatsTestApp/Android.bp | 9 +++++ .../coretests/DisabledTestApp/Android.bp | 9 +++++ .../tests/coretests/EnabledTestApp/Android.bp | 9 +++++ core/tests/coretests/aidl/Android.bp | 9 +++++ core/tests/coretests/apks/Android.bp | 9 +++++ core/tests/coretests/apks/install/Android.bp | 9 +++++ .../coretests/apks/install_bad_dex/Android.bp | 9 +++++ .../install_complete_package_info/Android.bp | 10 ++++- .../apks/install_decl_perm/Android.bp | 9 +++++ .../coretests/apks/install_jni_lib/Android.bp | 9 +++++ .../install_jni_lib_open_from_apk/Android.bp | 9 +++++ .../apks/install_loc_auto/Android.bp | 9 +++++ .../apks/install_loc_internal/Android.bp | 9 +++++ .../apks/install_loc_sdcard/Android.bp | 9 +++++ .../apks/install_loc_unspecified/Android.bp | 9 +++++ .../apks/install_use_perm_good/Android.bp | 9 +++++ .../apks/install_uses_feature/Android.bp | 9 +++++ .../apks/install_verifier_bad/Android.bp | 9 +++++ .../apks/install_verifier_good/Android.bp | 9 +++++ core/tests/coretests/apks/keyset/Android.bp | 9 +++++ core/tests/coretests/apks/locales/Android.bp | 9 +++++ .../coretests/apks/overlay_config/Android.bp | 9 +++++ core/tests/coretests/apks/version/Android.bp | 9 +++++ .../coretests/apks/version_nosys/Android.bp | 9 +++++ core/tests/coretests/certs/Android.bp | 11 ++++++ core/tests/featureflagtests/Android.bp | 9 +++++ core/tests/hdmitests/Android.bp | 9 +++++ .../test-apps/AutoLocTestApp/Android.bp | 9 +++++ .../AutoLocVersionedTestApp_v1/Android.bp | 9 +++++ .../AutoLocVersionedTestApp_v2/Android.bp | 9 +++++ .../ExternalLocAllPermsTestApp/Android.bp | 9 +++++ .../ExternalLocPermsFLTestApp/Android.bp | 9 +++++ .../test-apps/ExternalLocTestApp/Android.bp | 9 +++++ .../ExternalLocVersionedTestApp_v1/Android.bp | 9 +++++ .../ExternalLocVersionedTestApp_v2/Android.bp | 9 +++++ .../test-apps/ExternalSharedPerms/Android.bp | 9 +++++ .../ExternalSharedPermsBT/Android.bp | 9 +++++ .../ExternalSharedPermsDiffKey/Android.bp | 9 +++++ .../ExternalSharedPermsFL/Android.bp | 9 +++++ .../test-apps/InternalLocTestApp/Android.bp | 9 +++++ .../Android.bp | 9 +++++ .../test-apps/NoLocTestApp/Android.bp | 9 +++++ .../NoLocVersionedTestApp_v1/Android.bp | 9 +++++ .../NoLocVersionedTestApp_v2/Android.bp | 9 +++++ .../test-apps/SharedUid/32/Android.bp | 9 +++++ .../test-apps/SharedUid/32/jni/Android.bp | 9 +++++ .../test-apps/SharedUid/64/Android.bp | 9 +++++ .../test-apps/SharedUid/64/jni/Android.bp | 9 +++++ .../test-apps/SharedUid/dual/Android.bp | 9 +++++ .../test-apps/SharedUid/dual/jni/Android.bp | 9 +++++ .../test-apps/SharedUid/java_only/Android.bp | 9 +++++ .../test-apps/SimpleTestApp/Android.bp | 9 +++++ .../Android.bp | 9 +++++ .../Android.bp | 9 +++++ .../Android.bp | 9 +++++ .../Android.bp | 9 +++++ .../VersatileTestApp_Auto/Android.bp | 9 +++++ .../VersatileTestApp_External/Android.bp | 9 +++++ .../VersatileTestApp_Internal/Android.bp | 9 +++++ .../VersatileTestApp_None/Android.bp | 9 +++++ core/tests/mockingcoretests/Android.bp | 9 +++++ core/tests/notificationtests/Android.bp | 9 +++++ core/tests/overlaytests/device/Android.bp | 9 +++++ .../device/test-apps/AppOverlayOne/Android.bp | 9 +++++ .../device/test-apps/AppOverlayTwo/Android.bp | 9 +++++ .../test-apps/FrameworkOverlay/Android.bp | 9 +++++ core/tests/overlaytests/host/Android.bp | 9 +++++ core/tests/overlaytests/remount/Android.bp | 9 +++++ .../remount/test-apps/Overlay/Android.bp | 11 +++++- .../test-apps/SharedLibrary/Android.bp | 9 +++++ .../test-apps/SharedLibraryOverlay/Android.bp | 9 +++++ .../remount/test-apps/Target/Android.bp | 9 +++++ .../remount/test-apps/certs/Android.bp | 11 ++++++ .../test-apps/overlaid_apex/Android.bp | 11 ++++++ .../remount/test-apps/overlay_apex/Android.bp | 11 ++++++ core/tests/packagemanagertests/Android.bp | 9 +++++ core/tests/privacytests/Android.bp | 9 +++++ core/tests/screenshothelpertests/Android.bp | 10 ++++- core/tests/systemproperties/Android.bp | 9 +++++ core/tests/utillib/Android.bp | 9 +++++ core/tests/utiltests/Android.bp | 9 +++++ core/tests/utiltests/jni/Android.bp | 9 +++++ core/tests/uwbtests/Android.bp | 9 +++++ core/xsd/Android.bp | 9 +++++ core/xsd/vts/Android.bp | 9 +++++ data/etc/Android.bp | 9 +++++ data/etc/car/Android.bp | 9 +++++ data/fonts/Android.bp | 17 +++++++++ data/keyboards/Android.mk | 3 ++ drm/jni/Android.bp | 9 +++++ errorprone/Android.bp | 9 +++++ graphics/proto/Android.bp | 9 +++++ keystore/Android.bp | 31 +++++++++++++++ keystore/tests/Android.bp | 9 +++++ libs/WindowManager/Jetpack/Android.bp | 9 +++++ libs/WindowManager/Shell/Android.bp | 9 +++++ libs/WindowManager/Shell/tests/Android.bp | 9 +++++ libs/androidfw/Android.bp | 17 +++++++++ .../fuzz/resourcefile_fuzzer/Android.bp | 9 +++++ libs/hostgraphics/Android.bp | 11 +++++- libs/hwui/Android.bp | 30 +++++++++++++++ libs/incident/Android.bp | 12 ++++-- libs/input/Android.bp | 9 +++++ libs/input/tests/Android.bp | 9 +++++ libs/protoutil/Android.bp | 9 +++++ libs/services/Android.bp | 9 +++++ libs/storage/Android.bp | 17 +++++++++ libs/tracingproxy/Android.bp | 11 ++++++ libs/usb/Android.bp | 10 +++++ libs/usb/tests/AccessoryChat/Android.bp | 9 +++++ .../AccessoryChat/accessorychat/Android.bp | 9 +++++ libs/usb/tests/accessorytest/Android.bp | 10 +++++ location/lib/Android.bp | 9 +++++ location/tests/locationtests/Android.bp | 9 +++++ lowpan/tests/Android.bp | 9 +++++ media/Android.bp | 9 +++++ media/java/Android.bp | 9 +++++ .../media/tv/tunerresourcemanager/Android.bp | 11 +++++- media/jni/Android.bp | 17 +++++++++ media/jni/audioeffect/Android.bp | 9 +++++ media/jni/soundpool/Android.bp | 19 ++++++++++ media/jni/soundpool/tests/Android.bp | 11 ++++++ media/lib/remotedisplay/Android.bp | 9 +++++ media/lib/signer/Android.bp | 9 +++++ media/lib/tvremote/Android.bp | 9 +++++ media/lib/tvremote/tests/Android.bp | 9 +++++ media/mca/filterfw/Android.bp | 9 +++++ media/mca/filterfw/native/Android.bp | 9 +++++ media/mca/filterpacks/Android.bp | 9 +++++ .../CameraEffectsRecordingSample/Android.bp | 10 ++++- media/mca/tests/Android.bp | 9 +++++ media/native/midi/Android.bp | 9 +++++ .../packages/BluetoothMidiService/Android.bp | 9 +++++ .../tests/unit/Android.bp | 9 +++++ media/tests/AudioPolicyTest/Android.bp | 9 +++++ media/tests/CameraBrowser/Android.bp | 9 +++++ media/tests/EffectsTest/Android.bp | 9 +++++ media/tests/MediaDump/Android.bp | 9 +++++ media/tests/MediaFrameworkTest/Android.bp | 9 +++++ media/tests/MediaRouter/Android.bp | 11 +++++- media/tests/MtpTests/Android.bp | 9 +++++ media/tests/ScoAudioTest/Android.bp | 9 +++++ media/tests/SoundPoolTest/Android.bp | 9 +++++ media/tests/TunerTest/Android.bp | 9 +++++ media/tests/audiotests/Android.bp | 9 +++++ media/tests/players/Android.bp | 9 +++++ mime/Android.bp | 9 +++++ native/android/Android.bp | 9 +++++ native/graphics/jni/Android.bp | 9 +++++ native/webview/loader/Android.bp | 9 +++++ native/webview/plat_support/Android.bp | 32 ++++++++++++++++ nfc-extras/Android.bp | 9 +++++ nfc-extras/tests/Android.bp | 9 +++++ obex/Android.bp | 30 +++++++++++++++ packages/AppPredictionLib/Android.bp | 9 +++++ packages/BackupEncryption/Android.bp | 9 +++++ .../test/robolectric-integration/Android.bp | 9 +++++ .../test/robolectric/Android.bp | 9 +++++ .../BackupEncryption/test/unittest/Android.bp | 11 +++++- packages/BackupRestoreConfirmation/Android.bp | 9 +++++ packages/CarSystemUI/Android.bp | 9 +++++ packages/CarrierDefaultApp/Android.bp | 9 +++++ .../CarrierDefaultApp/tests/unit/Android.bp | 9 +++++ packages/CompanionDeviceManager/Android.bp | 19 ++++++++++ packages/Connectivity/framework/Android.bp | 11 +++++- packages/Connectivity/service/Android.bp | 9 +++++ packages/CtsShim/Android.bp | 9 +++++ packages/CtsShim/build/Android.bp | 9 +++++ packages/CtsShim/build/jni/Android.bp | 9 +++++ .../Android.bp | 19 ++++++++++ .../tests/Android.bp | 11 ++++++ packages/EasterEgg/Android.bp | 9 +++++ packages/EncryptedLocalTransport/Android.bp | 9 +++++ packages/ExtShared/Android.bp | 17 +++++++++ packages/ExternalStorageProvider/Android.bp | 9 +++++ .../ExternalStorageProvider/tests/Android.bp | 9 +++++ packages/FakeOemFeatures/Android.bp | 19 ++++++++++ packages/FusedLocation/Android.bp | 21 +++++++++- packages/InputDevices/Android.bp | 19 ++++++++++ packages/LocalTransport/Android.bp | 9 +++++ packages/PackageInstaller/Android.bp | 19 ++++++++++ .../PrintRecommendationService/Android.bp | 19 ++++++++++ packages/PrintSpooler/Android.bp | 19 ++++++++++ packages/PrintSpooler/jni/Android.bp | 11 ++++++ .../tests/outofprocess/Android.bp | 11 ++++++ .../SettingsLib/ActionBarShadow/Android.bp | 9 +++++ .../ActionButtonsPreference/Android.bp | 9 +++++ packages/SettingsLib/AdaptiveIcon/Android.bp | 9 +++++ packages/SettingsLib/Android.bp | 9 +++++ packages/SettingsLib/AppPreference/Android.bp | 9 +++++ .../SettingsLib/BarChartPreference/Android.bp | 9 +++++ .../DisplayDensityUtils/Android.bp | 9 +++++ .../EntityHeaderWidgets/Android.bp | 9 +++++ packages/SettingsLib/HelpUtils/Android.bp | 9 +++++ .../SettingsLib/LayoutPreference/Android.bp | 9 +++++ packages/SettingsLib/ProgressBar/Android.bp | 11 +++++- .../RadioButtonPreference/Android.bp | 9 +++++ .../RestrictedLockUtils/Android.bp | 11 +++++- .../SettingsLib/SchedulesProvider/Android.bp | 9 +++++ .../SettingsLib/SearchProvider/Android.bp | 9 +++++ packages/SettingsLib/SearchWidget/Android.bp | 9 +++++ .../SettingsLib/SettingsSpinner/Android.bp | 9 +++++ packages/SettingsLib/SettingsTheme/Android.bp | 9 +++++ packages/SettingsLib/Tile/Android.bp | 9 +++++ packages/SettingsLib/Utils/Android.bp | 9 +++++ packages/SettingsLib/search/Android.bp | 9 +++++ packages/SettingsLib/tests/integ/Android.bp | 9 +++++ .../SettingsLib/tests/robotests/Android.bp | 9 +++++ packages/SettingsProvider/Android.bp | 19 ++++++++++ packages/SharedStorageBackup/Android.bp | 9 +++++ packages/Shell/Android.bp | 9 +++++ packages/Shell/tests/Android.bp | 9 +++++ packages/SimAppDialog/Android.bp | 9 +++++ packages/SoundPicker/Android.bp | 9 +++++ packages/StatementService/Android.bp | 9 +++++ packages/SystemUI/Android.bp | 17 +++++++++ packages/SystemUI/plugin/Android.bp | 9 +++++ .../SystemUI/plugin/ExamplePlugin/Android.bp | 9 +++++ packages/SystemUI/plugin_core/Android.bp | 9 +++++ packages/SystemUI/shared/Android.bp | 9 +++++ packages/VpnDialogs/Android.bp | 9 +++++ packages/WAPPushManager/Android.bp | 19 ++++++++++ packages/WAPPushManager/tests/Android.bp | 11 ++++++ packages/WallpaperBackup/Android.bp | 9 +++++ packages/WallpaperCropper/Android.bp | 9 +++++ packages/overlays/Android.mk | 6 +++ packages/overlays/tests/Android.bp | 9 +++++ packages/services/PacProcessor/Android.bp | 9 +++++ packages/services/PacProcessor/jni/Android.bp | 9 +++++ packages/services/Proxy/Android.bp | 9 +++++ proto/Android.bp | 9 +++++ rs/jni/Android.mk | 3 ++ samples/demo/haptic-assessment/Android.bp | 11 +++++- sax/tests/saxtests/Android.bp | 9 +++++ services/Android.bp | 9 +++++ services/accessibility/Android.bp | 9 +++++ services/appprediction/Android.bp | 9 +++++ services/appwidget/Android.bp | 9 +++++ services/autofill/Android.bp | 9 +++++ services/backup/Android.bp | 9 +++++ services/backup/backuplib/Android.bp | 9 +++++ services/companion/Android.bp | 9 +++++ services/contentcapture/Android.bp | 9 +++++ services/contentsuggestions/Android.bp | 9 +++++ services/core/Android.bp | 9 +++++ .../java/com/android/server/vcn/Android.bp | 11 +++++- services/core/jni/Android.bp | 9 +++++ services/core/xsd/Android.bp | 9 +++++ services/core/xsd/vts/Android.bp | 9 +++++ services/coverage/Android.bp | 9 +++++ services/devicepolicy/Android.bp | 9 +++++ services/incremental/Android.bp | 9 +++++ services/midi/Android.bp | 9 +++++ services/net/Android.bp | 9 +++++ services/people/Android.bp | 9 +++++ services/print/Android.bp | 9 +++++ services/profcollect/Android.bp | 9 +++++ services/restrictions/Android.bp | 9 +++++ services/robotests/Android.bp | 9 +++++ services/robotests/backup/Android.bp | 9 +++++ services/startop/Android.bp | 11 ++++++ services/systemcaptions/Android.bp | 9 +++++ .../Android.bp | 9 +++++ .../host/Android.bp | 9 +++++ .../host/test-apps/Android.bp | 9 +++++ .../tests/mockingservicestests/Android.bp | 9 +++++ services/tests/rescueparty/Android.bp | 9 +++++ services/tests/servicestests/Android.bp | 9 +++++ services/tests/servicestests/aidl/Android.bp | 9 +++++ services/tests/servicestests/apks/Android.bp | 9 +++++ .../apks/install-split-base/Android.bp | 9 +++++ .../apks/install-split-feature-a/Android.bp | 9 +++++ .../apks/install_intent_filters/Android.bp | 10 ++++- .../apks/install_uses_sdk/Android.bp | 9 +++++ .../test-apps/ConnTestApp/Android.bp | 9 +++++ .../test-apps/JobTestApp/Android.bp | 9 +++++ .../test-apps/PackageParserApp/Android.bp | 9 +++++ .../test-apps/SimpleServiceTestApp/Android.bp | 9 +++++ .../test-apps/SuspendTestApp/Android.bp | 9 +++++ .../tests/shortcutmanagerutils/Android.bp | 9 +++++ services/tests/uiservicestests/Android.bp | 9 +++++ services/tests/wmtests/Android.bp | 9 +++++ services/usage/Android.bp | 9 +++++ services/usb/Android.bp | 9 +++++ services/voiceinteraction/Android.bp | 9 +++++ services/wifi/Android.bp | 9 +++++ startop/apps/test/Android.bp | 9 +++++ startop/iorap/Android.bp | 9 +++++ startop/iorap/functional_tests/Android.bp | 10 ++++- startop/iorap/stress/Android.bp | 9 +++++ startop/iorap/tests/Android.bp | 9 +++++ startop/view_compiler/Android.bp | 9 +++++ .../view_compiler/dex_builder_test/Android.bp | 9 +++++ test-base/Android.bp | 10 +++++ test-base/hiddenapi/Android.bp | 9 +++++ test-legacy/Android.mk | 3 ++ test-mock/Android.bp | 9 +++++ test-runner/Android.bp | 10 +++++ test-runner/tests/Android.bp | 9 +++++ tests/AccessibilityEventsLogger/Android.bp | 9 +++++ tests/AccessoryDisplay/common/Android.bp | 9 +++++ tests/AccessoryDisplay/sink/Android.bp | 9 +++++ tests/AccessoryDisplay/source/Android.bp | 9 +++++ .../stub-app/Android.bp | 10 ++++- .../test-app/Android.bp | 9 +++++ .../ActivityManagerPerfTests/tests/Android.bp | 9 +++++ .../ActivityManagerPerfTests/utils/Android.bp | 9 +++++ tests/ActivityTests/Android.bp | 9 +++++ tests/ActivityViewTest/Android.bp | 9 +++++ tests/AmSlam/Android.bp | 9 +++++ tests/ApkVerityTest/Android.bp | 9 +++++ .../ApkVerityTest/ApkVerityTestApp/Android.bp | 9 +++++ .../block_device_writer/Android.bp | 9 +++++ tests/ApkVerityTest/testdata/Android.bp | 12 +++++- tests/AppLaunch/Android.bp | 9 +++++ tests/AppLaunchWear/Android.bp | 9 +++++ tests/AppResourcesLoaders/Android.bp | 9 +++++ tests/AppResourcesLoaders/Overlay/Android.bp | 9 +++++ tests/Assist/Android.bp | 9 +++++ tests/AutoVerify/app1/Android.bp | 9 +++++ tests/AutoVerify/app2/Android.bp | 9 +++++ tests/AutoVerify/app3/Android.bp | 9 +++++ tests/AutoVerify/app4/Android.bp | 9 +++++ .../Android.bp | 9 +++++ tests/BandwidthTests/Android.bp | 9 +++++ tests/BatteryWaster/Android.bp | 9 +++++ tests/BiDiTests/Android.bp | 9 +++++ tests/BlobStoreTestUtils/Android.bp | 11 +++++- tests/BootImageProfileTest/Android.bp | 9 +++++ tests/BrowserPowerTest/Android.bp | 9 +++++ .../SmartCamera/SimpleCamera/jni/Android.bp | 9 +++++ tests/CameraPrewarmTest/Android.bp | 9 +++++ tests/Codegen/Android.bp | 9 +++++ tests/Compatibility/Android.bp | 9 +++++ tests/CoreTests/android/Android.bp | 9 +++++ tests/DataIdleTest/Android.bp | 9 +++++ tests/DozeTest/Android.bp | 9 +++++ tests/DpiTest/Android.bp | 9 +++++ .../Android.mk | 9 +++++ tests/FeatureSplit/base/Android.bp | 9 +++++ tests/FeatureSplit/feature1/Android.bp | 9 +++++ tests/FeatureSplit/feature2/Android.bp | 9 +++++ tests/FixVibrateSetting/Android.bp | 9 +++++ tests/FlickerTests/Android.bp | 9 +++++ .../test-apps/flickerapp/Android.bp | 9 +++++ tests/FrameworkPerf/Android.bp | 9 +++++ tests/GamePerformance/Android.bp | 9 +++++ tests/GridLayoutTest/Android.bp | 9 +++++ tests/HierarchyViewerTest/Android.bp | 9 +++++ tests/HugeBackup/Android.bp | 9 +++++ tests/HwAccelerationTest/Android.bp | 9 +++++ tests/Internal/Android.bp | 9 +++++ tests/JankBench/Android.bp | 9 +++++ tests/JobSchedulerPerfTests/Android.bp | 9 +++++ tests/JobSchedulerTestApp/Android.bp | 9 +++++ tests/LargeAssetTest/Android.bp | 9 +++++ tests/LegacyAssistant/Android.bp | 9 +++++ tests/LocalizationTest/Android.bp | 9 +++++ tests/LocationTracker/Android.bp | 9 +++++ tests/LotsOfApps/Android.bp | 9 +++++ tests/LowStorageTest/Android.bp | 9 +++++ .../Android.bp | 9 +++++ .../app/DummyDPC/Android.bp | 9 +++++ tests/MemoryUsage/Android.bp | 9 +++++ tests/MirrorSurfaceTest/Android.bp | 9 +++++ tests/NativeProcessesMemoryTest/Android.bp | 9 +++++ tests/NetworkSecurityConfigTest/Android.bp | 9 +++++ tests/NullHomeTest/Android.bp | 9 +++++ tests/OdmApps/Android.bp | 9 +++++ tests/OdmApps/app/Android.bp | 9 +++++ tests/OdmApps/priv-app/Android.bp | 9 +++++ tests/OneMedia/Android.bp | 9 +++++ tests/PackageWatchdog/Android.bp | 9 +++++ tests/PlatformCompatGating/Android.bp | 9 +++++ .../test-rules/Android.bp | 11 +++++- tests/ProtoInputStreamTests/Android.bp | 9 +++++ tests/RemoteDisplayProvider/Android.bp | 9 +++++ tests/RenderThreadTest/Android.bp | 9 +++++ tests/RollbackTest/Android.bp | 11 +++++- tests/SerialChat/Android.bp | 9 +++++ tests/ServiceCrashTest/Android.bp | 9 +++++ tests/SharedLibrary/client/Android.bp | 9 +++++ tests/SharedLibrary/lib/Android.bp | 9 +++++ tests/ShowWhenLockedApp/Android.bp | 9 +++++ tests/SmokeTest/Android.bp | 9 +++++ tests/SmokeTest/tests/Android.bp | 9 +++++ tests/SmokeTestApps/Android.bp | 9 +++++ tests/SoundTriggerTestApp/Android.bp | 9 +++++ tests/Split/Android.bp | 9 +++++ tests/StagedInstallTest/Android.bp | 10 ++++- tests/StatusBar/Android.bp | 9 +++++ tests/SurfaceComposition/Android.bp | 9 +++++ tests/SurfaceControlViewHostTest/Android.bp | 9 +++++ tests/SystemMemoryTest/device/Android.bp | 9 +++++ tests/SystemMemoryTest/host/Android.bp | 9 +++++ tests/SystemUIDemoModeController/Android.bp | 9 +++++ tests/TaskOrganizerTest/Android.bp | 9 +++++ tests/TelephonyCommonTests/Android.bp | 9 +++++ tests/TouchLatency/Android.bp | 9 +++++ tests/TransformTest/Android.bp | 9 +++++ tests/TransitionTests/Android.bp | 11 ++++++ tests/TtsTests/Android.bp | 9 +++++ tests/UiBench/Android.bp | 9 +++++ tests/UsageReportingTest/Android.bp | 9 +++++ tests/UsageStatsPerfTests/Android.bp | 9 +++++ tests/UsageStatsTest/Android.bp | 9 +++++ .../AoapTestDevice/Android.bp | 9 +++++ .../AoapTestHost/Android.bp | 9 +++++ .../Android.bp | 9 +++++ tests/UsbManagerTests/Android.bp | 9 +++++ tests/UsbManagerTests/lib/Android.bp | 9 +++++ tests/UsbTests/Android.bp | 9 +++++ tests/UsesFeature2Test/Android.bp | 9 +++++ tests/VectorDrawableTest/Android.bp | 9 +++++ tests/VoiceEnrollment/Android.bp | 9 +++++ tests/VoiceInteraction/Android.bp | 9 +++++ tests/WallpaperTest/Android.bp | 9 +++++ tests/WindowAnimationJank/Android.bp | 9 +++++ tests/WindowInsetsTests/Android.bp | 10 ++++- tests/appwidgets/AppWidgetHostTest/Android.bp | 9 +++++ .../AppWidgetProviderTest/Android.bp | 9 +++++ tests/backup/Android.mk | 3 ++ tests/benchmarks/Android.bp | 9 +++++ tests/libs-permissions/Android.bp | 9 +++++ tests/net/Android.bp | 9 +++++ tests/net/common/Android.bp | 9 +++++ tests/net/deflake/Android.bp | 9 +++++ tests/net/integration/Android.bp | 9 +++++ tests/net/jni/Android.bp | 9 +++++ tests/net/smoketest/Android.bp | 11 +++++- tests/notification/Android.bp | 9 +++++ tests/permission/Android.bp | 9 +++++ tests/privapp-permissions/Android.bp | 9 +++++ tests/testables/Android.bp | 9 +++++ tests/testables/tests/Android.bp | 9 +++++ tests/utils/StubIME/Android.bp | 9 +++++ tests/utils/hostutils/Android.bp | 9 +++++ tests/utils/testutils/Android.bp | 9 +++++ tests/vcn/Android.bp | 9 +++++ tools/aapt/Android.bp | 17 +++++++++ tools/aapt2/Android.bp | 9 +++++ .../AutoVersionTest/Android.bp | 9 +++++ .../integration-tests/BasicTest/Android.bp | 9 +++++ .../MergeOnlyTest/LeafLib/Android.mk | 5 ++- .../MergeOnlyTest/LocalLib/Android.mk | 5 ++- .../NamespaceTest/LibOne/Android.mk | 3 ++ .../NamespaceTest/LibTwo/Android.mk | 3 ++ .../StaticLibTest/App/Android.bp | 9 +++++ .../StaticLibTest/LibOne/Android.bp | 9 +++++ .../StaticLibTest/LibTwo/Android.bp | 9 +++++ .../integration-tests/SymlinkTest/Android.bp | 9 +++++ tools/bit/Android.bp | 9 +++++ tools/codegen/Android.bp | 9 +++++ tools/dump-coverage/Android.bp | 9 +++++ tools/incident_report/Android.bp | 9 +++++ tools/incident_section_gen/Android.bp | 9 +++++ tools/lock_agent/Android.bp | 9 +++++ tools/locked_region_code_injection/Android.bp | 9 +++++ tools/obbtool/Android.bp | 9 +++++ tools/powermodel/Android.bp | 10 ++++- tools/preload-check/Android.bp | 9 +++++ tools/preload-check/device/Android.bp | 9 +++++ tools/preload/Android.bp | 10 +++++ tools/preload/loadclass/Android.bp | 9 +++++ tools/processors/staledataclass/Android.bp | 9 +++++ tools/processors/view_inspector/Android.bp | 9 +++++ tools/protologtool/Android.bp | 9 +++++ tools/sdkparcelables/Android.bp | 9 +++++ tools/split-select/Android.bp | 9 +++++ tools/streaming_proto/Android.bp | 9 +++++ tools/validatekeymaps/Android.bp | 9 +++++ wifi/java/Android.bp | 9 +++++ wifi/tests/Android.bp | 9 +++++ 550 files changed, 5421 insertions(+), 33 deletions(-) create mode 100644 keystore/Android.bp diff --git a/Android.bp b/Android.bp index 2ab33aced0e77..4f248d9d5c967 100644 --- a/Android.bp +++ b/Android.bp @@ -25,6 +25,44 @@ // // READ ME: ######################################################## +package { + default_applicable_licenses: ["frameworks_base_license"], +} + +// Added automatically by a large-scale-change that took the approach of +// 'apply every license found to every target'. While this makes sure we respect +// every license restriction, it may not be entirely correct. +// +// e.g. GPL in an MIT project might only apply to the contrib/ directory. +// +// Please consider splitting the single license below into multiple licenses, +// taking care not to lose any license_kind information, and overriding the +// default license using the 'licenses: [...]' property on targets as needed. +// +// For unused files, consider creating a 'fileGroup' with "//visibility:private" +// to attach the license to, and including a comment whether the files may be +// used in the current project. +// See: http://go/android-license-faq +license { + name: "frameworks_base_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + "SPDX-license-identifier-BSD", + "SPDX-license-identifier-CC-BY", + "SPDX-license-identifier-CPL-1.0", + "SPDX-license-identifier-GPL", + "SPDX-license-identifier-GPL-2.0", + "SPDX-license-identifier-MIT", + "SPDX-license-identifier-Unicode-DFS", + "SPDX-license-identifier-W3C", + "legacy_unencumbered", + ], + license_text: [ + "NOTICE", + ], +} + filegroup { name: "framework-core-sources", srcs: [ diff --git a/apct-tests/perftests/autofill/Android.bp b/apct-tests/perftests/autofill/Android.bp index 65c28fb4d0a73..82e29da0a077f 100644 --- a/apct-tests/perftests/autofill/Android.bp +++ b/apct-tests/perftests/autofill/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "AutofillPerfTests", srcs: ["src/**/*.java"], diff --git a/apct-tests/perftests/blobstore/Android.bp b/apct-tests/perftests/blobstore/Android.bp index be5072ce3d9d3..1b0b078a4472b 100644 --- a/apct-tests/perftests/blobstore/Android.bp +++ b/apct-tests/perftests/blobstore/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "BlobStorePerfTests", srcs: ["src/**/*.java"], @@ -25,4 +34,4 @@ android_test { platform_apis: true, test_suites: ["device-tests"], certificate: "platform", -} \ No newline at end of file +} diff --git a/apct-tests/perftests/core/Android.bp b/apct-tests/perftests/core/Android.bp index 984893a256055..277ad7e265c7b 100644 --- a/apct-tests/perftests/core/Android.bp +++ b/apct-tests/perftests/core/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "CorePerfTests", diff --git a/apct-tests/perftests/core/apps/overlay/Android.bp b/apct-tests/perftests/core/apps/overlay/Android.bp index 7bee30ee9cb49..646530788907c 100644 --- a/apct-tests/perftests/core/apps/overlay/Android.bp +++ b/apct-tests/perftests/core/apps/overlay/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "Overlay0", aaptflags: [ @@ -185,4 +194,4 @@ java_library { ":LargeOverlay8", ":LargeOverlay9", ], -} \ No newline at end of file +} diff --git a/apct-tests/perftests/core/apps/reources_manager/Android.bp b/apct-tests/perftests/core/apps/reources_manager/Android.bp index 451613236140a..85dd0c4be48dd 100644 --- a/apct-tests/perftests/core/apps/reources_manager/Android.bp +++ b/apct-tests/perftests/core/apps/reources_manager/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "LargeResourcesCompressed", static_libs: [ "androidx.appcompat_appcompat" ], @@ -31,4 +40,4 @@ java_library { ":LargeResourcesCompressed", ":LargeResourcesUncompressed", ], -} \ No newline at end of file +} diff --git a/apct-tests/perftests/core/jni/Android.bp b/apct-tests/perftests/core/jni/Android.bp index d160d48538c34..1e4405dea2d26 100644 --- a/apct-tests/perftests/core/jni/Android.bp +++ b/apct-tests/perftests/core/jni/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_library_shared { name: "libperftestscore_jni", sdk_version: "21", diff --git a/apct-tests/perftests/multiuser/Android.bp b/apct-tests/perftests/multiuser/Android.bp index 04432f25e3370..91e207433f3de 100644 --- a/apct-tests/perftests/multiuser/Android.bp +++ b/apct-tests/perftests/multiuser/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "MultiUserPerfTests", srcs: ["src/**/*.java"], diff --git a/apct-tests/perftests/multiuser/apps/dummyapp/Android.bp b/apct-tests/perftests/multiuser/apps/dummyapp/Android.bp index 08c54a60a290f..892c14006f878 100644 --- a/apct-tests/perftests/multiuser/apps/dummyapp/Android.bp +++ b/apct-tests/perftests/multiuser/apps/dummyapp/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "MultiUserPerfDummyApp", diff --git a/apct-tests/perftests/packagemanager/Android.bp b/apct-tests/perftests/packagemanager/Android.bp index 17033e048c7d9..dbb8a2e0acc0d 100644 --- a/apct-tests/perftests/packagemanager/Android.bp +++ b/apct-tests/perftests/packagemanager/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "PackageManagerPerfTests", diff --git a/apct-tests/perftests/packagemanager/apps/query-all/Android.bp b/apct-tests/perftests/packagemanager/apps/query-all/Android.bp index 3cb1589bc3768..b2339d5965a06 100644 --- a/apct-tests/perftests/packagemanager/apps/query-all/Android.bp +++ b/apct-tests/perftests/packagemanager/apps/query-all/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "QueriesAll0", aaptflags: [ diff --git a/apct-tests/perftests/textclassifier/Android.bp b/apct-tests/perftests/textclassifier/Android.bp index 49952dc1d009d..ce57bd5f27746 100644 --- a/apct-tests/perftests/textclassifier/Android.bp +++ b/apct-tests/perftests/textclassifier/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "TextClassifierPerfTests", srcs: ["src/**/*.java"], diff --git a/apct-tests/perftests/utils/Android.bp b/apct-tests/perftests/utils/Android.bp index be85816629c1f..6c46a9b58f069 100644 --- a/apct-tests/perftests/utils/Android.bp +++ b/apct-tests/perftests/utils/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_library { name: "apct-perftests-utils", static_libs: [ diff --git a/apct-tests/perftests/windowmanager/Android.bp b/apct-tests/perftests/windowmanager/Android.bp index f02cbcfc4daf8..1d78f6585dcbd 100644 --- a/apct-tests/perftests/windowmanager/Android.bp +++ b/apct-tests/perftests/windowmanager/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "WmPerfTests", srcs: ["src/**/*.java"], diff --git a/apex/Android.bp b/apex/Android.bp index 8310ba769f55f..f3a936233ae87 100644 --- a/apex/Android.bp +++ b/apex/Android.bp @@ -14,4 +14,10 @@ package { default_visibility: [":__subpackages__"], + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], } diff --git a/apex/blobstore/framework/Android.bp b/apex/blobstore/framework/Android.bp index 349955368b17d..1cb295ba0822b 100644 --- a/apex/blobstore/framework/Android.bp +++ b/apex/blobstore/framework/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + filegroup { name: "framework-blobstore-sources", srcs: [ diff --git a/apex/blobstore/service/Android.bp b/apex/blobstore/service/Android.bp index f6cbac1628da2..49cfd07443dbc 100644 --- a/apex/blobstore/service/Android.bp +++ b/apex/blobstore/service/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_library { name: "service-blobstore", installable: true, diff --git a/apex/jobscheduler/framework/Android.bp b/apex/jobscheduler/framework/Android.bp index 23f5614f018c9..70f7fe9acac40 100644 --- a/apex/jobscheduler/framework/Android.bp +++ b/apex/jobscheduler/framework/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + filegroup { name: "framework-jobscheduler-sources", srcs: [ diff --git a/apex/jobscheduler/service/Android.bp b/apex/jobscheduler/service/Android.bp index 6ddba690bd6f3..bb86341119e0e 100644 --- a/apex/jobscheduler/service/Android.bp +++ b/apex/jobscheduler/service/Android.bp @@ -1,5 +1,14 @@ // Job Scheduler Service jar, which will eventually be put in the jobscheduler mainline apex. // service-jobscheduler needs to be added to PRODUCT_SYSTEM_SERVER_JARS. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_library { name: "service-jobscheduler", installable: true, diff --git a/apex/media/Android.bp b/apex/media/Android.bp index 5f1bd374df00a..308741a6733dc 100644 --- a/apex/media/Android.bp +++ b/apex/media/Android.bp @@ -17,4 +17,10 @@ package { "//frameworks/av/apex", "//frameworks/av/apex/testing", ], + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], } diff --git a/apex/media/aidl/Android.bp b/apex/media/aidl/Android.bp index 409a04897f561..5bf32717fac0d 100644 --- a/apex/media/aidl/Android.bp +++ b/apex/media/aidl/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + filegroup { name: "stable-mediasession2-aidl-srcs", srcs: ["stable/**/*.aidl"], diff --git a/apex/media/framework/Android.bp b/apex/media/framework/Android.bp index 3dea77029da8c..3dd0da75d1a89 100644 --- a/apex/media/framework/Android.bp +++ b/apex/media/framework/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_library { name: "updatable-media", diff --git a/api/Android.bp b/api/Android.bp index 7e2147e99a5ef..2c2bb65402ea0 100644 --- a/api/Android.bp +++ b/api/Android.bp @@ -14,6 +14,14 @@ package { default_visibility: ["//visibility:private"], + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + // SPDX-license-identifier-MIT + // SPDX-license-identifier-Unicode-DFS + default_applicable_licenses: ["frameworks_base_license"], } genrule { diff --git a/boot/Android.bp b/boot/Android.bp index dd4066a7d151e..4f7c44eca8182 100644 --- a/boot/Android.bp +++ b/boot/Android.bp @@ -12,6 +12,17 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + // SPDX-license-identifier-MIT + // SPDX-license-identifier-Unicode-DFS + default_applicable_licenses: ["frameworks_base_license"], +} + boot_image { name: "framework-boot-image", image_name: "boot", diff --git a/cmds/am/Android.bp b/cmds/am/Android.bp index ed73d55968590..7bb9675ede37e 100644 --- a/cmds/am/Android.bp +++ b/cmds/am/Android.bp @@ -1,6 +1,23 @@ // Copyright 2008 The Android Open Source Project // +package { + default_applicable_licenses: ["frameworks_base_cmds_am_license"], +} + +// Added automatically by a large-scale-change +// See: http://go/android-license-faq +license { + name: "frameworks_base_cmds_am_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + ], + license_text: [ + "NOTICE", + ], +} + cc_library_host_static { name: "libinstrumentation", srcs: ["**/*.proto"], diff --git a/cmds/app_process/Android.bp b/cmds/app_process/Android.bp index 14ebb713b6ae2..4e5b3bac57133 100644 --- a/cmds/app_process/Android.bp +++ b/cmds/app_process/Android.bp @@ -1,3 +1,20 @@ +package { + default_applicable_licenses: ["frameworks_base_cmds_app_process_license"], +} + +// Added automatically by a large-scale-change +// See: http://go/android-license-faq +license { + name: "frameworks_base_cmds_app_process_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + ], + license_text: [ + "NOTICE", + ], +} + cc_binary { name: "app_process", diff --git a/cmds/appops/Android.bp b/cmds/appops/Android.bp index 9f330fa3bb515..80f8ec6792471 100644 --- a/cmds/appops/Android.bp +++ b/cmds/appops/Android.bp @@ -1,5 +1,22 @@ // Copyright 2014 The Android Open Source Project +package { + default_applicable_licenses: ["frameworks_base_cmds_appops_license"], +} + +// Added automatically by a large-scale-change +// See: http://go/android-license-faq +license { + name: "frameworks_base_cmds_appops_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + ], + license_text: [ + "NOTICE", + ], +} + sh_binary { name: "appops", src: "appops", diff --git a/cmds/appwidget/Android.bp b/cmds/appwidget/Android.bp index 487d3e1fc25f8..8049038de809c 100644 --- a/cmds/appwidget/Android.bp +++ b/cmds/appwidget/Android.bp @@ -1,5 +1,22 @@ // Copyright 2014 The Android Open Source Project +package { + default_applicable_licenses: ["frameworks_base_cmds_appwidget_license"], +} + +// Added automatically by a large-scale-change +// See: http://go/android-license-faq +license { + name: "frameworks_base_cmds_appwidget_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + ], + license_text: [ + "NOTICE", + ], +} + java_binary { name: "appwidget", wrapper: "appwidget", diff --git a/cmds/backup/Android.bp b/cmds/backup/Android.bp index 287c23b27fbbb..5e2a56e6a9cd9 100644 --- a/cmds/backup/Android.bp +++ b/cmds/backup/Android.bp @@ -1,5 +1,22 @@ // Copyright 2009 The Android Open Source Project +package { + default_applicable_licenses: ["frameworks_base_cmds_backup_license"], +} + +// Added automatically by a large-scale-change +// See: http://go/android-license-faq +license { + name: "frameworks_base_cmds_backup_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + ], + license_text: [ + "NOTICE", + ], +} + cc_binary { name: "btool", diff --git a/cmds/bmgr/Android.bp b/cmds/bmgr/Android.bp index b64923bcbe1b1..14beb5561dbab 100644 --- a/cmds/bmgr/Android.bp +++ b/cmds/bmgr/Android.bp @@ -1,6 +1,23 @@ // Copyright 2007 The Android Open Source Project // +package { + default_applicable_licenses: ["frameworks_base_cmds_bmgr_license"], +} + +// Added automatically by a large-scale-change +// See: http://go/android-license-faq +license { + name: "frameworks_base_cmds_bmgr_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + ], + license_text: [ + "NOTICE", + ], +} + java_binary { name: "bmgr", wrapper: "bmgr", diff --git a/cmds/bootanimation/Android.bp b/cmds/bootanimation/Android.bp index 757c2b2a4cfaf..2ecbd75866ec1 100644 --- a/cmds/bootanimation/Android.bp +++ b/cmds/bootanimation/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_defaults { name: "bootanimation_defaults", diff --git a/cmds/bu/Android.bp b/cmds/bu/Android.bp index 0866ee0531079..5b4ec3197cddb 100644 --- a/cmds/bu/Android.bp +++ b/cmds/bu/Android.bp @@ -1,6 +1,23 @@ // Copyright 2011 The Android Open Source Project // +package { + default_applicable_licenses: ["frameworks_base_cmds_bu_license"], +} + +// Added automatically by a large-scale-change +// See: http://go/android-license-faq +license { + name: "frameworks_base_cmds_bu_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + ], + license_text: [ + "NOTICE", + ], +} + java_binary { name: "bu", wrapper: "bu", diff --git a/cmds/content/Android.bp b/cmds/content/Android.bp index 96d14696d0a24..c70d01ec8f0bb 100644 --- a/cmds/content/Android.bp +++ b/cmds/content/Android.bp @@ -1,5 +1,22 @@ // Copyright 2012 The Android Open Source Project +package { + default_applicable_licenses: ["frameworks_base_cmds_content_license"], +} + +// Added automatically by a large-scale-change +// See: http://go/android-license-faq +license { + name: "frameworks_base_cmds_content_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + ], + license_text: [ + "NOTICE", + ], +} + java_binary { name: "content", wrapper: "content", diff --git a/cmds/device_config/Android.bp b/cmds/device_config/Android.bp index 67e014a20506a..69572d8690c43 100644 --- a/cmds/device_config/Android.bp +++ b/cmds/device_config/Android.bp @@ -1,6 +1,17 @@ // Copyright 2018 The Android Open Source Project // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + // SPDX-license-identifier-MIT + // SPDX-license-identifier-Unicode-DFS + default_applicable_licenses: ["frameworks_base_license"], +} + sh_binary { name: "device_config", src: "device_config", diff --git a/cmds/dpm/Android.bp b/cmds/dpm/Android.bp index 753121e6d8861..665abcd7314df 100644 --- a/cmds/dpm/Android.bp +++ b/cmds/dpm/Android.bp @@ -1,6 +1,23 @@ // Copyright 2014 The Android Open Source Project // +package { + default_applicable_licenses: ["frameworks_base_cmds_dpm_license"], +} + +// Added automatically by a large-scale-change +// See: http://go/android-license-faq +license { + name: "frameworks_base_cmds_dpm_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + ], + license_text: [ + "NOTICE", + ], +} + java_binary { name: "dpm", wrapper: "dpm", diff --git a/cmds/hid/Android.bp b/cmds/hid/Android.bp index 54c8bf3ef34c6..295c71c65368b 100644 --- a/cmds/hid/Android.bp +++ b/cmds/hid/Android.bp @@ -1,6 +1,23 @@ // Copyright 2015 The Android Open Source Project // +package { + default_applicable_licenses: ["frameworks_base_cmds_hid_license"], +} + +// Added automatically by a large-scale-change +// See: http://go/android-license-faq +license { + name: "frameworks_base_cmds_hid_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + ], + license_text: [ + "NOTICE", + ], +} + java_binary { name: "hid", wrapper: "hid", diff --git a/cmds/hid/jni/Android.bp b/cmds/hid/jni/Android.bp index 2c07de04b6a7e..11d92909e44aa 100644 --- a/cmds/hid/jni/Android.bp +++ b/cmds/hid/jni/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_cmds_hid_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_cmds_hid_license"], +} + cc_library_shared { name: "libhidcommand_jni", diff --git a/cmds/idmap2/Android.bp b/cmds/idmap2/Android.bp index 1176a1ea84d5e..5212d80814012 100644 --- a/cmds/idmap2/Android.bp +++ b/cmds/idmap2/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_defaults { name: "idmap2_defaults", tidy: true, diff --git a/cmds/ime/Android.bp b/cmds/ime/Android.bp index 76a16c81ca384..6dd3ba1ca7ef5 100644 --- a/cmds/ime/Android.bp +++ b/cmds/ime/Android.bp @@ -1,6 +1,23 @@ // Copyright 2007 The Android Open Source Project // +package { + default_applicable_licenses: ["frameworks_base_cmds_ime_license"], +} + +// Added automatically by a large-scale-change +// See: http://go/android-license-faq +license { + name: "frameworks_base_cmds_ime_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + ], + license_text: [ + "NOTICE", + ], +} + sh_binary { name: "ime", src: "ime", diff --git a/cmds/incident/Android.bp b/cmds/incident/Android.bp index 94855aa0311fa..147885f029c2d 100644 --- a/cmds/incident/Android.bp +++ b/cmds/incident/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_binary { name: "incident", diff --git a/cmds/incident_helper/Android.bp b/cmds/incident_helper/Android.bp index f07743ec2ee63..5b819ebc3dfd9 100644 --- a/cmds/incident_helper/Android.bp +++ b/cmds/incident_helper/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_binary { name: "incident-helper-cmd", wrapper: "incident_helper_cmd", diff --git a/cmds/incidentd/Android.bp b/cmds/incidentd/Android.bp index c47526abad53d..b0b23f569664f 100644 --- a/cmds/incidentd/Android.bp +++ b/cmds/incidentd/Android.bp @@ -16,6 +16,15 @@ // incidentd // ========= +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_binary { name: "incidentd", diff --git a/cmds/input/Android.bp b/cmds/input/Android.bp index a0ebde63eb6ee..f41a95eb380f7 100644 --- a/cmds/input/Android.bp +++ b/cmds/input/Android.bp @@ -1,6 +1,23 @@ // Copyright 2008 The Android Open Source Project // +package { + default_applicable_licenses: ["frameworks_base_cmds_input_license"], +} + +// Added automatically by a large-scale-change +// See: http://go/android-license-faq +license { + name: "frameworks_base_cmds_input_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + ], + license_text: [ + "NOTICE", + ], +} + java_binary { name: "input", wrapper: "input", diff --git a/cmds/interrupter/Android.bp b/cmds/interrupter/Android.bp index d68e7fe37535a..d7f744d0834e0 100644 --- a/cmds/interrupter/Android.bp +++ b/cmds/interrupter/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_library_shared { name: "interrupter", host_supported: true, diff --git a/cmds/locksettings/Android.bp b/cmds/locksettings/Android.bp index 59ccc5cd082ea..3869c8fcdabcd 100644 --- a/cmds/locksettings/Android.bp +++ b/cmds/locksettings/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_binary { name: "locksettings", wrapper: "locksettings", diff --git a/cmds/pm/Android.bp b/cmds/pm/Android.bp index 0644f6efcb8a0..847dbabdf4c08 100644 --- a/cmds/pm/Android.bp +++ b/cmds/pm/Android.bp @@ -1,6 +1,23 @@ // Copyright 2007 The Android Open Source Project // +package { + default_applicable_licenses: ["frameworks_base_cmds_pm_license"], +} + +// Added automatically by a large-scale-change +// See: http://go/android-license-faq +license { + name: "frameworks_base_cmds_pm_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + ], + license_text: [ + "NOTICE", + ], +} + sh_binary { name: "pm", src: "pm", diff --git a/cmds/requestsync/Android.bp b/cmds/requestsync/Android.bp index ef2a8a6be3ca6..57e8dd355b26a 100644 --- a/cmds/requestsync/Android.bp +++ b/cmds/requestsync/Android.bp @@ -1,6 +1,23 @@ // Copyright 2012 The Android Open Source Project // +package { + default_applicable_licenses: ["frameworks_base_cmds_requestsync_license"], +} + +// Added automatically by a large-scale-change +// See: http://go/android-license-faq +license { + name: "frameworks_base_cmds_requestsync_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + ], + license_text: [ + "NOTICE", + ], +} + java_binary { name: "requestsync", wrapper: "requestsync", diff --git a/cmds/screencap/Android.bp b/cmds/screencap/Android.bp index 248c675896962..7b61bef5031c0 100644 --- a/cmds/screencap/Android.bp +++ b/cmds/screencap/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_binary { name: "screencap", diff --git a/cmds/settings/Android.bp b/cmds/settings/Android.bp index 8a78e5420a5fc..cc730062f9df2 100644 --- a/cmds/settings/Android.bp +++ b/cmds/settings/Android.bp @@ -1,6 +1,17 @@ // Copyright 2011 The Android Open Source Project // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + // SPDX-license-identifier-MIT + // SPDX-license-identifier-Unicode-DFS + default_applicable_licenses: ["frameworks_base_license"], +} + sh_binary { name: "settings", src: "settings", diff --git a/cmds/sm/Android.bp b/cmds/sm/Android.bp index 11e4e72b435bd..ecfacaeecfd93 100644 --- a/cmds/sm/Android.bp +++ b/cmds/sm/Android.bp @@ -1,6 +1,23 @@ // Copyright 2015 The Android Open Source Project // +package { + default_applicable_licenses: ["frameworks_base_cmds_sm_license"], +} + +// Added automatically by a large-scale-change +// See: http://go/android-license-faq +license { + name: "frameworks_base_cmds_sm_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + ], + license_text: [ + "NOTICE", + ], +} + java_binary { name: "sm", wrapper: "sm", diff --git a/cmds/svc/Android.bp b/cmds/svc/Android.bp index 68b48f11e5a61..41a3ebd2f5149 100644 --- a/cmds/svc/Android.bp +++ b/cmds/svc/Android.bp @@ -1,6 +1,23 @@ // Copyright 2007 The Android Open Source Project // +package { + default_applicable_licenses: ["frameworks_base_cmds_svc_license"], +} + +// Added automatically by a large-scale-change +// See: http://go/android-license-faq +license { + name: "frameworks_base_cmds_svc_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + ], + license_text: [ + "NOTICE", + ], +} + java_binary { name: "svc", wrapper: "svc", diff --git a/cmds/telecom/Android.bp b/cmds/telecom/Android.bp index 56e147c5c8cac..4da79c54477be 100644 --- a/cmds/telecom/Android.bp +++ b/cmds/telecom/Android.bp @@ -1,6 +1,23 @@ // Copyright 2015 The Android Open Source Project // +package { + default_applicable_licenses: ["frameworks_base_cmds_telecom_license"], +} + +// Added automatically by a large-scale-change +// See: http://go/android-license-faq +license { + name: "frameworks_base_cmds_telecom_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + ], + license_text: [ + "NOTICE", + ], +} + java_binary { name: "telecom", wrapper: "telecom", diff --git a/cmds/uiautomator/Android.bp b/cmds/uiautomator/Android.bp index f9cb3dd388973..a0bf624c6455e 100644 --- a/cmds/uiautomator/Android.bp +++ b/cmds/uiautomator/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + genrule { name: "uiautomator-last-released-api", srcs: ["api/*.txt"], diff --git a/cmds/uiautomator/cmds/uiautomator/Android.bp b/cmds/uiautomator/cmds/uiautomator/Android.bp index 68cc5a3391075..56e2e70958fa9 100644 --- a/cmds/uiautomator/cmds/uiautomator/Android.bp +++ b/cmds/uiautomator/cmds/uiautomator/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_binary { name: "uiautomator", wrapper: "uiautomator", diff --git a/cmds/uiautomator/instrumentation/Android.bp b/cmds/uiautomator/instrumentation/Android.bp index 477f0d1f6e104..50e223425f141 100644 --- a/cmds/uiautomator/instrumentation/Android.bp +++ b/cmds/uiautomator/instrumentation/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_test { name: "uiautomator-instrumentation", diff --git a/cmds/uiautomator/library/Android.bp b/cmds/uiautomator/library/Android.bp index 14b74da0c6162..469b452013372 100644 --- a/cmds/uiautomator/library/Android.bp +++ b/cmds/uiautomator/library/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + droidstubs { name: "uiautomator-stubs", srcs: [ diff --git a/cmds/vr/Android.bp b/cmds/vr/Android.bp index cb129bdf68531..893649155fd81 100644 --- a/cmds/vr/Android.bp +++ b/cmds/vr/Android.bp @@ -1,6 +1,23 @@ // Copyright 2017 The Android Open Source Project // +package { + default_applicable_licenses: ["frameworks_base_cmds_vr_license"], +} + +// Added automatically by a large-scale-change +// See: http://go/android-license-faq +license { + name: "frameworks_base_cmds_vr_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + ], + license_text: [ + "NOTICE", + ], +} + java_binary { name: "vr", wrapper: "vr", diff --git a/cmds/wm/Android.bp b/cmds/wm/Android.bp index 609f84b89bd8c..cf6b0193fe873 100644 --- a/cmds/wm/Android.bp +++ b/cmds/wm/Android.bp @@ -1,6 +1,23 @@ // Copyright 2013 The Android Open Source Project // +package { + default_applicable_licenses: ["frameworks_base_cmds_wm_license"], +} + +// Added automatically by a large-scale-change +// See: http://go/android-license-faq +license { + name: "frameworks_base_cmds_wm_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + ], + license_text: [ + "NOTICE", + ], +} + sh_binary { name: "wm", src: "wm", diff --git a/config/Android.bp b/config/Android.bp index 8dd409b51eeed..6a6f848b7d52a 100644 --- a/config/Android.bp +++ b/config/Android.bp @@ -12,6 +12,23 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + default_applicable_licenses: ["frameworks_base_config_license"], +} + +// Added automatically by a large-scale-change +// See: http://go/android-license-faq +license { + name: "frameworks_base_config_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + ], + license_text: [ + "copyright-header", + ], +} + filegroup { name: "preloaded-classes-denylist", srcs: ["preloaded-classes-denylist"], diff --git a/core/api/Android.bp b/core/api/Android.bp index 00b901992b901..170febb4f7666 100644 --- a/core/api/Android.bp +++ b/core/api/Android.bp @@ -14,6 +14,14 @@ package { default_visibility: ["//visibility:private"], + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + // SPDX-license-identifier-MIT + // SPDX-license-identifier-Unicode-DFS + default_applicable_licenses: ["frameworks_base_license"], } filegroup { diff --git a/core/java/Android.bp b/core/java/Android.bp index af5df769ffad9..2fdf9c146ff6a 100644 --- a/core/java/Android.bp +++ b/core/java/Android.bp @@ -1,3 +1,14 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + // SPDX-license-identifier-BSD + // legacy_unencumbered + default_applicable_licenses: ["frameworks_base_license"], +} + filegroup { name: "IKeyAttestationApplicationIdProvider.aidl", srcs: ["android/security/keymaster/IKeyAttestationApplicationIdProvider.aidl"], diff --git a/core/java/android/service/wallpaper/Android.bp b/core/java/android/service/wallpaper/Android.bp index ffbdb035c36ce..a527d3d10fdf3 100644 --- a/core/java/android/service/wallpaper/Android.bp +++ b/core/java/android/service/wallpaper/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_library { name: "WallpaperSharedLib", diff --git a/core/jni/Android.bp b/core/jni/Android.bp index 088682c9f2d83..877349227406b 100644 --- a/core/jni/Android.bp +++ b/core/jni/Android.bp @@ -1,4 +1,21 @@ +package { + default_applicable_licenses: ["frameworks_base_core_jni_license"], +} + +// Added automatically by a large-scale-change +// See: http://go/android-license-faq +license { + name: "frameworks_base_core_jni_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + ], + license_text: [ + "NOTICE", + ], +} + cc_library_shared { name: "libandroid_runtime", host_supported: true, diff --git a/core/res/Android.bp b/core/res/Android.bp index f94a2b08e6c39..4c05cd64db498 100644 --- a/core/res/Android.bp +++ b/core/res/Android.bp @@ -14,6 +14,36 @@ // limitations under the License. // +package { + default_applicable_licenses: ["frameworks_base_core_res_license"], +} + +// Added automatically by a large-scale-change that took the approach of +// 'apply every license found to every target'. While this makes sure we respect +// every license restriction, it may not be entirely correct. +// +// e.g. GPL in an MIT project might only apply to the contrib/ directory. +// +// Please consider splitting the single license below into multiple licenses, +// taking care not to lose any license_kind information, and overriding the +// default license using the 'licenses: [...]' property on targets as needed. +// +// For unused files, consider creating a 'fileGroup' with "//visibility:private" +// to attach the license to, and including a comment whether the files may be +// used in the current project. +// See: http://go/android-license-faq +license { + name: "frameworks_base_core_res_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + "SPDX-license-identifier-GPL", + ], + license_text: [ + "NOTICE", + ], +} + android_app { name: "framework-res", sdk_version: "core_platform", diff --git a/core/sysprop/Android.bp b/core/sysprop/Android.bp index 237ede2006ead..f89099e5630d2 100644 --- a/core/sysprop/Android.bp +++ b/core/sysprop/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + sysprop_library { name: "com.android.sysprop.localization", srcs: ["LocalizationProperties.sysprop"], diff --git a/core/tests/BroadcastRadioTests/Android.bp b/core/tests/BroadcastRadioTests/Android.bp index b8efd198aebe4..113f45dfef559 100644 --- a/core/tests/BroadcastRadioTests/Android.bp +++ b/core/tests/BroadcastRadioTests/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "BroadcastRadioTests", privileged: true, diff --git a/core/tests/ConnectivityManagerTest/Android.bp b/core/tests/ConnectivityManagerTest/Android.bp index a33d219f53d27..beaf17615f1db 100644 --- a/core/tests/ConnectivityManagerTest/Android.bp +++ b/core/tests/ConnectivityManagerTest/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "ConnectivityManagerTest", libs: [ diff --git a/core/tests/PackageInstallerSessions/Android.bp b/core/tests/PackageInstallerSessions/Android.bp index e74f30ee10a46..c7a0002130295 100644 --- a/core/tests/PackageInstallerSessions/Android.bp +++ b/core/tests/PackageInstallerSessions/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "FrameworksCorePackageInstallerSessionsTests", diff --git a/core/tests/PlatformCompatFramework/Android.bp b/core/tests/PlatformCompatFramework/Android.bp index 33802650fa123..95e23ad396af0 100644 --- a/core/tests/PlatformCompatFramework/Android.bp +++ b/core/tests/PlatformCompatFramework/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "PlatformCompatFrameworkTests", // Include all test java files. diff --git a/core/tests/bandwidthtests/Android.bp b/core/tests/bandwidthtests/Android.bp index 5d881b8be68c1..f1ecd45073ebd 100644 --- a/core/tests/bandwidthtests/Android.bp +++ b/core/tests/bandwidthtests/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "BandwidthTests", // Include all test java files. diff --git a/core/tests/benchmarks/Android.bp b/core/tests/benchmarks/Android.bp index 8dd7928e6fc23..4cd546753dbfa 100644 --- a/core/tests/benchmarks/Android.bp +++ b/core/tests/benchmarks/Android.bp @@ -16,6 +16,15 @@ // build framework base core benchmarks // ============================================================ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_library { name: "frameworks-base-core-benchmarks", installable: true, diff --git a/core/tests/bluetoothtests/Android.bp b/core/tests/bluetoothtests/Android.bp index 4b6f9db33afc0..a2e4dff8f8269 100644 --- a/core/tests/bluetoothtests/Android.bp +++ b/core/tests/bluetoothtests/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "BluetoothTests", // Include all test java files. diff --git a/core/tests/bugreports/Android.bp b/core/tests/bugreports/Android.bp index e42b4b4ae2bf1..f87797a90c904 100644 --- a/core/tests/bugreports/Android.bp +++ b/core/tests/bugreports/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "BugreportManagerTestCases", srcs: ["src/**/*.java"], diff --git a/core/tests/coretests/Android.bp b/core/tests/coretests/Android.bp index 1e16ee052899c..510578e1e50bc 100644 --- a/core/tests/coretests/Android.bp +++ b/core/tests/coretests/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "FrameworksCoreTests", diff --git a/core/tests/coretests/BinderDeathRecipientHelperApp/Android.bp b/core/tests/coretests/BinderDeathRecipientHelperApp/Android.bp index 25e4fc366124a..b47c4702eafe2 100644 --- a/core/tests/coretests/BinderDeathRecipientHelperApp/Android.bp +++ b/core/tests/coretests/BinderDeathRecipientHelperApp/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "BinderDeathRecipientHelperApp1", diff --git a/core/tests/coretests/BinderProxyCountingTestApp/Android.bp b/core/tests/coretests/BinderProxyCountingTestApp/Android.bp index 6279a4873c678..b1df8dbbee19b 100644 --- a/core/tests/coretests/BinderProxyCountingTestApp/Android.bp +++ b/core/tests/coretests/BinderProxyCountingTestApp/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "BinderProxyCountingTestApp", diff --git a/core/tests/coretests/BinderProxyCountingTestService/Android.bp b/core/tests/coretests/BinderProxyCountingTestService/Android.bp index 22718cb86d66b..52c23a15e4e33 100644 --- a/core/tests/coretests/BinderProxyCountingTestService/Android.bp +++ b/core/tests/coretests/BinderProxyCountingTestService/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "BinderProxyCountingTestService", diff --git a/core/tests/coretests/BstatsTestApp/Android.bp b/core/tests/coretests/BstatsTestApp/Android.bp index a89d728306863..c82da9e7b4490 100644 --- a/core/tests/coretests/BstatsTestApp/Android.bp +++ b/core/tests/coretests/BstatsTestApp/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "BstatsTestApp", diff --git a/core/tests/coretests/DisabledTestApp/Android.bp b/core/tests/coretests/DisabledTestApp/Android.bp index 419816e42eff8..3ab321827e533 100644 --- a/core/tests/coretests/DisabledTestApp/Android.bp +++ b/core/tests/coretests/DisabledTestApp/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "DisabledTestApp", diff --git a/core/tests/coretests/EnabledTestApp/Android.bp b/core/tests/coretests/EnabledTestApp/Android.bp index bc4f4bd2e4d77..750b578a0253c 100644 --- a/core/tests/coretests/EnabledTestApp/Android.bp +++ b/core/tests/coretests/EnabledTestApp/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "EnabledTestApp", diff --git a/core/tests/coretests/aidl/Android.bp b/core/tests/coretests/aidl/Android.bp index 6e442db785002..2d848cca46182 100644 --- a/core/tests/coretests/aidl/Android.bp +++ b/core/tests/coretests/aidl/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_test { name: "coretests-aidl", sdk_version: "current", diff --git a/core/tests/coretests/apks/Android.bp b/core/tests/coretests/apks/Android.bp index 20c87b2d2ce9a..eda875acfdb1f 100644 --- a/core/tests/coretests/apks/Android.bp +++ b/core/tests/coretests/apks/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_defaults { name: "FrameworksCoreTests_apks_defaults", sdk_version: "current", diff --git a/core/tests/coretests/apks/install/Android.bp b/core/tests/coretests/apks/install/Android.bp index e783fe2ec2dcf..652b49130433e 100644 --- a/core/tests/coretests/apks/install/Android.bp +++ b/core/tests/coretests/apks/install/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "FrameworksCoreTests_install", defaults: ["FrameworksCoreTests_apks_defaults"], diff --git a/core/tests/coretests/apks/install_bad_dex/Android.bp b/core/tests/coretests/apks/install_bad_dex/Android.bp index d156793cf22ab..7b96c9b475533 100644 --- a/core/tests/coretests/apks/install_bad_dex/Android.bp +++ b/core/tests/coretests/apks/install_bad_dex/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "FrameworksCoreTests_install_bad_dex_", defaults: ["FrameworksCoreTests_apks_defaults"], diff --git a/core/tests/coretests/apks/install_complete_package_info/Android.bp b/core/tests/coretests/apks/install_complete_package_info/Android.bp index 123558bda0766..3fee0c6e7f7c5 100644 --- a/core/tests/coretests/apks/install_complete_package_info/Android.bp +++ b/core/tests/coretests/apks/install_complete_package_info/Android.bp @@ -1,7 +1,15 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "FrameworksCoreTests_install_complete_package_info", defaults: ["FrameworksCoreTests_apks_defaults"], srcs: ["**/*.java"], } - diff --git a/core/tests/coretests/apks/install_decl_perm/Android.bp b/core/tests/coretests/apks/install_decl_perm/Android.bp index 868e8b51bd494..bf1f0de9672a4 100644 --- a/core/tests/coretests/apks/install_decl_perm/Android.bp +++ b/core/tests/coretests/apks/install_decl_perm/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "FrameworksCoreTests_install_decl_perm", defaults: ["FrameworksCoreTests_apks_defaults"], diff --git a/core/tests/coretests/apks/install_jni_lib/Android.bp b/core/tests/coretests/apks/install_jni_lib/Android.bp index df19fa09adcf1..d315e7b70cb91 100644 --- a/core/tests/coretests/apks/install_jni_lib/Android.bp +++ b/core/tests/coretests/apks/install_jni_lib/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_test_library { name: "libframeworks_coretests_jni", defaults: ["FrameworksCoreTests_apks_defaults"], diff --git a/core/tests/coretests/apks/install_jni_lib_open_from_apk/Android.bp b/core/tests/coretests/apks/install_jni_lib_open_from_apk/Android.bp index 602b704a0a5d4..20cc96ebc5c0b 100644 --- a/core/tests/coretests/apks/install_jni_lib_open_from_apk/Android.bp +++ b/core/tests/coretests/apks/install_jni_lib_open_from_apk/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "FrameworksCoreTests_install_jni_lib_open_from_apk", defaults: ["FrameworksCoreTests_apks_defaults"], diff --git a/core/tests/coretests/apks/install_loc_auto/Android.bp b/core/tests/coretests/apks/install_loc_auto/Android.bp index 6393915ba2834..37daf7608a434 100644 --- a/core/tests/coretests/apks/install_loc_auto/Android.bp +++ b/core/tests/coretests/apks/install_loc_auto/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "FrameworksCoreTests_install_loc_auto", defaults: ["FrameworksCoreTests_apks_defaults"], diff --git a/core/tests/coretests/apks/install_loc_internal/Android.bp b/core/tests/coretests/apks/install_loc_internal/Android.bp index 770aaa511b9d4..3e233132b58da 100644 --- a/core/tests/coretests/apks/install_loc_internal/Android.bp +++ b/core/tests/coretests/apks/install_loc_internal/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "FrameworksCoreTests_install_loc_internal", defaults: ["FrameworksCoreTests_apks_defaults"], diff --git a/core/tests/coretests/apks/install_loc_sdcard/Android.bp b/core/tests/coretests/apks/install_loc_sdcard/Android.bp index 177940102e833..708e655e07dbf 100644 --- a/core/tests/coretests/apks/install_loc_sdcard/Android.bp +++ b/core/tests/coretests/apks/install_loc_sdcard/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "FrameworksCoreTests_install_loc_sdcard", defaults: ["FrameworksCoreTests_apks_defaults"], diff --git a/core/tests/coretests/apks/install_loc_unspecified/Android.bp b/core/tests/coretests/apks/install_loc_unspecified/Android.bp index 21c0f82b44ff5..76869e9b9ed5f 100644 --- a/core/tests/coretests/apks/install_loc_unspecified/Android.bp +++ b/core/tests/coretests/apks/install_loc_unspecified/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "FrameworksCoreTests_install_loc_unspecified", defaults: ["FrameworksCoreTests_apks_defaults"], diff --git a/core/tests/coretests/apks/install_use_perm_good/Android.bp b/core/tests/coretests/apks/install_use_perm_good/Android.bp index bb41ebb2fdca4..89700ddb94bea 100644 --- a/core/tests/coretests/apks/install_use_perm_good/Android.bp +++ b/core/tests/coretests/apks/install_use_perm_good/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "FrameworksCoreTests_install_use_perm_good", defaults: ["FrameworksCoreTests_apks_defaults"], diff --git a/core/tests/coretests/apks/install_uses_feature/Android.bp b/core/tests/coretests/apks/install_uses_feature/Android.bp index 0ec747b0f1512..913a96a1cd277 100644 --- a/core/tests/coretests/apks/install_uses_feature/Android.bp +++ b/core/tests/coretests/apks/install_uses_feature/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "FrameworksCoreTests_install_uses_feature", defaults: ["FrameworksCoreTests_apks_defaults"], diff --git a/core/tests/coretests/apks/install_verifier_bad/Android.bp b/core/tests/coretests/apks/install_verifier_bad/Android.bp index 1265739a3107f..ed13d74789bf1 100644 --- a/core/tests/coretests/apks/install_verifier_bad/Android.bp +++ b/core/tests/coretests/apks/install_verifier_bad/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "FrameworksCoreTests_install_verifier_bad", defaults: ["FrameworksCoreTests_apks_defaults"], diff --git a/core/tests/coretests/apks/install_verifier_good/Android.bp b/core/tests/coretests/apks/install_verifier_good/Android.bp index 4911ffbd2020a..fe9a24f6bd7b2 100644 --- a/core/tests/coretests/apks/install_verifier_good/Android.bp +++ b/core/tests/coretests/apks/install_verifier_good/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "FrameworksCoreTests_install_verifier_good", defaults: ["FrameworksCoreTests_apks_defaults"], diff --git a/core/tests/coretests/apks/keyset/Android.bp b/core/tests/coretests/apks/keyset/Android.bp index e252b081341a2..93c3b1f603276 100644 --- a/core/tests/coretests/apks/keyset/Android.bp +++ b/core/tests/coretests/apks/keyset/Android.bp @@ -1,4 +1,13 @@ //apks signed by keyset_A +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "FrameworksCoreTests_keyset_sa_unone", defaults: ["FrameworksCoreTests_apks_defaults"], diff --git a/core/tests/coretests/apks/locales/Android.bp b/core/tests/coretests/apks/locales/Android.bp index 4a730ef53404d..4fe6c7fd09b28 100644 --- a/core/tests/coretests/apks/locales/Android.bp +++ b/core/tests/coretests/apks/locales/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "FrameworksCoreTests_locales", defaults: ["FrameworksCoreTests_apks_defaults"], diff --git a/core/tests/coretests/apks/overlay_config/Android.bp b/core/tests/coretests/apks/overlay_config/Android.bp index 957355726fe80..9c971fd2f1bc7 100644 --- a/core/tests/coretests/apks/overlay_config/Android.bp +++ b/core/tests/coretests/apks/overlay_config/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "FrameworksCoreTests_overlay_config", defaults: ["FrameworksCoreTests_apks_defaults"], diff --git a/core/tests/coretests/apks/version/Android.bp b/core/tests/coretests/apks/version/Android.bp index 371ccfc301cb1..8b750f7b5ee40 100644 --- a/core/tests/coretests/apks/version/Android.bp +++ b/core/tests/coretests/apks/version/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "FrameworksCoreTests_version_1", defaults: ["FrameworksCoreTests_apks_defaults"], diff --git a/core/tests/coretests/apks/version_nosys/Android.bp b/core/tests/coretests/apks/version_nosys/Android.bp index 5756678223939..de40f49849b76 100644 --- a/core/tests/coretests/apks/version_nosys/Android.bp +++ b/core/tests/coretests/apks/version_nosys/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "FrameworksCoreTests_version_1_nosys", defaults: ["FrameworksCoreTests_apks_defaults"], diff --git a/core/tests/coretests/certs/Android.bp b/core/tests/coretests/certs/Android.bp index bd5c8293f6f6f..8411183c3335b 100644 --- a/core/tests/coretests/certs/Android.bp +++ b/core/tests/coretests/certs/Android.bp @@ -1,3 +1,14 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + // SPDX-license-identifier-MIT + // SPDX-license-identifier-Unicode-DFS + default_applicable_licenses: ["frameworks_base_license"], +} + android_app_certificate { name: "FrameworksCoreTests_keyset_A_cert", certificate: "keyset_A", diff --git a/core/tests/featureflagtests/Android.bp b/core/tests/featureflagtests/Android.bp index 8730b7012c4a0..d9f608ea34c4d 100644 --- a/core/tests/featureflagtests/Android.bp +++ b/core/tests/featureflagtests/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "FrameworksCoreFeatureFlagTests", // We only want this apk build for tests. diff --git a/core/tests/hdmitests/Android.bp b/core/tests/hdmitests/Android.bp index 4755e0ea5259c..f49e05329f626 100644 --- a/core/tests/hdmitests/Android.bp +++ b/core/tests/hdmitests/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "HdmiCecTests", // Include all test java files diff --git a/core/tests/hosttests/test-apps/AutoLocTestApp/Android.bp b/core/tests/hosttests/test-apps/AutoLocTestApp/Android.bp index 14424811d3be7..b4efce2c822bc 100644 --- a/core/tests/hosttests/test-apps/AutoLocTestApp/Android.bp +++ b/core/tests/hosttests/test-apps/AutoLocTestApp/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "AutoLocTestApp", srcs: ["src/**/*.java"], diff --git a/core/tests/hosttests/test-apps/AutoLocVersionedTestApp_v1/Android.bp b/core/tests/hosttests/test-apps/AutoLocVersionedTestApp_v1/Android.bp index 438ed25337162..0e07ddca5edc5 100644 --- a/core/tests/hosttests/test-apps/AutoLocVersionedTestApp_v1/Android.bp +++ b/core/tests/hosttests/test-apps/AutoLocVersionedTestApp_v1/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "AutoLocVersionedTestApp_v1", srcs: ["src/**/*.java"], diff --git a/core/tests/hosttests/test-apps/AutoLocVersionedTestApp_v2/Android.bp b/core/tests/hosttests/test-apps/AutoLocVersionedTestApp_v2/Android.bp index 2ac72a13fee3e..f40870004e925 100644 --- a/core/tests/hosttests/test-apps/AutoLocVersionedTestApp_v2/Android.bp +++ b/core/tests/hosttests/test-apps/AutoLocVersionedTestApp_v2/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "AutoLocVersionedTestApp_v2", srcs: ["src/**/*.java"], diff --git a/core/tests/hosttests/test-apps/ExternalLocAllPermsTestApp/Android.bp b/core/tests/hosttests/test-apps/ExternalLocAllPermsTestApp/Android.bp index e06e82e38ef4d..964401d851afb 100644 --- a/core/tests/hosttests/test-apps/ExternalLocAllPermsTestApp/Android.bp +++ b/core/tests/hosttests/test-apps/ExternalLocAllPermsTestApp/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "ExternalLocAllPermsTestApp", srcs: ["src/**/*.java"], diff --git a/core/tests/hosttests/test-apps/ExternalLocPermsFLTestApp/Android.bp b/core/tests/hosttests/test-apps/ExternalLocPermsFLTestApp/Android.bp index c48dcd525232c..297ed57a6b34a 100644 --- a/core/tests/hosttests/test-apps/ExternalLocPermsFLTestApp/Android.bp +++ b/core/tests/hosttests/test-apps/ExternalLocPermsFLTestApp/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "ExternalLocPermFLTestApp", srcs: ["src/**/*.java"], diff --git a/core/tests/hosttests/test-apps/ExternalLocTestApp/Android.bp b/core/tests/hosttests/test-apps/ExternalLocTestApp/Android.bp index 5c1c15a4999f2..cf8c7e1abcf35 100644 --- a/core/tests/hosttests/test-apps/ExternalLocTestApp/Android.bp +++ b/core/tests/hosttests/test-apps/ExternalLocTestApp/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "ExternalLocTestApp", srcs: ["src/**/*.java"], diff --git a/core/tests/hosttests/test-apps/ExternalLocVersionedTestApp_v1/Android.bp b/core/tests/hosttests/test-apps/ExternalLocVersionedTestApp_v1/Android.bp index 13f5066c71701..909bd7f9d0daa 100644 --- a/core/tests/hosttests/test-apps/ExternalLocVersionedTestApp_v1/Android.bp +++ b/core/tests/hosttests/test-apps/ExternalLocVersionedTestApp_v1/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "ExternalLocVersionedTestApp_v1", srcs: ["src/**/*.java"], diff --git a/core/tests/hosttests/test-apps/ExternalLocVersionedTestApp_v2/Android.bp b/core/tests/hosttests/test-apps/ExternalLocVersionedTestApp_v2/Android.bp index e02ffb307ba2c..c5f91924d2431 100644 --- a/core/tests/hosttests/test-apps/ExternalLocVersionedTestApp_v2/Android.bp +++ b/core/tests/hosttests/test-apps/ExternalLocVersionedTestApp_v2/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "ExternalLocVersionedTestApp_v2", srcs: ["src/**/*.java"], diff --git a/core/tests/hosttests/test-apps/ExternalSharedPerms/Android.bp b/core/tests/hosttests/test-apps/ExternalSharedPerms/Android.bp index de098005b40ef..1545f4d0e5f91 100644 --- a/core/tests/hosttests/test-apps/ExternalSharedPerms/Android.bp +++ b/core/tests/hosttests/test-apps/ExternalSharedPerms/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "ExternalSharedPermsTestApp", srcs: ["src/**/*.java"], diff --git a/core/tests/hosttests/test-apps/ExternalSharedPermsBT/Android.bp b/core/tests/hosttests/test-apps/ExternalSharedPermsBT/Android.bp index 435144f31edd5..8690bdfc2f93b 100644 --- a/core/tests/hosttests/test-apps/ExternalSharedPermsBT/Android.bp +++ b/core/tests/hosttests/test-apps/ExternalSharedPermsBT/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "ExternalSharedPermsBTTestApp", srcs: ["src/**/*.java"], diff --git a/core/tests/hosttests/test-apps/ExternalSharedPermsDiffKey/Android.bp b/core/tests/hosttests/test-apps/ExternalSharedPermsDiffKey/Android.bp index 445bac94f10db..21b7c4c1ea777 100644 --- a/core/tests/hosttests/test-apps/ExternalSharedPermsDiffKey/Android.bp +++ b/core/tests/hosttests/test-apps/ExternalSharedPermsDiffKey/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "ExternalSharedPermsDiffKeyTestApp", srcs: ["src/**/*.java"], diff --git a/core/tests/hosttests/test-apps/ExternalSharedPermsFL/Android.bp b/core/tests/hosttests/test-apps/ExternalSharedPermsFL/Android.bp index d1da3998ca4a5..63bf8dca69680 100644 --- a/core/tests/hosttests/test-apps/ExternalSharedPermsFL/Android.bp +++ b/core/tests/hosttests/test-apps/ExternalSharedPermsFL/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "ExternalSharedPermsFLTestApp", srcs: ["src/**/*.java"], diff --git a/core/tests/hosttests/test-apps/InternalLocTestApp/Android.bp b/core/tests/hosttests/test-apps/InternalLocTestApp/Android.bp index fab9d4394fc58..f05cde430992e 100644 --- a/core/tests/hosttests/test-apps/InternalLocTestApp/Android.bp +++ b/core/tests/hosttests/test-apps/InternalLocTestApp/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "InternalLocTestApp", srcs: ["src/**/*.java"], diff --git a/core/tests/hosttests/test-apps/MultiDexLegacyTestServicesTests/Android.bp b/core/tests/hosttests/test-apps/MultiDexLegacyTestServicesTests/Android.bp index dcf168760d4d4..56f10fe075edf 100644 --- a/core/tests/hosttests/test-apps/MultiDexLegacyTestServicesTests/Android.bp +++ b/core/tests/hosttests/test-apps/MultiDexLegacyTestServicesTests/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "MultiDexLegacyTestServicesTests", srcs: ["src/**/*.java"], diff --git a/core/tests/hosttests/test-apps/NoLocTestApp/Android.bp b/core/tests/hosttests/test-apps/NoLocTestApp/Android.bp index 50a2de499d370..88e3722a5ed4f 100644 --- a/core/tests/hosttests/test-apps/NoLocTestApp/Android.bp +++ b/core/tests/hosttests/test-apps/NoLocTestApp/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "NoLocTestApp", srcs: ["src/**/*.java"], diff --git a/core/tests/hosttests/test-apps/NoLocVersionedTestApp_v1/Android.bp b/core/tests/hosttests/test-apps/NoLocVersionedTestApp_v1/Android.bp index 4bc9edcd9f201..fd5ab265d1e26 100644 --- a/core/tests/hosttests/test-apps/NoLocVersionedTestApp_v1/Android.bp +++ b/core/tests/hosttests/test-apps/NoLocVersionedTestApp_v1/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "NoLocVersionedTestApp_v1", srcs: ["src/**/*.java"], diff --git a/core/tests/hosttests/test-apps/NoLocVersionedTestApp_v2/Android.bp b/core/tests/hosttests/test-apps/NoLocVersionedTestApp_v2/Android.bp index dd2952be00dd3..fa821d84ace41 100644 --- a/core/tests/hosttests/test-apps/NoLocVersionedTestApp_v2/Android.bp +++ b/core/tests/hosttests/test-apps/NoLocVersionedTestApp_v2/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "NoLocVersionedTestApp_v2", srcs: ["src/**/*.java"], diff --git a/core/tests/hosttests/test-apps/SharedUid/32/Android.bp b/core/tests/hosttests/test-apps/SharedUid/32/Android.bp index f3e3eded5fbaa..6f3d4cf9c0273 100644 --- a/core/tests/hosttests/test-apps/SharedUid/32/Android.bp +++ b/core/tests/hosttests/test-apps/SharedUid/32/Android.bp @@ -19,6 +19,15 @@ // Build activity +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "PMTest_Java32", srcs: ["**/*.java"], diff --git a/core/tests/hosttests/test-apps/SharedUid/32/jni/Android.bp b/core/tests/hosttests/test-apps/SharedUid/32/jni/Android.bp index 9e6c17f0247ac..867d65cbe81c5 100644 --- a/core/tests/hosttests/test-apps/SharedUid/32/jni/Android.bp +++ b/core/tests/hosttests/test-apps/SharedUid/32/jni/Android.bp @@ -17,6 +17,15 @@ // This makefile supplies the rules for building a library of JNI code for // use by our example of how to bundle a shared library with an APK. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_test_library { // This is the target being built. diff --git a/core/tests/hosttests/test-apps/SharedUid/64/Android.bp b/core/tests/hosttests/test-apps/SharedUid/64/Android.bp index 5d9c0b597ef1a..6bb25a82b3542 100644 --- a/core/tests/hosttests/test-apps/SharedUid/64/Android.bp +++ b/core/tests/hosttests/test-apps/SharedUid/64/Android.bp @@ -19,6 +19,15 @@ // Build activity +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "PMTest_Java64", srcs: ["**/*.java"], diff --git a/core/tests/hosttests/test-apps/SharedUid/64/jni/Android.bp b/core/tests/hosttests/test-apps/SharedUid/64/jni/Android.bp index 91da6e44a8be7..c032ba1503d18 100644 --- a/core/tests/hosttests/test-apps/SharedUid/64/jni/Android.bp +++ b/core/tests/hosttests/test-apps/SharedUid/64/jni/Android.bp @@ -17,6 +17,15 @@ // This Android.bp supplies the rules for building a library of JNI code for // use by our example of how to bundle a shared library with an APK. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_test_library { // This is the target being built. name: "libpmtest64", diff --git a/core/tests/hosttests/test-apps/SharedUid/dual/Android.bp b/core/tests/hosttests/test-apps/SharedUid/dual/Android.bp index c42192dcdbf29..94dd0c6758c27 100644 --- a/core/tests/hosttests/test-apps/SharedUid/dual/Android.bp +++ b/core/tests/hosttests/test-apps/SharedUid/dual/Android.bp @@ -19,6 +19,15 @@ // Build activity +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "PMTest_Java_dual", srcs: ["**/*.java"], diff --git a/core/tests/hosttests/test-apps/SharedUid/dual/jni/Android.bp b/core/tests/hosttests/test-apps/SharedUid/dual/jni/Android.bp index 662755dd35b0c..6b9d7f337fc85 100644 --- a/core/tests/hosttests/test-apps/SharedUid/dual/jni/Android.bp +++ b/core/tests/hosttests/test-apps/SharedUid/dual/jni/Android.bp @@ -17,6 +17,15 @@ // This Android.bp supplies the rules for building a library of JNI code for // use by our example of how to bundle a shared library with an APK. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_test_library { // This is the target being built. diff --git a/core/tests/hosttests/test-apps/SharedUid/java_only/Android.bp b/core/tests/hosttests/test-apps/SharedUid/java_only/Android.bp index baedc6e35734e..6d632671e261f 100644 --- a/core/tests/hosttests/test-apps/SharedUid/java_only/Android.bp +++ b/core/tests/hosttests/test-apps/SharedUid/java_only/Android.bp @@ -19,6 +19,15 @@ // Build activity +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "PMTest_Java", srcs: ["**/*.java"], diff --git a/core/tests/hosttests/test-apps/SimpleTestApp/Android.bp b/core/tests/hosttests/test-apps/SimpleTestApp/Android.bp index 5f443bd836058..b022bdaa60166 100644 --- a/core/tests/hosttests/test-apps/SimpleTestApp/Android.bp +++ b/core/tests/hosttests/test-apps/SimpleTestApp/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "SimpleTestApp", srcs: ["src/**/*.java"], diff --git a/core/tests/hosttests/test-apps/UpdateExtToIntLocTestApp_v1_ext/Android.bp b/core/tests/hosttests/test-apps/UpdateExtToIntLocTestApp_v1_ext/Android.bp index 800e0833d35d4..0ac825b3dd2e8 100644 --- a/core/tests/hosttests/test-apps/UpdateExtToIntLocTestApp_v1_ext/Android.bp +++ b/core/tests/hosttests/test-apps/UpdateExtToIntLocTestApp_v1_ext/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "UpdateExtToIntLocTestApp_v1_ext", srcs: ["src/**/*.java"], diff --git a/core/tests/hosttests/test-apps/UpdateExtToIntLocTestApp_v2_int/Android.bp b/core/tests/hosttests/test-apps/UpdateExtToIntLocTestApp_v2_int/Android.bp index 299887c9fbfcc..6f66a51044991 100644 --- a/core/tests/hosttests/test-apps/UpdateExtToIntLocTestApp_v2_int/Android.bp +++ b/core/tests/hosttests/test-apps/UpdateExtToIntLocTestApp_v2_int/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "UpdateExtToIntLocTestApp_v2_int", srcs: ["src/**/*.java"], diff --git a/core/tests/hosttests/test-apps/UpdateExternalLocTestApp_v1_ext/Android.bp b/core/tests/hosttests/test-apps/UpdateExternalLocTestApp_v1_ext/Android.bp index 1530422841f66..d88bce04638bc 100644 --- a/core/tests/hosttests/test-apps/UpdateExternalLocTestApp_v1_ext/Android.bp +++ b/core/tests/hosttests/test-apps/UpdateExternalLocTestApp_v1_ext/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "UpdateExternalLocTestApp_v1_ext", srcs: ["src/**/*.java"], diff --git a/core/tests/hosttests/test-apps/UpdateExternalLocTestApp_v2_none/Android.bp b/core/tests/hosttests/test-apps/UpdateExternalLocTestApp_v2_none/Android.bp index 4c7975e5f18a2..d1240df8a3cef 100644 --- a/core/tests/hosttests/test-apps/UpdateExternalLocTestApp_v2_none/Android.bp +++ b/core/tests/hosttests/test-apps/UpdateExternalLocTestApp_v2_none/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "UpdateExternalLocTestApp_v2_none", srcs: ["src/**/*.java"], diff --git a/core/tests/hosttests/test-apps/VersatileTestApp_Auto/Android.bp b/core/tests/hosttests/test-apps/VersatileTestApp_Auto/Android.bp index c6b60c352e380..751071cd947af 100644 --- a/core/tests/hosttests/test-apps/VersatileTestApp_Auto/Android.bp +++ b/core/tests/hosttests/test-apps/VersatileTestApp_Auto/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "VersatileTestApp_Auto", srcs: ["src/**/*.java"], diff --git a/core/tests/hosttests/test-apps/VersatileTestApp_External/Android.bp b/core/tests/hosttests/test-apps/VersatileTestApp_External/Android.bp index db521efc59351..b9ed015b22eb6 100644 --- a/core/tests/hosttests/test-apps/VersatileTestApp_External/Android.bp +++ b/core/tests/hosttests/test-apps/VersatileTestApp_External/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "VersatileTestApp_External", srcs: ["src/**/*.java"], diff --git a/core/tests/hosttests/test-apps/VersatileTestApp_Internal/Android.bp b/core/tests/hosttests/test-apps/VersatileTestApp_Internal/Android.bp index ca059302ff0d6..7b725704651c3 100644 --- a/core/tests/hosttests/test-apps/VersatileTestApp_Internal/Android.bp +++ b/core/tests/hosttests/test-apps/VersatileTestApp_Internal/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "VersatileTestApp_Internal", srcs: ["src/**/*.java"], diff --git a/core/tests/hosttests/test-apps/VersatileTestApp_None/Android.bp b/core/tests/hosttests/test-apps/VersatileTestApp_None/Android.bp index 6e1aac7d6c94e..5f67bce361c5d 100644 --- a/core/tests/hosttests/test-apps/VersatileTestApp_None/Android.bp +++ b/core/tests/hosttests/test-apps/VersatileTestApp_None/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "VersatileTestApp_None", srcs: ["src/**/*.java"], diff --git a/core/tests/mockingcoretests/Android.bp b/core/tests/mockingcoretests/Android.bp index ae3ff8612eee8..96811be37f5a2 100644 --- a/core/tests/mockingcoretests/Android.bp +++ b/core/tests/mockingcoretests/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "FrameworksMockingCoreTests", diff --git a/core/tests/notificationtests/Android.bp b/core/tests/notificationtests/Android.bp index e744d5a2e6313..1c0e39d9e022b 100644 --- a/core/tests/notificationtests/Android.bp +++ b/core/tests/notificationtests/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "NotificationStressTests", // Include all test java files. diff --git a/core/tests/overlaytests/device/Android.bp b/core/tests/overlaytests/device/Android.bp index f86ac9ce37e11..0d3b15a41e8c3 100644 --- a/core/tests/overlaytests/device/Android.bp +++ b/core/tests/overlaytests/device/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "OverlayDeviceTests", srcs: ["src/**/*.java"], diff --git a/core/tests/overlaytests/device/test-apps/AppOverlayOne/Android.bp b/core/tests/overlaytests/device/test-apps/AppOverlayOne/Android.bp index 847b4915530bc..4ff59fa56a68b 100644 --- a/core/tests/overlaytests/device/test-apps/AppOverlayOne/Android.bp +++ b/core/tests/overlaytests/device/test-apps/AppOverlayOne/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "OverlayDeviceTests_AppOverlayOne", sdk_version: "current", diff --git a/core/tests/overlaytests/device/test-apps/AppOverlayTwo/Android.bp b/core/tests/overlaytests/device/test-apps/AppOverlayTwo/Android.bp index 7d5f82a71b442..1f5763ee60ae7 100644 --- a/core/tests/overlaytests/device/test-apps/AppOverlayTwo/Android.bp +++ b/core/tests/overlaytests/device/test-apps/AppOverlayTwo/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "OverlayDeviceTests_AppOverlayTwo", sdk_version: "current", diff --git a/core/tests/overlaytests/device/test-apps/FrameworkOverlay/Android.bp b/core/tests/overlaytests/device/test-apps/FrameworkOverlay/Android.bp index 50dbc6f054d31..178a02009dda5 100644 --- a/core/tests/overlaytests/device/test-apps/FrameworkOverlay/Android.bp +++ b/core/tests/overlaytests/device/test-apps/FrameworkOverlay/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "OverlayDeviceTests_FrameworkOverlay", sdk_version: "current", diff --git a/core/tests/overlaytests/host/Android.bp b/core/tests/overlaytests/host/Android.bp index a2fcef56b7802..e4c3fbec8afcf 100644 --- a/core/tests/overlaytests/host/Android.bp +++ b/core/tests/overlaytests/host/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_test_host { name: "OverlayHostTests", srcs: ["src/**/*.java"], diff --git a/core/tests/overlaytests/remount/Android.bp b/core/tests/overlaytests/remount/Android.bp index 939334c94312c..0a6b88bcbb632 100644 --- a/core/tests/overlaytests/remount/Android.bp +++ b/core/tests/overlaytests/remount/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_test_host { name: "OverlayRemountedTest", srcs: ["src/**/*.java"], diff --git a/core/tests/overlaytests/remount/test-apps/Overlay/Android.bp b/core/tests/overlaytests/remount/test-apps/Overlay/Android.bp index 032a0cdcb50d4..a341c9aa88f7c 100644 --- a/core/tests/overlaytests/remount/test-apps/Overlay/Android.bp +++ b/core/tests/overlaytests/remount/test-apps/Overlay/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "OverlayRemountedTest_Overlay", sdk_version: "current", @@ -24,4 +33,4 @@ android_test_helper_app { name: "OverlayRemountedTest_Overlay_SameCert", certificate: ":rro-remounted-test-a", sdk_version: "current", -} \ No newline at end of file +} diff --git a/core/tests/overlaytests/remount/test-apps/SharedLibrary/Android.bp b/core/tests/overlaytests/remount/test-apps/SharedLibrary/Android.bp index ffb0572c3fd03..bc88d61df77ac 100644 --- a/core/tests/overlaytests/remount/test-apps/SharedLibrary/Android.bp +++ b/core/tests/overlaytests/remount/test-apps/SharedLibrary/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "OverlayRemountedTest_SharedLibrary", sdk_version: "current", diff --git a/core/tests/overlaytests/remount/test-apps/SharedLibraryOverlay/Android.bp b/core/tests/overlaytests/remount/test-apps/SharedLibraryOverlay/Android.bp index 0d29aec909d54..88a05ab8427bb 100644 --- a/core/tests/overlaytests/remount/test-apps/SharedLibraryOverlay/Android.bp +++ b/core/tests/overlaytests/remount/test-apps/SharedLibraryOverlay/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "OverlayRemountedTest_SharedLibraryOverlay", sdk_version: "current", diff --git a/core/tests/overlaytests/remount/test-apps/Target/Android.bp b/core/tests/overlaytests/remount/test-apps/Target/Android.bp index e4b4eaa8d2209..869a75f5225d3 100644 --- a/core/tests/overlaytests/remount/test-apps/Target/Android.bp +++ b/core/tests/overlaytests/remount/test-apps/Target/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "OverlayRemountedTest_Target", sdk_version: "test_current", diff --git a/core/tests/overlaytests/remount/test-apps/certs/Android.bp b/core/tests/overlaytests/remount/test-apps/certs/Android.bp index 06114efc12493..f5d89bcabdad7 100644 --- a/core/tests/overlaytests/remount/test-apps/certs/Android.bp +++ b/core/tests/overlaytests/remount/test-apps/certs/Android.bp @@ -13,6 +13,17 @@ // limitations under the License. // development/tools/make_key rro-remounted-test-a '/CN=rro_test_a' +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + // SPDX-license-identifier-MIT + // SPDX-license-identifier-Unicode-DFS + default_applicable_licenses: ["frameworks_base_license"], +} + android_app_certificate { name: "rro-remounted-test-a", certificate: "rro-remounted-test-a", diff --git a/core/tests/overlaytests/remount/test-apps/overlaid_apex/Android.bp b/core/tests/overlaytests/remount/test-apps/overlaid_apex/Android.bp index e6ebd5ea76d8a..42421ce0e9f3e 100644 --- a/core/tests/overlaytests/remount/test-apps/overlaid_apex/Android.bp +++ b/core/tests/overlaytests/remount/test-apps/overlaid_apex/Android.bp @@ -12,6 +12,17 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + // SPDX-license-identifier-MIT + // SPDX-license-identifier-Unicode-DFS + default_applicable_licenses: ["frameworks_base_license"], +} + genrule { name: "com.android.overlaytest.overlaid.pem", out: ["com.android.overlaytest.overlaid.pem"], diff --git a/core/tests/overlaytests/remount/test-apps/overlay_apex/Android.bp b/core/tests/overlaytests/remount/test-apps/overlay_apex/Android.bp index 07f27ee55d390..0b52dcc4fb852 100644 --- a/core/tests/overlaytests/remount/test-apps/overlay_apex/Android.bp +++ b/core/tests/overlaytests/remount/test-apps/overlay_apex/Android.bp @@ -12,6 +12,17 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + // SPDX-license-identifier-MIT + // SPDX-license-identifier-Unicode-DFS + default_applicable_licenses: ["frameworks_base_license"], +} + genrule { name: "com.android.overlaytest.overlay.pem", out: ["com.android.overlaytest.overlay.pem"], diff --git a/core/tests/packagemanagertests/Android.bp b/core/tests/packagemanagertests/Android.bp index 6f39af8bd468d..5ce71c902c7cf 100644 --- a/core/tests/packagemanagertests/Android.bp +++ b/core/tests/packagemanagertests/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "FrameworksCorePackageManagerTests", // We only want this apk build for tests. diff --git a/core/tests/privacytests/Android.bp b/core/tests/privacytests/Android.bp index 7f56992877969..bc3dd810be8c1 100644 --- a/core/tests/privacytests/Android.bp +++ b/core/tests/privacytests/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "FrameworksPrivacyLibraryTests", srcs: ["src/**/*.java"], diff --git a/core/tests/screenshothelpertests/Android.bp b/core/tests/screenshothelpertests/Android.bp index 3d54b68b7ddc1..37af99c58d427 100644 --- a/core/tests/screenshothelpertests/Android.bp +++ b/core/tests/screenshothelpertests/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "ScreenshotHelperTests", @@ -25,4 +34,3 @@ android_test { certificate: "platform", } - diff --git a/core/tests/systemproperties/Android.bp b/core/tests/systemproperties/Android.bp index 7ef1b9b8f74b4..765ca3e5110ad 100644 --- a/core/tests/systemproperties/Android.bp +++ b/core/tests/systemproperties/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "FrameworksCoreSystemPropertiesTests", // Include all test java files. diff --git a/core/tests/utillib/Android.bp b/core/tests/utillib/Android.bp index 1f742c208ba2e..d40d1d2bb6e20 100644 --- a/core/tests/utillib/Android.bp +++ b/core/tests/utillib/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_library { name: "frameworks-core-util-lib", diff --git a/core/tests/utiltests/Android.bp b/core/tests/utiltests/Android.bp index a9b9c41d47196..72d6a2c677396 100644 --- a/core/tests/utiltests/Android.bp +++ b/core/tests/utiltests/Android.bp @@ -2,6 +2,15 @@ // Build FrameworksUtilTests package //######################################################################## +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "FrameworksUtilTests", diff --git a/core/tests/utiltests/jni/Android.bp b/core/tests/utiltests/jni/Android.bp index 6b75471a358a6..a9c695ed09f31 100644 --- a/core/tests/utiltests/jni/Android.bp +++ b/core/tests/utiltests/jni/Android.bp @@ -11,6 +11,15 @@ // 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 { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_library_shared { name: "libmemoryintarraytest", diff --git a/core/tests/uwbtests/Android.bp b/core/tests/uwbtests/Android.bp index 8ee86f470c9e3..31f446f7a60d7 100644 --- a/core/tests/uwbtests/Android.bp +++ b/core/tests/uwbtests/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "UwbManagerTests", static_libs: [ diff --git a/core/xsd/Android.bp b/core/xsd/Android.bp index 738f33076ac99..5387f85bffb27 100644 --- a/core/xsd/Android.bp +++ b/core/xsd/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + xsd_config { name: "permission", srcs: ["permission.xsd"], diff --git a/core/xsd/vts/Android.bp b/core/xsd/vts/Android.bp index ca655f18149c8..5d8407f584bc7 100644 --- a/core/xsd/vts/Android.bp +++ b/core/xsd/vts/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_test { name: "vts_permission_validate_test", srcs: [ diff --git a/data/etc/Android.bp b/data/etc/Android.bp index fb8b17c1f159b..d0e2474500333 100644 --- a/data/etc/Android.bp +++ b/data/etc/Android.bp @@ -15,6 +15,15 @@ // Sysconfig files +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + prebuilt_etc { name: "framework-sysconfig.xml", sub_dir: "sysconfig", diff --git a/data/etc/car/Android.bp b/data/etc/car/Android.bp index 401cf204543ef..b67fa3aaeb5bc 100644 --- a/data/etc/car/Android.bp +++ b/data/etc/car/Android.bp @@ -16,6 +16,15 @@ // Privapp permission whitelist files +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + prebuilt_etc { name: "privapp_whitelist_android.car.cluster.loggingrenderer", sub_dir: "permissions", diff --git a/data/fonts/Android.bp b/data/fonts/Android.bp index 3a3bea43ab86f..f0d750ef30e96 100644 --- a/data/fonts/Android.bp +++ b/data/fonts/Android.bp @@ -12,6 +12,23 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + default_applicable_licenses: ["frameworks_base_data_fonts_license"], +} + +// Added automatically by a large-scale-change +// See: http://go/android-license-faq +license { + name: "frameworks_base_data_fonts_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + ], + license_text: [ + "NOTICE", + ], +} + prebuilt_font { name: "DroidSansMono.ttf", src: "DroidSansMono.ttf", diff --git a/data/keyboards/Android.mk b/data/keyboards/Android.mk index 7949c77ab5582..6ae88007f0f5b 100644 --- a/data/keyboards/Android.mk +++ b/data/keyboards/Android.mk @@ -22,6 +22,9 @@ include $(LOCAL_PATH)/common.mk include $(CLEAR_VARS) LOCAL_MODULE := validate_framework_keymaps +LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0 +LOCAL_LICENSE_CONDITIONS := notice +LOCAL_NOTICE_FILE := $(LOCAL_PATH)/../../NOTICE intermediates := $(call intermediates-dir-for,ETC,$(LOCAL_MODULE),,COMMON) LOCAL_BUILT_MODULE := $(intermediates)/stamp diff --git a/drm/jni/Android.bp b/drm/jni/Android.bp index 68757d86fb89f..669f109943656 100644 --- a/drm/jni/Android.bp +++ b/drm/jni/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_library_shared { name: "libdrmframework_jni", diff --git a/errorprone/Android.bp b/errorprone/Android.bp index 7d0557d193933..f384ae94d36a3 100644 --- a/errorprone/Android.bp +++ b/errorprone/Android.bp @@ -1,4 +1,13 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_plugin { name: "error_prone_android_framework", diff --git a/graphics/proto/Android.bp b/graphics/proto/Android.bp index ea79b731a3651..1b192668b4a39 100644 --- a/graphics/proto/Android.bp +++ b/graphics/proto/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_library_static { name: "updatable-driver-protos", host_supported: true, diff --git a/keystore/Android.bp b/keystore/Android.bp new file mode 100644 index 0000000000000..5db668e48431b --- /dev/null +++ b/keystore/Android.bp @@ -0,0 +1,31 @@ +// +// 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 { + default_applicable_licenses: ["frameworks_base_keystore_license"], +} + +// Added automatically by a large-scale-change +// See: http://go/android-license-faq +license { + name: "frameworks_base_keystore_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + ], + license_text: [ + "NOTICE", + ], +} diff --git a/keystore/tests/Android.bp b/keystore/tests/Android.bp index e9b22c1407424..2315a8568c647 100644 --- a/keystore/tests/Android.bp +++ b/keystore/tests/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_keystore_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_keystore_license"], +} + android_test { name: "KeystoreTests", // LOCAL_MODULE := keystore diff --git a/libs/WindowManager/Jetpack/Android.bp b/libs/WindowManager/Jetpack/Android.bp index 7fbbb61e469d4..b6622bf0fa605 100644 --- a/libs/WindowManager/Jetpack/Android.bp +++ b/libs/WindowManager/Jetpack/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_library_import { name: "window-sidecar", aars: ["window-sidecar-release.aar"], diff --git a/libs/WindowManager/Shell/Android.bp b/libs/WindowManager/Shell/Android.bp index b8934dc8c583c..2987dabe4e30a 100644 --- a/libs/WindowManager/Shell/Android.bp +++ b/libs/WindowManager/Shell/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_library { name: "WindowManager-Shell", srcs: [ diff --git a/libs/WindowManager/Shell/tests/Android.bp b/libs/WindowManager/Shell/tests/Android.bp index 78fa45ebdf949..ca37ad75467d9 100644 --- a/libs/WindowManager/Shell/tests/Android.bp +++ b/libs/WindowManager/Shell/tests/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "WindowManagerShellTests", diff --git a/libs/androidfw/Android.bp b/libs/androidfw/Android.bp index 6a7df94331f36..581af0d0628a9 100644 --- a/libs/androidfw/Android.bp +++ b/libs/androidfw/Android.bp @@ -14,6 +14,23 @@ // libandroidfw is partially built for the host (used by obbtool, aapt, and others) +package { + default_applicable_licenses: ["frameworks_base_libs_androidfw_license"], +} + +// Added automatically by a large-scale-change +// See: http://go/android-license-faq +license { + name: "frameworks_base_libs_androidfw_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + ], + license_text: [ + "NOTICE", + ], +} + cc_defaults { name: "libandroidfw_defaults", cflags: [ diff --git a/libs/androidfw/fuzz/resourcefile_fuzzer/Android.bp b/libs/androidfw/fuzz/resourcefile_fuzzer/Android.bp index 77ef8dfb9725a..b511244c4a301 100644 --- a/libs/androidfw/fuzz/resourcefile_fuzzer/Android.bp +++ b/libs/androidfw/fuzz/resourcefile_fuzzer/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_libs_androidfw_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_libs_androidfw_license"], +} + cc_fuzz { name: "resourcefile_fuzzer", srcs: [ diff --git a/libs/hostgraphics/Android.bp b/libs/hostgraphics/Android.bp index e713b98b867eb..0388e92e1d1bd 100644 --- a/libs/hostgraphics/Android.bp +++ b/libs/hostgraphics/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_library_host_static { name: "libhostgraphics", @@ -28,4 +37,4 @@ cc_library_host_static { enabled: true, } }, -} \ No newline at end of file +} diff --git a/libs/hwui/Android.bp b/libs/hwui/Android.bp index aa842ff6a7b7b..fdb278e29cc78 100644 --- a/libs/hwui/Android.bp +++ b/libs/hwui/Android.bp @@ -1,3 +1,33 @@ +package { + default_applicable_licenses: ["frameworks_base_libs_hwui_license"], +} + +// Added automatically by a large-scale-change that took the approach of +// 'apply every license found to every target'. While this makes sure we respect +// every license restriction, it may not be entirely correct. +// +// e.g. GPL in an MIT project might only apply to the contrib/ directory. +// +// Please consider splitting the single license below into multiple licenses, +// taking care not to lose any license_kind information, and overriding the +// default license using the 'licenses: [...]' property on targets as needed. +// +// For unused files, consider creating a 'fileGroup' with "//visibility:private" +// to attach the license to, and including a comment whether the files may be +// used in the current project. +// See: http://go/android-license-faq +license { + name: "frameworks_base_libs_hwui_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + "SPDX-license-identifier-BSD", + ], + license_text: [ + "NOTICE", + ], +} + cc_defaults { name: "hwui_defaults", defaults: [ diff --git a/libs/incident/Android.bp b/libs/incident/Android.bp index d291ec001daf0..697cbb9d41c01 100644 --- a/libs/incident/Android.bp +++ b/libs/incident/Android.bp @@ -13,6 +13,15 @@ // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_defaults { name: "libincidentpriv_defaults", @@ -125,6 +134,3 @@ cc_test { "libgmock", ], } - - - diff --git a/libs/input/Android.bp b/libs/input/Android.bp index dca35012cbdd3..55f932dffff16 100644 --- a/libs/input/Android.bp +++ b/libs/input/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_library_shared { name: "libinputservice", srcs: [ diff --git a/libs/input/tests/Android.bp b/libs/input/tests/Android.bp index 213b3adfb2a80..4eabfb238f4a3 100644 --- a/libs/input/tests/Android.bp +++ b/libs/input/tests/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_test { name: "libinputservice_test", srcs: [ diff --git a/libs/protoutil/Android.bp b/libs/protoutil/Android.bp index d2b7d5c75d58e..132d71eb6db8c 100644 --- a/libs/protoutil/Android.bp +++ b/libs/protoutil/Android.bp @@ -12,6 +12,15 @@ // 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 { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_defaults { name: "libprotoutil_defaults", diff --git a/libs/services/Android.bp b/libs/services/Android.bp index 1e621079b5322..bf2e764aae6ad 100644 --- a/libs/services/Android.bp +++ b/libs/services/Android.bp @@ -14,6 +14,15 @@ // Provides C++ wrappers for system services. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_library_shared { name: "libservices", srcs: [ diff --git a/libs/storage/Android.bp b/libs/storage/Android.bp index c19933e39c96a..e8c6c071bc06c 100644 --- a/libs/storage/Android.bp +++ b/libs/storage/Android.bp @@ -1,3 +1,20 @@ +package { + default_applicable_licenses: ["frameworks_base_libs_storage_license"], +} + +// Added automatically by a large-scale-change +// See: http://go/android-license-faq +license { + name: "frameworks_base_libs_storage_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + ], + license_text: [ + "NOTICE", + ], +} + cc_library_static { name: "libstorage", diff --git a/libs/tracingproxy/Android.bp b/libs/tracingproxy/Android.bp index 67f407ff75994..7126bfac773d7 100644 --- a/libs/tracingproxy/Android.bp +++ b/libs/tracingproxy/Android.bp @@ -14,6 +14,17 @@ // Provides C++ wrappers for system services. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + // SPDX-license-identifier-MIT + // SPDX-license-identifier-Unicode-DFS + default_applicable_licenses: ["frameworks_base_license"], +} + cc_library_shared { name: "libtracingproxy", diff --git a/libs/usb/Android.bp b/libs/usb/Android.bp index e752b55f5ef79..edc847487dcbc 100644 --- a/libs/usb/Android.bp +++ b/libs/usb/Android.bp @@ -14,6 +14,16 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + // SPDX-license-identifier-GPL-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_sdk_library { name: "com.android.future.usb.accessory", srcs: ["src/**/*.java"], diff --git a/libs/usb/tests/AccessoryChat/Android.bp b/libs/usb/tests/AccessoryChat/Android.bp index 19ed3d3ef52e1..72090fb692e0b 100644 --- a/libs/usb/tests/AccessoryChat/Android.bp +++ b/libs/usb/tests/AccessoryChat/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "AccessoryChat", diff --git a/libs/usb/tests/AccessoryChat/accessorychat/Android.bp b/libs/usb/tests/AccessoryChat/accessorychat/Android.bp index 5613745e966bf..108649aa92aed 100644 --- a/libs/usb/tests/AccessoryChat/accessorychat/Android.bp +++ b/libs/usb/tests/AccessoryChat/accessorychat/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_binary { name: "accessorychat", host_supported: true, diff --git a/libs/usb/tests/accessorytest/Android.bp b/libs/usb/tests/accessorytest/Android.bp index c6340e32e60c4..69761aeb46fe5 100644 --- a/libs/usb/tests/accessorytest/Android.bp +++ b/libs/usb/tests/accessorytest/Android.bp @@ -1,3 +1,13 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + // SPDX-license-identifier-GPL-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_binary_host { name: "accessorytest", diff --git a/location/lib/Android.bp b/location/lib/Android.bp index cd45e8e6ffa67..5cd5a59f41ac7 100644 --- a/location/lib/Android.bp +++ b/location/lib/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_sdk_library { name: "com.android.location.provider", srcs: ["java/**/*.java"], diff --git a/location/tests/locationtests/Android.bp b/location/tests/locationtests/Android.bp index 1a4e2c7ba3556..c18ef28ca7999 100644 --- a/location/tests/locationtests/Android.bp +++ b/location/tests/locationtests/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "FrameworksLocationTests", // Include all test java files. diff --git a/lowpan/tests/Android.bp b/lowpan/tests/Android.bp index ad2bc27d1b39a..590892926ec18 100644 --- a/lowpan/tests/Android.bp +++ b/lowpan/tests/Android.bp @@ -14,6 +14,15 @@ // Make test APK // ============================================================ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "FrameworksLowpanApiTests", srcs: ["**/*.java"], diff --git a/media/Android.bp b/media/Android.bp index 0ed10472561d4..6b4c3886a17db 100644 --- a/media/Android.bp +++ b/media/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + aidl_interface { name: "audio_common-aidl", unstable: true, diff --git a/media/java/Android.bp b/media/java/Android.bp index 0810699abf0a8..aea63a073e952 100644 --- a/media/java/Android.bp +++ b/media/java/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + filegroup { name: "IMidiDeviceServer.aidl", srcs: ["android/media/midi/IMidiDeviceServer.aidl"], diff --git a/media/java/android/media/tv/tunerresourcemanager/Android.bp b/media/java/android/media/tv/tunerresourcemanager/Android.bp index c65d25a03813f..66c7bd4a1f2b9 100644 --- a/media/java/android/media/tv/tunerresourcemanager/Android.bp +++ b/media/java/android/media/tv/tunerresourcemanager/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + filegroup { name: "framework-media-tv-tunerresourcemanager-sources", srcs: [ @@ -14,4 +23,4 @@ java_library { visibility: [ "//frameworks/base", ], -} \ No newline at end of file +} diff --git a/media/jni/Android.bp b/media/jni/Android.bp index d3466702ebf2e..f65dfddef008e 100644 --- a/media/jni/Android.bp +++ b/media/jni/Android.bp @@ -1,3 +1,20 @@ +package { + default_applicable_licenses: ["frameworks_base_media_jni_license"], +} + +// Added automatically by a large-scale-change +// See: http://go/android-license-faq +license { + name: "frameworks_base_media_jni_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + ], + license_text: [ + "NOTICE", + ], +} + cc_library_shared { name: "libmedia_jni", diff --git a/media/jni/audioeffect/Android.bp b/media/jni/audioeffect/Android.bp index 40e4c54c2921f..c2fc91d5cfea7 100644 --- a/media/jni/audioeffect/Android.bp +++ b/media/jni/audioeffect/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_media_jni_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_media_jni_license"], +} + cc_library_shared { name: "libaudioeffect_jni", diff --git a/media/jni/soundpool/Android.bp b/media/jni/soundpool/Android.bp index 6141308a8fdbf..7b498e027d1c4 100644 --- a/media/jni/soundpool/Android.bp +++ b/media/jni/soundpool/Android.bp @@ -1,3 +1,22 @@ +package { + default_applicable_licenses: [ + "frameworks_base_media_jni_soundpool_license", + ], +} + +// Added automatically by a large-scale-change +// See: http://go/android-license-faq +license { + name: "frameworks_base_media_jni_soundpool_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + ], + license_text: [ + "NOTICE", + ], +} + tidy_errors = [ // https://clang.llvm.org/extra/clang-tidy/checks/list.html // For many categories, the checks are too many to specify individually. diff --git a/media/jni/soundpool/tests/Android.bp b/media/jni/soundpool/tests/Android.bp index 52f59ed69503f..7d31c106f9c46 100644 --- a/media/jni/soundpool/tests/Android.bp +++ b/media/jni/soundpool/tests/Android.bp @@ -1,3 +1,14 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_media_jni_soundpool_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: [ + "frameworks_base_media_jni_soundpool_license", + ], +} + cc_binary { name: "soundpool_stress", host_supported: false, diff --git a/media/lib/remotedisplay/Android.bp b/media/lib/remotedisplay/Android.bp index 5f4b930f350e0..bfb0cb854be33 100644 --- a/media/lib/remotedisplay/Android.bp +++ b/media/lib/remotedisplay/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_sdk_library { name: "com.android.media.remotedisplay", srcs: ["java/**/*.java"], diff --git a/media/lib/signer/Android.bp b/media/lib/signer/Android.bp index 3b25787540874..6504176eb6f11 100644 --- a/media/lib/signer/Android.bp +++ b/media/lib/signer/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_sdk_library { name: "com.android.mediadrm.signer", srcs: ["java/**/*.java"], diff --git a/media/lib/tvremote/Android.bp b/media/lib/tvremote/Android.bp index 5f101a3141c8c..5f9185aca9a2c 100644 --- a/media/lib/tvremote/Android.bp +++ b/media/lib/tvremote/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_sdk_library { name: "com.android.media.tv.remoteprovider", srcs: ["java/**/*.java"], diff --git a/media/lib/tvremote/tests/Android.bp b/media/lib/tvremote/tests/Android.bp index f00eed0707986..f02cfc393c814 100644 --- a/media/lib/tvremote/tests/Android.bp +++ b/media/lib/tvremote/tests/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "TvRemoteTests", srcs: ["src/**/*.java"], diff --git a/media/mca/filterfw/Android.bp b/media/mca/filterfw/Android.bp index 0e0ecf331afce..ef3583f1a77f5 100644 --- a/media/mca/filterfw/Android.bp +++ b/media/mca/filterfw/Android.bp @@ -13,6 +13,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_library_shared { name: "libfilterfw", diff --git a/media/mca/filterfw/native/Android.bp b/media/mca/filterfw/native/Android.bp index 7a8a6a18664ec..7e4a34e8d9340 100644 --- a/media/mca/filterfw/native/Android.bp +++ b/media/mca/filterfw/native/Android.bp @@ -16,6 +16,15 @@ //#################### // Build module libfilterfw_static +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_library_static { name: "libfilterfw_native", diff --git a/media/mca/filterpacks/Android.bp b/media/mca/filterpacks/Android.bp index 34fb27dd1663d..b50df6eb572c1 100644 --- a/media/mca/filterpacks/Android.bp +++ b/media/mca/filterpacks/Android.bp @@ -13,6 +13,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_library_static { name: "libfilterpack_base", srcs: [ diff --git a/media/mca/samples/CameraEffectsRecordingSample/Android.bp b/media/mca/samples/CameraEffectsRecordingSample/Android.bp index 96e81ab9b9cc6..541660c1e4a20 100644 --- a/media/mca/samples/CameraEffectsRecordingSample/Android.bp +++ b/media/mca/samples/CameraEffectsRecordingSample/Android.bp @@ -15,6 +15,15 @@ // Build activity +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "CameraEffectsRecordingSample", srcs: ["**/*.java"], @@ -23,4 +32,3 @@ android_test { enabled: false, }, } - diff --git a/media/mca/tests/Android.bp b/media/mca/tests/Android.bp index 6b11dd9db7ba0..f02b4c0a4bfb4 100644 --- a/media/mca/tests/Android.bp +++ b/media/mca/tests/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "CameraEffectsTests", libs: [ diff --git a/media/native/midi/Android.bp b/media/native/midi/Android.bp index 2da45b6a78be1..7acb8c744ba77 100644 --- a/media/native/midi/Android.bp +++ b/media/native/midi/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_library_shared { name: "libamidi", diff --git a/media/packages/BluetoothMidiService/Android.bp b/media/packages/BluetoothMidiService/Android.bp index 48fc329276bd4..5ac4e7ff9d60e 100644 --- a/media/packages/BluetoothMidiService/Android.bp +++ b/media/packages/BluetoothMidiService/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_library { name: "BluetoothMidiLib", srcs: [ diff --git a/media/packages/BluetoothMidiService/tests/unit/Android.bp b/media/packages/BluetoothMidiService/tests/unit/Android.bp index 4d4ae9e15532c..ad07993082cce 100644 --- a/media/packages/BluetoothMidiService/tests/unit/Android.bp +++ b/media/packages/BluetoothMidiService/tests/unit/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "BluetoothMidiTests", srcs: ["src/**/*.java"], diff --git a/media/tests/AudioPolicyTest/Android.bp b/media/tests/AudioPolicyTest/Android.bp index ed3383752695d..95d1c6ccb67cc 100644 --- a/media/tests/AudioPolicyTest/Android.bp +++ b/media/tests/AudioPolicyTest/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "audiopolicytest", srcs: ["**/*.java"], diff --git a/media/tests/CameraBrowser/Android.bp b/media/tests/CameraBrowser/Android.bp index 8e3ca1943b17c..1408640a6b0df 100644 --- a/media/tests/CameraBrowser/Android.bp +++ b/media/tests/CameraBrowser/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "CameraBrowser", srcs: ["**/*.java"], diff --git a/media/tests/EffectsTest/Android.bp b/media/tests/EffectsTest/Android.bp index 214e8c02f742b..644e453b8956d 100644 --- a/media/tests/EffectsTest/Android.bp +++ b/media/tests/EffectsTest/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "EffectsTest", srcs: ["**/*.java"], diff --git a/media/tests/MediaDump/Android.bp b/media/tests/MediaDump/Android.bp index 0eba8b24f6cd3..f54b97a065584 100644 --- a/media/tests/MediaDump/Android.bp +++ b/media/tests/MediaDump/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_app { name: "MediaDump", // Only compile source java files in this apk. diff --git a/media/tests/MediaFrameworkTest/Android.bp b/media/tests/MediaFrameworkTest/Android.bp index ecbe2b3eb8b78..725781f5b57fa 100644 --- a/media/tests/MediaFrameworkTest/Android.bp +++ b/media/tests/MediaFrameworkTest/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "mediaframeworktest", srcs: ["**/*.java"], diff --git a/media/tests/MediaRouter/Android.bp b/media/tests/MediaRouter/Android.bp index 5a0a50c2ae389..b546590545e38 100644 --- a/media/tests/MediaRouter/Android.bp +++ b/media/tests/MediaRouter/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "mediaroutertest", @@ -16,4 +25,4 @@ android_test { platform_apis: true, certificate: "platform", -} \ No newline at end of file +} diff --git a/media/tests/MtpTests/Android.bp b/media/tests/MtpTests/Android.bp index 7d2c7c693fa5b..3016873e1de8b 100644 --- a/media/tests/MtpTests/Android.bp +++ b/media/tests/MtpTests/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "MtpTests", srcs: ["**/*.java"], diff --git a/media/tests/ScoAudioTest/Android.bp b/media/tests/ScoAudioTest/Android.bp index ad2b917161458..f8a893bf7f2cf 100644 --- a/media/tests/ScoAudioTest/Android.bp +++ b/media/tests/ScoAudioTest/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "scoaudiotest", platform_apis: true, diff --git a/media/tests/SoundPoolTest/Android.bp b/media/tests/SoundPoolTest/Android.bp index 473f531f675b5..0a50106d52c8a 100644 --- a/media/tests/SoundPoolTest/Android.bp +++ b/media/tests/SoundPoolTest/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "SoundPoolTest", srcs: ["**/*.java"], diff --git a/media/tests/TunerTest/Android.bp b/media/tests/TunerTest/Android.bp index cef879112225f..2816fcc9d2f76 100644 --- a/media/tests/TunerTest/Android.bp +++ b/media/tests/TunerTest/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "mediatunertest", diff --git a/media/tests/audiotests/Android.bp b/media/tests/audiotests/Android.bp index 5db0ab0cde6d6..c52c0336979c9 100644 --- a/media/tests/audiotests/Android.bp +++ b/media/tests/audiotests/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_test { name: "shared_mem_test", gtest: false, diff --git a/media/tests/players/Android.bp b/media/tests/players/Android.bp index 23c5f04c93a66..3b6df707badbf 100644 --- a/media/tests/players/Android.bp +++ b/media/tests/players/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_test_library { name: "invoke_mock_media_player", srcs: ["invoke_mock_media_player.cpp"], diff --git a/mime/Android.bp b/mime/Android.bp index 23a8fbf5059c3..a3ea65cb2efe4 100644 --- a/mime/Android.bp +++ b/mime/Android.bp @@ -13,6 +13,15 @@ // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_defaults { name: "mimemap-defaults", srcs: [ diff --git a/native/android/Android.bp b/native/android/Android.bp index 02e1ebe05b028..d1dddbd52265e 100644 --- a/native/android/Android.bp +++ b/native/android/Android.bp @@ -13,6 +13,15 @@ // limitations under the License. // The headers module is in frameworks/native/Android.bp. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + ndk_library { name: "libandroid", symbol_file: "libandroid.map.txt", diff --git a/native/graphics/jni/Android.bp b/native/graphics/jni/Android.bp index 15b473c2a6ab8..3f7f445ad2c15 100644 --- a/native/graphics/jni/Android.bp +++ b/native/graphics/jni/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_library_shared { name: "libjnigraphics", diff --git a/native/webview/loader/Android.bp b/native/webview/loader/Android.bp index dfa5bdde07857..bb9b8903273e7 100644 --- a/native/webview/loader/Android.bp +++ b/native/webview/loader/Android.bp @@ -17,6 +17,15 @@ // Loader library which handles address space reservation and relro sharing. // Does NOT link any native chromium code. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_library_shared { name: "libwebviewchromium_loader", diff --git a/native/webview/plat_support/Android.bp b/native/webview/plat_support/Android.bp index 1a3b36d046e15..2e94e8452fddd 100644 --- a/native/webview/plat_support/Android.bp +++ b/native/webview/plat_support/Android.bp @@ -18,6 +18,38 @@ // Native support library (libwebviewchromium_plat_support.so) - does NOT link // any native chromium code. +package { + default_applicable_licenses: [ + "frameworks_base_native_webview_plat_support_license", + ], +} + +// Added automatically by a large-scale-change that took the approach of +// 'apply every license found to every target'. While this makes sure we respect +// every license restriction, it may not be entirely correct. +// +// e.g. GPL in an MIT project might only apply to the contrib/ directory. +// +// Please consider splitting the single license below into multiple licenses, +// taking care not to lose any license_kind information, and overriding the +// default license using the 'licenses: [...]' property on targets as needed. +// +// For unused files, consider creating a 'fileGroup' with "//visibility:private" +// to attach the license to, and including a comment whether the files may be +// used in the current project. +// See: http://go/android-license-faq +license { + name: "frameworks_base_native_webview_plat_support_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + "SPDX-license-identifier-BSD", + ], + license_text: [ + "LICENSE", + ], +} + cc_library_shared { name: "libwebviewchromium_plat_support", diff --git a/nfc-extras/Android.bp b/nfc-extras/Android.bp index cbacd48b080ef..43b2830f544be 100644 --- a/nfc-extras/Android.bp +++ b/nfc-extras/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_sdk_library { name: "com.android.nfc_extras", srcs: ["java/**/*.java"], diff --git a/nfc-extras/tests/Android.bp b/nfc-extras/tests/Android.bp index fc52006d14d2e..4c1f2fb77e727 100644 --- a/nfc-extras/tests/Android.bp +++ b/nfc-extras/tests/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "NfcExtrasTests", diff --git a/obex/Android.bp b/obex/Android.bp index 6558eb36d0010..95eac81e80be3 100644 --- a/obex/Android.bp +++ b/obex/Android.bp @@ -14,6 +14,36 @@ // limitations under the License. // +package { + default_applicable_licenses: ["frameworks_base_obex_license"], +} + +// Added automatically by a large-scale-change that took the approach of +// 'apply every license found to every target'. While this makes sure we respect +// every license restriction, it may not be entirely correct. +// +// e.g. GPL in an MIT project might only apply to the contrib/ directory. +// +// Please consider splitting the single license below into multiple licenses, +// taking care not to lose any license_kind information, and overriding the +// default license using the 'licenses: [...]' property on targets as needed. +// +// For unused files, consider creating a 'fileGroup' with "//visibility:private" +// to attach the license to, and including a comment whether the files may be +// used in the current project. +// See: http://go/android-license-faq +license { + name: "frameworks_base_obex_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + "SPDX-license-identifier-BSD", + ], + license_text: [ + "NOTICE", + ], +} + java_sdk_library { name: "javax.obex", srcs: ["javax/**/*.java"], diff --git a/packages/AppPredictionLib/Android.bp b/packages/AppPredictionLib/Android.bp index e0f4dedc93687..5a68fdc9ae75f 100644 --- a/packages/AppPredictionLib/Android.bp +++ b/packages/AppPredictionLib/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_library { name: "app_prediction", diff --git a/packages/BackupEncryption/Android.bp b/packages/BackupEncryption/Android.bp index 68e937c24a89e..00f2ddb3662e8 100644 --- a/packages/BackupEncryption/Android.bp +++ b/packages/BackupEncryption/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_app { name: "BackupEncryption", srcs: ["src/**/*.java"], diff --git a/packages/BackupEncryption/test/robolectric-integration/Android.bp b/packages/BackupEncryption/test/robolectric-integration/Android.bp index 67365df4b28f6..c842e425fd6ff 100644 --- a/packages/BackupEncryption/test/robolectric-integration/Android.bp +++ b/packages/BackupEncryption/test/robolectric-integration/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_robolectric_test { name: "BackupEncryptionRoboIntegTests", srcs: [ diff --git a/packages/BackupEncryption/test/robolectric/Android.bp b/packages/BackupEncryption/test/robolectric/Android.bp index 2a36dcf0babaf..7665d8f4e4c2e 100644 --- a/packages/BackupEncryption/test/robolectric/Android.bp +++ b/packages/BackupEncryption/test/robolectric/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_robolectric_test { name: "BackupEncryptionRoboTests", srcs: [ diff --git a/packages/BackupEncryption/test/unittest/Android.bp b/packages/BackupEncryption/test/unittest/Android.bp index d7c510b57518e..f005170884c84 100644 --- a/packages/BackupEncryption/test/unittest/Android.bp +++ b/packages/BackupEncryption/test/unittest/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "BackupEncryptionUnitTests", srcs: ["src/**/*.java"], @@ -19,4 +28,4 @@ android_test { test_suites: ["device-tests"], instrumentation_for: "BackupEncryption", certificate: "platform", -} \ No newline at end of file +} diff --git a/packages/BackupRestoreConfirmation/Android.bp b/packages/BackupRestoreConfirmation/Android.bp index b0222da9405b0..8152f8d134e8f 100644 --- a/packages/BackupRestoreConfirmation/Android.bp +++ b/packages/BackupRestoreConfirmation/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_app { name: "BackupRestoreConfirmation", srcs: ["src/**/*.java"], diff --git a/packages/CarSystemUI/Android.bp b/packages/CarSystemUI/Android.bp index 8598f74e14413..2e1c208565195 100644 --- a/packages/CarSystemUI/Android.bp +++ b/packages/CarSystemUI/Android.bp @@ -13,6 +13,15 @@ // See the License for the specific language governing permissions and // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_library { name: "CarSystemUI-core", diff --git a/packages/CarrierDefaultApp/Android.bp b/packages/CarrierDefaultApp/Android.bp index c1b0b2da2cb50..fc753da19394f 100644 --- a/packages/CarrierDefaultApp/Android.bp +++ b/packages/CarrierDefaultApp/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_app { name: "CarrierDefaultApp", srcs: ["src/**/*.java"], diff --git a/packages/CarrierDefaultApp/tests/unit/Android.bp b/packages/CarrierDefaultApp/tests/unit/Android.bp index 5655abb046b2d..54c9016ee53a0 100644 --- a/packages/CarrierDefaultApp/tests/unit/Android.bp +++ b/packages/CarrierDefaultApp/tests/unit/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "CarrierDefaultAppUnitTests", certificate: "platform", diff --git a/packages/CompanionDeviceManager/Android.bp b/packages/CompanionDeviceManager/Android.bp index 1453ec3b63cbe..09505b7743a10 100644 --- a/packages/CompanionDeviceManager/Android.bp +++ b/packages/CompanionDeviceManager/Android.bp @@ -12,6 +12,25 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + default_applicable_licenses: [ + "frameworks_base_packages_CompanionDeviceManager_license", + ], +} + +// Added automatically by a large-scale-change +// See: http://go/android-license-faq +license { + name: "frameworks_base_packages_CompanionDeviceManager_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + ], + license_text: [ + "NOTICE", + ], +} + android_app { name: "CompanionDeviceManager", srcs: ["src/**/*.java"], diff --git a/packages/Connectivity/framework/Android.bp b/packages/Connectivity/framework/Android.bp index 8db8d7699a1e7..3326ea9eddcb1 100644 --- a/packages/Connectivity/framework/Android.bp +++ b/packages/Connectivity/framework/Android.bp @@ -15,6 +15,15 @@ // // TODO: use a java_library in the bootclasspath instead +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + filegroup { name: "framework-connectivity-sources", srcs: [ @@ -26,4 +35,4 @@ filegroup { "//frameworks/base", "//packages/modules/Connectivity:__subpackages__", ], -} \ No newline at end of file +} diff --git a/packages/Connectivity/service/Android.bp b/packages/Connectivity/service/Android.bp index ed1716fad8c00..f20b89fb842c5 100644 --- a/packages/Connectivity/service/Android.bp +++ b/packages/Connectivity/service/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_library_shared { name: "libservice-connectivity", // TODO: build against the NDK (sdk_version: "30" for example) diff --git a/packages/CtsShim/Android.bp b/packages/CtsShim/Android.bp index 49608b3856e06..31cd760791312 100644 --- a/packages/CtsShim/Android.bp +++ b/packages/CtsShim/Android.bp @@ -17,6 +17,15 @@ //########################################################## // Variant: Privileged app +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_app_import { name: "CtsShimPrivPrebuilt", diff --git a/packages/CtsShim/build/Android.bp b/packages/CtsShim/build/Android.bp index 14a3376380dfa..0b3f9bb62a9b9 100644 --- a/packages/CtsShim/build/Android.bp +++ b/packages/CtsShim/build/Android.bp @@ -17,6 +17,15 @@ //########################################################## // Variant: Privileged app upgrade +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_app { name: "CtsShimPrivUpgrade", // this needs to be a privileged application diff --git a/packages/CtsShim/build/jni/Android.bp b/packages/CtsShim/build/jni/Android.bp index 4a1973cc0b46c..ba586dbb2d883 100644 --- a/packages/CtsShim/build/jni/Android.bp +++ b/packages/CtsShim/build/jni/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_library_shared { name: "libshim_jni", srcs: ["Shim.c"], diff --git a/packages/DynamicSystemInstallationService/Android.bp b/packages/DynamicSystemInstallationService/Android.bp index f1a18ae2a53ff..04333204b0cb3 100644 --- a/packages/DynamicSystemInstallationService/Android.bp +++ b/packages/DynamicSystemInstallationService/Android.bp @@ -1,3 +1,22 @@ +package { + default_applicable_licenses: [ + "frameworks_base_packages_DynamicSystemInstallationService_license", + ], +} + +// Added automatically by a large-scale-change +// See: http://go/android-license-faq +license { + name: "frameworks_base_packages_DynamicSystemInstallationService_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + ], + license_text: [ + "NOTICE", + ], +} + android_app { name: "DynamicSystemInstallationService", diff --git a/packages/DynamicSystemInstallationService/tests/Android.bp b/packages/DynamicSystemInstallationService/tests/Android.bp index 3bdf829668894..50b65b4067fda 100644 --- a/packages/DynamicSystemInstallationService/tests/Android.bp +++ b/packages/DynamicSystemInstallationService/tests/Android.bp @@ -1,3 +1,14 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_packages_DynamicSystemInstallationService_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: [ + "frameworks_base_packages_DynamicSystemInstallationService_license", + ], +} + android_test { name: "DynamicSystemInstallationServiceTests", diff --git a/packages/EasterEgg/Android.bp b/packages/EasterEgg/Android.bp index b858ab01ffd96..f8785f2b8e2c4 100644 --- a/packages/EasterEgg/Android.bp +++ b/packages/EasterEgg/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_app { // the build system in pi-dev can't quite handle R.java in kt // so we will have a mix of java and kotlin files diff --git a/packages/EncryptedLocalTransport/Android.bp b/packages/EncryptedLocalTransport/Android.bp index dd30ad177d69d..f851bc49d8afa 100644 --- a/packages/EncryptedLocalTransport/Android.bp +++ b/packages/EncryptedLocalTransport/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_app { name: "EncryptedLocalTransport", srcs: ["src/**/*.java"], diff --git a/packages/ExtShared/Android.bp b/packages/ExtShared/Android.bp index a9823b923256f..8e51215706db3 100644 --- a/packages/ExtShared/Android.bp +++ b/packages/ExtShared/Android.bp @@ -12,6 +12,23 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + default_applicable_licenses: ["frameworks_base_packages_ExtShared_license"], +} + +// Added automatically by a large-scale-change +// See: http://go/android-license-faq +license { + name: "frameworks_base_packages_ExtShared_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + ], + license_text: [ + "NOTICE", + ], +} + android_app { name: "ExtShared", srcs: ["src/**/*.java"], diff --git a/packages/ExternalStorageProvider/Android.bp b/packages/ExternalStorageProvider/Android.bp index 973fef3e666d6..8718cc56704d6 100644 --- a/packages/ExternalStorageProvider/Android.bp +++ b/packages/ExternalStorageProvider/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_app { name: "ExternalStorageProvider", diff --git a/packages/ExternalStorageProvider/tests/Android.bp b/packages/ExternalStorageProvider/tests/Android.bp index 04cf01af073a8..633f186109211 100644 --- a/packages/ExternalStorageProvider/tests/Android.bp +++ b/packages/ExternalStorageProvider/tests/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "ExternalStorageProviderTests", diff --git a/packages/FakeOemFeatures/Android.bp b/packages/FakeOemFeatures/Android.bp index b265158220da4..276132fb19c07 100644 --- a/packages/FakeOemFeatures/Android.bp +++ b/packages/FakeOemFeatures/Android.bp @@ -1,3 +1,22 @@ +package { + default_applicable_licenses: [ + "frameworks_base_packages_FakeOemFeatures_license", + ], +} + +// Added automatically by a large-scale-change +// See: http://go/android-license-faq +license { + name: "frameworks_base_packages_FakeOemFeatures_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + ], + license_text: [ + "NOTICE", + ], +} + android_app { name: "FakeOemFeatures", srcs: ["src/**/*.java"], diff --git a/packages/FusedLocation/Android.bp b/packages/FusedLocation/Android.bp index c70ab716aa443..ee459fed28ce8 100644 --- a/packages/FusedLocation/Android.bp +++ b/packages/FusedLocation/Android.bp @@ -12,6 +12,25 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + default_applicable_licenses: [ + "frameworks_base_packages_FusedLocation_license", + ], +} + +// Added automatically by a large-scale-change +// See: http://go/android-license-faq +license { + name: "frameworks_base_packages_FusedLocation_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + ], + license_text: [ + "NOTICE", + ], +} + android_app { name: "FusedLocation", srcs: ["src/**/*.java"], @@ -43,4 +62,4 @@ android_test { "truth-prebuilt", ], test_suites: ["device-tests"] -} \ No newline at end of file +} diff --git a/packages/InputDevices/Android.bp b/packages/InputDevices/Android.bp index 7532aea236154..8aa8bb872e0c5 100644 --- a/packages/InputDevices/Android.bp +++ b/packages/InputDevices/Android.bp @@ -12,6 +12,25 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + default_applicable_licenses: [ + "frameworks_base_packages_InputDevices_license", + ], +} + +// Added automatically by a large-scale-change +// See: http://go/android-license-faq +license { + name: "frameworks_base_packages_InputDevices_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + ], + license_text: [ + "NOTICE", + ], +} + android_app { name: "InputDevices", diff --git a/packages/LocalTransport/Android.bp b/packages/LocalTransport/Android.bp index 2c990fed16882..185ab50907382 100644 --- a/packages/LocalTransport/Android.bp +++ b/packages/LocalTransport/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_app { name: "LocalTransport", srcs: ["src/**/*.java"], diff --git a/packages/PackageInstaller/Android.bp b/packages/PackageInstaller/Android.bp index 75bd32ec03017..bf0520faa5a19 100644 --- a/packages/PackageInstaller/Android.bp +++ b/packages/PackageInstaller/Android.bp @@ -12,6 +12,25 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + default_applicable_licenses: [ + "frameworks_base_packages_PackageInstaller_license", + ], +} + +// Added automatically by a large-scale-change +// See: http://go/android-license-faq +license { + name: "frameworks_base_packages_PackageInstaller_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + ], + license_text: [ + "NOTICE", + ], +} + android_app { name: "PackageInstaller", diff --git a/packages/PrintRecommendationService/Android.bp b/packages/PrintRecommendationService/Android.bp index 6d28bdb7943b8..c907e4e2fd8e0 100644 --- a/packages/PrintRecommendationService/Android.bp +++ b/packages/PrintRecommendationService/Android.bp @@ -12,6 +12,25 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + default_applicable_licenses: [ + "frameworks_base_packages_PrintRecommendationService_license", + ], +} + +// Added automatically by a large-scale-change +// See: http://go/android-license-faq +license { + name: "frameworks_base_packages_PrintRecommendationService_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + ], + license_text: [ + "NOTICE", + ], +} + android_app { name: "PrintRecommendationService", srcs: ["src/**/*.java"], diff --git a/packages/PrintSpooler/Android.bp b/packages/PrintSpooler/Android.bp index c40a81791302d..99769b74bd2df 100644 --- a/packages/PrintSpooler/Android.bp +++ b/packages/PrintSpooler/Android.bp @@ -12,6 +12,25 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + default_applicable_licenses: [ + "frameworks_base_packages_PrintSpooler_license", + ], +} + +// Added automatically by a large-scale-change +// See: http://go/android-license-faq +license { + name: "frameworks_base_packages_PrintSpooler_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + ], + license_text: [ + "NOTICE", + ], +} + android_app { name: "PrintSpooler", diff --git a/packages/PrintSpooler/jni/Android.bp b/packages/PrintSpooler/jni/Android.bp index 789312e58863a..44df70e89d541 100644 --- a/packages/PrintSpooler/jni/Android.bp +++ b/packages/PrintSpooler/jni/Android.bp @@ -1,3 +1,14 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_packages_PrintSpooler_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: [ + "frameworks_base_packages_PrintSpooler_license", + ], +} + cc_library_shared { name: "libprintspooler_jni", diff --git a/packages/PrintSpooler/tests/outofprocess/Android.bp b/packages/PrintSpooler/tests/outofprocess/Android.bp index 0e028b04aaaf1..69a1d7fa59e4a 100644 --- a/packages/PrintSpooler/tests/outofprocess/Android.bp +++ b/packages/PrintSpooler/tests/outofprocess/Android.bp @@ -12,6 +12,17 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_packages_PrintSpooler_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: [ + "frameworks_base_packages_PrintSpooler_license", + ], +} + android_test { name: "PrintSpoolerOutOfProcessTests", diff --git a/packages/SettingsLib/ActionBarShadow/Android.bp b/packages/SettingsLib/ActionBarShadow/Android.bp index d2848564abea1..800ab671cedba 100644 --- a/packages/SettingsLib/ActionBarShadow/Android.bp +++ b/packages/SettingsLib/ActionBarShadow/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_library { name: "SettingsLibActionBarShadow", diff --git a/packages/SettingsLib/ActionButtonsPreference/Android.bp b/packages/SettingsLib/ActionButtonsPreference/Android.bp index cd3fb0cc2143b..51c9c39cdf034 100644 --- a/packages/SettingsLib/ActionButtonsPreference/Android.bp +++ b/packages/SettingsLib/ActionButtonsPreference/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_library { name: "SettingsLibActionButtonsPreference", diff --git a/packages/SettingsLib/AdaptiveIcon/Android.bp b/packages/SettingsLib/AdaptiveIcon/Android.bp index 7f4442deecd6b..934aacfddfb93 100644 --- a/packages/SettingsLib/AdaptiveIcon/Android.bp +++ b/packages/SettingsLib/AdaptiveIcon/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_library { name: "SettingsLibAdaptiveIcon", diff --git a/packages/SettingsLib/Android.bp b/packages/SettingsLib/Android.bp index 5afe2f3d2efc4..b0b6387b7d3fe 100644 --- a/packages/SettingsLib/Android.bp +++ b/packages/SettingsLib/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_library { name: "SettingsLib", diff --git a/packages/SettingsLib/AppPreference/Android.bp b/packages/SettingsLib/AppPreference/Android.bp index b07176a064f93..1817a77981a9a 100644 --- a/packages/SettingsLib/AppPreference/Android.bp +++ b/packages/SettingsLib/AppPreference/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_library { name: "SettingsLibAppPreference", diff --git a/packages/SettingsLib/BarChartPreference/Android.bp b/packages/SettingsLib/BarChartPreference/Android.bp index 477e8979b03b8..ae2606661697e 100644 --- a/packages/SettingsLib/BarChartPreference/Android.bp +++ b/packages/SettingsLib/BarChartPreference/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_library { name: "SettingsLibBarChartPreference", diff --git a/packages/SettingsLib/DisplayDensityUtils/Android.bp b/packages/SettingsLib/DisplayDensityUtils/Android.bp index 27d0cb5ad48c5..b7bfb5fd8af53 100644 --- a/packages/SettingsLib/DisplayDensityUtils/Android.bp +++ b/packages/SettingsLib/DisplayDensityUtils/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_library { name: "SettingsLibDisplayDensityUtils", diff --git a/packages/SettingsLib/EntityHeaderWidgets/Android.bp b/packages/SettingsLib/EntityHeaderWidgets/Android.bp index 280848a0d7c4b..bd83cdce0078b 100644 --- a/packages/SettingsLib/EntityHeaderWidgets/Android.bp +++ b/packages/SettingsLib/EntityHeaderWidgets/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_library { name: "SettingsLibEntityHeaderWidgets", diff --git a/packages/SettingsLib/HelpUtils/Android.bp b/packages/SettingsLib/HelpUtils/Android.bp index 285131d197258..5826047b9f522 100644 --- a/packages/SettingsLib/HelpUtils/Android.bp +++ b/packages/SettingsLib/HelpUtils/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_library { name: "SettingsLibHelpUtils", diff --git a/packages/SettingsLib/LayoutPreference/Android.bp b/packages/SettingsLib/LayoutPreference/Android.bp index a1f9a768c76c9..8a4e53d80a7c1 100644 --- a/packages/SettingsLib/LayoutPreference/Android.bp +++ b/packages/SettingsLib/LayoutPreference/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_library { name: "SettingsLibLayoutPreference", diff --git a/packages/SettingsLib/ProgressBar/Android.bp b/packages/SettingsLib/ProgressBar/Android.bp index eae21d8858dc6..b5bc8f77045b1 100644 --- a/packages/SettingsLib/ProgressBar/Android.bp +++ b/packages/SettingsLib/ProgressBar/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_library { name: "SettingsLibProgressBar", @@ -6,4 +15,4 @@ android_library { sdk_version: "system_current", min_sdk_version: "21", -} \ No newline at end of file +} diff --git a/packages/SettingsLib/RadioButtonPreference/Android.bp b/packages/SettingsLib/RadioButtonPreference/Android.bp index 136d6daad99a2..b309c01e0b7b0 100644 --- a/packages/SettingsLib/RadioButtonPreference/Android.bp +++ b/packages/SettingsLib/RadioButtonPreference/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_library { name: "SettingsLibRadioButtonPreference", diff --git a/packages/SettingsLib/RestrictedLockUtils/Android.bp b/packages/SettingsLib/RestrictedLockUtils/Android.bp index b2f088257bb92..c0623edabefe4 100644 --- a/packages/SettingsLib/RestrictedLockUtils/Android.bp +++ b/packages/SettingsLib/RestrictedLockUtils/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_library { name: "SettingsLibRestrictedLockUtils", @@ -10,4 +19,4 @@ android_library { sdk_version: "system_current", min_sdk_version: "21", -} \ No newline at end of file +} diff --git a/packages/SettingsLib/SchedulesProvider/Android.bp b/packages/SettingsLib/SchedulesProvider/Android.bp index ef592527ba92b..c4373bb2dc1f1 100644 --- a/packages/SettingsLib/SchedulesProvider/Android.bp +++ b/packages/SettingsLib/SchedulesProvider/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_library { name: "SettingsLibSchedulesProvider", diff --git a/packages/SettingsLib/SearchProvider/Android.bp b/packages/SettingsLib/SearchProvider/Android.bp index 5254dde715535..f96011ad5d095 100644 --- a/packages/SettingsLib/SearchProvider/Android.bp +++ b/packages/SettingsLib/SearchProvider/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_library { name: "SettingsLibSearchProvider", diff --git a/packages/SettingsLib/SearchWidget/Android.bp b/packages/SettingsLib/SearchWidget/Android.bp index 7541ca4561389..b7367b4a10a7c 100644 --- a/packages/SettingsLib/SearchWidget/Android.bp +++ b/packages/SettingsLib/SearchWidget/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_library { name: "SettingsLibSearchWidget", diff --git a/packages/SettingsLib/SettingsSpinner/Android.bp b/packages/SettingsLib/SettingsSpinner/Android.bp index f18917cd2ebb5..be0567cb52ddd 100644 --- a/packages/SettingsLib/SettingsSpinner/Android.bp +++ b/packages/SettingsLib/SettingsSpinner/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_library { name: "SettingsLibSettingsSpinner", diff --git a/packages/SettingsLib/SettingsTheme/Android.bp b/packages/SettingsLib/SettingsTheme/Android.bp index 6d505bf8895da..e45c0caa0ce30 100644 --- a/packages/SettingsLib/SettingsTheme/Android.bp +++ b/packages/SettingsLib/SettingsTheme/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_library { name: "SettingsLibSettingsTheme", diff --git a/packages/SettingsLib/Tile/Android.bp b/packages/SettingsLib/Tile/Android.bp index bf16ef317fd8a..cc570ccbb5069 100644 --- a/packages/SettingsLib/Tile/Android.bp +++ b/packages/SettingsLib/Tile/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_library { name: "SettingsLibTile", diff --git a/packages/SettingsLib/Utils/Android.bp b/packages/SettingsLib/Utils/Android.bp index c5f0ee6c939cc..1cf42ff1c566d 100644 --- a/packages/SettingsLib/Utils/Android.bp +++ b/packages/SettingsLib/Utils/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_library { name: "SettingsLibUtils", diff --git a/packages/SettingsLib/search/Android.bp b/packages/SettingsLib/search/Android.bp index d398aa5c44ac8..45746d9848df2 100644 --- a/packages/SettingsLib/search/Android.bp +++ b/packages/SettingsLib/search/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_library { name: "SettingsLib-search", srcs: ["src/**/*.java"], diff --git a/packages/SettingsLib/tests/integ/Android.bp b/packages/SettingsLib/tests/integ/Android.bp index 2ccff1ecaf6cd..24ca1fbe2a495 100644 --- a/packages/SettingsLib/tests/integ/Android.bp +++ b/packages/SettingsLib/tests/integ/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "SettingsLibTests", defaults: [ diff --git a/packages/SettingsLib/tests/robotests/Android.bp b/packages/SettingsLib/tests/robotests/Android.bp index 3756c3bf7704a..dc661c2341160 100644 --- a/packages/SettingsLib/tests/robotests/Android.bp +++ b/packages/SettingsLib/tests/robotests/Android.bp @@ -16,6 +16,15 @@ // SettingsLib Shell app just for Robolectric test target. # //########################################################### +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_app { name: "SettingsLibShell", defaults: ["SettingsLibDefaults"], diff --git a/packages/SettingsProvider/Android.bp b/packages/SettingsProvider/Android.bp index 9d042a4e15f66..5f8bfef2d2900 100644 --- a/packages/SettingsProvider/Android.bp +++ b/packages/SettingsProvider/Android.bp @@ -1,3 +1,22 @@ +package { + default_applicable_licenses: [ + "frameworks_base_packages_SettingsProvider_license", + ], +} + +// Added automatically by a large-scale-change +// See: http://go/android-license-faq +license { + name: "frameworks_base_packages_SettingsProvider_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + ], + license_text: [ + "NOTICE", + ], +} + android_app { name: "SettingsProvider", resource_dirs: ["res"], diff --git a/packages/SharedStorageBackup/Android.bp b/packages/SharedStorageBackup/Android.bp index 5380832a17d47..db682ff554f66 100644 --- a/packages/SharedStorageBackup/Android.bp +++ b/packages/SharedStorageBackup/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_app { name: "SharedStorageBackup", srcs: ["src/**/*.java"], diff --git a/packages/Shell/Android.bp b/packages/Shell/Android.bp index c51fb56464b08..092c5439d7ca1 100644 --- a/packages/Shell/Android.bp +++ b/packages/Shell/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + // used both for the android_app and android_library shell_srcs = ["src/**/*.java",":dumpstate_aidl"] shell_static_libs = ["androidx.legacy_legacy-support-v4"] diff --git a/packages/Shell/tests/Android.bp b/packages/Shell/tests/Android.bp index 8536c4fbb5a31..70e8c10a961d0 100644 --- a/packages/Shell/tests/Android.bp +++ b/packages/Shell/tests/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "ShellTests", srcs: ["src/**/*.java"], diff --git a/packages/SimAppDialog/Android.bp b/packages/SimAppDialog/Android.bp index ff26710fa2e11..1aeebf5c53750 100644 --- a/packages/SimAppDialog/Android.bp +++ b/packages/SimAppDialog/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_app { name: "SimAppDialog", diff --git a/packages/SoundPicker/Android.bp b/packages/SoundPicker/Android.bp index 3be7ca92e8c6a..31fc77c6ee5f3 100644 --- a/packages/SoundPicker/Android.bp +++ b/packages/SoundPicker/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_app { name: "SoundPicker", manifest: "AndroidManifest.xml", diff --git a/packages/StatementService/Android.bp b/packages/StatementService/Android.bp index 3831fd981c5c8..dcb9b322405c3 100644 --- a/packages/StatementService/Android.bp +++ b/packages/StatementService/Android.bp @@ -11,6 +11,15 @@ // 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 { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_app { name: "StatementService", srcs: ["src/**/*.java"], diff --git a/packages/SystemUI/Android.bp b/packages/SystemUI/Android.bp index 249b1946d4359..f11351640732f 100644 --- a/packages/SystemUI/Android.bp +++ b/packages/SystemUI/Android.bp @@ -14,6 +14,23 @@ // limitations under the License. // +package { + default_applicable_licenses: ["frameworks_base_packages_SystemUI_license"], +} + +// Added automatically by a large-scale-change +// See: http://go/android-license-faq +license { + name: "frameworks_base_packages_SystemUI_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + ], + license_text: [ + "NOTICE", + ], +} + java_library { name: "SystemUI-proto", diff --git a/packages/SystemUI/plugin/Android.bp b/packages/SystemUI/plugin/Android.bp index df5561acbbc4d..ad39eaeed84f8 100644 --- a/packages/SystemUI/plugin/Android.bp +++ b/packages/SystemUI/plugin/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_packages_SystemUI_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_packages_SystemUI_license"], +} + java_library { name: "SystemUIPluginLib", diff --git a/packages/SystemUI/plugin/ExamplePlugin/Android.bp b/packages/SystemUI/plugin/ExamplePlugin/Android.bp index c6c80f3780a36..3f0fdedb57daa 100644 --- a/packages/SystemUI/plugin/ExamplePlugin/Android.bp +++ b/packages/SystemUI/plugin/ExamplePlugin/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_packages_SystemUI_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_packages_SystemUI_license"], +} + android_app { name: "ExamplePlugin", diff --git a/packages/SystemUI/plugin_core/Android.bp b/packages/SystemUI/plugin_core/Android.bp index 581fef721accd..34d31d9955fc1 100644 --- a/packages/SystemUI/plugin_core/Android.bp +++ b/packages/SystemUI/plugin_core/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_packages_SystemUI_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_packages_SystemUI_license"], +} + java_library { sdk_version: "current", name: "PluginCoreLib", diff --git a/packages/SystemUI/shared/Android.bp b/packages/SystemUI/shared/Android.bp index 68f4b746caa28..db7e7b50a477f 100644 --- a/packages/SystemUI/shared/Android.bp +++ b/packages/SystemUI/shared/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_packages_SystemUI_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_packages_SystemUI_license"], +} + genrule { name: "statslog-SystemUI-java-gen", tools: ["stats-log-api-gen"], diff --git a/packages/VpnDialogs/Android.bp b/packages/VpnDialogs/Android.bp index 6f2f50c0ddd48..05135b2bebf94 100644 --- a/packages/VpnDialogs/Android.bp +++ b/packages/VpnDialogs/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_app { name: "VpnDialogs", certificate: "platform", diff --git a/packages/WAPPushManager/Android.bp b/packages/WAPPushManager/Android.bp index 083dac944936a..eb4f14b34bab3 100644 --- a/packages/WAPPushManager/Android.bp +++ b/packages/WAPPushManager/Android.bp @@ -1,5 +1,24 @@ // Copyright 2007-2008 The Android Open Source Project +package { + default_applicable_licenses: [ + "frameworks_base_packages_WAPPushManager_license", + ], +} + +// Added automatically by a large-scale-change +// See: http://go/android-license-faq +license { + name: "frameworks_base_packages_WAPPushManager_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + ], + license_text: [ + "NOTICE", + ], +} + android_app { name: "WAPPushManager", srcs: ["src/**/*.java"], diff --git a/packages/WAPPushManager/tests/Android.bp b/packages/WAPPushManager/tests/Android.bp index 25c6121324ea7..0a179383fab66 100644 --- a/packages/WAPPushManager/tests/Android.bp +++ b/packages/WAPPushManager/tests/Android.bp @@ -12,6 +12,17 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_packages_WAPPushManager_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: [ + "frameworks_base_packages_WAPPushManager_license", + ], +} + android_test { name: "WAPPushManagerTests", libs: [ diff --git a/packages/WallpaperBackup/Android.bp b/packages/WallpaperBackup/Android.bp index 748eb40cb8b88..03bdf9349eb68 100644 --- a/packages/WallpaperBackup/Android.bp +++ b/packages/WallpaperBackup/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_app { name: "WallpaperBackup", srcs: ["src/**/*.java"], diff --git a/packages/WallpaperCropper/Android.bp b/packages/WallpaperCropper/Android.bp index ac38b271395cf..6c14d0f924798 100644 --- a/packages/WallpaperCropper/Android.bp +++ b/packages/WallpaperCropper/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_app { name: "WallpaperCropper", srcs: ["src/**/*.java"], diff --git a/packages/overlays/Android.mk b/packages/overlays/Android.mk index 999ab0802468d..94c47b938f382 100644 --- a/packages/overlays/Android.mk +++ b/packages/overlays/Android.mk @@ -16,6 +16,9 @@ LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := frameworks-base-overlays +LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0 +LOCAL_LICENSE_CONDITIONS := notice +LOCAL_NOTICE_FILE := $(LOCAL_PATH)/../../NOTICE LOCAL_REQUIRED_MODULES := \ AccentColorBlackOverlay \ AccentColorCinnamonOverlay \ @@ -83,6 +86,9 @@ include $(BUILD_PHONY_PACKAGE) include $(CLEAR_VARS) LOCAL_MODULE := frameworks-base-overlays-debug +LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0 +LOCAL_LICENSE_CONDITIONS := notice +LOCAL_NOTICE_FILE := $(LOCAL_PATH)/../../NOTICE include $(BUILD_PHONY_PACKAGE) include $(call first-makefiles-under,$(LOCAL_PATH)) diff --git a/packages/overlays/tests/Android.bp b/packages/overlays/tests/Android.bp index 343367a3cd11b..b117a318e848e 100644 --- a/packages/overlays/tests/Android.bp +++ b/packages/overlays/tests/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "OverlayTests", diff --git a/packages/services/PacProcessor/Android.bp b/packages/services/PacProcessor/Android.bp index 494a8187886d0..6f903347f5901 100644 --- a/packages/services/PacProcessor/Android.bp +++ b/packages/services/PacProcessor/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_app { name: "PacProcessor", srcs: ["src/**/*.java"], diff --git a/packages/services/PacProcessor/jni/Android.bp b/packages/services/PacProcessor/jni/Android.bp index 0e7e10152f81f..965143788610c 100644 --- a/packages/services/PacProcessor/jni/Android.bp +++ b/packages/services/PacProcessor/jni/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_library_shared { name: "libjni_pacprocessor", diff --git a/packages/services/Proxy/Android.bp b/packages/services/Proxy/Android.bp index d93c9f8d9941d..4d76db725d1f6 100644 --- a/packages/services/Proxy/Android.bp +++ b/packages/services/Proxy/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_app { name: "ProxyHandler", srcs: ["src/**/*.java"], diff --git a/proto/Android.bp b/proto/Android.bp index 86d8ee3a662fb..a5e13350ebd22 100644 --- a/proto/Android.bp +++ b/proto/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_library_static { name: "framework-protos", host_supported: true, diff --git a/rs/jni/Android.mk b/rs/jni/Android.mk index 95697e6f8bac5..1a113599ff557 100644 --- a/rs/jni/Android.mk +++ b/rs/jni/Android.mk @@ -29,6 +29,9 @@ LOCAL_CFLAGS += -Wno-unused-parameter LOCAL_CFLAGS += -Wall -Werror -Wunused -Wunreachable-code LOCAL_MODULE:= librs_jni +LOCAL_LICENSE_KINDS:= SPDX-license-identifier-Apache-2.0 +LOCAL_LICENSE_CONDITIONS:= notice +LOCAL_NOTICE_FILE:= $(LOCAL_PATH)/../../NOTICE LOCAL_MODULE_TAGS := optional LOCAL_REQUIRED_MODULES := libRS diff --git a/samples/demo/haptic-assessment/Android.bp b/samples/demo/haptic-assessment/Android.bp index 1c006091a755d..4d54550f3762f 100644 --- a/samples/demo/haptic-assessment/Android.bp +++ b/samples/demo/haptic-assessment/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_app { name: "HapticAssessment", manifest: "AndroidManifest.xml", @@ -31,4 +40,4 @@ android_app { "res", ], dxflags: ["--multi-dex"], -} \ No newline at end of file +} diff --git a/sax/tests/saxtests/Android.bp b/sax/tests/saxtests/Android.bp index 5889f769a6459..cbd19c36dd731 100644 --- a/sax/tests/saxtests/Android.bp +++ b/sax/tests/saxtests/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "FrameworksSaxTests", // Include all test java files. diff --git a/services/Android.bp b/services/Android.bp index a13dbe612528a..8369444d16150 100644 --- a/services/Android.bp +++ b/services/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_defaults { name: "services_defaults", plugins: [ diff --git a/services/accessibility/Android.bp b/services/accessibility/Android.bp index 21a0c74898279..a492a5f129d9c 100644 --- a/services/accessibility/Android.bp +++ b/services/accessibility/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + filegroup { name: "services.accessibility-sources", srcs: ["java/**/*.java"], diff --git a/services/appprediction/Android.bp b/services/appprediction/Android.bp index c12f62fc6cd16..ec98151141f96 100644 --- a/services/appprediction/Android.bp +++ b/services/appprediction/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + filegroup { name: "services.appprediction-sources", srcs: ["java/**/*.java"], diff --git a/services/appwidget/Android.bp b/services/appwidget/Android.bp index 83a9aa493bb01..d3cb5ee1571ed 100644 --- a/services/appwidget/Android.bp +++ b/services/appwidget/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + filegroup { name: "services.appwidget-sources", srcs: ["java/**/*.java"], diff --git a/services/autofill/Android.bp b/services/autofill/Android.bp index 1e65e8459edf4..bbb6cd865f2bd 100644 --- a/services/autofill/Android.bp +++ b/services/autofill/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + filegroup { name: "services.autofill-sources", srcs: ["java/**/*.java"], diff --git a/services/backup/Android.bp b/services/backup/Android.bp index 56b788e34d355..89f6b5466a30f 100644 --- a/services/backup/Android.bp +++ b/services/backup/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + filegroup { name: "services.backup-sources", srcs: ["java/**/*.java"], diff --git a/services/backup/backuplib/Android.bp b/services/backup/backuplib/Android.bp index 00f51c960636d..5a28891f88c94 100644 --- a/services/backup/backuplib/Android.bp +++ b/services/backup/backuplib/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + filegroup { name: "backuplib-sources", srcs: ["java/**/*.java"], diff --git a/services/companion/Android.bp b/services/companion/Android.bp index e25104227b71c..8f33a48a4a66f 100644 --- a/services/companion/Android.bp +++ b/services/companion/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + filegroup { name: "services.companion-sources", srcs: ["java/**/*.java"], diff --git a/services/contentcapture/Android.bp b/services/contentcapture/Android.bp index 7006430067ecb..bdc706ec823fc 100644 --- a/services/contentcapture/Android.bp +++ b/services/contentcapture/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + filegroup { name: "services.contentcapture-sources", srcs: ["java/**/*.java"], diff --git a/services/contentsuggestions/Android.bp b/services/contentsuggestions/Android.bp index 3fe3cd2525929..c1fbcbf4bdaed 100644 --- a/services/contentsuggestions/Android.bp +++ b/services/contentsuggestions/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + filegroup { name: "services.contentsuggestions-sources", srcs: ["java/**/*.java"], diff --git a/services/core/Android.bp b/services/core/Android.bp index c0fd88e3dfd07..0beb8ff5de541 100644 --- a/services/core/Android.bp +++ b/services/core/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + filegroup { name: "services.core-sources-deviceconfig-interface", srcs: [ diff --git a/services/core/java/com/android/server/vcn/Android.bp b/services/core/java/com/android/server/vcn/Android.bp index 5ed204fd76409..ab5da3ee45b43 100644 --- a/services/core/java/com/android/server/vcn/Android.bp +++ b/services/core/java/com/android/server/vcn/Android.bp @@ -1,4 +1,13 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + filegroup { name: "framework-vcn-util-sources", srcs: ["util/**/*.java"], -} \ No newline at end of file +} diff --git a/services/core/jni/Android.bp b/services/core/jni/Android.bp index 0e2549e164d46..ea47a2713fb13 100644 --- a/services/core/jni/Android.bp +++ b/services/core/jni/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_library_static { name: "libservices.core", defaults: ["libservices.core-libs"], diff --git a/services/core/xsd/Android.bp b/services/core/xsd/Android.bp index 3690afc1bc414..a9b85e6130a5e 100644 --- a/services/core/xsd/Android.bp +++ b/services/core/xsd/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + xsd_config { name: "default-permissions", srcs: ["default-permissions.xsd"], diff --git a/services/core/xsd/vts/Android.bp b/services/core/xsd/vts/Android.bp index a942108667a5b..4d3c79eb28aed 100644 --- a/services/core/xsd/vts/Android.bp +++ b/services/core/xsd/vts/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_test { name: "vts_defaultPermissions_validate_test", srcs: [ diff --git a/services/coverage/Android.bp b/services/coverage/Android.bp index df054b006cd3c..0d316730c38ee 100644 --- a/services/coverage/Android.bp +++ b/services/coverage/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + filegroup { name: "services.coverage-sources", srcs: ["java/**/*.java"], diff --git a/services/devicepolicy/Android.bp b/services/devicepolicy/Android.bp index 7a80fb1b8856c..2e8a0a86358f7 100644 --- a/services/devicepolicy/Android.bp +++ b/services/devicepolicy/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + filegroup { name: "services.devicepolicy-sources", srcs: ["java/**/*.java"], diff --git a/services/incremental/Android.bp b/services/incremental/Android.bp index 7534c7c40a3d5..7e1e99fe0a23e 100644 --- a/services/incremental/Android.bp +++ b/services/incremental/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_defaults { name: "service.incremental-proto-defaults", diff --git a/services/midi/Android.bp b/services/midi/Android.bp index 6bce5b51ecb7f..cbb36a884f0d4 100644 --- a/services/midi/Android.bp +++ b/services/midi/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + filegroup { name: "services.midi-sources", srcs: ["java/**/*.java"], diff --git a/services/net/Android.bp b/services/net/Android.bp index e0bb67a7e6d88..93aa461031de6 100644 --- a/services/net/Android.bp +++ b/services/net/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + filegroup { name: "services.net-sources", srcs: ["java/**/*.java"], diff --git a/services/people/Android.bp b/services/people/Android.bp index c863f1f5919f0..b2327b5adb05d 100644 --- a/services/people/Android.bp +++ b/services/people/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_library_static { name: "services.people", defaults: ["services_defaults"], diff --git a/services/print/Android.bp b/services/print/Android.bp index 93b5ef0409261..feaeeed088662 100644 --- a/services/print/Android.bp +++ b/services/print/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + filegroup { name: "services.print-sources", srcs: ["java/**/*.java"], diff --git a/services/profcollect/Android.bp b/services/profcollect/Android.bp index 68fba5508b589..a636d670298fb 100644 --- a/services/profcollect/Android.bp +++ b/services/profcollect/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + filegroup { name: "services.profcollect-javasources", srcs: ["src/**/*.java"], diff --git a/services/restrictions/Android.bp b/services/restrictions/Android.bp index 28830956e7f5f..9fd97f1f504c3 100644 --- a/services/restrictions/Android.bp +++ b/services/restrictions/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + filegroup { name: "services.restrictions-sources", srcs: ["java/**/*.java"], diff --git a/services/robotests/Android.bp b/services/robotests/Android.bp index 1ae2aec90ba39..52eae21f9e66e 100644 --- a/services/robotests/Android.bp +++ b/services/robotests/Android.bp @@ -16,6 +16,15 @@ // FrameworksServicesLib app just for Robolectric test target # //################################################################## +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_app { name: "FrameworksServicesLib", platform_apis: true, diff --git a/services/robotests/backup/Android.bp b/services/robotests/backup/Android.bp index 32587accf1607..506e1561e8d77 100644 --- a/services/robotests/backup/Android.bp +++ b/services/robotests/backup/Android.bp @@ -15,6 +15,15 @@ //################################################################## // BackupFrameworksServicesLib app just for Robolectric test target # //################################################################## +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_app { name: "BackupFrameworksServicesLib", platform_apis: true, diff --git a/services/startop/Android.bp b/services/startop/Android.bp index 46a81aae63c51..a7ae578eb7383 100644 --- a/services/startop/Android.bp +++ b/services/startop/Android.bp @@ -14,6 +14,17 @@ * limitations under the License. */ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + // SPDX-license-identifier-MIT + // SPDX-license-identifier-Unicode-DFS + default_applicable_licenses: ["frameworks_base_license"], +} + java_library_static { name: "services.startop", defaults: ["services_defaults"], diff --git a/services/systemcaptions/Android.bp b/services/systemcaptions/Android.bp index 54968c003560f..7ac44cec95cba 100644 --- a/services/systemcaptions/Android.bp +++ b/services/systemcaptions/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + filegroup { name: "services.systemcaptions-sources", srcs: ["java/**/*.java"], diff --git a/services/tests/PackageManagerComponentOverrideTests/Android.bp b/services/tests/PackageManagerComponentOverrideTests/Android.bp index a2668a184fe06..19fdf6056453d 100644 --- a/services/tests/PackageManagerComponentOverrideTests/Android.bp +++ b/services/tests/PackageManagerComponentOverrideTests/Android.bp @@ -17,6 +17,15 @@ // NOTE: This test is separate from service tests since it relies on same vs different calling UID, // and this is more representative of a real caller. It also uses Mockito extended, and this // prevents converting the entire services test module. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "PackageManagerComponentOverrideTests", srcs: [ diff --git a/services/tests/PackageManagerServiceTests/host/Android.bp b/services/tests/PackageManagerServiceTests/host/Android.bp index 41dfade1a09a3..cf745c2a86635 100644 --- a/services/tests/PackageManagerServiceTests/host/Android.bp +++ b/services/tests/PackageManagerServiceTests/host/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_test_host { name: "PackageManagerServiceHostTests", srcs: ["src/**/*.kt"], diff --git a/services/tests/PackageManagerServiceTests/host/test-apps/Android.bp b/services/tests/PackageManagerServiceTests/host/test-apps/Android.bp index c9b29275a7319..626b113e6e0c6 100644 --- a/services/tests/PackageManagerServiceTests/host/test-apps/Android.bp +++ b/services/tests/PackageManagerServiceTests/host/test-apps/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "PackageManagerDummyAppVersion1", manifest: "AndroidManifestVersion1.xml" diff --git a/services/tests/mockingservicestests/Android.bp b/services/tests/mockingservicestests/Android.bp index b4e0f10f14b02..9202f67247519 100644 --- a/services/tests/mockingservicestests/Android.bp +++ b/services/tests/mockingservicestests/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "FrameworksMockingServicesTests", diff --git a/services/tests/rescueparty/Android.bp b/services/tests/rescueparty/Android.bp index 6733af4eb26a7..ed7de967f069c 100644 --- a/services/tests/rescueparty/Android.bp +++ b/services/tests/rescueparty/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_test { name: "log_rescueparty_reset_event_reported", srcs: ["log_rescueparty_reset_event_reported.cpp"], diff --git a/services/tests/servicestests/Android.bp b/services/tests/servicestests/Android.bp index fb1f7c1bec9a1..11d050c0dc7e6 100644 --- a/services/tests/servicestests/Android.bp +++ b/services/tests/servicestests/Android.bp @@ -2,6 +2,15 @@ // Build FrameworksServicesTests package //######################################################################## +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "FrameworksServicesTests", diff --git a/services/tests/servicestests/aidl/Android.bp b/services/tests/servicestests/aidl/Android.bp index d4e53dddf4a7a..678053192e827 100644 --- a/services/tests/servicestests/aidl/Android.bp +++ b/services/tests/servicestests/aidl/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_library { name: "servicestests-aidl", sdk_version: "current", diff --git a/services/tests/servicestests/apks/Android.bp b/services/tests/servicestests/apks/Android.bp index 3e11604005a05..6c918064dbff3 100644 --- a/services/tests/servicestests/apks/Android.bp +++ b/services/tests/servicestests/apks/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_defaults { name: "FrameworksServicesTests_apks_defaults", sdk_version: "current", diff --git a/services/tests/servicestests/apks/install-split-base/Android.bp b/services/tests/servicestests/apks/install-split-base/Android.bp index 1b62aa2a8e967..39992f600b962 100644 --- a/services/tests/servicestests/apks/install-split-base/Android.bp +++ b/services/tests/servicestests/apks/install-split-base/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "FrameworksServicesTests_install_split_base", defaults: ["FrameworksServicesTests_apks_defaults"], diff --git a/services/tests/servicestests/apks/install-split-feature-a/Android.bp b/services/tests/servicestests/apks/install-split-feature-a/Android.bp index 45d8917201664..ca7295e48fbc9 100644 --- a/services/tests/servicestests/apks/install-split-feature-a/Android.bp +++ b/services/tests/servicestests/apks/install-split-feature-a/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "FrameworksServicesTests_install_split_feature_a", defaults: ["FrameworksServicesTests_apks_defaults"], diff --git a/services/tests/servicestests/apks/install_intent_filters/Android.bp b/services/tests/servicestests/apks/install_intent_filters/Android.bp index 59c8524e01c2d..643824de785cd 100644 --- a/services/tests/servicestests/apks/install_intent_filters/Android.bp +++ b/services/tests/servicestests/apks/install_intent_filters/Android.bp @@ -1,7 +1,15 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "FrameworksServicesTests_install_intent_filters", defaults: ["FrameworksServicesTests_apks_defaults"], srcs: ["**/*.java"], } - diff --git a/services/tests/servicestests/apks/install_uses_sdk/Android.bp b/services/tests/servicestests/apks/install_uses_sdk/Android.bp index c24aa2bd8bba0..feb152c49eb39 100644 --- a/services/tests/servicestests/apks/install_uses_sdk/Android.bp +++ b/services/tests/servicestests/apks/install_uses_sdk/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "FrameworksServicesTests_install_uses_sdk_r0", defaults: ["FrameworksServicesTests_apks_defaults"], diff --git a/services/tests/servicestests/test-apps/ConnTestApp/Android.bp b/services/tests/servicestests/test-apps/ConnTestApp/Android.bp index 13e664446418e..0731e2ca1f414 100644 --- a/services/tests/servicestests/test-apps/ConnTestApp/Android.bp +++ b/services/tests/servicestests/test-apps/ConnTestApp/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "ConnTestApp", diff --git a/services/tests/servicestests/test-apps/JobTestApp/Android.bp b/services/tests/servicestests/test-apps/JobTestApp/Android.bp index b29e187576c34..6458bcd4fc8fe 100644 --- a/services/tests/servicestests/test-apps/JobTestApp/Android.bp +++ b/services/tests/servicestests/test-apps/JobTestApp/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "JobTestApp", diff --git a/services/tests/servicestests/test-apps/PackageParserApp/Android.bp b/services/tests/servicestests/test-apps/PackageParserApp/Android.bp index c409438e94ae6..0fd3de8b14b8d 100644 --- a/services/tests/servicestests/test-apps/PackageParserApp/Android.bp +++ b/services/tests/servicestests/test-apps/PackageParserApp/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "PackageParserTestApp1", sdk_version: "current", diff --git a/services/tests/servicestests/test-apps/SimpleServiceTestApp/Android.bp b/services/tests/servicestests/test-apps/SimpleServiceTestApp/Android.bp index 5cbd39c39434e..50b89d484ee82 100644 --- a/services/tests/servicestests/test-apps/SimpleServiceTestApp/Android.bp +++ b/services/tests/servicestests/test-apps/SimpleServiceTestApp/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "SimpleServiceTestApp", diff --git a/services/tests/servicestests/test-apps/SuspendTestApp/Android.bp b/services/tests/servicestests/test-apps/SuspendTestApp/Android.bp index 7257275971ab3..5e77498862be7 100644 --- a/services/tests/servicestests/test-apps/SuspendTestApp/Android.bp +++ b/services/tests/servicestests/test-apps/SuspendTestApp/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "SuspendTestApp", diff --git a/services/tests/shortcutmanagerutils/Android.bp b/services/tests/shortcutmanagerutils/Android.bp index c2cb688175b24..b33230e1af12e 100644 --- a/services/tests/shortcutmanagerutils/Android.bp +++ b/services/tests/shortcutmanagerutils/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_library { name: "ShortcutManagerTestUtils", diff --git a/services/tests/uiservicestests/Android.bp b/services/tests/uiservicestests/Android.bp index 4a1a6ada9eeb1..541fc631bca6d 100644 --- a/services/tests/uiservicestests/Android.bp +++ b/services/tests/uiservicestests/Android.bp @@ -2,6 +2,15 @@ // Build FrameworksUiServicesTests package //######################################################################## +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "FrameworksUiServicesTests", diff --git a/services/tests/wmtests/Android.bp b/services/tests/wmtests/Android.bp index e2821f40f24cc..6d0953a024153 100644 --- a/services/tests/wmtests/Android.bp +++ b/services/tests/wmtests/Android.bp @@ -2,6 +2,15 @@ // Build WmTests package //######################################################################## +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "WmTests", diff --git a/services/usage/Android.bp b/services/usage/Android.bp index 463673f104abf..350da876fb6df 100644 --- a/services/usage/Android.bp +++ b/services/usage/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + filegroup { name: "services.usage-sources", srcs: ["java/**/*.java"], diff --git a/services/usb/Android.bp b/services/usb/Android.bp index 4e984093cfec6..efca1a1a90407 100644 --- a/services/usb/Android.bp +++ b/services/usb/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + filegroup { name: "services.usb-sources", srcs: ["java/**/*.java"], diff --git a/services/voiceinteraction/Android.bp b/services/voiceinteraction/Android.bp index 47129ad62e866..cfccc17e18de3 100644 --- a/services/voiceinteraction/Android.bp +++ b/services/voiceinteraction/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + filegroup { name: "services.voiceinteraction-sources", srcs: ["java/**/*.java"], diff --git a/services/wifi/Android.bp b/services/wifi/Android.bp index 3975fd238bb5a..62d53729c3dd1 100644 --- a/services/wifi/Android.bp +++ b/services/wifi/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + filegroup { name: "services.wifi-sources", srcs: ["java/**/*.java"], diff --git a/startop/apps/test/Android.bp b/startop/apps/test/Android.bp index f42c755e3efd7..98b9b64e12423 100644 --- a/startop/apps/test/Android.bp +++ b/startop/apps/test/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_app { name: "startop_test_app", srcs: [ diff --git a/startop/iorap/Android.bp b/startop/iorap/Android.bp index 993d1e1092b90..4fdf34cc1814f 100644 --- a/startop/iorap/Android.bp +++ b/startop/iorap/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + filegroup { name: "services.startop.iorap-javasources", srcs: ["src/**/*.java"], diff --git a/startop/iorap/functional_tests/Android.bp b/startop/iorap/functional_tests/Android.bp index 8a5bd34af6530..43c61551cdecf 100644 --- a/startop/iorap/functional_tests/Android.bp +++ b/startop/iorap/functional_tests/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "iorap-functional-tests", srcs: ["src/**/*.java"], @@ -39,4 +48,3 @@ android_test { certificate: "platform", platform_apis: true, } - diff --git a/startop/iorap/stress/Android.bp b/startop/iorap/stress/Android.bp index f9f251bdd889d..6e8725d091fb5 100644 --- a/startop/iorap/stress/Android.bp +++ b/startop/iorap/stress/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_binary { name: "iorap.stress.memory", srcs: ["main_memory.cc"], diff --git a/startop/iorap/tests/Android.bp b/startop/iorap/tests/Android.bp index 3e60ad448cae1..ad3d001ad7d45 100644 --- a/startop/iorap/tests/Android.bp +++ b/startop/iorap/tests/Android.bp @@ -13,6 +13,15 @@ // limitations under the License. // TODO: once b/80095087 is fixed, rewrite this back to android_test +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_library { name: "libiorap-java-test-lib", srcs: ["src/**/*.kt"], diff --git a/startop/view_compiler/Android.bp b/startop/view_compiler/Android.bp index cac7b82adc2c3..90239212f6651 100644 --- a/startop/view_compiler/Android.bp +++ b/startop/view_compiler/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_defaults { name: "viewcompiler_defaults", header_libs: [ diff --git a/startop/view_compiler/dex_builder_test/Android.bp b/startop/view_compiler/dex_builder_test/Android.bp index f783aa68fe92d..2048964f4af27 100644 --- a/startop/view_compiler/dex_builder_test/Android.bp +++ b/startop/view_compiler/dex_builder_test/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + genrule { name: "generate_compiled_layout1", tools: [":viewcompiler"], diff --git a/test-base/Android.bp b/test-base/Android.bp index c7c9fc7391891..0b7a3981a4039 100644 --- a/test-base/Android.bp +++ b/test-base/Android.bp @@ -19,6 +19,16 @@ // This contains the junit.framework and android.test classes that were in // Android API level 25 excluding those from android.test.runner. // Also contains the com.android.internal.util.Predicate[s] classes. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + // SPDX-license-identifier-CPL-1.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_sdk_library { name: "android.test.base", diff --git a/test-base/hiddenapi/Android.bp b/test-base/hiddenapi/Android.bp index c202467517aa2..d4f52d0fc6cdb 100644 --- a/test-base/hiddenapi/Android.bp +++ b/test-base/hiddenapi/Android.bp @@ -19,6 +19,15 @@ // UnsupportedAppUsage annotation to tag those methods that are accessible via the hiddenapi. // Relies on the convention that modules with name -hiddenapi provide hiddenapi information for // module that is on the bootclasspath. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_library { name: "android.test.base-hiddenapi", compile_dex: true, diff --git a/test-legacy/Android.mk b/test-legacy/Android.mk index af26c5b807173..ce5e4cf466956 100644 --- a/test-legacy/Android.mk +++ b/test-legacy/Android.mk @@ -27,6 +27,9 @@ ifeq (,$(TARGET_BUILD_APPS)$(filter true,$(TARGET_BUILD_PDK))) include $(CLEAR_VARS) LOCAL_MODULE := android.test.legacy +LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0 SPDX-license-identifier-MIT SPDX-license-identifier-Unicode-DFS +LOCAL_LICENSE_CONDITIONS := notice +LOCAL_NOTICE_FILE := $(LOCAL_PATH)/../NOTICE LOCAL_SDK_VERSION := current diff --git a/test-mock/Android.bp b/test-mock/Android.bp index 7d0f92fac4c7b..a2447d71c3bd6 100644 --- a/test-mock/Android.bp +++ b/test-mock/Android.bp @@ -16,6 +16,15 @@ // Build the android.test.mock library // =================================== +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_sdk_library { name: "android.test.mock", diff --git a/test-runner/Android.bp b/test-runner/Android.bp index 1f6db8403eee4..fe007e39f7175 100644 --- a/test-runner/Android.bp +++ b/test-runner/Android.bp @@ -16,6 +16,16 @@ // Build the android.test.runner library // ===================================== +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + // SPDX-license-identifier-CPL-1.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_sdk_library { name: "android.test.runner", diff --git a/test-runner/tests/Android.bp b/test-runner/tests/Android.bp index d74cee4937c99..ac21bcb9d124e 100644 --- a/test-runner/tests/Android.bp +++ b/test-runner/tests/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "FrameworkTestRunnerTests", diff --git a/tests/AccessibilityEventsLogger/Android.bp b/tests/AccessibilityEventsLogger/Android.bp index ead1656022546..c403f9bf961e3 100644 --- a/tests/AccessibilityEventsLogger/Android.bp +++ b/tests/AccessibilityEventsLogger/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "AccessibilityEventsLogger", srcs: ["**/*.java"], diff --git a/tests/AccessoryDisplay/common/Android.bp b/tests/AccessoryDisplay/common/Android.bp index 3ce4c5718d134..fd3af1ecf1c90 100644 --- a/tests/AccessoryDisplay/common/Android.bp +++ b/tests/AccessoryDisplay/common/Android.bp @@ -13,6 +13,15 @@ // limitations under the License. // Build the application. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_library_static { name: "AccessoryDisplayCommon", sdk_version: "current", diff --git a/tests/AccessoryDisplay/sink/Android.bp b/tests/AccessoryDisplay/sink/Android.bp index 4e50a81d8c247..d825c60b437f5 100644 --- a/tests/AccessoryDisplay/sink/Android.bp +++ b/tests/AccessoryDisplay/sink/Android.bp @@ -13,6 +13,15 @@ // limitations under the License. // Build the application. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "AccessoryDisplaySink", sdk_version: "current", diff --git a/tests/AccessoryDisplay/source/Android.bp b/tests/AccessoryDisplay/source/Android.bp index 6d8087f5e7dd8..6ed752ee2c8fe 100644 --- a/tests/AccessoryDisplay/source/Android.bp +++ b/tests/AccessoryDisplay/source/Android.bp @@ -13,6 +13,15 @@ // limitations under the License. // Build the application. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "AccessoryDisplaySource", sdk_version: "current", diff --git a/tests/ActivityManagerPerfTests/stub-app/Android.bp b/tests/ActivityManagerPerfTests/stub-app/Android.bp index a3c1f5b2f17d0..19225e4c879e9 100644 --- a/tests/ActivityManagerPerfTests/stub-app/Android.bp +++ b/tests/ActivityManagerPerfTests/stub-app/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "ActivityManagerPerfTestsStubApp1", static_libs: ["ActivityManagerPerfTestsUtils"], @@ -65,4 +74,3 @@ android_test_helper_app { "--auto-add-overlay", ], } - diff --git a/tests/ActivityManagerPerfTests/test-app/Android.bp b/tests/ActivityManagerPerfTests/test-app/Android.bp index ef9d587581c4c..5fd1d5a0ae694 100644 --- a/tests/ActivityManagerPerfTests/test-app/Android.bp +++ b/tests/ActivityManagerPerfTests/test-app/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "ActivityManagerPerfTestsTestApp", srcs: ["src/**/*.java"], diff --git a/tests/ActivityManagerPerfTests/tests/Android.bp b/tests/ActivityManagerPerfTests/tests/Android.bp index 2ae2cc49bb7ae..c8dbf811c69ba 100644 --- a/tests/ActivityManagerPerfTests/tests/Android.bp +++ b/tests/ActivityManagerPerfTests/tests/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "ActivityManagerPerfTests", srcs: ["src/**/*.java"], diff --git a/tests/ActivityManagerPerfTests/utils/Android.bp b/tests/ActivityManagerPerfTests/utils/Android.bp index 766c3acf3c090..99c43c8d8fcaf 100644 --- a/tests/ActivityManagerPerfTests/utils/Android.bp +++ b/tests/ActivityManagerPerfTests/utils/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_test { name: "ActivityManagerPerfTestsUtils", sdk_version: "current", diff --git a/tests/ActivityTests/Android.bp b/tests/ActivityTests/Android.bp index 01828624fa4a7..be6096fb31cff 100644 --- a/tests/ActivityTests/Android.bp +++ b/tests/ActivityTests/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "ActivityTest", srcs: ["**/*.java"], diff --git a/tests/ActivityViewTest/Android.bp b/tests/ActivityViewTest/Android.bp index e7b8c8e1d058b..95178a0fb9a59 100644 --- a/tests/ActivityViewTest/Android.bp +++ b/tests/ActivityViewTest/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "ActivityViewTest", srcs: ["src/**/*.java"], diff --git a/tests/AmSlam/Android.bp b/tests/AmSlam/Android.bp index a8e575a39da4b..cc33d88ba3638 100644 --- a/tests/AmSlam/Android.bp +++ b/tests/AmSlam/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "AmSlam", srcs: ["**/*.java"], diff --git a/tests/ApkVerityTest/Android.bp b/tests/ApkVerityTest/Android.bp index 02c75edafcd5f..0cdb11fe79451 100644 --- a/tests/ApkVerityTest/Android.bp +++ b/tests/ApkVerityTest/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_test_host { name: "ApkVerityTest", srcs: ["src/**/*.java"], diff --git a/tests/ApkVerityTest/ApkVerityTestApp/Android.bp b/tests/ApkVerityTest/ApkVerityTestApp/Android.bp index 69632b2158227..adf8f9f9d3215 100644 --- a/tests/ApkVerityTest/ApkVerityTestApp/Android.bp +++ b/tests/ApkVerityTest/ApkVerityTestApp/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "ApkVerityTestApp", manifest: "AndroidManifest.xml", diff --git a/tests/ApkVerityTest/block_device_writer/Android.bp b/tests/ApkVerityTest/block_device_writer/Android.bp index 37fbc29470f62..b5a46da402eb9 100644 --- a/tests/ApkVerityTest/block_device_writer/Android.bp +++ b/tests/ApkVerityTest/block_device_writer/Android.bp @@ -14,6 +14,15 @@ // This is a cc_test just because it supports test_suites. This should be converted to something // like cc_binary_test_helper once supported, thus auto_gen_config:false below. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_test { // Depending on how the test runs, the executable may be uploaded to different location. // Before the bug in the file pusher is fixed, workaround by making the name unique. diff --git a/tests/ApkVerityTest/testdata/Android.bp b/tests/ApkVerityTest/testdata/Android.bp index c10b0cef21d76..ccfc4c99a3473 100644 --- a/tests/ApkVerityTest/testdata/Android.bp +++ b/tests/ApkVerityTest/testdata/Android.bp @@ -12,6 +12,17 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + // SPDX-license-identifier-MIT + // SPDX-license-identifier-Unicode-DFS + default_applicable_licenses: ["frameworks_base_license"], +} + filegroup { name: "ApkVerityTestKeyPem", srcs: ["ApkVerityTestKey.pem"], @@ -74,4 +85,3 @@ genrule { srcs: [":ApkVerityTestAppSplitDm"], out: ["ApkVerityTestAppSplit.dm.fsv_sig"], } - diff --git a/tests/AppLaunch/Android.bp b/tests/AppLaunch/Android.bp index 75db55122553e..f838c5a80c280 100644 --- a/tests/AppLaunch/Android.bp +++ b/tests/AppLaunch/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "AppLaunch", // Only compile source java files in this apk. diff --git a/tests/AppLaunchWear/Android.bp b/tests/AppLaunchWear/Android.bp index 8d34b6eb9c0f8..e2fc4735a7c28 100644 --- a/tests/AppLaunchWear/Android.bp +++ b/tests/AppLaunchWear/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "AppLaunchWear", // Only compile source java files in this apk. diff --git a/tests/AppResourcesLoaders/Android.bp b/tests/AppResourcesLoaders/Android.bp index e5739dbf181c4..d882db8b18a2c 100644 --- a/tests/AppResourcesLoaders/Android.bp +++ b/tests/AppResourcesLoaders/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "AppResourcesLoaders", srcs: ["**/*.java"], diff --git a/tests/AppResourcesLoaders/Overlay/Android.bp b/tests/AppResourcesLoaders/Overlay/Android.bp index 80443f6c3c00a..b063023f7d19b 100644 --- a/tests/AppResourcesLoaders/Overlay/Android.bp +++ b/tests/AppResourcesLoaders/Overlay/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "AppResourcesLoaders_Overlay", } diff --git a/tests/Assist/Android.bp b/tests/Assist/Android.bp index 216e75109dded..033c14017442d 100644 --- a/tests/Assist/Android.bp +++ b/tests/Assist/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "Assist", srcs: ["**/*.java"], diff --git a/tests/AutoVerify/app1/Android.bp b/tests/AutoVerify/app1/Android.bp index 548519fa653b0..0e26067d803e7 100644 --- a/tests/AutoVerify/app1/Android.bp +++ b/tests/AutoVerify/app1/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_app { name: "AutoVerifyTest", srcs: ["src/**/*.java"], diff --git a/tests/AutoVerify/app2/Android.bp b/tests/AutoVerify/app2/Android.bp index 1c6c97bdf3503..5fcff1a70783e 100644 --- a/tests/AutoVerify/app2/Android.bp +++ b/tests/AutoVerify/app2/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_app { name: "AutoVerifyTest2", srcs: ["src/**/*.java"], diff --git a/tests/AutoVerify/app3/Android.bp b/tests/AutoVerify/app3/Android.bp index 70a2b77d10009..479f355bc75cb 100644 --- a/tests/AutoVerify/app3/Android.bp +++ b/tests/AutoVerify/app3/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_app { name: "AutoVerifyTest3", srcs: ["src/**/*.java"], diff --git a/tests/AutoVerify/app4/Android.bp b/tests/AutoVerify/app4/Android.bp index fbdae1181a7a1..dcf8902ee03af 100644 --- a/tests/AutoVerify/app4/Android.bp +++ b/tests/AutoVerify/app4/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_app { name: "AutoVerifyTest4", srcs: ["src/**/*.java"], diff --git a/tests/BackgroundDexOptServiceIntegrationTests/Android.bp b/tests/BackgroundDexOptServiceIntegrationTests/Android.bp index a85d129b013aa..0a45d5381f847 100644 --- a/tests/BackgroundDexOptServiceIntegrationTests/Android.bp +++ b/tests/BackgroundDexOptServiceIntegrationTests/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "BackgroundDexOptServiceIntegrationTests", srcs: ["src/**/*.java"], diff --git a/tests/BandwidthTests/Android.bp b/tests/BandwidthTests/Android.bp index 523f5226cd2ca..a7fc89db32e1d 100644 --- a/tests/BandwidthTests/Android.bp +++ b/tests/BandwidthTests/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "BandwidthEnforcementTest", platform_apis: true, diff --git a/tests/BatteryWaster/Android.bp b/tests/BatteryWaster/Android.bp index 4698910adb401..1fa4f82cd9f4c 100644 --- a/tests/BatteryWaster/Android.bp +++ b/tests/BatteryWaster/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "BatteryWaster", srcs: ["**/*.java"], diff --git a/tests/BiDiTests/Android.bp b/tests/BiDiTests/Android.bp index c659e8c1257eb..79ae41fb0c827 100644 --- a/tests/BiDiTests/Android.bp +++ b/tests/BiDiTests/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "BiDiTests", // Only compile source java files in this apk. diff --git a/tests/BlobStoreTestUtils/Android.bp b/tests/BlobStoreTestUtils/Android.bp index 53d36389a52a5..c4faf7f4fb115 100644 --- a/tests/BlobStoreTestUtils/Android.bp +++ b/tests/BlobStoreTestUtils/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_library { name: "BlobStoreTestUtils", srcs: ["src/**/*.java"], @@ -21,4 +30,4 @@ java_library { "androidx.test.ext.junit", ], sdk_version: "test_current", -} \ No newline at end of file +} diff --git a/tests/BootImageProfileTest/Android.bp b/tests/BootImageProfileTest/Android.bp index 1b097a8af0f91..9fb5aa21f985a 100644 --- a/tests/BootImageProfileTest/Android.bp +++ b/tests/BootImageProfileTest/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_test_host { name: "BootImageProfileTest", srcs: ["src/**/*.java"], diff --git a/tests/BrowserPowerTest/Android.bp b/tests/BrowserPowerTest/Android.bp index 1d358cbe6e75a..a8a9897c0e865 100644 --- a/tests/BrowserPowerTest/Android.bp +++ b/tests/BrowserPowerTest/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "BrowserPowerTests", libs: [ diff --git a/tests/Camera2Tests/SmartCamera/SimpleCamera/jni/Android.bp b/tests/Camera2Tests/SmartCamera/SimpleCamera/jni/Android.bp index 125deb521ddc3..b889b0d29a8bd 100644 --- a/tests/Camera2Tests/SmartCamera/SimpleCamera/jni/Android.bp +++ b/tests/Camera2Tests/SmartCamera/SimpleCamera/jni/Android.bp @@ -13,6 +13,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_test_library { name: "libsmartcamera_jni", sdk_version: "14", diff --git a/tests/CameraPrewarmTest/Android.bp b/tests/CameraPrewarmTest/Android.bp index eaf453b6f3aeb..07c49232efc5a 100644 --- a/tests/CameraPrewarmTest/Android.bp +++ b/tests/CameraPrewarmTest/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "CameraPrewarmTest", srcs: ["**/*.java"], diff --git a/tests/Codegen/Android.bp b/tests/Codegen/Android.bp index 966c5602959cc..ddbf16817b94d 100644 --- a/tests/Codegen/Android.bp +++ b/tests/Codegen/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "CodegenTests", srcs: [ diff --git a/tests/Compatibility/Android.bp b/tests/Compatibility/Android.bp index c14e705b09ab5..c58c99e1c4f01 100644 --- a/tests/Compatibility/Android.bp +++ b/tests/Compatibility/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "AppCompatibilityTest", static_libs: ["androidx.test.rules"], diff --git a/tests/CoreTests/android/Android.bp b/tests/CoreTests/android/Android.bp index 24134e8fb7f01..e2f194b044372 100644 --- a/tests/CoreTests/android/Android.bp +++ b/tests/CoreTests/android/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "LegacyCoreTests", srcs: ["**/*.java"], diff --git a/tests/DataIdleTest/Android.bp b/tests/DataIdleTest/Android.bp index 19656ce32b299..f9509cc9a4bf9 100644 --- a/tests/DataIdleTest/Android.bp +++ b/tests/DataIdleTest/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "DataIdleTest", platform_apis: true, diff --git a/tests/DozeTest/Android.bp b/tests/DozeTest/Android.bp index f1be029f58d5c..36ea91a84a0d9 100644 --- a/tests/DozeTest/Android.bp +++ b/tests/DozeTest/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_app { name: "DozeTest", // Only compile source java files in this apk. diff --git a/tests/DpiTest/Android.bp b/tests/DpiTest/Android.bp index 7d6a78ba15811..52bb08bbc8ad1 100644 --- a/tests/DpiTest/Android.bp +++ b/tests/DpiTest/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "DensityTest", srcs: ["**/*.java"], diff --git a/tests/DynamicCodeLoggerIntegrationTests/Android.mk b/tests/DynamicCodeLoggerIntegrationTests/Android.mk index 2d58ce8baddcf..bfb5b076237a7 100644 --- a/tests/DynamicCodeLoggerIntegrationTests/Android.mk +++ b/tests/DynamicCodeLoggerIntegrationTests/Android.mk @@ -22,6 +22,9 @@ include $(CLEAR_VARS) LOCAL_MODULE_TAGS := tests LOCAL_MODULE := DynamicCodeLoggerTestLibrary +LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0 +LOCAL_LICENSE_CONDITIONS := notice +LOCAL_NOTICE_FILE := $(LOCAL_PATH)/../../NOTICE LOCAL_SRC_FILES := $(call all-java-files-under, src/com/android/dcl) include $(BUILD_JAVA_LIBRARY) @@ -35,6 +38,9 @@ include $(CLEAR_VARS) LOCAL_MODULE_TAGS := tests LOCAL_MODULE := DynamicCodeLoggerNativeTestLibrary +LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0 +LOCAL_LICENSE_CONDITIONS := notice +LOCAL_NOTICE_FILE := $(LOCAL_PATH)/../../NOTICE LOCAL_SRC_FILES := src/cpp/com_android_dcl_Jni.cpp LOCAL_HEADER_LIBRARIES := jni_headers LOCAL_SDK_VERSION := 28 @@ -48,6 +54,9 @@ include $(CLEAR_VARS) LOCAL_MODULE_TAGS := tests LOCAL_MODULE := DynamicCodeLoggerNativeExecutable +LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0 +LOCAL_LICENSE_CONDITIONS := notice +LOCAL_NOTICE_FILE := $(LOCAL_PATH)/../../NOTICE LOCAL_SRC_FILES := src/cpp/test_executable.cpp include $(BUILD_EXECUTABLE) diff --git a/tests/FeatureSplit/base/Android.bp b/tests/FeatureSplit/base/Android.bp index ab25464a82fc5..89c26d2c2256a 100644 --- a/tests/FeatureSplit/base/Android.bp +++ b/tests/FeatureSplit/base/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "FeatureSplitBase", srcs: ["**/*.java"], diff --git a/tests/FeatureSplit/feature1/Android.bp b/tests/FeatureSplit/feature1/Android.bp index 706a4f5443931..2f8aa8b6eb284 100644 --- a/tests/FeatureSplit/feature1/Android.bp +++ b/tests/FeatureSplit/feature1/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "FeatureSplit1", srcs: ["**/*.java"], diff --git a/tests/FeatureSplit/feature2/Android.bp b/tests/FeatureSplit/feature2/Android.bp index a3634821f6fde..2a5c432d14999 100644 --- a/tests/FeatureSplit/feature2/Android.bp +++ b/tests/FeatureSplit/feature2/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "FeatureSplit2", srcs: ["**/*.java"], diff --git a/tests/FixVibrateSetting/Android.bp b/tests/FixVibrateSetting/Android.bp index 5608a2b5e15d6..bd7c701026ba9 100644 --- a/tests/FixVibrateSetting/Android.bp +++ b/tests/FixVibrateSetting/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_app { name: "FixVibrateSetting", srcs: ["**/*.java"], diff --git a/tests/FlickerTests/Android.bp b/tests/FlickerTests/Android.bp index 05f0a8e7921d8..4f463f964c778 100644 --- a/tests/FlickerTests/Android.bp +++ b/tests/FlickerTests/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "FlickerTests", srcs: ["src/**/*.java"], diff --git a/tests/FlickerTests/test-apps/flickerapp/Android.bp b/tests/FlickerTests/test-apps/flickerapp/Android.bp index 0bea209a757a7..1d5f732ed04f8 100644 --- a/tests/FlickerTests/test-apps/flickerapp/Android.bp +++ b/tests/FlickerTests/test-apps/flickerapp/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "FlickerTestApp", srcs: ["**/*.java"], diff --git a/tests/FrameworkPerf/Android.bp b/tests/FrameworkPerf/Android.bp index a259ebd05fa85..9be3ab795b864 100644 --- a/tests/FrameworkPerf/Android.bp +++ b/tests/FrameworkPerf/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "FrameworkPerf", srcs: ["**/*.java"], diff --git a/tests/GamePerformance/Android.bp b/tests/GamePerformance/Android.bp index 648fd8151b4ef..07d0f42e8df29 100644 --- a/tests/GamePerformance/Android.bp +++ b/tests/GamePerformance/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "GamePerformance", // Don't include this package in any target diff --git a/tests/GridLayoutTest/Android.bp b/tests/GridLayoutTest/Android.bp index b4b5ba561c3f2..71d884c4111fe 100644 --- a/tests/GridLayoutTest/Android.bp +++ b/tests/GridLayoutTest/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "GridLayoutTest", srcs: ["**/*.java"], diff --git a/tests/HierarchyViewerTest/Android.bp b/tests/HierarchyViewerTest/Android.bp index 814c883281186..9c5d1c09cedd9 100644 --- a/tests/HierarchyViewerTest/Android.bp +++ b/tests/HierarchyViewerTest/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "HierarchyViewerTest", srcs: ["**/*.java"], diff --git a/tests/HugeBackup/Android.bp b/tests/HugeBackup/Android.bp index b44c4578a853f..7d4e52acb9b28 100644 --- a/tests/HugeBackup/Android.bp +++ b/tests/HugeBackup/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "HugeBackup", // Only compile source java files in this apk. diff --git a/tests/HwAccelerationTest/Android.bp b/tests/HwAccelerationTest/Android.bp index 37d3f5d4d97f3..76063227eac1c 100644 --- a/tests/HwAccelerationTest/Android.bp +++ b/tests/HwAccelerationTest/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "HwAccelerationTest", srcs: ["**/*.java"], diff --git a/tests/Internal/Android.bp b/tests/Internal/Android.bp index e233fed7e785a..8546ec204fff8 100644 --- a/tests/Internal/Android.bp +++ b/tests/Internal/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "InternalTests", proto: { diff --git a/tests/JankBench/Android.bp b/tests/JankBench/Android.bp index 166639d2e7dbf..39dd197bf681d 100644 --- a/tests/JankBench/Android.bp +++ b/tests/JankBench/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "JankBench", manifest: "app/src/main/AndroidManifest.xml", diff --git a/tests/JobSchedulerPerfTests/Android.bp b/tests/JobSchedulerPerfTests/Android.bp index 2ae8c33b60a7c..eb9b2f6361913 100644 --- a/tests/JobSchedulerPerfTests/Android.bp +++ b/tests/JobSchedulerPerfTests/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "JobSchedulerPerfTests", srcs: ["src/**/*.java"], diff --git a/tests/JobSchedulerTestApp/Android.bp b/tests/JobSchedulerTestApp/Android.bp index bac0220e55917..893a983ca9d92 100644 --- a/tests/JobSchedulerTestApp/Android.bp +++ b/tests/JobSchedulerTestApp/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_app { name: "JobSchedulerTestApp", srcs: ["src/**/*.java"], diff --git a/tests/LargeAssetTest/Android.bp b/tests/LargeAssetTest/Android.bp index 499e6a0721a1e..2a6de77fb170c 100644 --- a/tests/LargeAssetTest/Android.bp +++ b/tests/LargeAssetTest/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_app { name: "LargeAssetTest", srcs: ["**/*.java"], diff --git a/tests/LegacyAssistant/Android.bp b/tests/LegacyAssistant/Android.bp index fef924d1cd89c..ab8ef8885c451 100644 --- a/tests/LegacyAssistant/Android.bp +++ b/tests/LegacyAssistant/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "LegacyAssistant", srcs: ["**/*.java"], diff --git a/tests/LocalizationTest/Android.bp b/tests/LocalizationTest/Android.bp index c4bfcb1d2261d..4e0b0a89d972d 100644 --- a/tests/LocalizationTest/Android.bp +++ b/tests/LocalizationTest/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "LocalizationTest", srcs: ["java/**/*.kt"], diff --git a/tests/LocationTracker/Android.bp b/tests/LocationTracker/Android.bp index f0075a9c37bdb..538687c7db453 100644 --- a/tests/LocationTracker/Android.bp +++ b/tests/LocationTracker/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "LocationTracker", srcs: ["**/*.java"], diff --git a/tests/LotsOfApps/Android.bp b/tests/LotsOfApps/Android.bp index 68b9f88ecfd74..5f6c089188c7b 100644 --- a/tests/LotsOfApps/Android.bp +++ b/tests/LotsOfApps/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_app { name: "LotsOfApps", srcs: ["**/*.java"], diff --git a/tests/LowStorageTest/Android.bp b/tests/LowStorageTest/Android.bp index e72e4a5e25591..6dcf39d606dd8 100644 --- a/tests/LowStorageTest/Android.bp +++ b/tests/LowStorageTest/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "lowstoragetest", certificate: "platform", diff --git a/tests/ManagedProfileLifecycleStressTest/Android.bp b/tests/ManagedProfileLifecycleStressTest/Android.bp index 639ce3cfe935a..3ef6322a29844 100644 --- a/tests/ManagedProfileLifecycleStressTest/Android.bp +++ b/tests/ManagedProfileLifecycleStressTest/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_test_host { name: "ManagedProfileLifecycleStressTest", srcs: ["src/**/*.java"], diff --git a/tests/ManagedProfileLifecycleStressTest/app/DummyDPC/Android.bp b/tests/ManagedProfileLifecycleStressTest/app/DummyDPC/Android.bp index 1f47b03d00740..7a9b6cfb134fc 100644 --- a/tests/ManagedProfileLifecycleStressTest/app/DummyDPC/Android.bp +++ b/tests/ManagedProfileLifecycleStressTest/app/DummyDPC/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "DummyDPC", defaults: ["cts_defaults"], diff --git a/tests/MemoryUsage/Android.bp b/tests/MemoryUsage/Android.bp index aeb533882d4ff..e30a0a7cd8b55 100644 --- a/tests/MemoryUsage/Android.bp +++ b/tests/MemoryUsage/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "MemoryUsage", // Only compile source java files in this apk. diff --git a/tests/MirrorSurfaceTest/Android.bp b/tests/MirrorSurfaceTest/Android.bp index e359c64cc982f..1368f260725f1 100644 --- a/tests/MirrorSurfaceTest/Android.bp +++ b/tests/MirrorSurfaceTest/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "MirrorSurfaceTest", srcs: ["src/**/*.java"], diff --git a/tests/NativeProcessesMemoryTest/Android.bp b/tests/NativeProcessesMemoryTest/Android.bp index f2625bf2db119..b7160e95dbb68 100644 --- a/tests/NativeProcessesMemoryTest/Android.bp +++ b/tests/NativeProcessesMemoryTest/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_test_host { name: "native-processes-memory-test", srcs: ["src/**/*.java"], diff --git a/tests/NetworkSecurityConfigTest/Android.bp b/tests/NetworkSecurityConfigTest/Android.bp index cf8ca57862b45..473eadbcad735 100644 --- a/tests/NetworkSecurityConfigTest/Android.bp +++ b/tests/NetworkSecurityConfigTest/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "NetworkSecurityConfigTests", certificate: "platform", diff --git a/tests/NullHomeTest/Android.bp b/tests/NullHomeTest/Android.bp index 99248bfe1da12..a5720db25a917 100644 --- a/tests/NullHomeTest/Android.bp +++ b/tests/NullHomeTest/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "NullHomeTest", srcs: ["src/**/*.java"], diff --git a/tests/OdmApps/Android.bp b/tests/OdmApps/Android.bp index d86f9cc81a5f6..de86498afd271 100644 --- a/tests/OdmApps/Android.bp +++ b/tests/OdmApps/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_test_host { name: "OdmAppsTest", srcs: ["src/**/*.java"], diff --git a/tests/OdmApps/app/Android.bp b/tests/OdmApps/app/Android.bp index 5eb8590b6e06f..a33a1cf4690e5 100644 --- a/tests/OdmApps/app/Android.bp +++ b/tests/OdmApps/app/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "TestOdmApp", test_suites: ["device-tests"], diff --git a/tests/OdmApps/priv-app/Android.bp b/tests/OdmApps/priv-app/Android.bp index 9dd477cf6ad36..7527729c8267c 100644 --- a/tests/OdmApps/priv-app/Android.bp +++ b/tests/OdmApps/priv-app/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "TestOdmPrivApp", test_suites: ["device-tests"], diff --git a/tests/OneMedia/Android.bp b/tests/OneMedia/Android.bp index 11e12f35741c4..5c7317735bc76 100644 --- a/tests/OneMedia/Android.bp +++ b/tests/OneMedia/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_app { name: "OneMedia", srcs: [ diff --git a/tests/PackageWatchdog/Android.bp b/tests/PackageWatchdog/Android.bp index 0b75039cf69f1..1e1dc84585605 100644 --- a/tests/PackageWatchdog/Android.bp +++ b/tests/PackageWatchdog/Android.bp @@ -13,6 +13,15 @@ // limitations under the License. // PackageWatchdogTest +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "PackageWatchdogTest", srcs: ["src/**/*.java"], diff --git a/tests/PlatformCompatGating/Android.bp b/tests/PlatformCompatGating/Android.bp index 7d918cc4c18bd..f0f9c4bdd721f 100644 --- a/tests/PlatformCompatGating/Android.bp +++ b/tests/PlatformCompatGating/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "PlatformCompatGating", // Only compile source java files in this apk. diff --git a/tests/PlatformCompatGating/test-rules/Android.bp b/tests/PlatformCompatGating/test-rules/Android.bp index 10fa2dc0d7c61..5f91f9d0e505e 100644 --- a/tests/PlatformCompatGating/test-rules/Android.bp +++ b/tests/PlatformCompatGating/test-rules/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_library { name: "platform-compat-test-rules", srcs: ["src/**/*.java"], @@ -23,4 +32,4 @@ java_library { "truth-prebuilt", "core-compat-test-rules" ], -} \ No newline at end of file +} diff --git a/tests/ProtoInputStreamTests/Android.bp b/tests/ProtoInputStreamTests/Android.bp index ecc4056641280..0029080b5a89b 100644 --- a/tests/ProtoInputStreamTests/Android.bp +++ b/tests/ProtoInputStreamTests/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "ProtoInputStreamTests", proto: { diff --git a/tests/RemoteDisplayProvider/Android.bp b/tests/RemoteDisplayProvider/Android.bp index 6c7798fb3faf4..55732d14af468 100644 --- a/tests/RemoteDisplayProvider/Android.bp +++ b/tests/RemoteDisplayProvider/Android.bp @@ -13,6 +13,15 @@ // limitations under the License. // Build the application. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "RemoteDisplayProviderTest", sdk_version: "system_current", diff --git a/tests/RenderThreadTest/Android.bp b/tests/RenderThreadTest/Android.bp index 165977607219e..b18b04edb4c4a 100644 --- a/tests/RenderThreadTest/Android.bp +++ b/tests/RenderThreadTest/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "RenderThreadTest", // Only compile source java files in this apk. diff --git a/tests/RollbackTest/Android.bp b/tests/RollbackTest/Android.bp index 4f5a30502c913..025ac420fd4f1 100644 --- a/tests/RollbackTest/Android.bp +++ b/tests/RollbackTest/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "RollbackTest", manifest: "RollbackTest/AndroidManifest.xml", @@ -115,4 +124,4 @@ apex { key: "com.android.apex.apkrollback.test.key", apps: ["TestAppACrashingV2"], installable: false, -} \ No newline at end of file +} diff --git a/tests/SerialChat/Android.bp b/tests/SerialChat/Android.bp index 3c18035a4aab0..8719e01031d5d 100644 --- a/tests/SerialChat/Android.bp +++ b/tests/SerialChat/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "SerialChat", srcs: ["**/*.java"], diff --git a/tests/ServiceCrashTest/Android.bp b/tests/ServiceCrashTest/Android.bp index 40a377de852f8..fb98b7631b7e2 100644 --- a/tests/ServiceCrashTest/Android.bp +++ b/tests/ServiceCrashTest/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "ServiceCrashTest", // Only compile source java files in this apk. diff --git a/tests/SharedLibrary/client/Android.bp b/tests/SharedLibrary/client/Android.bp index dbf6dc94eb8d4..6eab7c2e2dce9 100644 --- a/tests/SharedLibrary/client/Android.bp +++ b/tests/SharedLibrary/client/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "SharedLibraryClient", srcs: ["**/*.java"], diff --git a/tests/SharedLibrary/lib/Android.bp b/tests/SharedLibrary/lib/Android.bp index f69d388ef0f14..0595cb1e116a0 100644 --- a/tests/SharedLibrary/lib/Android.bp +++ b/tests/SharedLibrary/lib/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_app { name: "SharedLibrary", srcs: ["**/*.java"], diff --git a/tests/ShowWhenLockedApp/Android.bp b/tests/ShowWhenLockedApp/Android.bp index dba564c91059d..f24834a53a366 100644 --- a/tests/ShowWhenLockedApp/Android.bp +++ b/tests/ShowWhenLockedApp/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "ShowWhenLocked", srcs: ["**/*.java"], diff --git a/tests/SmokeTest/Android.bp b/tests/SmokeTest/Android.bp index bc45ee6799b49..4c853e3c52674 100644 --- a/tests/SmokeTest/Android.bp +++ b/tests/SmokeTest/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "SmokeTestApp", // This builds "SmokeTestApp" diff --git a/tests/SmokeTest/tests/Android.bp b/tests/SmokeTest/tests/Android.bp index ceb2d193de796..5542dd0119ea5 100644 --- a/tests/SmokeTest/tests/Android.bp +++ b/tests/SmokeTest/tests/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "SmokeTest", // Include all test java files. diff --git a/tests/SmokeTestApps/Android.bp b/tests/SmokeTestApps/Android.bp index 0feb00040eacb..3505fe1c4afbd 100644 --- a/tests/SmokeTestApps/Android.bp +++ b/tests/SmokeTestApps/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "SmokeTestTriggerApps", srcs: ["src/**/*.java"], diff --git a/tests/SoundTriggerTestApp/Android.bp b/tests/SoundTriggerTestApp/Android.bp index d3a1300b8e125..09f1e10561e3a 100644 --- a/tests/SoundTriggerTestApp/Android.bp +++ b/tests/SoundTriggerTestApp/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_app { name: "SoundTriggerTestApp", srcs: ["**/*.java"], diff --git a/tests/Split/Android.bp b/tests/Split/Android.bp index d8c89bab28571..727b2026461c9 100644 --- a/tests/Split/Android.bp +++ b/tests/Split/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "Split", srcs: ["**/*.java"], diff --git a/tests/StagedInstallTest/Android.bp b/tests/StagedInstallTest/Android.bp index 45c1c73afcb06..243c3015b5594 100644 --- a/tests/StagedInstallTest/Android.bp +++ b/tests/StagedInstallTest/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "StagedInstallInternalTestApp", manifest: "app/AndroidManifest.xml", @@ -37,4 +46,3 @@ java_test_host { test_suites: ["general-tests"], test_config: "StagedInstallInternalTest.xml", } - diff --git a/tests/StatusBar/Android.bp b/tests/StatusBar/Android.bp index 0b650ed3afc8e..2fad051300c74 100644 --- a/tests/StatusBar/Android.bp +++ b/tests/StatusBar/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "StatusBarTest", srcs: ["**/*.java"], diff --git a/tests/SurfaceComposition/Android.bp b/tests/SurfaceComposition/Android.bp index 53e4d52b2efde..f5aba8f5a2f2e 100644 --- a/tests/SurfaceComposition/Android.bp +++ b/tests/SurfaceComposition/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "SurfaceComposition", // Don't include this package in any target diff --git a/tests/SurfaceControlViewHostTest/Android.bp b/tests/SurfaceControlViewHostTest/Android.bp index e4e060010eea4..0127ba559500a 100644 --- a/tests/SurfaceControlViewHostTest/Android.bp +++ b/tests/SurfaceControlViewHostTest/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "SurfaceControlViewHostTest", srcs: ["**/*.java"], diff --git a/tests/SystemMemoryTest/device/Android.bp b/tests/SystemMemoryTest/device/Android.bp index 2bf0fec0fd1f9..d7cec1aedaedf 100644 --- a/tests/SystemMemoryTest/device/Android.bp +++ b/tests/SystemMemoryTest/device/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test_helper_app { name: "SystemMemoryTestDevice", sdk_version: "current", diff --git a/tests/SystemMemoryTest/host/Android.bp b/tests/SystemMemoryTest/host/Android.bp index 3bb5489dab6ce..79744625b7526 100644 --- a/tests/SystemMemoryTest/host/Android.bp +++ b/tests/SystemMemoryTest/host/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_test_host { name: "system-memory-test", srcs: ["src/**/*.java"], diff --git a/tests/SystemUIDemoModeController/Android.bp b/tests/SystemUIDemoModeController/Android.bp index 1e4c43792d709..d952cf6a4b3eb 100644 --- a/tests/SystemUIDemoModeController/Android.bp +++ b/tests/SystemUIDemoModeController/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "DemoModeController", srcs: ["**/*.java"], diff --git a/tests/TaskOrganizerTest/Android.bp b/tests/TaskOrganizerTest/Android.bp index 8a13dbc52c660..56d569548006e 100644 --- a/tests/TaskOrganizerTest/Android.bp +++ b/tests/TaskOrganizerTest/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "TaskOrganizerTest", srcs: ["**/*.java"], diff --git a/tests/TelephonyCommonTests/Android.bp b/tests/TelephonyCommonTests/Android.bp index 4f7569d4f4513..a9fbfd97225d0 100644 --- a/tests/TelephonyCommonTests/Android.bp +++ b/tests/TelephonyCommonTests/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "TelephonyCommonTests", srcs: [ diff --git a/tests/TouchLatency/Android.bp b/tests/TouchLatency/Android.bp index 1174bcb0d4d63..3a9e240d97464 100644 --- a/tests/TouchLatency/Android.bp +++ b/tests/TouchLatency/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "TouchLatency", manifest: "app/src/main/AndroidManifest.xml", diff --git a/tests/TransformTest/Android.bp b/tests/TransformTest/Android.bp index fd7aaeb35feb8..f58fe8f13bdae 100644 --- a/tests/TransformTest/Android.bp +++ b/tests/TransformTest/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "TransformTest", srcs: ["**/*.java"], diff --git a/tests/TransitionTests/Android.bp b/tests/TransitionTests/Android.bp index 57f19e38330d2..4daa5b84f71e7 100644 --- a/tests/TransitionTests/Android.bp +++ b/tests/TransitionTests/Android.bp @@ -1,3 +1,14 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + // SPDX-license-identifier-MIT + // SPDX-license-identifier-Unicode-DFS + default_applicable_licenses: ["frameworks_base_license"], +} + android_app { name: "TransitionTests", // Only compile source java files in this apk. diff --git a/tests/TtsTests/Android.bp b/tests/TtsTests/Android.bp index b137523803a68..b7aa5d4a38aae 100644 --- a/tests/TtsTests/Android.bp +++ b/tests/TtsTests/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "TtsTests", srcs: ["**/*.java"], diff --git a/tests/UiBench/Android.bp b/tests/UiBench/Android.bp index e0608e2884594..0d2f2ef46cab3 100644 --- a/tests/UiBench/Android.bp +++ b/tests/UiBench/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "UiBench", sdk_version: "current", diff --git a/tests/UsageReportingTest/Android.bp b/tests/UsageReportingTest/Android.bp index 0bac5a224b264..dfce0705df59a 100644 --- a/tests/UsageReportingTest/Android.bp +++ b/tests/UsageReportingTest/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "UsageReportingTest", // Only compile source java files in this apk. diff --git a/tests/UsageStatsPerfTests/Android.bp b/tests/UsageStatsPerfTests/Android.bp index 3991fb8366ac9..0e372a3ef95a8 100644 --- a/tests/UsageStatsPerfTests/Android.bp +++ b/tests/UsageStatsPerfTests/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "UsageStatsPerfTests", srcs: ["src/**/*.java"], diff --git a/tests/UsageStatsTest/Android.bp b/tests/UsageStatsTest/Android.bp index 0808b05ec053d..afb266bf326d3 100644 --- a/tests/UsageStatsTest/Android.bp +++ b/tests/UsageStatsTest/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "UsageStatsTest", // Only compile source java files in this apk. diff --git a/tests/UsbHostExternalManagmentTest/AoapTestDevice/Android.bp b/tests/UsbHostExternalManagmentTest/AoapTestDevice/Android.bp index c7e9df0fe9cfd..9133baed71794 100644 --- a/tests/UsbHostExternalManagmentTest/AoapTestDevice/Android.bp +++ b/tests/UsbHostExternalManagmentTest/AoapTestDevice/Android.bp @@ -16,6 +16,15 @@ //################################################# +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "AoapTestDeviceApp", srcs: ["src/**/*.java"], diff --git a/tests/UsbHostExternalManagmentTest/AoapTestHost/Android.bp b/tests/UsbHostExternalManagmentTest/AoapTestHost/Android.bp index 6fa58cb5c6825..68930023de960 100644 --- a/tests/UsbHostExternalManagmentTest/AoapTestHost/Android.bp +++ b/tests/UsbHostExternalManagmentTest/AoapTestHost/Android.bp @@ -16,6 +16,15 @@ //################################################# +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "AoapTestHostApp", srcs: ["src/**/*.java"], diff --git a/tests/UsbHostExternalManagmentTest/UsbHostExternalManagmentTestApp/Android.bp b/tests/UsbHostExternalManagmentTest/UsbHostExternalManagmentTestApp/Android.bp index edd4205968b36..2fca4d35fe018 100644 --- a/tests/UsbHostExternalManagmentTest/UsbHostExternalManagmentTestApp/Android.bp +++ b/tests/UsbHostExternalManagmentTest/UsbHostExternalManagmentTestApp/Android.bp @@ -17,6 +17,15 @@ //################################################# // TODO: should this be android_helper_test_app? +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_app { name: "UsbHostExternalManagementTestApp", srcs: ["src/**/*.java"], diff --git a/tests/UsbManagerTests/Android.bp b/tests/UsbManagerTests/Android.bp index a03c6e223b74d..97fbf5b320351 100644 --- a/tests/UsbManagerTests/Android.bp +++ b/tests/UsbManagerTests/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "UsbManagerTests", srcs: ["src/**/*.java"], diff --git a/tests/UsbManagerTests/lib/Android.bp b/tests/UsbManagerTests/lib/Android.bp index 3c5d91b326d0d..994484cd63bf0 100644 --- a/tests/UsbManagerTests/lib/Android.bp +++ b/tests/UsbManagerTests/lib/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_library { name: "UsbManagerTestLib", srcs: ["src/**/*.java"], diff --git a/tests/UsbTests/Android.bp b/tests/UsbTests/Android.bp index 7c2be9b63ac33..9328b67795cb0 100644 --- a/tests/UsbTests/Android.bp +++ b/tests/UsbTests/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "UsbTests", srcs: ["**/*.java"], diff --git a/tests/UsesFeature2Test/Android.bp b/tests/UsesFeature2Test/Android.bp index a1b77d07ccdc7..624e4ec7ebd8c 100644 --- a/tests/UsesFeature2Test/Android.bp +++ b/tests/UsesFeature2Test/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "UsesFeature2Test", srcs: ["**/*.java"], diff --git a/tests/VectorDrawableTest/Android.bp b/tests/VectorDrawableTest/Android.bp index 13f318ef7c425..9da7c5fdbb170 100644 --- a/tests/VectorDrawableTest/Android.bp +++ b/tests/VectorDrawableTest/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "VectorDrawableTest", srcs: ["**/*.java"], diff --git a/tests/VoiceEnrollment/Android.bp b/tests/VoiceEnrollment/Android.bp index e43b38c5a0341..b5d62bbd68a8c 100644 --- a/tests/VoiceEnrollment/Android.bp +++ b/tests/VoiceEnrollment/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_app { name: "VoiceEnrollment", srcs: ["**/*.java"], diff --git a/tests/VoiceInteraction/Android.bp b/tests/VoiceInteraction/Android.bp index 7059473fb63f7..1aa7fafcd37c3 100644 --- a/tests/VoiceInteraction/Android.bp +++ b/tests/VoiceInteraction/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "VoiceInteraction", srcs: ["**/*.java"], diff --git a/tests/WallpaperTest/Android.bp b/tests/WallpaperTest/Android.bp index f68b6ec2452d2..b009af25f9da7 100644 --- a/tests/WallpaperTest/Android.bp +++ b/tests/WallpaperTest/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_app { name: "WallpaperTest", srcs: ["src/**/*.java"], diff --git a/tests/WindowAnimationJank/Android.bp b/tests/WindowAnimationJank/Android.bp index 50b2297386cc2..ed86aa5f90ea4 100644 --- a/tests/WindowAnimationJank/Android.bp +++ b/tests/WindowAnimationJank/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "WindowAnimationJank", srcs: ["src/**/*.java"], diff --git a/tests/WindowInsetsTests/Android.bp b/tests/WindowInsetsTests/Android.bp index 7272152dc2579..b1f4819fc0bb8 100644 --- a/tests/WindowInsetsTests/Android.bp +++ b/tests/WindowInsetsTests/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "WindowInsetsTests", srcs: ["src/**/*.java"], @@ -24,4 +33,3 @@ android_test { "com.google.android.material_material", ], } - diff --git a/tests/appwidgets/AppWidgetHostTest/Android.bp b/tests/appwidgets/AppWidgetHostTest/Android.bp index 24b76136c0459..a3838e5405d1a 100644 --- a/tests/appwidgets/AppWidgetHostTest/Android.bp +++ b/tests/appwidgets/AppWidgetHostTest/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_app { name: "AppWidgetHostTest", srcs: ["**/*.java"], diff --git a/tests/appwidgets/AppWidgetProviderTest/Android.bp b/tests/appwidgets/AppWidgetProviderTest/Android.bp index a1a599177a016..a9ee7ad936638 100644 --- a/tests/appwidgets/AppWidgetProviderTest/Android.bp +++ b/tests/appwidgets/AppWidgetProviderTest/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_app { name: "AppWidgetProvider", srcs: ["**/*.java"], diff --git a/tests/backup/Android.mk b/tests/backup/Android.mk index e9618300fc48e..9b155c930871b 100644 --- a/tests/backup/Android.mk +++ b/tests/backup/Android.mk @@ -24,6 +24,9 @@ LOCAL_SRC_FILES := \ LOCAL_CFLAGS := -Wall -Werror LOCAL_MODULE_TAGS := optional LOCAL_MODULE := backup_helper_test +LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0 +LOCAL_LICENSE_CONDITIONS := notice +LOCAL_NOTICE_FILE := $(LOCAL_PATH)/../../NOTICE LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS) LOCAL_SHARED_LIBRARIES := libandroidfw libutils diff --git a/tests/benchmarks/Android.bp b/tests/benchmarks/Android.bp index f16ddb9bc68e2..f87ca2ef928b2 100644 --- a/tests/benchmarks/Android.bp +++ b/tests/benchmarks/Android.bp @@ -15,6 +15,15 @@ // build framework base core benchmarks // ============================================================ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_library { name: "networkStatsFactory-benchmarks", installable: true, diff --git a/tests/libs-permissions/Android.bp b/tests/libs-permissions/Android.bp index 66a1f83dc3080..a8ce8a4cd9563 100644 --- a/tests/libs-permissions/Android.bp +++ b/tests/libs-permissions/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_library { name: "com.android.test.libs.product", installable: true, diff --git a/tests/net/Android.bp b/tests/net/Android.bp index ffde68eab5782..81224957b2c7f 100644 --- a/tests/net/Android.bp +++ b/tests/net/Android.bp @@ -1,6 +1,15 @@ //######################################################################## // Build FrameworksNetTests package //######################################################################## +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_defaults { name: "FrameworksNetTests-jni-defaults", jni_libs: [ diff --git a/tests/net/common/Android.bp b/tests/net/common/Android.bp index c271f49ee537d..babb81c5fa34c 100644 --- a/tests/net/common/Android.bp +++ b/tests/net/common/Android.bp @@ -16,6 +16,15 @@ // Tests in this folder are included both in unit tests and CTS. // They must be fast and stable, and exercise public or test APIs. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_library { name: "FrameworksNetCommonTests", srcs: ["java/**/*.java", "java/**/*.kt"], diff --git a/tests/net/deflake/Android.bp b/tests/net/deflake/Android.bp index b1b017131c64c..58ece37ef6477 100644 --- a/tests/net/deflake/Android.bp +++ b/tests/net/deflake/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_test_host { name: "FrameworksNetDeflakeTest", srcs: ["src/**/*.kt"], diff --git a/tests/net/integration/Android.bp b/tests/net/integration/Android.bp index 69742b9bf7b21..4d1e3371e0a7d 100644 --- a/tests/net/integration/Android.bp +++ b/tests/net/integration/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "FrameworksNetIntegrationTests", platform_apis: true, diff --git a/tests/net/jni/Android.bp b/tests/net/jni/Android.bp index 9225ffb24bd87..22a04f5c0945f 100644 --- a/tests/net/jni/Android.bp +++ b/tests/net/jni/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_library_shared { name: "libnetworkstatsfactorytestjni", diff --git a/tests/net/smoketest/Android.bp b/tests/net/smoketest/Android.bp index 84ae2b5d845e9..1535f3ddcb385 100644 --- a/tests/net/smoketest/Android.bp +++ b/tests/net/smoketest/Android.bp @@ -9,6 +9,15 @@ // // TODO: remove this hack when there is a better solution for jni_libs that includes // dependent libraries. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "FrameworksNetSmokeTests", defaults: ["FrameworksNetTests-jni-defaults"], @@ -19,4 +28,4 @@ android_test { "mockito-target-minus-junit4", "services.core", ], -} \ No newline at end of file +} diff --git a/tests/notification/Android.bp b/tests/notification/Android.bp index f05edafbf8b7c..1c1b5a231e860 100644 --- a/tests/notification/Android.bp +++ b/tests/notification/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "NotificationTests", // Include all test java files. diff --git a/tests/permission/Android.bp b/tests/permission/Android.bp index bd07009de7b37..bbc2358d206ef 100644 --- a/tests/permission/Android.bp +++ b/tests/permission/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "FrameworkPermissionTests", // Include all test java files. diff --git a/tests/privapp-permissions/Android.bp b/tests/privapp-permissions/Android.bp index b6618508d95d1..082b08dea91fd 100644 --- a/tests/privapp-permissions/Android.bp +++ b/tests/privapp-permissions/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_app { name: "PrivAppPermissionTest", sdk_version: "current", diff --git a/tests/testables/Android.bp b/tests/testables/Android.bp index eb6811cf490ee..c0e3d630d1ab7 100644 --- a/tests/testables/Android.bp +++ b/tests/testables/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_library { name: "testables", srcs: ["src/**/*.java"], diff --git a/tests/testables/tests/Android.bp b/tests/testables/tests/Android.bp index e1a58be7bd689..ba323d3fe47a3 100644 --- a/tests/testables/tests/Android.bp +++ b/tests/testables/tests/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "TestablesTests", platform_apis: true, diff --git a/tests/utils/StubIME/Android.bp b/tests/utils/StubIME/Android.bp index 668c92c86c51b..d86068cef8b40 100644 --- a/tests/utils/StubIME/Android.bp +++ b/tests/utils/StubIME/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "StubIME", srcs: ["src/**/*.java"], diff --git a/tests/utils/hostutils/Android.bp b/tests/utils/hostutils/Android.bp index c9ad70280aa62..05f3c74218c61 100644 --- a/tests/utils/hostutils/Android.bp +++ b/tests/utils/hostutils/Android.bp @@ -13,6 +13,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_library_host { name: "frameworks-base-hostutils", diff --git a/tests/utils/testutils/Android.bp b/tests/utils/testutils/Android.bp index a6625ab9c17f1..af9786b92f40f 100644 --- a/tests/utils/testutils/Android.bp +++ b/tests/utils/testutils/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_library { name: "frameworks-base-testutils", diff --git a/tests/vcn/Android.bp b/tests/vcn/Android.bp index c04ddd78e69bb..345c2a9f30e2c 100644 --- a/tests/vcn/Android.bp +++ b/tests/vcn/Android.bp @@ -2,6 +2,15 @@ // Build FrameworksVcnTests package //######################################################################## +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "FrameworksVcnTests", srcs: [ diff --git a/tools/aapt/Android.bp b/tools/aapt/Android.bp index a594e5bf0ce15..c75ba71c44328 100644 --- a/tools/aapt/Android.bp +++ b/tools/aapt/Android.bp @@ -19,6 +19,23 @@ // targets here. // ========================================================== +package { + default_applicable_licenses: ["frameworks_base_tools_aapt_license"], +} + +// Added automatically by a large-scale-change +// See: http://go/android-license-faq +license { + name: "frameworks_base_tools_aapt_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + ], + license_text: [ + "NOTICE", + ], +} + cc_defaults { name: "aapt_defaults", diff --git a/tools/aapt2/Android.bp b/tools/aapt2/Android.bp index ade0dc4d9c429..5c5b3c32876c2 100644 --- a/tools/aapt2/Android.bp +++ b/tools/aapt2/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + toolSources = [ "cmd/Command.cpp", "cmd/Compile.cpp", diff --git a/tools/aapt2/integration-tests/AutoVersionTest/Android.bp b/tools/aapt2/integration-tests/AutoVersionTest/Android.bp index 79fb5734cd689..bfd35083366e7 100644 --- a/tools/aapt2/integration-tests/AutoVersionTest/Android.bp +++ b/tools/aapt2/integration-tests/AutoVersionTest/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "AaptAutoVersionTest", sdk_version: "current", diff --git a/tools/aapt2/integration-tests/BasicTest/Android.bp b/tools/aapt2/integration-tests/BasicTest/Android.bp index a94a01f12c9e7..7db9d2698cc74 100644 --- a/tools/aapt2/integration-tests/BasicTest/Android.bp +++ b/tools/aapt2/integration-tests/BasicTest/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "AaptBasicTest", sdk_version: "current", diff --git a/tools/aapt2/integration-tests/MergeOnlyTest/LeafLib/Android.mk b/tools/aapt2/integration-tests/MergeOnlyTest/LeafLib/Android.mk index 7bf8cf84426cc..c084849a9d28b 100644 --- a/tools/aapt2/integration-tests/MergeOnlyTest/LeafLib/Android.mk +++ b/tools/aapt2/integration-tests/MergeOnlyTest/LeafLib/Android.mk @@ -20,9 +20,12 @@ include $(CLEAR_VARS) LOCAL_USE_AAPT2 := true LOCAL_AAPT_NAMESPACES := true LOCAL_MODULE := AaptTestMergeOnly_LeafLib +LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0 +LOCAL_LICENSE_CONDITIONS := notice +LOCAL_NOTICE_FILE := $(LOCAL_PATH)/../../../../../NOTICE LOCAL_SDK_VERSION := current LOCAL_MODULE_TAGS := tests LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res LOCAL_MIN_SDK_VERSION := 21 LOCAL_AAPT_FLAGS := --merge-only -include $(BUILD_STATIC_JAVA_LIBRARY) \ No newline at end of file +include $(BUILD_STATIC_JAVA_LIBRARY) diff --git a/tools/aapt2/integration-tests/MergeOnlyTest/LocalLib/Android.mk b/tools/aapt2/integration-tests/MergeOnlyTest/LocalLib/Android.mk index ba781c56a9132..699ad79ecf1a3 100644 --- a/tools/aapt2/integration-tests/MergeOnlyTest/LocalLib/Android.mk +++ b/tools/aapt2/integration-tests/MergeOnlyTest/LocalLib/Android.mk @@ -20,9 +20,12 @@ include $(CLEAR_VARS) LOCAL_USE_AAPT2 := true LOCAL_AAPT_NAMESPACES := true LOCAL_MODULE := AaptTestMergeOnly_LocalLib +LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0 +LOCAL_LICENSE_CONDITIONS := notice +LOCAL_NOTICE_FILE := $(LOCAL_PATH)/../../../../../NOTICE LOCAL_SDK_VERSION := current LOCAL_MODULE_TAGS := tests LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res LOCAL_MIN_SDK_VERSION := 21 LOCAL_AAPT_FLAGS := --merge-only -include $(BUILD_STATIC_JAVA_LIBRARY) \ No newline at end of file +include $(BUILD_STATIC_JAVA_LIBRARY) diff --git a/tools/aapt2/integration-tests/NamespaceTest/LibOne/Android.mk b/tools/aapt2/integration-tests/NamespaceTest/LibOne/Android.mk index c723d905db5b2..dd41702342580 100644 --- a/tools/aapt2/integration-tests/NamespaceTest/LibOne/Android.mk +++ b/tools/aapt2/integration-tests/NamespaceTest/LibOne/Android.mk @@ -20,6 +20,9 @@ include $(CLEAR_VARS) LOCAL_USE_AAPT2 := true LOCAL_AAPT_NAMESPACES := true LOCAL_MODULE := AaptTestNamespace_LibOne +LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0 +LOCAL_LICENSE_CONDITIONS := notice +LOCAL_NOTICE_FILE := $(LOCAL_PATH)/../../../../../NOTICE LOCAL_SDK_VERSION := current LOCAL_MODULE_TAGS := tests LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res diff --git a/tools/aapt2/integration-tests/NamespaceTest/LibTwo/Android.mk b/tools/aapt2/integration-tests/NamespaceTest/LibTwo/Android.mk index 90a7f627e591d..0d11bcbda64d3 100644 --- a/tools/aapt2/integration-tests/NamespaceTest/LibTwo/Android.mk +++ b/tools/aapt2/integration-tests/NamespaceTest/LibTwo/Android.mk @@ -20,6 +20,9 @@ include $(CLEAR_VARS) LOCAL_USE_AAPT2 := true LOCAL_AAPT_NAMESPACES := true LOCAL_MODULE := AaptTestNamespace_LibTwo +LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0 +LOCAL_LICENSE_CONDITIONS := notice +LOCAL_NOTICE_FILE := $(LOCAL_PATH)/../../../../../NOTICE LOCAL_SDK_VERSION := current LOCAL_MODULE_TAGS := tests LOCAL_SRC_FILES := $(call all-java-files-under,src) diff --git a/tools/aapt2/integration-tests/StaticLibTest/App/Android.bp b/tools/aapt2/integration-tests/StaticLibTest/App/Android.bp index 9aadff3d619ec..80404eeb8d8e8 100644 --- a/tools/aapt2/integration-tests/StaticLibTest/App/Android.bp +++ b/tools/aapt2/integration-tests/StaticLibTest/App/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "AaptTestStaticLib_App", diff --git a/tools/aapt2/integration-tests/StaticLibTest/LibOne/Android.bp b/tools/aapt2/integration-tests/StaticLibTest/LibOne/Android.bp index 4c8181343a33c..a84da43c70c8b 100644 --- a/tools/aapt2/integration-tests/StaticLibTest/LibOne/Android.bp +++ b/tools/aapt2/integration-tests/StaticLibTest/LibOne/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_library { name: "AaptTestStaticLib_LibOne", sdk_version: "current", diff --git a/tools/aapt2/integration-tests/StaticLibTest/LibTwo/Android.bp b/tools/aapt2/integration-tests/StaticLibTest/LibTwo/Android.bp index 7c4f7ed90e694..d386c3a35d203 100644 --- a/tools/aapt2/integration-tests/StaticLibTest/LibTwo/Android.bp +++ b/tools/aapt2/integration-tests/StaticLibTest/LibTwo/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_library { name: "AaptTestStaticLib_LibTwo", sdk_version: "current", diff --git a/tools/aapt2/integration-tests/SymlinkTest/Android.bp b/tools/aapt2/integration-tests/SymlinkTest/Android.bp index 68e6148e480c1..1e8cf86ed8116 100644 --- a/tools/aapt2/integration-tests/SymlinkTest/Android.bp +++ b/tools/aapt2/integration-tests/SymlinkTest/Android.bp @@ -14,6 +14,15 @@ // limitations under the License. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "AaptSymlinkTest", sdk_version: "current", diff --git a/tools/bit/Android.bp b/tools/bit/Android.bp index a8062719d586e..f6aa0fb8f3f04 100644 --- a/tools/bit/Android.bp +++ b/tools/bit/Android.bp @@ -17,6 +17,15 @@ // ========================================================== // Build the host executable: bit // ========================================================== +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_binary_host { name: "bit", diff --git a/tools/codegen/Android.bp b/tools/codegen/Android.bp index 677bee2cce818..e53ba3e18a86d 100644 --- a/tools/codegen/Android.bp +++ b/tools/codegen/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_binary_host { name: "codegen_cli", manifest: "manifest.txt", diff --git a/tools/dump-coverage/Android.bp b/tools/dump-coverage/Android.bp index 94356ebac035e..f381773909723 100644 --- a/tools/dump-coverage/Android.bp +++ b/tools/dump-coverage/Android.bp @@ -15,6 +15,15 @@ // // Build variants {target,host} x {32,64} +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_library { name: "libdumpcoverage", srcs: ["dump_coverage.cc"], diff --git a/tools/incident_report/Android.bp b/tools/incident_report/Android.bp index f2d0d0f3e5534..fe519c7edff43 100644 --- a/tools/incident_report/Android.bp +++ b/tools/incident_report/Android.bp @@ -17,6 +17,15 @@ // ========================================================== // Build the host executable: incident_report // ========================================================== +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_binary_host { name: "incident_report", diff --git a/tools/incident_section_gen/Android.bp b/tools/incident_section_gen/Android.bp index 0c7797eacf092..8227b60d6c092 100644 --- a/tools/incident_section_gen/Android.bp +++ b/tools/incident_section_gen/Android.bp @@ -17,6 +17,15 @@ // ========================================================== // Build the host executable: incident-section-gen // ========================================================== +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_binary_host { name: "incident-section-gen", cflags: [ diff --git a/tools/lock_agent/Android.bp b/tools/lock_agent/Android.bp index 7b2ca9a652427..cabe1398903e3 100644 --- a/tools/lock_agent/Android.bp +++ b/tools/lock_agent/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_library { name: "liblockagent", host_supported: false, diff --git a/tools/locked_region_code_injection/Android.bp b/tools/locked_region_code_injection/Android.bp index 5f81a2eeb130a..98c0e69cbf8e7 100644 --- a/tools/locked_region_code_injection/Android.bp +++ b/tools/locked_region_code_injection/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_binary_host { name: "lockedregioncodeinjection", manifest: "manifest.txt", diff --git a/tools/obbtool/Android.bp b/tools/obbtool/Android.bp index f87965860ce18..1c50d18ed32b9 100644 --- a/tools/obbtool/Android.bp +++ b/tools/obbtool/Android.bp @@ -4,6 +4,15 @@ // Opaque Binary Blob (OBB) Tool // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_binary_host { name: "obbtool", diff --git a/tools/powermodel/Android.bp b/tools/powermodel/Android.bp index f597aab0f4644..35c1356140276 100644 --- a/tools/powermodel/Android.bp +++ b/tools/powermodel/Android.bp @@ -1,4 +1,13 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_library_host { name: "powermodel", srcs: [ @@ -23,4 +32,3 @@ java_test_host { "mockito", ], } - diff --git a/tools/preload-check/Android.bp b/tools/preload-check/Android.bp index aaa6d76b39e36..73caac694cb4d 100644 --- a/tools/preload-check/Android.bp +++ b/tools/preload-check/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_test_host { name: "PreloadCheck", srcs: ["src/**/*.java"], diff --git a/tools/preload-check/device/Android.bp b/tools/preload-check/device/Android.bp index f40d8ba5a287d..2a866c4263369 100644 --- a/tools/preload-check/device/Android.bp +++ b/tools/preload-check/device/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_test_helper_library { name: "preload-check-device", host_supported: false, diff --git a/tools/preload/Android.bp b/tools/preload/Android.bp index 809ee474969ab..fad015ae35e07 100644 --- a/tools/preload/Android.bp +++ b/tools/preload/Android.bp @@ -1,3 +1,13 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + // SPDX-license-identifier-MIT + default_applicable_licenses: ["frameworks_base_license"], +} + java_library_host { name: "preload", srcs: [ diff --git a/tools/preload/loadclass/Android.bp b/tools/preload/loadclass/Android.bp index 6f12015dae2b5..ba36061e5fb62 100644 --- a/tools/preload/loadclass/Android.bp +++ b/tools/preload/loadclass/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_test { name: "loadclass", srcs: ["**/*.java"], diff --git a/tools/processors/staledataclass/Android.bp b/tools/processors/staledataclass/Android.bp index 58a7d346ce1f1..1e5097662a0a9 100644 --- a/tools/processors/staledataclass/Android.bp +++ b/tools/processors/staledataclass/Android.bp @@ -1,4 +1,13 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_plugin { name: "staledataclass-annotation-processor", processor_class: "android.processor.staledataclass.StaleDataclassProcessor", diff --git a/tools/processors/view_inspector/Android.bp b/tools/processors/view_inspector/Android.bp index 069e61f5b921e..ea9974f06a64e 100644 --- a/tools/processors/view_inspector/Android.bp +++ b/tools/processors/view_inspector/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_plugin { name: "view-inspector-annotation-processor", diff --git a/tools/protologtool/Android.bp b/tools/protologtool/Android.bp index ce551bd0cc104..56351e3275f60 100644 --- a/tools/protologtool/Android.bp +++ b/tools/protologtool/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_library_host { name: "protologtool-lib", srcs: [ diff --git a/tools/sdkparcelables/Android.bp b/tools/sdkparcelables/Android.bp index 00fb8aa20b18c..9d773e44faeae 100644 --- a/tools/sdkparcelables/Android.bp +++ b/tools/sdkparcelables/Android.bp @@ -1,3 +1,12 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + java_binary_host { name: "sdkparcelables", manifest: "manifest.txt", diff --git a/tools/split-select/Android.bp b/tools/split-select/Android.bp index ee822b7d7fa74..c12fc6a7f2539 100644 --- a/tools/split-select/Android.bp +++ b/tools/split-select/Android.bp @@ -19,6 +19,15 @@ // targets here. // ========================================================== +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_defaults { name: "split-select_defaults", diff --git a/tools/streaming_proto/Android.bp b/tools/streaming_proto/Android.bp index 1390f63248f97..1ec83a360048b 100644 --- a/tools/streaming_proto/Android.bp +++ b/tools/streaming_proto/Android.bp @@ -17,6 +17,15 @@ // ========================================================== // Build the host executable: protoc-gen-javastream // ========================================================== +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_defaults { name: "protoc-gen-stream-defaults", srcs: [ diff --git a/tools/validatekeymaps/Android.bp b/tools/validatekeymaps/Android.bp index 819e75ba1fed0..9fcf034536fc4 100644 --- a/tools/validatekeymaps/Android.bp +++ b/tools/validatekeymaps/Android.bp @@ -4,6 +4,15 @@ // Keymap validation tool. // +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + cc_binary_host { name: "validatekeymaps", diff --git a/wifi/java/Android.bp b/wifi/java/Android.bp index b35b4be55818e..225e750923fdb 100644 --- a/wifi/java/Android.bp +++ b/wifi/java/Android.bp @@ -16,6 +16,15 @@ // updatable), and are generally only called by the Wifi module. // necessary since we only want the `path` property to only refer to these files +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + filegroup { name: "framework-wifi-non-updatable-sources-internal", srcs: ["src/**/*.java"], diff --git a/wifi/tests/Android.bp b/wifi/tests/Android.bp index 3f5cacff017fb..c9105f7454e44 100644 --- a/wifi/tests/Android.bp +++ b/wifi/tests/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + android_test { name: "FrameworksWifiNonUpdatableApiTests", From 39745d829c696256e8021d545ed9d4ed9bcc4e37 Mon Sep 17 00:00:00 2001 From: Sungsoo Lim Date: Mon, 15 Feb 2021 15:53:07 +0900 Subject: [PATCH 169/288] [DO NOT MERGE] Catch RuntimeException from DisplayManager Bug: 171714761 Test: build Change-Id: I5bad08dcf49472af16df18418102407be56e67e7 --- media/java/android/media/MediaRouter.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/media/java/android/media/MediaRouter.java b/media/java/android/media/MediaRouter.java index 6fa378724240e..cd68a1d8eb1a1 100644 --- a/media/java/android/media/MediaRouter.java +++ b/media/java/android/media/MediaRouter.java @@ -361,7 +361,12 @@ public class MediaRouter { } public Display[] getAllPresentationDisplays() { - return mDisplayService.getDisplays(DisplayManager.DISPLAY_CATEGORY_PRESENTATION); + try { + return mDisplayService.getDisplays(DisplayManager.DISPLAY_CATEGORY_PRESENTATION); + } catch (RuntimeException ex) { + Log.e(TAG, "Unable to get displays.", ex); + return null; + } } private void updatePresentationDisplays(int changedDisplayId) { @@ -2075,6 +2080,9 @@ public class MediaRouter { private Display choosePresentationDisplay() { if ((mSupportedTypes & ROUTE_TYPE_LIVE_VIDEO) != 0) { Display[] displays = sStatic.getAllPresentationDisplays(); + if (displays == null || displays.length == 0) { + return null; + } // Ensure that the specified display is valid for presentations. // This check will normally disallow the default display unless it was From 5e0898d35da7119b52929363579169d6fc106095 Mon Sep 17 00:00:00 2001 From: yawanng Date: Mon, 8 Feb 2021 22:38:28 +0000 Subject: [PATCH 170/288] Adds caller check to getAllPackages() This change enforces that only system, root or shell may call getAllPackages(), a hidden API that shares all package names regardless of user, instant app or package visibility rules. The only exception is the uid of iorapd. iorapd needs the package info to prefetch the right data. Bug: 179618216 Bug: 174661955 Test: run iorapd and check it works well. Change-Id: I77460ae19a4d41151577646441f11e2eddbb741a (cherry picked from commit 8124efd57b50056d22e1b63c32c366ebdf049598) --- core/java/android/os/Process.java | 6 ++++++ .../java/com/android/server/pm/PackageManagerService.java | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java index 34664a4085e55..feabd06acb8b3 100644 --- a/core/java/android/os/Process.java +++ b/core/java/android/os/Process.java @@ -206,6 +206,12 @@ public class Process { */ public static final int SE_UID = 1068; + /** + * Defines the UID/GID for the iorapd. + * @hide + */ + public static final int IORAPD_UID = 1071; + /** * Defines the UID/GID for the NetworkStack app. * @hide diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 40723e073ba10..db2bf5ea14bac 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -6178,6 +6178,10 @@ public class PackageManagerService extends IPackageManager.Stub @Override public List getAllPackages() { + // Allow iorapd to call this method. + if (Binder.getCallingUid() != Process.IORAPD_UID) { + enforceSystemOrRootOrShell("getAllPackages is limited to privileged callers"); + } final int callingUid = Binder.getCallingUid(); final int callingUserId = UserHandle.getUserId(callingUid); synchronized (mLock) { From 9b694ef4d45ca54bcc4b7de6940f5608047a1a16 Mon Sep 17 00:00:00 2001 From: yawanng Date: Mon, 8 Feb 2021 22:38:28 +0000 Subject: [PATCH 171/288] Adds caller check to getAllPackages() This change enforces that only system, root or shell may call getAllPackages(), a hidden API that shares all package names regardless of user, instant app or package visibility rules. The only exception is the uid of iorapd. iorapd needs the package info to prefetch the right data. Bug: 179618216 Bug: 174661955 Test: run iorapd and check it works well. Change-Id: I77460ae19a4d41151577646441f11e2eddbb741a (cherry picked from commit 8124efd57b50056d22e1b63c32c366ebdf049598) --- core/java/android/os/Process.java | 6 ++++++ .../java/com/android/server/pm/PackageManagerService.java | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java index a4077fbee892e..a89aefaa8c5bd 100644 --- a/core/java/android/os/Process.java +++ b/core/java/android/os/Process.java @@ -202,6 +202,12 @@ public class Process { */ public static final int SE_UID = 1068; + /** + * Defines the UID/GID for the iorapd. + * @hide + */ + public static final int IORAPD_UID = 1071; + /** * Defines the UID/GID for the NetworkStack app. * @hide diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 18f2655dc2d6a..6b53fc5838a31 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -6169,6 +6169,10 @@ public class PackageManagerService extends IPackageManager.Stub @Override public List getAllPackages() { + // Allow iorapd to call this method. + if (Binder.getCallingUid() != Process.IORAPD_UID) { + enforceSystemOrRootOrShell("getAllPackages is limited to privileged callers"); + } final int callingUid = Binder.getCallingUid(); final int callingUserId = UserHandle.getUserId(callingUid); synchronized (mLock) { From 7e2d8b8b131758523ccf022b935ac51ae47ca469 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 22 Feb 2021 04:25:57 +0000 Subject: [PATCH 172/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Iaf7ad15df24bf4c1dad03b3f373b97eaec903291 --- core/res/res/values-ca/strings.xml | 8 ++++---- core/res/res/values-eu/strings.xml | 20 ++++++++++---------- core/res/res/values-hy/strings.xml | 2 +- core/res/res/values-ky/strings.xml | 2 +- core/res/res/values-my/strings.xml | 4 ++-- core/res/res/values-nl/strings.xml | 6 +++--- 6 files changed, 21 insertions(+), 21 deletions(-) diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 3b2bb14a5db04..2d12880bade7c 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -524,10 +524,10 @@ "Permet que l\'aplicació conegui el nivell de complexitat del bloqueig de pantalla (alt, mitjà, baix o cap), que indica la llargària i el tipus de bloqueig de pantalla possibles. L\'aplicació també pot suggerir que els usuaris actualitzin el bloqueig de pantalla a un nivell determinat, però els usuaris poden ignorar aquestes recomanacions. Tingues en compte que el bloqueig de pantalla no s\'emmagatzema com a text sense format, de manera que l\'aplicació no coneix la contrasenya exacta." "utilitza maquinari biomètric" "Permet que l\'aplicació faci servir maquinari biomètric per a l\'autenticació" - "Gestionar el maquinari d\'empremtes dactilars" + "Gestionar el maquinari d\'empremtes digitals" "Permet que l\'aplicació invoqui mètodes per afegir i suprimir plantilles d\'empremtes dactilars que es puguin fer servir." - "Utilitzar el maquinari d\'empremtes dactilars" - "Permet que l\'aplicació faci servir maquinari d\'empremtes dactilars per a l\'autenticació" + "Utilitzar el maquinari d\'empremtes digitals" + "Permet que l\'aplicació faci servir maquinari d\'empremtes digitals per a l\'autenticació" "modificar la teva col·lecció de música" "Permet que l\'aplicació modifiqui la teva col·lecció de música." "modificar la teva col·lecció de vídeos" @@ -552,7 +552,7 @@ "L\'empremta digital s\'ha autenticat" "Cara autenticada" "Cara autenticada; prem el botó per confirmar" - "El maquinari per a empremtes dactilars no està disponible." + "El maquinari d\'empremtes digitals no està disponible." "L\'empremta digital no es pot desar. Suprimeix-ne una." "S\'ha esgotat el temps d\'espera per a l\'empremta digital. Torna-ho a provar." "S\'ha cancel·lat l\'operació d\'empremta digital." diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index 15e9548fa3b9a..75551a03144b2 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -244,7 +244,7 @@ "Amaitu saioa" "Pantaila-argazkia" "Akatsen txostena" - "Gailuaren uneko egoerari buruzko informazioa bilduko da, mezu elektroniko gisa bidaltzeko. Minutu batzuk igaroko dira akatsen txostena sortzen hasten denetik bidaltzeko prest egon arte. Itxaron, mesedez." + "Gailuaren oraingo egoerari buruzko informazioa bilduko da, mezu elektroniko gisa bidaltzeko. Minutu batzuk igaroko dira akatsen txostena sortzen hasten denetik bidaltzeko prest egon arte. Itxaron, mesedez." "Txosten dinamikoa" "Aukera hau erabili beharko zenuke ia beti. Txostenaren jarraipena egin ahal izango duzu eta arazoari buruzko xehetasunak eman ahal izango dituzu. Baliteke gutxitan erabili behar izaten diren atalak ez agertzea, denbora aurrezteko." "Txosten osoa" @@ -658,7 +658,7 @@ "atzitu DRM ziurtagiriak" "DRM ziurtagiriak hornitzea eta erabiltzeko baimena ematen die aplikazioei. Aplikazio normalek ez lukete beharko." "Jaso Android Beam transferentzien egoera" - "Uneko Android Beam transferentziei buruzko informazioa jasotzeko baimena ematen die aplikazioei" + "Oraingo Android Beam transferentziei buruzko informazioa jasotzeko baimena ematen die aplikazioei" "kendu DRM ziurtagiriak" "DRM ziurtagiriak kentzea baimentzen die aplikazioei. Aplikazio normalek ez lukete beharko." "lotu operadorearen mezularitza-zerbitzuari" @@ -1179,7 +1179,7 @@ "Eskala" "Erakutsi beti" "Gaitu hori berriro Sistemaren ezarpenak > Aplikazioak > Deskargatutakoak." - "%1$s aplikazioak ez du onartzen uneko pantailaren tamaina eta espero ez bezala joka lezake." + "%1$s aplikazioak ez du onartzen pantailaren tamaina, eta baliteke espero ez bezala jokatzea." "Erakutsi beti" "Android sistema eragilearen bertsio bateraezin baterako dago egina %1$s; beraz, espero ez bezala funtziona lezake. Baliteke aplikazioaren bertsio eguneratuago bat eskuragarri egotea." "Erakutsi beti" @@ -1209,9 +1209,9 @@ "Gorde gabe itxiko da %1$s" "%1$s prozesuak memoria-muga gainditu du" "Prest dago %1$s memoria-iraulketaren txostena" - "Sortu da uneko memoria-iraulketaren txostena. Sakatu partekatzeko." - "Uneko memoria-iraulketaren txostena partekatu nahi duzu?" - "%1$s prozesuak memoria-muga (%2$s) gainditu du. Uneko memoria-iraulketaren txostena sortu da, garatzailearekin parteka dezazun. Kontuz: baliteke txosten horrek aplikazioak atzi dezakeen informazio pertsonala izatea." + "Sortu da memoria-iraulketaren txostena. Sakatu partekatzeko." + "Memoria-iraulketaren txostena partekatu nahi duzu?" + "%1$s prozesuak memoria-muga (%2$s) gainditu du. Memoria-iraulketaren txostena sortu da, garatzailearekin parteka dezazun. Kontuz: baliteke txosten horrek aplikazioak atzi dezakeen informazio pertsonala izatea." "%1$s prozesuak bere memoria-muga (%2$s) gainditu du. Memoria-iraulketaren txosten bat duzu erabilgarri, hura partekatu nahi baduzu ere. Kontuz: baliteke txosten horrek prozesuak atzi dezakeen kontuzko informazio pertsonala izatea eta datu horien barnean zuk idatzitakoak egotea, besteak beste." "%1$s prozesuaren memoria-iraulketaren txosten bat duzu erabilgarri, hura partekatu nahi baduzu ere. Kontuz: baliteke txosten horrek prozesuak atzi dezakeen kontuzko informazio pertsonala izatea eta datu horien barnean zuk idatzitakoak egotea, besteak beste." "Aukeratu testurako ekintza" @@ -1339,7 +1339,7 @@ "Ez baduzu nahi %s zerbitzuak eginbide hori erabiltzea, sakatu hau ezarpenak ireki eta aukera desaktibatzeko." "Desaktibatu" "%s egiaztatzen…" - "Uneko edukia berrikusten" + "Edukia berrikusten" "Euskarri berria: %s" "%s ez da funtzionatzen ari" "Sakatu konfiguratzeko" @@ -1623,7 +1623,7 @@ "Erabilerraztasun-lasterbidea erabili nahi duzu?" "Lasterbidea aktibatuta dagoenean, bi bolumen-botoiak hiru segundoz sakatuta abiaraziko da erabilerraztasun-eginbidea." "Erabilerraztasun-eginbideak aktibatu nahi dituzu?" - "Eduki sakatuta bolumen-botoiak segundo batzuez erabilerraztasun-eginbideak aktibatzeko. Hori eginez gero, baliteke zure mugikorraren funtzionamendua aldatzea.\n\nUneko eginbideak:\n%1$s\nHautatutako eginbideak aldatzeko, joan Ezarpenak > Erabilerraztasuna atalera." + "Eduki sakatuta bolumen-botoiak segundo batzuez erabilerraztasun-eginbideak aktibatzeko. Hori eginez gero, baliteke zure mugikorraren funtzionamendua aldatzea.\n\nEginbideak:\n%1$s\nHautatutako eginbideak aldatzeko, joan Ezarpenak > Erabilerraztasuna atalera." " • %1$s\n" "%1$s aktibatu nahi duzu?" "Eduki sakatuta bolumen-botoiak segundo batzuez %1$s izeneko erabilerraztasun-eginbidea aktibatzeko. Honen bidez, baliteke zure mugikorraren funtzionamendua aldatzea.\n\nLasterbide hau beste eginbide batengatik aldatzeko, joan Ezarpenak > Erabilerraztasuna atalera." @@ -1660,7 +1660,7 @@ "Eginbide batetik bestera aldatzeko, pasatu bi hatz pantailaren behealdetik gora eta eduki sakatuta une batez." "Eginbide batetik bestera aldatzeko, pasatu hiru hatz pantailaren behealdetik gora eta eduki sakatuta une batez." "Lupa" - "Uneko erabiltzailea: %1$s." + "Erabiltzailea: %1$s." "%1$s erabiltzailera aldatzen…" "%1$s erabiltzailearen saioa amaitzen…" "Jabea" @@ -1760,7 +1760,7 @@ "Idatzi administratzailearen PIN kodea" "Idatzi PINa" "Okerra" - "Uneko PINa" + "Oraingo PINa" "PIN berria" "Berretsi PIN berria" "Konfiguratu debekuak aldatu ahal izateko idatzi beharko den PIN kodea" diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index da83ae5ef6f38..56b415b3d980b 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -1421,7 +1421,7 @@ "Պաստառ" "Փոխել պաստառը" "Ծանուցման ունկնդիր" - "VR ունկնդրիչ" + "VR ունկնիր" "Պայմանների մատակարար" "Ծանուցումների դասակարգման ծառայություն" "VPN-ը ակտիվացված է" diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index a76ded2155556..71c30f16cec45 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -306,7 +306,7 @@ "Микрофон" "аудио жаздыруу" "Кыймыл-аракет" - "кыймыл-аракетиңизге мүмкүнчүлүк алат" + "кыймыл-аракеттериңизге көз салып турганга мүмкүнчүлүк алат" "Камера" "сүрөт жана видео тартууга" "Чалуулар тизмеси" diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml index 9ba7fef637731..c0e3fb9a30fbd 100644 --- a/core/res/res/values-my/strings.xml +++ b/core/res/res/values-my/strings.xml @@ -633,8 +633,8 @@ "အက်ပ်အား အသုံးပြုသူက ခေါ်ဆိုမှုအဝင် မျက်နှာပြင် ဘယ်အချိန်မှာ ဘယ်လို မြင်ရမှာကို ထိန်းချုပ်ခွင့်ပေးရန်" "တယ်လီဖုန်း ဝန်ဆောင်မှုများနှင့် အပြန်အလှန် တုံ့ပြန်မှု" "အက်ပ်အား ခေါ်ဆိုမှုများ လုပ်ခြင်း/လက်ခံခြင်း ပြုလုပ်နိုင်ရန် တယ်လီဖုန်း ဝန်ဆောင်မှုများနှင့် အပြန်အလှန် တုံ့ပြန်မှုကို ခွင့်ပြုသည်။" - "အသုံးပြုသူ အတွက် ခေါ်ဆိုမှုအဝင် လုပ်ကိုင်ပုံကို စီစဉ်ပေးခြင်း" - "အက်ပ်အား အသုံးပြုသူ အတွက် ခေါ်ဆိုမှုအဝင် လုပ်ကိုင်ပုံကို စီစဉ်ခွင့် ပြုသည်။" + "အဝင်ခေါ်ဆိုမှုအတွက် အသုံးပြုသူ၏ နှစ်သက်မှုကို ခွင့်ပြုခြင်း" + "အဝင်ခေါ်ဆိုမှုအတွက် အသုံးပြုသူ၏ နှစ်သက်မှုကို ပံ့ပိုးပေးရန် အက်ပ်အား ခွင့်ပြုသည်။" "ရာဇဝင်အလိုက် ကွန်ယက်သုံစွဲမှုအား ဖတ်ခြင်း" "အက်ပ်အား အထူး ကွန်ရက်များ နှင့် အက်ပ်များ အတွက် ကွန်ရက် အသုံးပြုမှု မှတ်တမ်းကို ဖတ်ကြားခွင့် ပြုသည်။" "ကွန်ယက်မူဝါဒအား စီမံခြင်း" diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index c226b58fa1ab9..e14ad4d3f67c5 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -1841,7 +1841,7 @@ "Weekend" "Afspraken" "Slapen" - "%1$s dempt sommige geluiden" + "%1$s zet sommige geluiden uit" "Er is een intern probleem met je apparaat. Het apparaat kan instabiel zijn totdat u het apparaat terugzet naar de fabrieksinstellingen." "Er is een intern probleem met je apparaat. Neem contact op met de fabrikant voor meer informatie." "USSD-verzoek gewijzigd in normaal gesprek" @@ -1909,7 +1909,7 @@ "Demo starten…" "Apparaat resetten…" "%1$s uitgeschakeld" - "Conferencecall" + "Telefonische vergadering" "Knopinfo" "Games" "Muziek en audio" @@ -1985,7 +1985,7 @@ "%1$s wil segmenten van %2$s weergeven" "Bewerken" "Trillen bij gesprekken en meldingen" - "Gesprekken en meldingen zijn gedempt" + "Telefoon- en meldingsgeluid wordt uitgezet" "Systeemwijzigingen" "Niet storen" "Nieuw: \'Niet storen\' verbergt meldingen" From 8fea9c8e897e49950be4d965d44c7301a7ea945b Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Mon, 22 Feb 2021 13:52:07 +0800 Subject: [PATCH 173/288] Notify client to clear intermediate rotated adjustments For example: launch a landscape activity while device is portrait, and then launch another portrait activity before previous transition is done. If the landscape activity is destroyed before sending the fixed rotation adjustment for restoration, the adjustment is always retained by client side app. That causes the Display objects associated with application Resources to always return rotation from the adjustment. This change notifies client to clear the rotated adjustments if the the display won't be rotated by the next top activity before the transition is done, so the app can get the correct rotation in time. The transform will be cleared at the end of transition animation so the closing animation won't jump cut with rotation change. E.g. launch an activity in different orientation and press home or back key before the launch animation is finished. Also simply a bit for the path of clearing fixed rotation state to avoid sending duplicated adjustments. Bug: 161519202 Bug: 168263090 Bug: 177390830 Test: DisplayContentTests#testClearIntermediateFixedRotationAdjustments Change-Id: Ica074604df3e74eabbdef931531abe51855103e5 Merged-In: Ica074604df3e74eabbdef931531abe51855103e5 --- .../com/android/server/wm/DisplayContent.java | 7 +++++ .../com/android/server/wm/WindowToken.java | 12 +++---- .../server/wm/DisplayContentTests.java | 31 +++++++++++++++++++ 3 files changed, 43 insertions(+), 7 deletions(-) diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 2ef98b59768f5..f1b110de37aca 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -1513,6 +1513,13 @@ class DisplayContent extends WindowContainer { state.mIsTransforming = false; if (applyDisplayRotation != null) { applyDisplayRotation.run(); - } else { - // The display will not rotate to the rotation of this container, let's cancel them. - for (int i = state.mAssociatedTokens.size() - 1; i >= 0; i--) { - state.mAssociatedTokens.get(i).cancelFixedRotationTransform(); - } } // The state is cleared at the end, because it is used to indicate that other windows can // use seamless rotation when applying rotation to display. @@ -634,11 +629,15 @@ class WindowToken extends WindowContainer { final WindowToken token = state.mAssociatedTokens.get(i); token.mFixedRotationTransformState = null; token.notifyFixedRotationTransform(false /* enabled */); + if (applyDisplayRotation == null) { + // Notify cancellation because the display does not change rotation. + token.cancelFixedRotationTransform(); + } } } /** Notifies application side to enable or disable the rotation adjustment of display info. */ - private void notifyFixedRotationTransform(boolean enabled) { + void notifyFixedRotationTransform(boolean enabled) { FixedRotationAdjustments adjustments = null; // A token may contain windows of the same processes or different processes. The list is // used to avoid sending the same adjustments to a process multiple times. @@ -682,7 +681,6 @@ class WindowToken extends WindowContainer { // The window may be detached or detaching. return; } - notifyFixedRotationTransform(false /* enabled */); final int originalRotation = getWindowConfiguration().getRotation(); onConfigurationChanged(parent.getConfiguration()); onCancelFixedRotationTransform(originalRotation); diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java index d99606b704e48..b28220585c5c5 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java @@ -88,6 +88,7 @@ import static org.mockito.Mockito.doCallRealMethod; import android.annotation.SuppressLint; import android.app.ActivityTaskManager; import android.app.WindowConfiguration; +import android.app.servertransaction.FixedRotationAdjustmentsItem; import android.content.res.Configuration; import android.graphics.Rect; import android.graphics.Region; @@ -1345,6 +1346,36 @@ public class DisplayContentTests extends WindowTestsBase { assertFalse(recentsActivity.hasFixedRotationTransform()); } + @Test + public void testClearIntermediateFixedRotationAdjustments() throws RemoteException { + final ActivityRecord activity = new ActivityTestsBase.StackBuilder(mWm.mRoot) + .setDisplay(mDisplayContent).build().getTopMostActivity(); + mDisplayContent.setFixedRotationLaunchingApp(activity, + (mDisplayContent.getRotation() + 1) % 4); + // Create a window so FixedRotationAdjustmentsItem can be sent. + createWindow(null, TYPE_APPLICATION_STARTING, activity, "AppWin"); + final ActivityRecord activity2 = new ActivityTestsBase.StackBuilder(mWm.mRoot) + .setDisplay(mDisplayContent).build().getTopMostActivity(); + activity2.setVisible(false); + clearInvocations(mWm.mAtmService.getLifecycleManager()); + // The first activity has applied fixed rotation but the second activity becomes the top + // before the transition is done and it has the same rotation as display, so the dispatched + // rotation adjustment of first activity must be cleared. + mDisplayContent.handleTopActivityLaunchingInDifferentOrientation(activity2, + false /* checkOpening */); + + final ArgumentCaptor adjustmentsCaptor = + ArgumentCaptor.forClass(FixedRotationAdjustmentsItem.class); + verify(mWm.mAtmService.getLifecycleManager(), atLeastOnce()).scheduleTransaction( + eq(activity.app.getThread()), adjustmentsCaptor.capture()); + // The transformation is kept for animation in real case. + assertTrue(activity.hasFixedRotationTransform()); + final FixedRotationAdjustmentsItem clearAdjustments = FixedRotationAdjustmentsItem.obtain( + activity.token, null /* fixedRotationAdjustments */); + // The captor may match other items. The first one must be the item to clear adjustments. + assertEquals(clearAdjustments, adjustmentsCaptor.getAllValues().get(0)); + } + @Test public void testRemoteRotation() { DisplayContent dc = createNewDisplay(); From 6628f4e7b86cc5878c004981e4913430dffe2937 Mon Sep 17 00:00:00 2001 From: Danny Epstein Date: Fri, 12 Feb 2021 16:36:58 -0800 Subject: [PATCH 174/288] DO NOT MERGE Chk QUERY_ALL_PACKAGES when resolving When resolving intents, check whether QUERY_ALL_PACKAGES permission was granted, as well as whether the caller is a system process, to determine whether filtering may occur. This allows prefered activity records to be deleted by non-system processes if they have QUERY_ALL_PACKAGES permission. Before this change, configuring a custom activity resolver doesn't work properly because it's not allowed to delete the record of the last chosen app before writing a new record. Test: Create a custom activity resolver, choose an app just once, choose another app next time, verify it defaults to the other app after that. Bug: 173543124 Change-Id: If4dfea0374352b5e903d15e87e90baf012abf40b --- .../server/pm/PackageManagerService.java | 31 ++++++++++++++----- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 40723e073ba10..b54706e7b6bed 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -20,6 +20,7 @@ import static android.Manifest.permission.DELETE_PACKAGES; import static android.Manifest.permission.INSTALL_PACKAGES; import static android.Manifest.permission.MANAGE_DEVICE_ADMINS; import static android.Manifest.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS; +import static android.Manifest.permission.QUERY_ALL_PACKAGES; import static android.Manifest.permission.READ_EXTERNAL_STORAGE; import static android.Manifest.permission.REQUEST_DELETE_PACKAGES; import static android.Manifest.permission.SET_HARMFUL_APP_WARNINGS; @@ -28,6 +29,7 @@ import static android.app.AppOpsManager.MODE_ALLOWED; import static android.app.AppOpsManager.MODE_DEFAULT; import static android.app.AppOpsManager.MODE_IGNORED; import static android.content.Intent.ACTION_MAIN; +import static android.content.Intent.CATEGORY_BROWSABLE; import static android.content.Intent.CATEGORY_DEFAULT; import static android.content.Intent.CATEGORY_HOME; import static android.content.Intent.EXTRA_LONG_VERSION_CODE; @@ -35,8 +37,6 @@ import static android.content.Intent.EXTRA_PACKAGE_NAME; import static android.content.Intent.EXTRA_VERSION_CODE; import static android.content.pm.PackageManager.CERT_INPUT_RAW_X509; import static android.content.pm.PackageManager.CERT_INPUT_SHA256; -import static android.content.Intent.CATEGORY_BROWSABLE; -import static android.content.Intent.CATEGORY_DEFAULT; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED; @@ -6456,14 +6456,10 @@ public class PackageManagerService extends IPackageManager.Stub true /*allowDynamicSplits*/); Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER); - final boolean queryMayBeFiltered = - UserHandle.getAppId(filterCallingUid) >= Process.FIRST_APPLICATION_UID - && !resolveForStart; - final ResolveInfo bestChoice = chooseBestActivity( intent, resolvedType, flags, privateResolveFlags, query, userId, - queryMayBeFiltered); + queryMayBeFiltered(filterCallingUid, resolveForStart)); final boolean nonBrowserOnly = (privateResolveFlags & PackageManagerInternal.RESOLVE_NON_BROWSER_ONLY) != 0; if (nonBrowserOnly && bestChoice != null && bestChoice.handleAllWebDataURI) { @@ -6475,6 +6471,25 @@ public class PackageManagerService extends IPackageManager.Stub } } + /** + * Returns whether the query may be filtered to packages which are visible to the caller. + * Filtering occurs except in the following cases: + *

    + *
  • system processes + *
  • applications granted {@link android.Manifest.permission#QUERY_ALL_PACKAGES} + *
  • when querying to start an app + *
+ * + * @param filterCallingUid the UID of the calling application + * @param queryForStart whether query is to start an app + * @return whether filtering may occur + */ + private boolean queryMayBeFiltered(int filterCallingUid, boolean queryForStart) { + return UserHandle.getAppId(filterCallingUid) >= Process.FIRST_APPLICATION_UID + && checkUidPermission(QUERY_ALL_PACKAGES, filterCallingUid) != PERMISSION_GRANTED + && !queryForStart; + } + @Override public ResolveInfo findPersistentPreferredActivity(Intent intent, int userId) { if (!UserHandle.isSameApp(Binder.getCallingUid(), Process.SYSTEM_UID)) { @@ -6840,7 +6855,7 @@ public class PackageManagerService extends IPackageManager.Stub boolean removeMatches, boolean debug, int userId) { return findPreferredActivityNotLocked( intent, resolvedType, flags, query, priority, always, removeMatches, debug, userId, - UserHandle.getAppId(Binder.getCallingUid()) >= Process.FIRST_APPLICATION_UID); + queryMayBeFiltered(Binder.getCallingUid(), /* queryForStart= */ false)); } // TODO: handle preferred activities missing while user has amnesia From 8a3e7201b5a58c1bf09a9e2ffc014afcf3a2cdcc Mon Sep 17 00:00:00 2001 From: Christopher Tate Date: Fri, 11 Dec 2020 10:01:20 -0800 Subject: [PATCH 175/288] Make isAppBad() lock-free We trade off increased cost of (rare) mutations of the set of "bad" apps in order to make the core lookup "is this specific app bad?" lock-free. Locking discipline turned out to be a dominant cost in a very hot code path within the running system, even uncontended. Bug: 175339368 Bug: 163297662 Test: atest ActivityManagerServiceTest Change-Id: I8803a177d46b01b86897f1e8d0966eb2452849fd Merged-In: I8803a177d46b01b86897f1e8d0966eb2452849fd --- .../com/android/internal/app/ProcessMap.java | 4 +- .../server/am/ActivityManagerService.java | 4 +- .../java/com/android/server/am/AppErrors.java | 55 ++++++++++++++----- .../com/android/server/am/ProcessList.java | 6 +- 4 files changed, 48 insertions(+), 21 deletions(-) diff --git a/core/java/com/android/internal/app/ProcessMap.java b/core/java/com/android/internal/app/ProcessMap.java index 81036f7ecba8d..4917a47eb0004 100644 --- a/core/java/com/android/internal/app/ProcessMap.java +++ b/core/java/com/android/internal/app/ProcessMap.java @@ -22,7 +22,7 @@ import android.util.SparseArray; public class ProcessMap { final ArrayMap> mMap = new ArrayMap>(); - + public E get(String name, int uid) { SparseArray uids = mMap.get(name); if (uids == null) return null; @@ -58,4 +58,6 @@ public class ProcessMap { public int size() { return mMap.size(); } + + public void putAll(ProcessMap other) { mMap.putAll(other.mMap); } } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 0f6c8fe55d144..6d58c1e11b672 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -5999,9 +5999,7 @@ public class ActivityManagerService extends IActivityManager.Stub } private boolean isAppBad(ApplicationInfo info) { - synchronized (this) { - return mAppErrors.isBadProcessLocked(info); - } + return mAppErrors.isBadProcess(info.processName, info.uid); } // NOTE: this is an internal method used by the OnShellCommand implementation only and should diff --git a/services/core/java/com/android/server/am/AppErrors.java b/services/core/java/com/android/server/am/AppErrors.java index 50d2cab0af81a..9838f01510a3f 100644 --- a/services/core/java/com/android/server/am/AppErrors.java +++ b/services/core/java/com/android/server/am/AppErrors.java @@ -97,9 +97,19 @@ class AppErrors { * a minimum amount of time; they are removed from it when they are * later restarted (hopefully due to some user action). The value is the * time it was added to the list. + * + * Read access is UNLOCKED, and must either be based on a single lookup + * call on the current mBadProcesses instance, or a local copy of that + * reference must be made and the local copy treated as the source of + * truth. Mutations are performed by synchronizing on mBadProcessLock, + * cloning the existing mBadProcesses instance, performing the mutation, + * then changing the volatile "live" mBadProcesses reference to point to the + * mutated version. These operations are very rare compared to lookups: + * we intentionally trade additional cost for mutations for eliminating + * lock operations from the simple lookup cases. */ - private final ProcessMap mBadProcesses = new ProcessMap<>(); - + private volatile ProcessMap mBadProcesses = new ProcessMap<>(); + private final Object mBadProcessLock = new Object(); AppErrors(Context context, ActivityManagerService service, PackageWatchdog watchdog) { context.assertRuntimeOverlayThemable(); @@ -109,7 +119,8 @@ class AppErrors { } void dumpDebug(ProtoOutputStream proto, long fieldId, String dumpPackage) { - if (mProcessCrashTimes.getMap().isEmpty() && mBadProcesses.getMap().isEmpty()) { + final ProcessMap badProcesses = mBadProcesses; + if (mProcessCrashTimes.getMap().isEmpty() && badProcesses.getMap().isEmpty()) { return; } @@ -144,8 +155,8 @@ class AppErrors { } - if (!mBadProcesses.getMap().isEmpty()) { - final ArrayMap> pmap = mBadProcesses.getMap(); + if (!badProcesses.getMap().isEmpty()) { + final ArrayMap> pmap = badProcesses.getMap(); final int processCount = pmap.size(); for (int ip = 0; ip < processCount; ip++) { final long btoken = proto.start(AppErrorsProto.BAD_PROCESSES); @@ -209,9 +220,10 @@ class AppErrors { } } - if (!mBadProcesses.getMap().isEmpty()) { + final ProcessMap badProcesses = mBadProcesses; + if (!badProcesses.getMap().isEmpty()) { boolean printed = false; - final ArrayMap> pmap = mBadProcesses.getMap(); + final ArrayMap> pmap = badProcesses.getMap(); final int processCount = pmap.size(); for (int ip = 0; ip < processCount; ip++) { final String pname = pmap.keyAt(ip); @@ -263,12 +275,27 @@ class AppErrors { return needSep; } - boolean isBadProcessLocked(ApplicationInfo info) { - return mBadProcesses.get(info.processName, info.uid) != null; + boolean isBadProcess(final String processName, final int uid) { + // NO LOCKING for the simple lookup + return mBadProcesses.get(processName, uid) != null; } - void clearBadProcessLocked(ApplicationInfo info) { - mBadProcesses.remove(info.processName, info.uid); + void clearBadProcess(final String processName, final int uid) { + synchronized (mBadProcessLock) { + final ProcessMap badProcesses = new ProcessMap<>(); + badProcesses.putAll(mBadProcesses); + badProcesses.remove(processName, uid); + mBadProcesses = badProcesses; + } + } + + void markBadProcess(final String processName, final int uid, BadProcessInfo info) { + synchronized (mBadProcessLock) { + final ProcessMap badProcesses = new ProcessMap<>(); + badProcesses.putAll(mBadProcesses); + badProcesses.put(processName, uid, info); + mBadProcesses = badProcesses; + } } void resetProcessCrashTimeLocked(ApplicationInfo info) { @@ -737,10 +764,10 @@ class AppErrors { app.info.processName); if (!app.isolated) { // XXX We don't have a way to mark isolated processes - // as bad, since they don't have a peristent identity. - mBadProcesses.put(app.info.processName, app.uid, + // as bad, since they don't have a persistent identity. + markBadProcess(app.info.processName, app.uid, new BadProcessInfo(now, shortMsg, longMsg, stackTrace)); - mProcessCrashTimes.remove(app.info.processName, app.uid); + mProcessCrashTimes.remove(app.processName, app.uid); } app.bad = true; app.removed = true; diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java index c851a88b6e68e..f1e4ae5ceecd8 100644 --- a/services/core/java/com/android/server/am/ProcessList.java +++ b/services/core/java/com/android/server/am/ProcessList.java @@ -2336,7 +2336,7 @@ public final class ProcessList { if ((intentFlags & Intent.FLAG_FROM_BACKGROUND) != 0) { // If we are in the background, then check to see if this process // is bad. If so, we will just silently fail. - if (mService.mAppErrors.isBadProcessLocked(info)) { + if (mService.mAppErrors.isBadProcess(info.processName, info.uid)) { if (DEBUG_PROCESSES) Slog.v(TAG, "Bad process: " + info.uid + "/" + info.processName); return null; @@ -2349,11 +2349,11 @@ public final class ProcessList { if (DEBUG_PROCESSES) Slog.v(TAG, "Clearing bad process: " + info.uid + "/" + info.processName); mService.mAppErrors.resetProcessCrashTimeLocked(info); - if (mService.mAppErrors.isBadProcessLocked(info)) { + if (mService.mAppErrors.isBadProcess(info.processName, info.uid)) { EventLog.writeEvent(EventLogTags.AM_PROC_GOOD, UserHandle.getUserId(info.uid), info.uid, info.processName); - mService.mAppErrors.clearBadProcessLocked(info); + mService.mAppErrors.clearBadProcess(info.processName, info.uid); if (app != null) { app.bad = false; } From 41802905f92fba7e88921f695b7bdd3387cc19e7 Mon Sep 17 00:00:00 2001 From: Daniel Peykov Date: Mon, 2 Nov 2020 18:04:53 +0000 Subject: [PATCH 176/288] Fix possible NPE when matching accessory version As UsbAccessory#getVersion is nullable, a NPE can occur if the manufacturer/model match. Bug: 172002066 Bug: 178227159 Bug: 180055624 Change-Id: I751a01e3d182e01e5a9dbc011b60535997f9bc15 (cherry picked from commit 25dca30e2f1fe1a25a6ae0b9ad556902cf722d46) --- core/java/android/hardware/usb/AccessoryFilter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/java/android/hardware/usb/AccessoryFilter.java b/core/java/android/hardware/usb/AccessoryFilter.java index f22dad4124d27..f4c73d56e433b 100644 --- a/core/java/android/hardware/usb/AccessoryFilter.java +++ b/core/java/android/hardware/usb/AccessoryFilter.java @@ -101,7 +101,7 @@ public class AccessoryFilter { public boolean matches(UsbAccessory acc) { if (mManufacturer != null && !acc.getManufacturer().equals(mManufacturer)) return false; if (mModel != null && !acc.getModel().equals(mModel)) return false; - return !(mVersion != null && !acc.getVersion().equals(mVersion)); + return !(mVersion != null && !mVersion.equals(acc.getVersion())); } /** From a26e73ab690547ebf90941719d50631143527e7e Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 23 Feb 2021 09:39:33 +0000 Subject: [PATCH 177/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I741fb648df0001a14b55c405f44425e52f3d1bac --- .../DynamicSystemInstallationService/res/values-eu/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/DynamicSystemInstallationService/res/values-eu/strings.xml b/packages/DynamicSystemInstallationService/res/values-eu/strings.xml index 7c4a67d4e6c21..9fa88beeb020d 100644 --- a/packages/DynamicSystemInstallationService/res/values-eu/strings.xml +++ b/packages/DynamicSystemInstallationService/res/values-eu/strings.xml @@ -5,7 +5,7 @@ "Prest dago sistema dinamikoa. Erabiltzen hasteko, berrabiarazi gailua." "Instalatzen" "Ezin izan da instalatu" - "Ezin izan da balidatu irudia. Utzi bertan behera instalazioa." + "Ezin izan da baliozkotu irudia. Utzi bertan behera instalazioa." "Sistema dinamiko bat abian da. Berrabiarazi Android-en jatorrizko bertsioa erabiltzeko." "Utzi" "Baztertu" From 88854d15efbcce0a686745f7d392c87c41729452 Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Mon, 22 Feb 2021 15:58:57 -0500 Subject: [PATCH 178/288] Add pkg target to snoozing alarm Test: SnoozeHelperTest Bug: 174493336 Change-Id: I6aaf80a11dcae2eca41d4647411126ed41587027 (cherry picked from commit 6b5813b1f10181f3949386201c4a8f5e6ed4d00f) --- .../android/server/notification/SnoozeHelper.java | 2 ++ .../server/notification/SnoozeHelperTest.java | 12 ++++++++++++ 2 files changed, 14 insertions(+) diff --git a/services/core/java/com/android/server/notification/SnoozeHelper.java b/services/core/java/com/android/server/notification/SnoozeHelper.java index 9a9e733cb3900..da472be811568 100644 --- a/services/core/java/com/android/server/notification/SnoozeHelper.java +++ b/services/core/java/com/android/server/notification/SnoozeHelper.java @@ -37,6 +37,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto; import com.android.internal.util.XmlUtils; +import com.android.server.pm.PackageManagerService; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; @@ -463,6 +464,7 @@ public class SnoozeHelper { return PendingIntent.getBroadcast(mContext, REQUEST_CODE_REPOST, new Intent(REPOST_ACTION) + .setPackage(PackageManagerService.PLATFORM_PACKAGE_NAME) .setData(new Uri.Builder().scheme(REPOST_SCHEME).appendPath(key).build()) .addFlags(Intent.FLAG_RECEIVER_FOREGROUND) .putExtra(EXTRA_KEY, key) diff --git a/services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java index 3deeea2d45772..c2ead5f15ceb1 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java @@ -49,6 +49,7 @@ import androidx.test.runner.AndroidJUnit4; import com.android.internal.util.FastXmlSerializer; import com.android.server.UiServiceTestCase; +import com.android.server.pm.PackageManagerService; import org.junit.Before; import org.junit.Test; @@ -256,6 +257,17 @@ public class SnoozeHelperTest extends UiServiceTestCase { UserHandle.USER_SYSTEM, r.getSbn().getPackageName(), r.getKey())); } + @Test + public void testSnoozeSentToAndroid() throws Exception { + NotificationRecord r = getNotificationRecord("pkg", 1, "one", UserHandle.SYSTEM); + mSnoozeHelper.snooze(r, 1000); + ArgumentCaptor captor = ArgumentCaptor.forClass(PendingIntent.class); + verify(mAm, times(1)).setExactAndAllowWhileIdle( + anyInt(), anyLong(), captor.capture()); + assertEquals(PackageManagerService.PLATFORM_PACKAGE_NAME, + captor.getValue().getIntent().getPackage()); + } + @Test public void testSnooze() throws Exception { NotificationRecord r = getNotificationRecord("pkg", 1, "one", UserHandle.SYSTEM); From c73916229dda8ebef766cd40e04bbc63059ee3e5 Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Mon, 22 Feb 2021 15:58:57 -0500 Subject: [PATCH 179/288] Add pkg target to snoozing alarm Test: SnoozeHelperTest Bug: 174493336 Change-Id: I6aaf80a11dcae2eca41d4647411126ed41587027 (cherry picked from commit 6b5813b1f10181f3949386201c4a8f5e6ed4d00f) --- .../android/server/notification/SnoozeHelper.java | 2 ++ .../server/notification/SnoozeHelperTest.java | 12 ++++++++++++ 2 files changed, 14 insertions(+) diff --git a/services/core/java/com/android/server/notification/SnoozeHelper.java b/services/core/java/com/android/server/notification/SnoozeHelper.java index 9a9e733cb3900..da472be811568 100644 --- a/services/core/java/com/android/server/notification/SnoozeHelper.java +++ b/services/core/java/com/android/server/notification/SnoozeHelper.java @@ -37,6 +37,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto; import com.android.internal.util.XmlUtils; +import com.android.server.pm.PackageManagerService; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; @@ -463,6 +464,7 @@ public class SnoozeHelper { return PendingIntent.getBroadcast(mContext, REQUEST_CODE_REPOST, new Intent(REPOST_ACTION) + .setPackage(PackageManagerService.PLATFORM_PACKAGE_NAME) .setData(new Uri.Builder().scheme(REPOST_SCHEME).appendPath(key).build()) .addFlags(Intent.FLAG_RECEIVER_FOREGROUND) .putExtra(EXTRA_KEY, key) diff --git a/services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java index 3deeea2d45772..c2ead5f15ceb1 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java @@ -49,6 +49,7 @@ import androidx.test.runner.AndroidJUnit4; import com.android.internal.util.FastXmlSerializer; import com.android.server.UiServiceTestCase; +import com.android.server.pm.PackageManagerService; import org.junit.Before; import org.junit.Test; @@ -256,6 +257,17 @@ public class SnoozeHelperTest extends UiServiceTestCase { UserHandle.USER_SYSTEM, r.getSbn().getPackageName(), r.getKey())); } + @Test + public void testSnoozeSentToAndroid() throws Exception { + NotificationRecord r = getNotificationRecord("pkg", 1, "one", UserHandle.SYSTEM); + mSnoozeHelper.snooze(r, 1000); + ArgumentCaptor captor = ArgumentCaptor.forClass(PendingIntent.class); + verify(mAm, times(1)).setExactAndAllowWhileIdle( + anyInt(), anyLong(), captor.capture()); + assertEquals(PackageManagerService.PLATFORM_PACKAGE_NAME, + captor.getValue().getIntent().getPackage()); + } + @Test public void testSnooze() throws Exception { NotificationRecord r = getNotificationRecord("pkg", 1, "one", UserHandle.SYSTEM); From 9f67940c41eac13a1d6db17d4a6a8637182e7e74 Mon Sep 17 00:00:00 2001 From: Pavel Grafov Date: Tue, 23 Feb 2021 15:37:07 +0000 Subject: [PATCH 180/288] Make two broadcasts protected ACTION_PROFILE_OFF_DEADLINE and ACTION_TURN_PROFILE_ON_NOTIFICATION should not be sent by apps. Bug: 180477798 Bug: 170121238 Test: n/a Change-Id: I8bcbb32be215bd7be3305d0dd77a716799d771bd --- core/res/AndroidManifest.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 5e4289087f799..0499598239424 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -488,6 +488,8 @@ + + From 5630668181b12b2fef70301065a597f028a2518a Mon Sep 17 00:00:00 2001 From: Abhijeet Kaur Date: Fri, 19 Feb 2021 16:43:59 +0000 Subject: [PATCH 181/288] Disable resetting WRITE_MEDIA_IMAGES and WRITE_MEDIA_VIDEO appops App holding System Gallery role is allowed WRITE_MEDIA_* appops by virtue of the role. This allows the System Gallery app write-access for images and videos. When app preferences are reset AppOpsService toggles the appops for all apps. Only the appops mentioned in sOpDisableReset are not toggled. Disable WRITE_MEDIA_* appops to reset, as the system gallery app loses write access on images/videos. Bug: 179133883 Test: Manual Change-Id: I168221c641566a9f691ed7956c038206b114d802 Merged-In: I168221c641566a9f691ed7956c038206b114d802 (cherry picked from commit de862be6a88ff74c0378f3f506919ec2880bf6ba) --- core/java/android/app/AppOpsManager.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index 7bfc4603f060b..6baabb69e0287 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -2436,9 +2436,9 @@ public class AppOpsManager { false, // READ_MEDIA_AUDIO false, // WRITE_MEDIA_AUDIO false, // READ_MEDIA_VIDEO - false, // WRITE_MEDIA_VIDEO + true, // WRITE_MEDIA_VIDEO false, // READ_MEDIA_IMAGES - false, // WRITE_MEDIA_IMAGES + true, // WRITE_MEDIA_IMAGES true, // LEGACY_STORAGE false, // ACCESS_ACCESSIBILITY false, // READ_DEVICE_IDENTIFIERS From 21a158e0403450b247e6c38602c10d13f4f4585c Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 23 Feb 2021 21:52:41 +0000 Subject: [PATCH 182/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ia7a8e0e915480cfba32b9c3b75bb6767c9d28866 --- packages/PackageInstaller/res/values-eu/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/PackageInstaller/res/values-eu/strings.xml b/packages/PackageInstaller/res/values-eu/strings.xml index d411831eef3f9..65e75cdba4056 100644 --- a/packages/PackageInstaller/res/values-eu/strings.xml +++ b/packages/PackageInstaller/res/values-eu/strings.xml @@ -83,9 +83,9 @@ "Segurtasuna bermatzeko, ezin dira instalatu iturburu honetako aplikazio ezezagunak tableta honetan." "Segurtasuna bermatzeko, ezin dira instalatu iturburu honetako aplikazio ezezagunak telebista honetan." "Segurtasuna bermatzeko, ezin dira instalatu iturburu honetako aplikazio ezezagunak telefono honetan." - "Telefonoak eta datu pertsonalek aplikazio ezezagunen erasoak jaso ditzakete. Aplikazio hau instalatzen baduzu, onartuko duzu zeu zarela hura erabiltzeagatik telefonoak jasan ditzakeen kalteen edo datu-galeren erantzulea." - "Tabletak eta datu pertsonalek aplikazio ezezagunen erasoak jaso ditzakete. Aplikazio hau instalatzen baduzu, onartuko duzu zeu zarela hura erabiltzeagatik tabletak jasan ditzakeen kalteen edo datu-galeren erantzulea." - "Telebistak eta datu pertsonalek aplikazio ezezagunen erasoak jaso ditzakete. Aplikazio hau instalatzen baduzu, onartuko duzu zeu zarela hura erabiltzeagatik telebistak jasan ditzakeen kalteen edo datu-galeren erantzulea." + "Telefonoak eta datu pertsonalek aplikazio ezezagunen erasoak jaso ditzakete. Aplikazio hau instalatzen baduzu, onartu egingo duzu zeu zarela hura erabiltzeagatik telefonoak jasan ditzakeen kalteen edo datu-galeren erantzulea." + "Tabletak eta datu pertsonalek aplikazio ezezagunen erasoak jaso ditzakete. Aplikazio hau instalatzen baduzu, onartu egingo duzu zeu zarela hura erabiltzeagatik tabletak jasan ditzakeen kalteen edo datu-galeren erantzulea." + "Telebistak eta datu pertsonalek aplikazio ezezagunen erasoak jaso ditzakete. Aplikazio hau instalatzen baduzu, onartu egingo duzu zeu zarela hura erabiltzeagatik telebistak jasan ditzakeen kalteen edo datu-galeren erantzulea." "Egin aurrera" "Ezarpenak" "Wear aplikazioak instalatzea/desinstalatzea" From fa32d0365fae914bae1bd213ad3d4ea0e217bbef Mon Sep 17 00:00:00 2001 From: Shuo Qian Date: Mon, 22 Feb 2021 18:39:33 -0800 Subject: [PATCH 183/288] Add Emergency callback mode shell command Test: manual Bug: 178821491 Change-Id: If6ca01283a02a4c1f762eaa0f4cd798d48781761 Merged-In: If6ca01283a02a4c1f762eaa0f4cd798d48781761 --- .../java/com/android/internal/telephony/ITelephony.aidl | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl index b70937cee8a1a..363d6f57b603f 100644 --- a/telephony/java/com/android/internal/telephony/ITelephony.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl @@ -2138,6 +2138,11 @@ interface ITelephony { */ int setImsProvisioningString(int subId, int key, String value); + /** + * Start emergency callback mode for testing. + */ + void startEmergencyCallbackMode(); + /** * Update Emergency Number List for Test Mode. */ From a335516ab23c7273f47ae32c7193877cf55939ef Mon Sep 17 00:00:00 2001 From: Gavin Corkery Date: Tue, 20 Oct 2020 10:00:11 +0100 Subject: [PATCH 184/288] Add immutability flag to PendingIntents Explicitly set FLAG_IMMUTABLE for all PendingIntents in BugreportProgressService. Test: Builds Bug: 170165227 Bug: 171830604 Bug: 178803845 Change-Id: Iae1489b9c8fa323448e60615e99ad96aee1cd1d7 Merged-in: Iae1489b9c8fa323448e60615e99ad96aee1cd1d7 (cherry picked from commit 2d38f6e4f04953a07f80984b50d3efefa64cb374) --- .../Shell/src/com/android/shell/BugreportProgressService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/Shell/src/com/android/shell/BugreportProgressService.java b/packages/Shell/src/com/android/shell/BugreportProgressService.java index f6c2ee264cb56..6b4c239f2b5a6 100644 --- a/packages/Shell/src/com/android/shell/BugreportProgressService.java +++ b/packages/Shell/src/com/android/shell/BugreportProgressService.java @@ -784,7 +784,7 @@ public class BugreportProgressService extends Service { intent.setClass(context, BugreportProgressService.class); intent.putExtra(EXTRA_ID, info.id); return PendingIntent.getService(context, info.id, intent, - PendingIntent.FLAG_UPDATE_CURRENT); + PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); } /** @@ -1244,7 +1244,7 @@ public class BugreportProgressService extends Service { .setTicker(title) .setContentText(content) .setContentIntent(PendingIntent.getService(mContext, info.id, shareIntent, - PendingIntent.FLAG_UPDATE_CURRENT)) + PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE)) .setDeleteIntent(newCancelIntent(mContext, info)); if (!TextUtils.isEmpty(info.getName())) { From 281d15024512f35659bd8423be0cb38de4bf233d Mon Sep 17 00:00:00 2001 From: Gavin Corkery Date: Tue, 20 Oct 2020 10:00:11 +0100 Subject: [PATCH 185/288] Add immutability flag to PendingIntents Explicitly set FLAG_IMMUTABLE for all PendingIntents in BugreportProgressService. Test: Builds Bug: 170165227 Bug: 171830604 Bug: 178803845 Change-Id: Iae1489b9c8fa323448e60615e99ad96aee1cd1d7 Merged-In: Iae1489b9c8fa323448e60615e99ad96aee1cd1d7 (cherry picked from commit 2d38f6e4f04953a07f80984b50d3efefa64cb374) --- .../Shell/src/com/android/shell/BugreportProgressService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/Shell/src/com/android/shell/BugreportProgressService.java b/packages/Shell/src/com/android/shell/BugreportProgressService.java index 7b4cf0f748d32..88112e3f5cc8e 100644 --- a/packages/Shell/src/com/android/shell/BugreportProgressService.java +++ b/packages/Shell/src/com/android/shell/BugreportProgressService.java @@ -803,7 +803,7 @@ public class BugreportProgressService extends Service { intent.setClass(context, BugreportProgressService.class); intent.putExtra(EXTRA_ID, info.id); return PendingIntent.getService(context, info.id, intent, - PendingIntent.FLAG_UPDATE_CURRENT); + PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); } /** @@ -1263,7 +1263,7 @@ public class BugreportProgressService extends Service { .setTicker(title) .setContentText(content) .setContentIntent(PendingIntent.getService(mContext, info.id, shareIntent, - PendingIntent.FLAG_UPDATE_CURRENT)) + PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE)) .setOnlyAlertOnce(false) .setDeleteIntent(newCancelIntent(mContext, info)); From b201f9b1e6221589e84b5b26b5620bc7607c01ed Mon Sep 17 00:00:00 2001 From: Shuo Qian Date: Mon, 22 Feb 2021 18:39:33 -0800 Subject: [PATCH 186/288] Add Emergency callback mode shell command Test: manual Bug: 178821491 Change-Id: If6ca01283a02a4c1f762eaa0f4cd798d48781761 Merged-In: If6ca01283a02a4c1f762eaa0f4cd798d48781761 --- .../java/com/android/internal/telephony/ITelephony.aidl | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl index e270b8dc3fe4a..8223c8b3b3790 100644 --- a/telephony/java/com/android/internal/telephony/ITelephony.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl @@ -2086,6 +2086,11 @@ interface ITelephony { */ int setImsProvisioningString(int subId, int key, String value); + /** + * Start emergency callback mode for testing. + */ + void startEmergencyCallbackMode(); + /** * Update Emergency Number List for Test Mode. */ From 598c530b94cd0b8aa538c2ac323a0062fcec9e6e Mon Sep 17 00:00:00 2001 From: Garfield Tan Date: Thu, 23 Jul 2020 10:56:06 -0700 Subject: [PATCH 187/288] Stop keeping freeform activities visible. This logic was introduced when there could be multiple tasks in the freeform stack so it was necessary to keep freeform tasks visible even when they are not in the front. However right now stack and task are the same so activities became the children of the original stack, and we don't have the need to keep activities behind the top activity always visible. Bug: 161366153 Bug: 177403437 Bug: 179247198 Test: atest ActivityVisibilityTests#testConvert* on freeform first devices. Change-Id: Ibeeba5ca8b6b60583eec9cbee9b7209ee17b1037 Merged-In: Ibeeba5ca8b6b60583eec9cbee9b7209ee17b1037 (cherry picked from commit 3f74b33211fd428c838deed0168719b05c683410) --- .../android/server/wm/EnsureActivitiesVisibleHelper.java | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/services/core/java/com/android/server/wm/EnsureActivitiesVisibleHelper.java b/services/core/java/com/android/server/wm/EnsureActivitiesVisibleHelper.java index c4e03f5c65f51..aa76a07bc9c79 100644 --- a/services/core/java/com/android/server/wm/EnsureActivitiesVisibleHelper.java +++ b/services/core/java/com/android/server/wm/EnsureActivitiesVisibleHelper.java @@ -16,8 +16,6 @@ package com.android.server.wm; -import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; - import static com.android.server.wm.ActivityStack.TAG_VISIBILITY; import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_VISIBILITY; @@ -174,12 +172,7 @@ class EnsureActivitiesVisibleHelper { } final int windowingMode = mContiner.getWindowingMode(); - if (windowingMode == WINDOWING_MODE_FREEFORM) { - // The visibility of tasks and the activities they contain in freeform stack are - // determined individually unlike other stacks where the visibility or fullscreen - // status of an activity in a previous task affects other. - mBehindFullscreenActivity = !mContainerShouldBeVisible; - } else if (!mBehindFullscreenActivity && mContiner.isActivityTypeHome() + if (!mBehindFullscreenActivity && mContiner.isActivityTypeHome() && r.isRootOfTask()) { if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "Home task: at " + mContiner + " stackShouldBeVisible=" + mContainerShouldBeVisible From 6d5527d5403c508fb05e63c5fc3e51edddffc999 Mon Sep 17 00:00:00 2001 From: Zim Date: Tue, 22 Sep 2020 16:00:33 +0100 Subject: [PATCH 188/288] Removed unused mount mode constants Since FUSE in R, there are only 4 mount modes that are used from IVold.aidl: REMOUNT_MODE_NONE REMOUNT_MODE_DEFAULT REMOUNT_MODE_INSTALLER REMOUNT_MODE_PASS_THROUGH REMOUNT_MODE_ANDROID_WRITABLE Bug: 148454884 Test: Manual Change-Id: I62b66083f2099b429474872b6f9c7cffb9fb906d Merged-In: I62b66083f2099b429474872b6f9c7cffb9fb906d (cherry picked from commit c8fe3d2acdc1ddcd087b87183e74efa2fd2a6f65) --- core/java/android/os/ZygoteProcess.java | 8 --- core/java/com/android/internal/os/Zygote.java | 12 ----- .../android/internal/os/ZygoteArguments.java | 10 +--- core/jni/com_android_internal_os_Zygote.cpp | 50 +++++-------------- .../android/server/StorageManagerService.java | 26 +--------- .../server/am/ActivityManagerService.java | 2 +- .../com/android/server/am/ProcessList.java | 13 ++--- .../android/server/appop/AppOpsService.java | 15 +----- .../server/pm/PackageManagerService.java | 30 ++++------- 9 files changed, 32 insertions(+), 134 deletions(-) diff --git a/core/java/android/os/ZygoteProcess.java b/core/java/android/os/ZygoteProcess.java index c9da6418471d8..9ffc5aa0022c3 100644 --- a/core/java/android/os/ZygoteProcess.java +++ b/core/java/android/os/ZygoteProcess.java @@ -657,16 +657,8 @@ public class ZygoteProcess { argsForZygote.add("--runtime-flags=" + runtimeFlags); if (mountExternal == Zygote.MOUNT_EXTERNAL_DEFAULT) { argsForZygote.add("--mount-external-default"); - } else if (mountExternal == Zygote.MOUNT_EXTERNAL_READ) { - argsForZygote.add("--mount-external-read"); - } else if (mountExternal == Zygote.MOUNT_EXTERNAL_WRITE) { - argsForZygote.add("--mount-external-write"); - } else if (mountExternal == Zygote.MOUNT_EXTERNAL_FULL) { - argsForZygote.add("--mount-external-full"); } else if (mountExternal == Zygote.MOUNT_EXTERNAL_INSTALLER) { argsForZygote.add("--mount-external-installer"); - } else if (mountExternal == Zygote.MOUNT_EXTERNAL_LEGACY) { - argsForZygote.add("--mount-external-legacy"); } else if (mountExternal == Zygote.MOUNT_EXTERNAL_PASS_THROUGH) { argsForZygote.add("--mount-external-pass-through"); } else if (mountExternal == Zygote.MOUNT_EXTERNAL_ANDROID_WRITABLE) { diff --git a/core/java/com/android/internal/os/Zygote.java b/core/java/com/android/internal/os/Zygote.java index 9abc55b983a06..a566836f42d16 100644 --- a/core/java/com/android/internal/os/Zygote.java +++ b/core/java/com/android/internal/os/Zygote.java @@ -172,23 +172,11 @@ public final class Zygote { public static final int MOUNT_EXTERNAL_NONE = IVold.REMOUNT_MODE_NONE; /** Default external storage should be mounted. */ public static final int MOUNT_EXTERNAL_DEFAULT = IVold.REMOUNT_MODE_DEFAULT; - /** Read-only external storage should be mounted. */ - public static final int MOUNT_EXTERNAL_READ = IVold.REMOUNT_MODE_READ; - /** Read-write external storage should be mounted. */ - public static final int MOUNT_EXTERNAL_WRITE = IVold.REMOUNT_MODE_WRITE; - /** - * Mount mode for apps that are already installed on the device before the isolated_storage - * feature is enabled. - */ - public static final int MOUNT_EXTERNAL_LEGACY = IVold.REMOUNT_MODE_LEGACY; /** * Mount mode for package installers which should give them access to * all obb dirs in addition to their package sandboxes */ public static final int MOUNT_EXTERNAL_INSTALLER = IVold.REMOUNT_MODE_INSTALLER; - /** Read-write external storage should be mounted instead of package sandbox */ - public static final int MOUNT_EXTERNAL_FULL = IVold.REMOUNT_MODE_FULL; - /** The lower file system should be bind mounted directly on external storage */ public static final int MOUNT_EXTERNAL_PASS_THROUGH = IVold.REMOUNT_MODE_PASS_THROUGH; diff --git a/core/java/com/android/internal/os/ZygoteArguments.java b/core/java/com/android/internal/os/ZygoteArguments.java index 5a1c1710d32b7..65b454d47db27 100644 --- a/core/java/com/android/internal/os/ZygoteArguments.java +++ b/core/java/com/android/internal/os/ZygoteArguments.java @@ -395,16 +395,8 @@ class ZygoteArguments { mNiceName = getAssignmentValue(arg); } else if (arg.equals("--mount-external-default")) { mMountExternal = Zygote.MOUNT_EXTERNAL_DEFAULT; - } else if (arg.equals("--mount-external-read")) { - mMountExternal = Zygote.MOUNT_EXTERNAL_READ; - } else if (arg.equals("--mount-external-write")) { - mMountExternal = Zygote.MOUNT_EXTERNAL_WRITE; - } else if (arg.equals("--mount-external-full")) { - mMountExternal = Zygote.MOUNT_EXTERNAL_FULL; - } else if (arg.equals("--mount-external-installer")) { + } else if (arg.equals("--mount-external-installer")) { mMountExternal = Zygote.MOUNT_EXTERNAL_INSTALLER; - } else if (arg.equals("--mount-external-legacy")) { - mMountExternal = Zygote.MOUNT_EXTERNAL_LEGACY; } else if (arg.equals("--mount-external-pass-through")) { mMountExternal = Zygote.MOUNT_EXTERNAL_PASS_THROUGH; } else if (arg.equals("--mount-external-android-writable")) { diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp index 4cef2b099589d..bdf8dfe5dc0ff 100644 --- a/core/jni/com_android_internal_os_Zygote.cpp +++ b/core/jni/com_android_internal_os_Zygote.cpp @@ -115,7 +115,6 @@ typedef const std::function& fail_fn_t; static pid_t gSystemServerPid = 0; static constexpr const char* kVoldAppDataIsolation = "persist.sys.vold_app_data_isolation_enabled"; -static constexpr const char* kPropFuse = "persist.sys.fuse"; static const char kZygoteClassName[] = "com/android/internal/os/Zygote"; static jclass gZygoteClass; static jmethodID gCallPostForkSystemServerHooks; @@ -305,31 +304,15 @@ static std::array gUsapTable; static FileDescriptorTable* gOpenFdTable = nullptr; // Must match values in com.android.internal.os.Zygote. -// The order of entries here must be kept in sync with ExternalStorageViews array values. +// Note that there are gaps in the constants: +// This is to further keep the values consistent with IVold.aidl enum MountExternalKind { - MOUNT_EXTERNAL_NONE = 0, - MOUNT_EXTERNAL_DEFAULT = 1, - MOUNT_EXTERNAL_READ = 2, - MOUNT_EXTERNAL_WRITE = 3, - MOUNT_EXTERNAL_LEGACY = 4, - MOUNT_EXTERNAL_INSTALLER = 5, - MOUNT_EXTERNAL_FULL = 6, - MOUNT_EXTERNAL_PASS_THROUGH = 7, - MOUNT_EXTERNAL_ANDROID_WRITABLE = 8, - MOUNT_EXTERNAL_COUNT = 9 -}; - -// The order of entries here must be kept in sync with MountExternalKind enum values. -static const std::array ExternalStorageViews = { - "", // MOUNT_EXTERNAL_NONE - "/mnt/runtime/default", // MOUNT_EXTERNAL_DEFAULT - "/mnt/runtime/read", // MOUNT_EXTERNAL_READ - "/mnt/runtime/write", // MOUNT_EXTERNAL_WRITE - "/mnt/runtime/write", // MOUNT_EXTERNAL_LEGACY - "/mnt/runtime/write", // MOUNT_EXTERNAL_INSTALLER - "/mnt/runtime/full", // MOUNT_EXTERNAL_FULL - "/mnt/runtime/full", // MOUNT_EXTERNAL_PASS_THROUGH (only used w/ FUSE) - "/mnt/runtime/full", // MOUNT_EXTERNAL_ANDROID_WRITABLE (only used w/ FUSE) + MOUNT_EXTERNAL_NONE = 0, + MOUNT_EXTERNAL_DEFAULT = 1, + MOUNT_EXTERNAL_INSTALLER = 5, + MOUNT_EXTERNAL_PASS_THROUGH = 7, + MOUNT_EXTERNAL_ANDROID_WRITABLE = 8, + MOUNT_EXTERNAL_COUNT = 9 }; // Must match values in com.android.internal.os.Zygote. @@ -831,29 +814,20 @@ static void MountEmulatedStorage(uid_t uid, jint mount_mode, PrepareDir(user_source, 0710, user_id ? AID_ROOT : AID_SHELL, multiuser_get_uid(user_id, AID_EVERYBODY), fail_fn); - bool isFuse = GetBoolProperty(kPropFuse, false); bool isAppDataIsolationEnabled = GetBoolProperty(kVoldAppDataIsolation, false); - if (isFuse) { - if (mount_mode == MOUNT_EXTERNAL_PASS_THROUGH) { + if (mount_mode == MOUNT_EXTERNAL_PASS_THROUGH) { const std::string pass_through_source = StringPrintf("/mnt/pass_through/%d", user_id); PrepareDir(pass_through_source, 0710, AID_ROOT, AID_MEDIA_RW, fail_fn); BindMount(pass_through_source, "/storage", fail_fn); - } else if (mount_mode == MOUNT_EXTERNAL_INSTALLER) { + } else if (mount_mode == MOUNT_EXTERNAL_INSTALLER) { const std::string installer_source = StringPrintf("/mnt/installer/%d", user_id); BindMount(installer_source, "/storage", fail_fn); - } else if (isAppDataIsolationEnabled && mount_mode == MOUNT_EXTERNAL_ANDROID_WRITABLE) { + } else if (isAppDataIsolationEnabled && mount_mode == MOUNT_EXTERNAL_ANDROID_WRITABLE) { const std::string writable_source = StringPrintf("/mnt/androidwritable/%d", user_id); BindMount(writable_source, "/storage", fail_fn); - } else { - BindMount(user_source, "/storage", fail_fn); - } } else { - const std::string& storage_source = ExternalStorageViews[mount_mode]; - BindMount(storage_source, "/storage", fail_fn); - - // Mount user-specific symlink helper into place - BindMount(user_source, "/storage/self", fail_fn); + BindMount(user_source, "/storage", fail_fn); } } diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java index 13d26920c9173..cca95caca73b5 100644 --- a/services/core/java/com/android/server/StorageManagerService.java +++ b/services/core/java/com/android/server/StorageManagerService.java @@ -18,9 +18,7 @@ package com.android.server; import static android.Manifest.permission.ACCESS_MTP; import static android.Manifest.permission.INSTALL_PACKAGES; -import static android.Manifest.permission.READ_EXTERNAL_STORAGE; import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE; -import static android.Manifest.permission.WRITE_MEDIA_STORAGE; import static android.app.ActivityManager.PROCESS_STATE_NONEXISTENT; import static android.app.AppOpsManager.MODE_ALLOWED; import static android.app.AppOpsManager.OP_LEGACY_STORAGE; @@ -4337,19 +4335,9 @@ class StorageManagerService extends IStorageManager.Stub } // Determine if caller is holding runtime permission - final boolean hasRead = StorageManager.checkPermissionAndCheckOp(mContext, false, 0, - uid, packageName, READ_EXTERNAL_STORAGE, OP_READ_EXTERNAL_STORAGE); final boolean hasWrite = StorageManager.checkPermissionAndCheckOp(mContext, false, 0, uid, packageName, WRITE_EXTERNAL_STORAGE, OP_WRITE_EXTERNAL_STORAGE); - // We're only willing to give out broad access if they also hold - // runtime permission; this is a firm CDD requirement - final boolean hasFull = mIPackageManager.checkUidPermission(WRITE_MEDIA_STORAGE, - uid) == PERMISSION_GRANTED; - if (hasFull && hasWrite) { - return Zygote.MOUNT_EXTERNAL_FULL; - } - // We're only willing to give out installer access if they also hold // runtime permission; this is a firm CDD requirement final boolean hasInstall = mIPackageManager.checkUidPermission(INSTALL_PACKAGES, @@ -4369,19 +4357,7 @@ class StorageManagerService extends IStorageManager.Stub if ((hasInstall || hasInstallOp) && hasWrite) { return Zygote.MOUNT_EXTERNAL_INSTALLER; } - - // Otherwise we're willing to give out sandboxed or non-sandboxed if - // they hold the runtime permission - boolean hasLegacy = mIAppOpsService.checkOperation(OP_LEGACY_STORAGE, - uid, packageName) == MODE_ALLOWED; - - if (hasLegacy && hasWrite) { - return Zygote.MOUNT_EXTERNAL_WRITE; - } else if (hasLegacy && hasRead) { - return Zygote.MOUNT_EXTERNAL_READ; - } else { - return Zygote.MOUNT_EXTERNAL_DEFAULT; - } + return Zygote.MOUNT_EXTERNAL_DEFAULT; } catch (RemoteException e) { // Should not happen } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 6fb30f9aa40bc..9d4b35d77a39c 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -19821,7 +19821,7 @@ public class ActivityManagerService extends IActivityManager.Stub @Override public int getStorageMountMode(int pid, int uid) { if (uid == SHELL_UID || uid == ROOT_UID) { - return Zygote.MOUNT_EXTERNAL_FULL; + return Zygote.MOUNT_EXTERNAL_DEFAULT; } synchronized (mPidsSelfLocked) { final ProcessRecord pr = mPidsSelfLocked.get(pid); diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java index 3fda6d279fef7..1c96ec0ee9e79 100644 --- a/services/core/java/com/android/server/am/ProcessList.java +++ b/services/core/java/com/android/server/am/ProcessList.java @@ -92,7 +92,6 @@ import android.os.SystemClock; import android.os.SystemProperties; import android.os.Trace; import android.os.UserHandle; -import android.os.storage.StorageManager; import android.os.storage.StorageManagerInternal; import android.system.Os; import android.text.TextUtils; @@ -1812,14 +1811,10 @@ public final class ProcessList { final IPackageManager pm = AppGlobals.getPackageManager(); permGids = pm.getPackageGids(app.info.packageName, MATCH_DIRECT_BOOT_AUTO, app.userId); - if (StorageManager.hasIsolatedStorage() && mountExtStorageFull) { - mountExternal = Zygote.MOUNT_EXTERNAL_FULL; - } else { - StorageManagerInternal storageManagerInternal = LocalServices.getService( - StorageManagerInternal.class); - mountExternal = storageManagerInternal.getExternalStorageMountMode(uid, - app.info.packageName); - } + StorageManagerInternal storageManagerInternal = LocalServices.getService( + StorageManagerInternal.class); + mountExternal = storageManagerInternal.getExternalStorageMountMode(uid, + app.info.packageName); } catch (RemoteException e) { throw e.rethrowAsRuntimeException(); } diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java index a5d2ca3ad4ff0..db8dc715214ad 100644 --- a/services/core/java/com/android/server/appop/AppOpsService.java +++ b/services/core/java/com/android/server/appop/AppOpsService.java @@ -1733,24 +1733,13 @@ public class AppOpsService extends IAppOpsService.Stub { if (Process.isIsolated(uid)) { return Zygote.MOUNT_EXTERNAL_NONE; } - if (noteOperation(AppOpsManager.OP_READ_EXTERNAL_STORAGE, uid, - packageName, null, true, "External storage policy", true) - != AppOpsManager.MODE_ALLOWED) { - return Zygote.MOUNT_EXTERNAL_NONE; - } - if (noteOperation(AppOpsManager.OP_WRITE_EXTERNAL_STORAGE, uid, - packageName, null, true, "External storage policy", true) - != AppOpsManager.MODE_ALLOWED) { - return Zygote.MOUNT_EXTERNAL_READ; - } - return Zygote.MOUNT_EXTERNAL_WRITE; + return Zygote.MOUNT_EXTERNAL_DEFAULT; } @Override public boolean hasExternalStorage(int uid, String packageName) { final int mountMode = getMountMode(uid, packageName); - return mountMode == Zygote.MOUNT_EXTERNAL_READ - || mountMode == Zygote.MOUNT_EXTERNAL_WRITE; + return mountMode != Zygote.MOUNT_EXTERNAL_NONE; } }); } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 917550baca00a..e47a367edd4c9 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -24,7 +24,6 @@ import static android.Manifest.permission.QUERY_ALL_PACKAGES; import static android.Manifest.permission.READ_EXTERNAL_STORAGE; import static android.Manifest.permission.REQUEST_DELETE_PACKAGES; import static android.Manifest.permission.SET_HARMFUL_APP_WARNINGS; -import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE; import static android.app.AppOpsManager.MODE_ALLOWED; import static android.app.AppOpsManager.MODE_DEFAULT; import static android.app.AppOpsManager.MODE_IGNORED; @@ -94,7 +93,6 @@ import static android.content.pm.PackageManager.MOVE_FAILED_INTERNAL_ERROR; import static android.content.pm.PackageManager.MOVE_FAILED_LOCKED_USER; import static android.content.pm.PackageManager.MOVE_FAILED_OPERATION_PENDING; import static android.content.pm.PackageManager.MOVE_FAILED_SYSTEM_PACKAGE; -import static android.content.pm.PackageManager.PERMISSION_DENIED; import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static android.content.pm.PackageManager.RESTRICTION_NONE; import static android.content.pm.PackageManager.UNINSTALL_REASON_UNKNOWN; @@ -21639,24 +21637,18 @@ public class PackageManagerService extends IPackageManager.Stub mInjector.getStorageManagerInternal().addExternalStoragePolicy( new StorageManagerInternal.ExternalStorageMountPolicy() { - @Override - public int getMountMode(int uid, String packageName) { - if (Process.isIsolated(uid)) { - return Zygote.MOUNT_EXTERNAL_NONE; - } - if (checkUidPermission(READ_EXTERNAL_STORAGE, uid) == PERMISSION_DENIED) { - return Zygote.MOUNT_EXTERNAL_DEFAULT; - } - if (checkUidPermission(WRITE_EXTERNAL_STORAGE, uid) == PERMISSION_DENIED) { - return Zygote.MOUNT_EXTERNAL_READ; - } - return Zygote.MOUNT_EXTERNAL_WRITE; - } + @Override + public int getMountMode(int uid, String packageName) { + if (Process.isIsolated(uid)) { + return Zygote.MOUNT_EXTERNAL_NONE; + } + return Zygote.MOUNT_EXTERNAL_DEFAULT; + } - @Override - public boolean hasExternalStorage(int uid, String packageName) { - return true; - } + @Override + public boolean hasExternalStorage(int uid, String packageName) { + return true; + } }); // Now that we're mostly running, clean up stale users and apps From 528f19fa8bb18e8fc1bd60400be486f9243571af Mon Sep 17 00:00:00 2001 From: Danny Epstein Date: Tue, 16 Feb 2021 16:57:50 -0800 Subject: [PATCH 189/288] Configure privapp perms for car activity resolver (Cherry picked from change b04a4567a141d6f82fe1df6d0fb8baf4369eb8a6.) Test: Use KitchenSink's activity resolver fragment with touch and rotary. Bug: 173543124 Change-Id: If7e5d48ce5d897a2cd90a02eaeda59e71d164520 Merged-In: If7e5d48ce5d897a2cd90a02eaeda59e71d164520 --- data/etc/car/Android.bp | 7 +++++++ .../car/com.android.car.activityresolver.xml | 21 +++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 data/etc/car/com.android.car.activityresolver.xml diff --git a/data/etc/car/Android.bp b/data/etc/car/Android.bp index a2e7bf6e749fc..c5a460b784749 100644 --- a/data/etc/car/Android.bp +++ b/data/etc/car/Android.bp @@ -156,3 +156,10 @@ prebuilt_etc { src: "com.android.car.shell.xml", filename_from_src: true, } + +prebuilt_etc { + name: "allowed_privapp_com.android.car.activityresolver", + sub_dir: "permissions", + src: "com.android.car.activityresolver.xml", + filename_from_src: true, +} diff --git a/data/etc/car/com.android.car.activityresolver.xml b/data/etc/car/com.android.car.activityresolver.xml new file mode 100644 index 0000000000000..63f83b4afb62b --- /dev/null +++ b/data/etc/car/com.android.car.activityresolver.xml @@ -0,0 +1,21 @@ + + + + + + + From 71ef23213fea8a0afd2dfa2c6f968a5d5b511be7 Mon Sep 17 00:00:00 2001 From: Collin Fijalkovich Date: Thu, 25 Feb 2021 21:41:44 +0000 Subject: [PATCH 190/288] Avoid TransferPipe for local dumpCacheInfo calls Make a process-local call to PropertyInvalidatedCache instead of dumping cache state through a TransferPipe to avoid blocking when the pipe buffer fills. Bug: 180051995 Test: Ran dumpsys cacheinfo and validated output Merged-In: I1e4ab8e1d09b98b379d81079fd26ff2129b5b65a Change-Id: Ib0df61ec1a30c016d1534ba483ebba919e279ed1 --- .../java/com/android/server/am/ActivityManagerService.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 6d58c1e11b672..5134f498928b4 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -183,6 +183,7 @@ import android.app.NotificationManager; import android.app.PendingIntent; import android.app.ProcessMemoryState; import android.app.ProfilerInfo; +import android.app.PropertyInvalidatedCache; import android.app.WaitResult; import android.app.backup.IBackupManager; import android.app.usage.UsageEvents; @@ -12833,6 +12834,10 @@ public class ActivityManagerService extends IActivityManager.Stub if (r.thread != null) { pw.println("\n\n** Cache info for pid " + r.pid + " [" + r.processName + "] **"); pw.flush(); + if (r.pid == MY_PID) { + PropertyInvalidatedCache.dumpCacheInfo(fd, args); + continue; + } try { TransferPipe tp = new TransferPipe(); try { From a287650f9431724a45c7687cd090021bc8350dea Mon Sep 17 00:00:00 2001 From: Heemin Seog Date: Wed, 24 Feb 2021 10:30:16 -0800 Subject: [PATCH 191/288] DO NOT MERGE Intercept back button on user switcher screen The back button on the user switcher screen should go back to the lockscreen of the current user. Bug: 178505273 Test: manual (press back button from user switcher screen while it has rotary focus) Change-Id: I30b8619a26e8b0c1ca9632b3bb656d187dad91b9 --- .../layout/car_fullscreen_user_switcher.xml | 41 +++++------ .../FullScreenUserSwitcherViewController.java | 16 +++- .../userswitcher/UserSwitcherContainer.java | 73 +++++++++++++++++++ 3 files changed, 105 insertions(+), 25 deletions(-) create mode 100644 packages/CarSystemUI/src/com/android/systemui/car/userswitcher/UserSwitcherContainer.java diff --git a/packages/CarSystemUI/res/layout/car_fullscreen_user_switcher.xml b/packages/CarSystemUI/res/layout/car_fullscreen_user_switcher.xml index 534c51e0febe3..99df6d52de073 100644 --- a/packages/CarSystemUI/res/layout/car_fullscreen_user_switcher.xml +++ b/packages/CarSystemUI/res/layout/car_fullscreen_user_switcher.xml @@ -14,36 +14,29 @@ See the License for the specific language governing permissions and limitations under the License. --> - + android:background="@color/car_user_switcher_background_color" + android:orientation="vertical"> - - - + android:theme="@android:style/Theme"/> - + - - + android:layout_height="wrap_content" + android:layout_gravity="center_vertical" + android:layout_marginTop="@dimen/car_user_switcher_margin_top"/> + - - + diff --git a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullScreenUserSwitcherViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullScreenUserSwitcherViewController.java index aac4cfbf83c41..5fc7299f68c5a 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullScreenUserSwitcherViewController.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullScreenUserSwitcherViewController.java @@ -22,6 +22,7 @@ import android.car.Car; import android.car.user.CarUserManager; import android.content.Context; import android.content.res.Resources; +import android.view.KeyEvent; import android.view.View; import androidx.recyclerview.widget.GridLayoutManager; @@ -67,6 +68,19 @@ public class FullScreenUserSwitcherViewController extends OverlayViewController @Override protected void onFinishInflate() { + // Intercept back button. + UserSwitcherContainer container = getLayout().findViewById(R.id.container); + container.setKeyEventHandler(event -> { + if (event.getKeyCode() != KeyEvent.KEYCODE_BACK) { + return false; + } + + if (event.getAction() == KeyEvent.ACTION_UP && getLayout().isVisibleToUser()) { + getLayout().setVisibility(View.GONE); + } + return true; + }); + // Initialize user grid. mUserGridView = getLayout().findViewById(R.id.user_grid); GridLayoutManager layoutManager = new GridLayoutManager(mContext, @@ -79,7 +93,7 @@ public class FullScreenUserSwitcherViewController extends OverlayViewController @Override protected boolean shouldFocusWindow() { - return false; + return true; } @Override diff --git a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/UserSwitcherContainer.java b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/UserSwitcherContainer.java new file mode 100644 index 0000000000000..5b6271107380e --- /dev/null +++ b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/UserSwitcherContainer.java @@ -0,0 +1,73 @@ +/* + * 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.systemui.car.userswitcher; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.KeyEvent; +import android.widget.LinearLayout; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +/** Container for the user switcher which intercepts the key events. */ +public class UserSwitcherContainer extends LinearLayout { + + private KeyEventHandler mKeyEventHandler; + + public UserSwitcherContainer(@NonNull Context context) { + super(context); + } + + public UserSwitcherContainer(@NonNull Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + public UserSwitcherContainer(@NonNull Context context, @Nullable AttributeSet attrs, + int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + public UserSwitcherContainer(@NonNull Context context, @Nullable AttributeSet attrs, + int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } + + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + if (super.dispatchKeyEvent(event)) { + return true; + } + + if (mKeyEventHandler != null) { + return mKeyEventHandler.dispatchKeyEvent(event); + } + + return false; + } + + /** Sets a {@link KeyEventHandler} to help interact with the notification panel. */ + public void setKeyEventHandler(KeyEventHandler keyEventHandler) { + mKeyEventHandler = keyEventHandler; + } + + /** An interface to help interact with the notification panel. */ + public interface KeyEventHandler { + /** Allows handling of a {@link KeyEvent} if it wasn't already handled by the superclass. */ + boolean dispatchKeyEvent(KeyEvent event); + } +} From e4dc456d4b0fb474ca3821967b0913c820a713f7 Mon Sep 17 00:00:00 2001 From: Joseph Pirozzo Date: Thu, 10 Sep 2020 06:55:30 -0700 Subject: [PATCH 192/288] Configure Bluetooth profiles displayed in settings Two profiles were displayed on automotive targets at the wrong times, MAP was displayed for all devices, PBAP was displayed only when enabled. This updates those two profiles to appear in the profiles only when the service is enabled locally and the remote device supports the other half of the connection. Bug: 173818456 Bug: 109783106 Test: pair with bluetooth devices that support (and don't support) MAP and PBAP, and verify settings slider appears when appropriate specifically when disabled. Change-Id: I62b8778517730076554ba996cee80862ce72539b Merged-In: I62b8778517730076554ba996cee80862ce72539b --- .../settingslib/bluetooth/LocalBluetoothProfileManager.java | 5 +++-- .../com/android/settingslib/bluetooth/MapClientProfile.java | 2 -- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java index 35bbbc0e8b396..34fdc1e455671 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java @@ -543,12 +543,13 @@ public class LocalBluetoothProfileManager { mPbapProfile.setEnabled(device, true); } - if (mMapClientProfile != null) { + if ((mMapClientProfile != null) + && BluetoothUuid.containsAnyUuid(uuids, MapClientProfile.UUIDS)) { profiles.add(mMapClientProfile); removedProfiles.remove(mMapClientProfile); } - if ((mPbapClientProfile != null) && ArrayUtils.contains(localUuids, BluetoothUuid.PBAP_PCE) + if ((mPbapClientProfile != null) && BluetoothUuid.containsAnyUuid(uuids, PbapClientProfile.SRC_UUIDS)) { profiles.add(mPbapClientProfile); removedProfiles.remove(mPbapClientProfile); diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/MapClientProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/MapClientProfile.java index 19cb2f59f321b..4881a86b398af 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/MapClientProfile.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/MapClientProfile.java @@ -47,8 +47,6 @@ public final class MapClientProfile implements LocalBluetoothProfile { private final LocalBluetoothProfileManager mProfileManager; static final ParcelUuid[] UUIDS = { - BluetoothUuid.MAP, - BluetoothUuid.MNS, BluetoothUuid.MAS, }; From a54a7bdaf667a6e39560a04f418883e2ef592c47 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 27 Feb 2021 07:21:26 +0000 Subject: [PATCH 193/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ie71cf9a1dcad53542775ce804fad1f879caa6d72 --- core/res/res/values-eu/strings.xml | 2 +- core/res/res/values-fr/strings.xml | 2 +- core/res/res/values-ja/strings.xml | 8 ++++---- core/res/res/values-ky/strings.xml | 4 ++-- core/res/res/values-pt-rBR/strings.xml | 2 +- core/res/res/values-pt/strings.xml | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index 75551a03144b2..1eaa9f7ca8298 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -437,7 +437,7 @@ "Aplikazioak ariketa fisikoa hauteman dezake." "atera argazkiak eta grabatu bideoak" "Aplikazioak edonoiz erabil dezake kamera argazkiak ateratzeko eta bideoak grabatzeko." - "onartu aplikazio edo zerbitzu bati sistemako kamerak atzitzea argazkiak eta bideoak ateratzeko" + "eman sistemako kamerak atzitzeko baimena aplikazio edo zerbitzu bati argazkiak ateratzeko eta bideoak grabatzeko" "Pribilegioa duen edo sistemakoa den aplikazio honek edonoiz erabil dezake kamera argazkiak ateratzeko eta bideoak grabatzeko. Halaber, android.permission.CAMERA baimena izan behar du aplikazioak." "eman jakinarazpenak jasotzeko baimena aplikazioari edo zerbitzuari kamerak ireki edo ixten direnean." "Kamera ireki edo itxi dela (eta zer aplikaziorekin) dioten jakinarazpenak jaso ditzake aplikazio honek." diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index a5b1626aa404c..29b68a3d1aa52 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -2036,7 +2036,7 @@ "Retour" "Applications récentes" "Notifications" - "Configuration rapide" + "Réglages rapides" "Boîte de dialogue Marche/Arrêt" "Verrouiller l\'écran" "Capture d\'écran" diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index 78927ca0995f5..4a8179142c5b1 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -524,10 +524,10 @@ "このアプリに画面ロックの複雑さレベル(高、中、低、なし)を認識することを許可します。複雑さレベルは、画面ロックの文字数の範囲やタイプを示すものです。アプリから一定レベルまで画面ロックを更新するよう推奨されることもありますが、ユーザーは無視したり別の操作を行ったりできます。画面ロックは平文で保存されないため、アプリが正確なパスワードを知ることはありません。" "生体認証ハードウェアの使用" "生体認証ハードウェアを認証に使用することをアプリに許可します" - "指紋ハードウェアの管理" + "指紋認証ハードウェアの管理" "使用する指紋テンプレートの追加や削除を行う方法の呼び出しをアプリに許可します。" - "指紋ハードウェアの使用" - "指紋ハードウェアを認証に使用することをアプリに許可します" + "指紋認証ハードウェアの使用" + "指紋認証ハードウェアを認証に使用することをアプリに許可します" "音楽コレクションの変更" "音楽コレクションの変更をアプリに許可します。" "動画コレクションの変更" @@ -552,7 +552,7 @@ "指紋認証を完了しました" "顔を認証しました" "顔を認証しました。[確認] を押してください" - "指紋ハードウェアは使用できません。" + "指紋認証ハードウェアは使用できません。" "指紋を保存できません。既存の指紋を削除してください。" "指紋の読み取りがタイムアウトになりました。もう一度お試しください。" "指紋の操作をキャンセルしました。" diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index 71c30f16cec45..c42cf953c6515 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -1186,7 +1186,7 @@ "Жаңыртууну издөө" "%1$s колдонмосу (%2$s процесси) өз алдынча иштеткен StrictMode саясатын бузду." "%1$s процесси өзүнүн мажбурланган StrictMode саясатын бузуп койду." - "Телефон жаңыртылууда…" + "Телефон жаңырууда…" "Планшет жаңыртылууда…" "Түзмөк жаңыртылууда…" "Телефон күйгүзүлүүдө…" @@ -1196,7 +1196,7 @@ "Сактагыч ыңгайлаштырылууда." "Тутумду жаңыртуу аяктоодо…" "%1$s жаңыртылууда..." - "%2$d ичинен %1$d колдонмо ыңгайлаштырылууда." + "%2$d ичинен %1$d колдонмо оптималдаштырылууда." "%1$s даярдалууда." "Колдонмолорду иштетип баштоо" "Жүктөлүүдө" diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index fa5be924bf85a..ec34e4e6f8c85 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -849,7 +849,7 @@ "Pausar" "Reproduzir" "Parar" - "Retroceder" + "Voltar" "Avançar" "Só chamadas de emergência" "Rede bloqueada" diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index fa5be924bf85a..ec34e4e6f8c85 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -849,7 +849,7 @@ "Pausar" "Reproduzir" "Parar" - "Retroceder" + "Voltar" "Avançar" "Só chamadas de emergência" "Rede bloqueada" From be333346b3dba0e6833ee38ee60d6a2b906036bf Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 1 Mar 2021 08:25:12 +0000 Subject: [PATCH 194/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I45f5d57fe0b27b6b103c6af8f6941d6a0f36005e --- .../SystemUI/res/values-es-rUS/strings.xml | 2 +- packages/SystemUI/res/values-eu/strings.xml | 12 ++++---- packages/SystemUI/res/values-fa/strings.xml | 4 +-- packages/SystemUI/res/values-fi/strings.xml | 2 +- packages/SystemUI/res/values-fr/strings.xml | 28 +++++++++---------- packages/SystemUI/res/values-hi/strings.xml | 4 +-- packages/SystemUI/res/values-mk/strings.xml | 2 +- packages/SystemUI/res/values-nl/strings.xml | 14 +++++----- .../SystemUI/res/values-pt-rBR/strings.xml | 2 +- packages/SystemUI/res/values-pt/strings.xml | 2 +- 10 files changed, 36 insertions(+), 36 deletions(-) diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index 7b1f162402169..36230e0be18cc 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -110,7 +110,7 @@ "Compartir" "Se canceló la grabación de pantalla" "Se guardó la grabación de pantalla; presiona para verla" - "Error al borrar la grabación de pantalla" + "No se pudo borrar la grabación de pantalla" "Error al obtener permisos" "Error al iniciar la grabación de pantalla" "Opciones de transferencia de archivos por USB" diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index e59074c9ebed6..68605b04b0fa8 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -470,8 +470,8 @@ "%2$s • Bizkor kargatzen (%1$s guztiz kargatu arte)" "%2$s • Mantso kargatzen (%1$s guztiz kargatu arte)" "Aldatu erabiltzailea" - "Aldatu erabiltzailez. %s da saioa hasita duena." - "Uneko erabiltzailea: %s" + "Aldatu erabiltzailea. %s da saioa hasita daukana." + "Erabiltzailea: %s" "Erakutsi profila" "Gehitu erabiltzailea" "Erabiltzaile berria" @@ -486,7 +486,7 @@ "Aplikazioak eta datuak ezabatzeko, kendu gonbidatua" "KENDU GONBIDATUA" "Amaitu erabiltzailearen saioa" - "Amaitu uneko erabiltzailearen saioa" + "Amaitu erabiltzailearen saioa" "AMAITU ERABILTZAILEAREN SAIOA" "Beste erabiltzaile bat gehitu?" "Erabiltzaile bat gehitzen duzunean, horrek bere eremua konfiguratu beharko du.\n\nEdozein erabiltzailek egunera ditzake beste erabiltzaile guztien aplikazioak." @@ -974,7 +974,7 @@ "Sakatu bateria eta datuen erabilerari buruzko xehetasunak ikusteko" "Datu-konexioa desaktibatu nahi duzu?" "%s erabilita ezingo dituzu erabili datuak edo Internet. Wifi-sare baten bidez soilik konektatu ahal izango zara Internetera." - "Uneko operadorea" + "Zure operadorea" "Aplikazio bat baimen-eskaera oztopatzen ari denez, ezarpenek ezin dute egiaztatu erantzuna." "%2$s aplikazioaren zatiak erakusteko baimena eman nahi diozu %1$s aplikazioari?" "- %1$s aplikazioaren informazioa irakur dezake." @@ -1074,8 +1074,8 @@ "Pasatu hatza aukera gehiago ikusteko" "Gomendioak kargatzen" "Multimedia-edukia" - "Ezkutatu uneko saioa." - "Ezin da ezkutatu uneko saioa." + "Ezkutatu saioa." + "Ezin da ezkutatu saioa." "Baztertu" "Berrekin" "Ezarpenak" diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index 8781456ab9930..c2872a8da59e1 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -715,7 +715,7 @@ "بسته به تنظیمات ممکن است تلفن زنگ بزند یا لرزش داشته باشد" "بسته به تنظیمات ممکن است تلفن زنگ بزند یا لرزش داشته باشد. مکالمه‌های %1$s به‌طور پیش‌فرض در حبابک نشان داده می‌شوند." "با میان‌بری شناور به این محتوا، توجه‌تان را جلب می‌کند." - "در بالای بخش مکالمه به‌صورت حبابک شناور نشان داده می‌شود و تصویر نمایه را در صفحه قفل نمایش می‌دهد" + "در بالای بخش مکالمه به‌صورت حبابک شناور نشان داده می‌شود و عکس نمایه را در صفحه قفل نمایش می‌دهد" "تنظیمات" "اولویت" "%1$s از ویژگی‌های مکالمه پشتیبانی نمی‌کند" @@ -1026,7 +1026,7 @@ "مکالمه روی اولویت تنظیم شده است" "مکالمه‌های اولویت‌دار:" "نمایش در بالای بخش مکالمه" - "تصویر نمایه را در صفحه قفل نمایش می‌دهد" + "عکس نمایه را در صفحه قفل نمایش می‌دهد" "به‌شکل حبابک شناور روی برنامه‌ها ظاهر می‌شود" "وقفه در «مزاحم نشوید»" "متوجه‌ام" diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index e0bb8c37e3c0f..19794e0a41998 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -118,7 +118,7 @@ "Käytä kamerana (PTP)" "Asenna Android File Transfer -sovellus Macille" "Takaisin" - "Aloituspainike" + "Aloitus" "Valikko" "Esteettömyys" "Näytön kääntäminen" diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 2d9083a07a1ac..7b6ad6bd7b526 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -257,7 +257,7 @@ "Notification masquée" "Bulle fermée." "Volet des notifications" - "Paramètres rapides" + "Réglages rapides" "Écran de verrouillage" "Paramètres" "Aperçu" @@ -644,7 +644,7 @@ "System UI Tuner" "Afficher le pourcentage intégré de la batterie" "Affichez le pourcentage correspondant au niveau de la batterie dans l\'icône de la barre d\'état lorsque l\'appareil n\'est pas en charge." - "Configuration rapide" + "Réglages rapides" "Barre d\'état" "Aperçu" "Mode de démonstration de l\'interface du système" @@ -654,13 +654,13 @@ "Alarme" "Profil professionnel" "Mode Avion" - "Ajouter une tuile" - "Tuile de diffusion" + "Ajouter un bloc" + "Bloc de diffusion" "Vous n\'entendrez pas votre prochaine alarme %1$s, sauf si vous désactivez cette option avant." "Vous n\'entendrez pas votre prochaine alarme %1$s." "à %1$s" "le %1$s" - "Configuration rapide – %s" + "Réglages rapides – %s" "Point d\'accès" "Profil professionnel" "Divertissant pour certains, mais pas pour tous" @@ -673,8 +673,8 @@ "L\'application n\'est pas installée sur votre appareil." "Afficher les secondes sur l\'horloge" "Afficher les secondes dans la barre d\'état. Cela risque de réduire l\'autonomie de la batterie." - "Réorganiser la fenêtre de configuration rapide" - "Afficher la luminosité dans fenêtre de configuration rapide" + "Réorganiser les Réglages rapides" + "Afficher la luminosité dans les Réglages rapides" "Paramètres expérimentaux" "Activer le Bluetooth ?" "Pour connecter un clavier à votre tablette, vous devez avoir activé le Bluetooth." @@ -883,22 +883,22 @@ "Écran du haut à 50 %" "Écran du haut à 30 %" "Écran du bas en plein écran" - "supprimer la carte" - "ajouter la carte à la fin" - "Déplacer la carte" - "Ajouter une carte" + "supprimer le bloc" + "ajouter le bloc à la fin" + "Déplacer le bloc" + "Ajouter un bloc" "Déplacer vers %1$d" "Ajouter à la position %1$d" "Position %1$d" - "Éditeur de configuration rapide." + "Éditeur Réglages rapides" "Notification %1$s : %2$s" "Il est possible que l\'application ne fonctionne pas en mode Écran partagé." "Application incompatible avec l\'écran partagé." "Il est possible que l\'application ne fonctionne pas sur un écran secondaire." "L\'application ne peut pas être lancée sur des écrans secondaires." "Ouvrir les paramètres." - "Ouvrir la fenêtre de configuration rapide." - "Fermer la fenêtre de configuration rapide." + "Ouvrir les Réglages rapides." + "Fermer les Réglages rapides." "Alarme définie." "Connecté en tant que %s" "Aucun accès à Internet" diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 73c9f619e6c3b..3daab1bf489c2 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -982,8 +982,8 @@ "- यह %1$s से सूचना पढ़ सकता है" "- यह %1$s में कार्रवाई कर सकता है" "%1$s को किसी भी ऐप्लिकेशन के हिस्से (स्लाइस) दिखाने की मंज़ूरी दें" - "मंज़ूरी दें" - "नामंज़ूर करें" + "अनुमति दें" + "अनुमति न दें" "बैटरी सेवर शेड्यूल करने के लिए टैप करें" "जब बैटरी खत्म होने वाली हो तब \'बैटरी सेवर\' चालू करें" "जी नहीं, शुक्रिया" diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index 1df6f2de19f4f..4e7c06370b0ff 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -513,7 +513,7 @@ "Безгласно" "Известувања" "Разговори" - "Избриши ги сите тивки известувања" + "Избриши ги сите бесчујни известувања" "Известувањата се паузирани од „Не вознемирувај“" "Започни сега" "Нема известувања" diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index b721369c8a7d5..a65023251d9e0 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -621,16 +621,16 @@ "Gesprekken" "Bellen" "Trillen" - "Dempen" + "Geluid staat uit" "Telefoon op trillen" - "Telefoon gedempt" + "Telefoongeluid staat uit" "%1$s. Tik om dempen op te heffen." - "%1$s. Tik om in te stellen op trillen. Toegankelijkheidsservices kunnen zijn gedempt." - "%1$s. Tik om te dempen. Toegankelijkheidsservices kunnen zijn gedempt." + "%1$s. Tik om in te stellen op trillen. Het geluid van toegankelijkheidsservices kan hierdoor uitgaan." + "%1$s. Tik om te dempen. Het geluid van toegankelijkheidsservices kan hierdoor uitgaan." "%1$s. Tik om in te stellen op trillen." - "%1$s. Tik om te dempen." - "dempen" - "dempen opheffen" + "%1$s. Tik om geluid uit te zetten." + "geluid uit" + "geluid aanzetten" "trillen" "%s-volumeknoppen" "Gesprekken en meldingen gaan over (%1$s)" diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index 3d26f8dca388b..231c8f8c24417 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -785,7 +785,7 @@ "Parar" "Avançar" "Anterior" - "Retroceder" + "Voltar" "Avançar rapidamente" "Page Up" "Page Down" diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 3d26f8dca388b..231c8f8c24417 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -785,7 +785,7 @@ "Parar" "Avançar" "Anterior" - "Retroceder" + "Voltar" "Avançar rapidamente" "Page Up" "Page Down" From 0bae5abe8f62d6a093c02afddee33c0f57c99f1f Mon Sep 17 00:00:00 2001 From: Bob Badour Date: Mon, 1 Mar 2021 08:41:36 -0800 Subject: [PATCH 195/288] [LSC] Add LOCAL_LICENSE_KINDS to frameworks/base Added SPDX-license-identifier-Apache-2.0 to: location/tests/Android.bp services/api/Android.bp services/tests/servicestests/test-apps/PackageParsingTestManifests/Android.bp tests/FlickerTests/test-apps/Android.bp Bug: 68860345 Bug: 151177513 Bug: 151953481 Test: m all Exempt-From-Owner-Approval: janitorial work Change-Id: Id37aaf0fe274dd89446bacdf8d719ec2dc6699c6 --- services/api/Android.bp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/services/api/Android.bp b/services/api/Android.bp index b8ca5488c5cd6..bbc8c72b2eefa 100644 --- a/services/api/Android.bp +++ b/services/api/Android.bp @@ -14,6 +14,12 @@ package { default_visibility: ["//visibility:private"], + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], } filegroup { @@ -26,4 +32,4 @@ filegroup { name: "non-updatable-system-server-removed.txt", srcs: ["non-updatable-removed.txt"], visibility: ["//frameworks/base/api"], -} \ No newline at end of file +} From f9574845a645dd29f69f185ab209ea439d03c166 Mon Sep 17 00:00:00 2001 From: Sandra Alfaro Date: Fri, 5 Feb 2021 10:13:58 -0800 Subject: [PATCH 196/288] DO NOT MERGE Allow the Car Setup Wizard appl to send CAR_INFORMATION notifications Bug: 171739119 Test: atest NotificationManagerServiceTest NotificationManagerTest Change-Id: I3a7eb3197e3bc1d239b87c0f50a7db3e8b17d63b --- .../NotificationManagerService.java | 22 ++++++++++++++---- .../NotificationManagerServiceTest.java | 23 +++++++++++++++++++ 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 4772fccfec9dc..a7606339b7d96 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -5694,7 +5694,7 @@ public class NotificationManagerService extends SystemService { + " trying to post for invalid pkg " + pkg + " in user " + incomingUserId); } - checkRestrictedCategories(notification); + checkRestrictedCategories(pkg, notification); // Fix the notification as best we can. try { @@ -8537,7 +8537,7 @@ public class NotificationManagerService extends SystemService { * Check if the notification is of a category type that is restricted to system use only, * if so throw SecurityException */ - private void checkRestrictedCategories(final Notification notification) { + private void checkRestrictedCategories(final String pkg, final Notification notification) { try { if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE, 0)) { return; @@ -8547,10 +8547,24 @@ public class NotificationManagerService extends SystemService { + "restrictions check thus the check will be done anyway"); } if (Notification.CATEGORY_CAR_EMERGENCY.equals(notification.category) - || Notification.CATEGORY_CAR_WARNING.equals(notification.category) - || Notification.CATEGORY_CAR_INFORMATION.equals(notification.category)) { + || Notification.CATEGORY_CAR_WARNING.equals(notification.category)) { checkCallerIsSystem(); } + + if (Notification.CATEGORY_CAR_INFORMATION.equals(notification.category)) { + checkCallerIsSystemOrSUW(pkg); + } + } + + private void checkCallerIsSystemOrSUW(final String pkg) { + + final PackageManagerInternal pmi = LocalServices.getService( + PackageManagerInternal.class); + String suwPkg = pmi.getSetupWizardPackageName(); + if (suwPkg != null && suwPkg.equals(pkg)) { + return; + } + checkCallerIsSystem(); } @VisibleForTesting diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java index adf5a89eef003..1d783532374b0 100755 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -111,6 +111,7 @@ import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; import android.content.pm.LauncherApps; import android.content.pm.PackageManager; +import android.content.pm.PackageManagerInternal; import android.content.pm.ParceledListSlice; import android.content.pm.ShortcutInfo; import android.content.pm.ShortcutServiceInternal; @@ -243,6 +244,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { Resources mResources; @Mock RankingHandler mRankingHandler; + @Mock + protected PackageManagerInternal mPackageManagerInternal; private static final int MAX_POST_DELAY = 1000; @@ -1186,6 +1189,26 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { assertEquals(0, mBinderService.getActiveNotifications(PKG).length); } + @Test + public void testEnqueuedRestrictedNotifications_asSuwApp() throws Exception { + LocalServices.removeServiceForTest(PackageManagerInternal.class); + LocalServices.addService(PackageManagerInternal.class, mPackageManagerInternal); + when(mPackageManagerInternal.getSetupWizardPackageName()).thenReturn(PKG); + + when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE, 0)) + .thenReturn(true); + + final StatusBarNotification sbn = + generateNotificationRecord(mTestNotificationChannel, 0, "", false).getSbn(); + sbn.getNotification().category = Notification.CATEGORY_CAR_INFORMATION; + mBinderService.enqueueNotificationWithTag(PKG, PKG, + "testEnqueuedRestrictedNotifications_asSuwApp", + sbn.getId(), sbn.getNotification(), sbn.getUserId()); + + waitForIdle(); + assertEquals(1, mBinderService.getActiveNotifications(PKG).length); + } + @Test public void testBlockedNotifications_blockedByAssistant() throws Exception { when(mPackageManager.isPackageSuspendedForUser(anyString(), anyInt())).thenReturn(false); From 1bc02694eac1472326db750af02ab7a37ef51e89 Mon Sep 17 00:00:00 2001 From: Tim Peng Date: Mon, 22 Feb 2021 11:24:21 +0800 Subject: [PATCH 197/288] [Fix] Bluetooth device ordering -Caused by sorting whole list -It should sort connected devices, and then, to add all disconnected devices from getMostRecentlyConnectedDevices() Bug: 176850941 Test: atest LocalMediaManagerTest Change-Id: I123e70d0616d3fab0a29658e29421ee94aec3094 (cherry picked from commit a4cf89aa16078e49e9e0d162ae64cc96abf72569) --- .../src/com/android/settingslib/media/LocalMediaManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java index 72a6074ff89c3..9d477251c2e35 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java @@ -205,7 +205,6 @@ public class LocalMediaManager implements BluetoothCallback { void dispatchDeviceListUpdate() { final List mediaDevices = new ArrayList<>(mMediaDevices); - Collections.sort(mediaDevices, COMPARATOR); for (DeviceCallback callback : getCallbacks()) { callback.onDeviceListUpdate(mediaDevices); } @@ -465,6 +464,7 @@ public class LocalMediaManager implements BluetoothCallback { synchronized (mMediaDevicesLock) { mMediaDevices.clear(); mMediaDevices.addAll(devices); + Collections.sort(devices, COMPARATOR); // Add disconnected bluetooth devices only when phone output device is available. for (MediaDevice device : devices) { final int type = device.getDeviceType(); From 2a18b15dfbb8c494ab58679c4aceb83da9683441 Mon Sep 17 00:00:00 2001 From: Hongwei Wang Date: Tue, 2 Mar 2021 09:21:22 -0800 Subject: [PATCH 198/288] Restrict the overridden min size for PiP Per go/cdd-proposal-pip-size, the absolute minimum size when overridden should be 48dp. Bug: 174302616 Test: atest PinnedStackTests#testEnterPipWithTinyMinimalSize Merged-In: I2f0dfd9a79049aaf696fde8703994deaecce63f5 Change-Id: I2f0dfd9a79049aaf696fde8703994deaecce63f5 --- core/res/res/values/dimens.xml | 7 +++++++ core/res/res/values/symbols.xml | 1 + .../com/android/systemui/pip/PipTaskOrganizer.java | 13 ++++++++++++- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml index ebaf85c64a142..d165930d3c942 100644 --- a/core/res/res/values/dimens.xml +++ b/core/res/res/values/dimens.xml @@ -632,6 +632,13 @@ 108dp + + 48dp + 80dp diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 871924255e663..45a4cee8c5ef2 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -1927,6 +1927,7 @@ + diff --git a/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java b/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java index 0141dee040860..ae3269fbc19b5 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java +++ b/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java @@ -45,6 +45,7 @@ import android.os.Handler; import android.os.IBinder; import android.os.Looper; import android.os.RemoteException; +import android.util.EventLog; import android.util.Log; import android.util.Size; import android.view.SurfaceControl; @@ -193,6 +194,7 @@ public class PipTaskOrganizer extends TaskOrganizer implements private PipSurfaceTransactionHelper.SurfaceControlTransactionFactory mSurfaceControlTransactionFactory; private PictureInPictureParams mPictureInPictureParams; + private int mOverridableMinSize; /** * If set to {@code true}, the entering animation will be skipped and we will wait for @@ -211,6 +213,8 @@ public class PipTaskOrganizer extends TaskOrganizer implements mPipBoundsHandler = boundsHandler; mEnterExitAnimationDuration = context.getResources() .getInteger(R.integer.config_pipResizeAnimationDuration); + mOverridableMinSize = context.getResources().getDimensionPixelSize( + com.android.internal.R.dimen.overridable_minimal_size_pip_resizable_task); mSurfaceTransactionHelper = surfaceTransactionHelper; mPipAnimationController = pipAnimationController; mSurfaceControlTransactionFactory = SurfaceControl.Transaction::new; @@ -887,7 +891,14 @@ public class PipTaskOrganizer extends TaskOrganizer implements // -1 will be populated if an activity specifies defaultWidth/defaultHeight in // without minWidth/minHeight if (windowLayout.minWidth > 0 && windowLayout.minHeight > 0) { - return new Size(windowLayout.minWidth, windowLayout.minHeight); + // If either dimension is smaller than the allowed minimum, adjust them + // according to mOverridableMinSize and log to SafeNet + if (windowLayout.minWidth < mOverridableMinSize + || windowLayout.minHeight < mOverridableMinSize) { + EventLog.writeEvent(0x534e4554, "174302616", -1, ""); + } + return new Size(Math.max(windowLayout.minWidth, mOverridableMinSize), + Math.max(windowLayout.minHeight, mOverridableMinSize)); } return null; } From da20330b3503d2b18eaa33bb49f28fb1b8140f2e Mon Sep 17 00:00:00 2001 From: Mike Reed Date: Fri, 15 Jan 2021 14:27:02 -0500 Subject: [PATCH 199/288] Fix nine-patches to always filter Regression was introduced here: https://android.git.corp.google.com/platform/frameworks/base/+/c2dbc03acc61e3d4303afbbc63c8e7144f617846 Bug: 176691890 Test: I1336d7e70f0e46e57023d7e0b8331ba7cba137ac Change-Id: I8153f1d6ecd850953369dd664da88915c3842bb5 (cherry picked from commit 0e540d057c4c57cef5c469e3e94c0eda551b4f46) Merged-In: I8153f1d6ecd850953369dd664da88915c3842bb5 Merged-In: I16f5aaff99ad6d2b6813a75ddbb4c97beb7aa2d8 --- libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp b/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp index d67cf8c9c73fe..5ff8fbc05e952 100644 --- a/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp +++ b/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp @@ -301,7 +301,8 @@ void SkiaRecordingCanvas::drawNinePatch(Bitmap& bitmap, const Res_png_9patch& ch } sk_sp image = bitmap.makeImage(); - applyLooper(get_looper(paint), *filterBitmap(paint), [&](SkScalar x, SkScalar y, const SkPaint& p) { + applyLooper(get_looper(paint), *filterBitmap(*filteredPaint), [&](SkScalar x, SkScalar y, + const SkPaint& p) { mRecorder.drawImageLattice(image, lattice, dst.makeOffset(x, y), &p, bitmap.palette()); }); From 17c8f10914b813f6bd191c95fbb0ca328a3118d2 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 4 Mar 2021 02:42:44 +0000 Subject: [PATCH 200/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ie9d116b861fdccd54e0d125b499e5613e9bb4a47 --- packages/SettingsLib/res/values-ca/arrays.xml | 2 +- packages/SettingsLib/res/values-ms/strings.xml | 4 ++-- packages/SettingsLib/res/values-my/strings.xml | 2 +- packages/SettingsLib/res/values-zh-rTW/strings.xml | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/SettingsLib/res/values-ca/arrays.xml b/packages/SettingsLib/res/values-ca/arrays.xml index 4b24637ddeaa8..927c2883e4760 100644 --- a/packages/SettingsLib/res/values-ca/arrays.xml +++ b/packages/SettingsLib/res/values-ca/arrays.xml @@ -234,7 +234,7 @@ "Cap" "Logcat" "Systrace (gràfics)" - "Pila de trucades a glGetError" + "Pila de crides a glGetError" "Desactivat" diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml index 9262d5b7abe3a..c9e46fce102d5 100644 --- a/packages/SettingsLib/res/values-ms/strings.xml +++ b/packages/SettingsLib/res/values-ms/strings.xml @@ -67,7 +67,7 @@ "Memutuskan sambungan..." "Menyambung..." "%1$s disambungkan" - "Memasangkan..." + "Menggandingkan..." "Disambungkan (tiada telefon)%1$s" "Disambungkan (tiada media)%1$s" "Disambungkan (tiada akses mesej)%1$s" @@ -112,7 +112,7 @@ "Gunakan untuk pemindahan fail" "Gunakan untuk input" "Gunakan untuk Alat Bantu Dengar" - "Jadikan pasangan" + "Gandingkan" "JADIKAN PASANGAN" "Batal" "Berpasangan memberi anda akses kepada kenalan dan sejarah panggilan apabila disambungkan." diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml index f2ed8a28dbee4..03903cb41e787 100644 --- a/packages/SettingsLib/res/values-my/strings.xml +++ b/packages/SettingsLib/res/values-my/strings.xml @@ -306,7 +306,7 @@ "သင် ယခင်က ခွင့်ပြုခဲ့သော ကွန်ပျူတာအားလုံးမှ ယူအက်စ်ဘီ အမှားစစ်ခွင့်ကို ရုတ်သိမ်းမည်လား ?" "တည်ဆောက်ပြုပြင်ရန်ဆက်တင်များကို အသုံးပြုခွင့်ပေးမည်လား?" "ဤဆက်တင်းများကို တည်ဆောက်ပြုပြင်ရာတွင် သုံးရန်အတွက်သာ ရည်ရွယ်သည်။ ၎င်းတို့သည် သင်၏စက်နှင့် အပလီကေးရှင်းများကို ရပ်စေခြင်း သို့ လုပ်ဆောင်ချက်မမှန်ကန်ခြင်းများ ဖြစ်ပေါ်စေနိုင်သည်။" - "USB ဖြင့် အက်ပ်များကို အတည်ပြုစိစစ်ရန်" + "USB ဖြင့် အက်ပ်များစိစစ်ရန်" "ADB/ADT မှတစ်ဆင့် ထည့်သွင်းသော အက်ပ်များ အန္တရာယ်ဖြစ်နိုင်ခြင်း ရှိမရှိ စစ်ဆေးသည်။" "အမည်မရှိသော (MAC လိပ်စာများသာပါသော) ဘလူးတုသ်စက်ပစ္စည်းများကို ပြသပါမည်" "ချိတ်ဆက်ထားသည့် ကိရိယာတွင် လက်မခံနိုင်လောက်အောင် ဆူညံ သို့မဟုတ် ထိန်းညှိမရနိုင်သော အသံပိုင်းပြဿနာ ရှိခဲ့လျှင် ဘလူးတုသ် ပကတိ အသံနှုန်းကို ပိတ်ပါ။" diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml index 704d265e4e236..5f342ec48843c 100644 --- a/packages/SettingsLib/res/values-zh-rTW/strings.xml +++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml @@ -429,9 +429,9 @@ "根據你的使用情形,目前電量為 %2$s,預估可持續使用到%1$s" "根據你的使用情形,預估可持續使用到%1$s" - "目前電量 %2$s,預估還能持續使用到%1$s" + "目前電量 %2$s,預估可用到%1$s" "預估電力大約可使用到%1$s" - "還能持續使用到%1$s" + "可用到%1$s" "電池電力可能於%1$s 前耗盡" "電池可用時間不到 %1$s" "電池可用時間不到 %1$s (%2$s)" From 033f3edb72bac38f8afb95ac494eb76ed47dd356 Mon Sep 17 00:00:00 2001 From: Danny Epstein Date: Tue, 2 Mar 2021 16:48:34 -0800 Subject: [PATCH 201/288] Configure privapp perms for rotary service Test: Check for SecurityException on boot in sc-dev branch Bug: 181577696 Change-Id: Ib0596f87c81fda75c830989ecc57059392b7fc42 Merged-In: Ib0596f87c81fda75c830989ecc57059392b7fc42 --- data/etc/car/Android.bp | 7 +++++++ data/etc/car/com.android.car.rotary.xml | 22 ++++++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 data/etc/car/com.android.car.rotary.xml diff --git a/data/etc/car/Android.bp b/data/etc/car/Android.bp index c5a460b784749..dc892080417d6 100644 --- a/data/etc/car/Android.bp +++ b/data/etc/car/Android.bp @@ -163,3 +163,10 @@ prebuilt_etc { src: "com.android.car.activityresolver.xml", filename_from_src: true, } + +prebuilt_etc { + name: "allowed_privapp_com.android.car.rotary", + sub_dir: "permissions", + src: "com.android.car.rotary.xml", + filename_from_src: true, +} diff --git a/data/etc/car/com.android.car.rotary.xml b/data/etc/car/com.android.car.rotary.xml new file mode 100644 index 0000000000000..575275507ea5b --- /dev/null +++ b/data/etc/car/com.android.car.rotary.xml @@ -0,0 +1,22 @@ + + + + + + + + From e076c2344e9e0f70e6118480c6c961e01cf4de32 Mon Sep 17 00:00:00 2001 From: Heemin Seog Date: Fri, 26 Feb 2021 14:03:01 -0800 Subject: [PATCH 202/288] DO NOT MERGE Add generic rotary support for sysui overlay window Bug: 181138897 Test: manual Change-Id: I353d9587fce09c5dff7328b5dec7e973230f2a9c --- .../layout/keyguard_container.xml | 5 +- .../res-keyguard/layout/num_pad_keys.xml | 2 - .../res-keyguard/values/dimens.xml | 4 +- .../res-keyguard/values/styles.xml | 7 +- .../layout/car_fullscreen_user_switcher.xml | 49 ++++---- .../layout/notification_center_activity.xml | 21 +--- .../layout/notification_panel_container.xml | 2 +- .../res/layout/sysui_overlay_window.xml | 30 +++-- .../keyguard/CarKeyguardViewController.java | 5 + .../NotificationPanelViewController.java | 5 + .../FullScreenUserSwitcherViewController.java | 7 +- .../car/window/OverlayViewController.java | 65 ++++++++++ .../OverlayViewGlobalStateController.java | 14 +++ .../OverlayViewGlobalStateControllerTest.java | 111 ++++++++++++++---- 14 files changed, 239 insertions(+), 88 deletions(-) diff --git a/packages/CarSystemUI/res-keyguard/layout/keyguard_container.xml b/packages/CarSystemUI/res-keyguard/layout/keyguard_container.xml index 3e35df9d9b0cf..f617ec06ae528 100644 --- a/packages/CarSystemUI/res-keyguard/layout/keyguard_container.xml +++ b/packages/CarSystemUI/res-keyguard/layout/keyguard_container.xml @@ -14,10 +14,7 @@ ~ limitations under the License. --> - - diff --git a/packages/CarSystemUI/res-keyguard/values/dimens.xml b/packages/CarSystemUI/res-keyguard/values/dimens.xml index 8dfe1716ef54d..3c139586c2cc7 100644 --- a/packages/CarSystemUI/res-keyguard/values/dimens.xml +++ b/packages/CarSystemUI/res-keyguard/values/dimens.xml @@ -17,10 +17,8 @@ 112dp 144dp - 80dp + 120dp 80dp - @*android:dimen/car_padding_5 - @*android:dimen/car_padding_5 @dimen/num_pad_key_height 1dp 128dp diff --git a/packages/CarSystemUI/res-keyguard/values/styles.xml b/packages/CarSystemUI/res-keyguard/values/styles.xml index ecea30a13ced1..ca37428a9fd92 100644 --- a/packages/CarSystemUI/res-keyguard/values/styles.xml +++ b/packages/CarSystemUI/res-keyguard/values/styles.xml @@ -23,12 +23,11 @@ @dimen/num_pad_key_width @dimen/num_pad_key_height @dimen/num_pad_key_margin_bottom + ?android:attr/selectableItemBackground @id/pinEntry diff --git a/packages/CarSystemUI/res/layout/car_fullscreen_user_switcher.xml b/packages/CarSystemUI/res/layout/car_fullscreen_user_switcher.xml index 99df6d52de073..f987b5a650bc7 100644 --- a/packages/CarSystemUI/res/layout/car_fullscreen_user_switcher.xml +++ b/packages/CarSystemUI/res/layout/car_fullscreen_user_switcher.xml @@ -14,29 +14,36 @@ See the License for the specific language governing permissions and limitations under the License. --> - - - - - - + - - + android:layout_height="match_parent" + android:background="@color/car_user_switcher_background_color" + android:orientation="vertical"> - + + + + + + + + + diff --git a/packages/CarSystemUI/res/layout/notification_center_activity.xml b/packages/CarSystemUI/res/layout/notification_center_activity.xml index 0e45e43132de2..51d23db79e8dd 100644 --- a/packages/CarSystemUI/res/layout/notification_center_activity.xml +++ b/packages/CarSystemUI/res/layout/notification_center_activity.xml @@ -22,10 +22,6 @@ android:layout_height="match_parent" android:background="@color/notification_shade_background_color"> - - - - - + app:layout_constraintTop_toTopOf="parent"/> diff --git a/packages/CarSystemUI/res/layout/notification_panel_container.xml b/packages/CarSystemUI/res/layout/notification_panel_container.xml index 3b53c6aaeac31..de69769b2bb0e 100644 --- a/packages/CarSystemUI/res/layout/notification_panel_container.xml +++ b/packages/CarSystemUI/res/layout/notification_panel_container.xml @@ -14,7 +14,7 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - + + + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout="@layout/notification_panel_container" + android:layout_marginBottom="@dimen/car_bottom_navigation_bar_height"/> + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout="@layout/keyguard_container" /> + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout="@layout/car_fullscreen_user_switcher"/> + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout="@layout/car_user_switching_dialog"/> \ No newline at end of file diff --git a/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java index ec018f9bb62e5..53d2320b3f9fb 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java @@ -147,6 +147,11 @@ public class CarKeyguardViewController extends OverlayViewController implements registerUserSwitchedListener(); } + @Override + protected int getFocusAreaViewId() { + return R.id.keyguard_container; + } + @Override protected boolean shouldShowNavigationBarInsets() { return true; diff --git a/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java index b83fcf4bf8b5c..6597144a088a5 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java @@ -218,6 +218,11 @@ public class NotificationPanelViewController extends OverlayPanelViewController mNotificationVisibilityLogger.stop(); } + @Override + protected int getFocusAreaViewId() { + return R.id.notification_container; + } + @Override protected boolean shouldShowNavigationBarInsets() { return true; diff --git a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullScreenUserSwitcherViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullScreenUserSwitcherViewController.java index 5fc7299f68c5a..dd59efa7b0b26 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullScreenUserSwitcherViewController.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullScreenUserSwitcherViewController.java @@ -76,7 +76,7 @@ public class FullScreenUserSwitcherViewController extends OverlayViewController } if (event.getAction() == KeyEvent.ACTION_UP && getLayout().isVisibleToUser()) { - getLayout().setVisibility(View.GONE); + stop(); } return true; }); @@ -91,6 +91,11 @@ public class FullScreenUserSwitcherViewController extends OverlayViewController registerCarUserManagerIfPossible(); } + @Override + protected int getFocusAreaViewId() { + return R.id.user_switcher_container; + } + @Override protected boolean shouldFocusWindow() { return true; diff --git a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewController.java index 8adc1adcc41c4..7bc17765d9fc4 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewController.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewController.java @@ -17,12 +17,17 @@ package com.android.systemui.car.window; import static android.view.WindowInsets.Type.statusBars; +import static android.view.accessibility.AccessibilityNodeInfo.ACTION_FOCUS; import android.view.View; import android.view.ViewGroup; import android.view.ViewStub; import android.view.WindowInsets; +import androidx.annotation.IdRes; + +import com.android.car.ui.FocusArea; + /** * Owns a {@link View} that is present in SystemUIOverlayWindow. */ @@ -128,6 +133,66 @@ public class OverlayViewController { return mOverlayViewGlobalStateController; } + /** Returns whether the view controlled by this controller is visible. */ + public final boolean isVisible() { + return mLayout.getVisibility() == View.VISIBLE; + } + + /** + * Returns the ID of the focus area that should receive focus when this view is the + * topmost view or {@link View#NO_ID} if there is no focus area. + */ + @IdRes + protected int getFocusAreaViewId() { + return View.NO_ID; + } + + /** Returns whether the view controlled by this controller has rotary focus. */ + protected final boolean hasRotaryFocus() { + return !mLayout.isInTouchMode() && mLayout.hasFocus(); + } + + /** + * Sets whether this view allows rotary focus. This should be set to {@code true} for the + * topmost layer in the overlay window and {@code false} for the others. + */ + public void setAllowRotaryFocus(boolean allowRotaryFocus) { + if (!isInflated()) { + return; + } + + if (!(mLayout instanceof ViewGroup)) { + return; + } + + ViewGroup viewGroup = (ViewGroup) mLayout; + viewGroup.setDescendantFocusability(allowRotaryFocus + ? ViewGroup.FOCUS_BEFORE_DESCENDANTS + : ViewGroup.FOCUS_BLOCK_DESCENDANTS); + } + + /** + * Refreshes the rotary focus in this view if we are in rotary mode. If the view already has + * rotary focus, it leaves the focus alone. Returns {@code true} if a new view was focused. + */ + public boolean refreshRotaryFocusIfNeeded() { + if (mLayout.isInTouchMode()) { + return false; + } + + if (hasRotaryFocus()) { + return false; + } + + View view = mLayout.findViewById(getFocusAreaViewId()); + if (view == null || !(view instanceof FocusArea)) { + return mLayout.requestFocus(); + } + + FocusArea focusArea = (FocusArea) view; + return focusArea.performAccessibilityAction(ACTION_FOCUS, /* arguments= */ null); + } + /** * Returns {@code true} if heads up notifications should be displayed over this view. */ diff --git a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewGlobalStateController.java b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewGlobalStateController.java index 55f0975aeccfa..204dde7e87b7a 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewGlobalStateController.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewGlobalStateController.java @@ -29,6 +29,7 @@ import androidx.annotation.VisibleForTesting; import java.util.HashMap; import java.util.HashSet; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.SortedMap; import java.util.TreeMap; @@ -120,6 +121,7 @@ public class OverlayViewGlobalStateController { refreshWindowFocus(); refreshNavigationBarVisibility(); refreshStatusBarVisibility(); + refreshRotaryFocusIfNeeded(); Log.d(TAG, "Content shown: " + viewController.getClass().getName()); debugLog(); @@ -193,6 +195,7 @@ public class OverlayViewGlobalStateController { refreshWindowFocus(); refreshNavigationBarVisibility(); refreshStatusBarVisibility(); + refreshRotaryFocusIfNeeded(); if (mZOrderVisibleSortedMap.isEmpty()) { setWindowVisible(false); @@ -254,6 +257,17 @@ public class OverlayViewGlobalStateController { } } + private void refreshRotaryFocusIfNeeded() { + for (OverlayViewController controller : mZOrderVisibleSortedMap.values()) { + boolean isTop = Objects.equals(controller, mHighestZOrder); + controller.setAllowRotaryFocus(isTop); + } + + if (!mZOrderVisibleSortedMap.isEmpty()) { + mHighestZOrder.refreshRotaryFocusIfNeeded(); + } + } + /** Returns {@code true} is the window is visible. */ public boolean isWindowVisible() { return mSystemUIOverlayWindowController.isWindowVisible(); diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayViewGlobalStateControllerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayViewGlobalStateControllerTest.java index 294aa0d3cf9bc..d97b2329350f4 100644 --- a/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayViewGlobalStateControllerTest.java +++ b/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayViewGlobalStateControllerTest.java @@ -214,6 +214,16 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase { verify(mSystemUIOverlayWindowController).setWindowVisible(true); } + @Test + public void showView_nothingAlreadyShown_newHighestZOrder_isVisible() { + setupOverlayViewController1(); + + mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable); + + assertThat(mOverlayViewGlobalStateController.mZOrderVisibleSortedMap.containsKey( + OVERLAY_VIEW_CONTROLLER_1_Z_ORDER)).isTrue(); + } + @Test public void showView_nothingAlreadyShown_newHighestZOrder() { setupOverlayViewController1(); @@ -225,13 +235,12 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase { } @Test - public void showView_nothingAlreadyShown_newHighestZOrder_isVisible() { + public void showView_nothingAlreadyShown_descendantsFocusable() { setupOverlayViewController1(); mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable); - assertThat(mOverlayViewGlobalStateController.mZOrderVisibleSortedMap.containsKey( - OVERLAY_VIEW_CONTROLLER_1_Z_ORDER)).isTrue(); + verify(mOverlayViewController1).setAllowRotaryFocus(true); } @Test @@ -331,6 +340,30 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase { OVERLAY_VIEW_CONTROLLER_2_Z_ORDER).toArray()); } + @Test + public void showView_newHighestZOrder_topDescendantsFocusable() { + setupOverlayViewController1(); + setOverlayViewControllerAsShowing(mOverlayViewController1); + setupOverlayViewController2(); + + mOverlayViewGlobalStateController.showView(mOverlayViewController2, mRunnable); + + verify(mOverlayViewController1).setAllowRotaryFocus(false); + verify(mOverlayViewController2).setAllowRotaryFocus(true); + } + + @Test + public void showView_newHighestZOrder_refreshTopFocus() { + setupOverlayViewController1(); + setOverlayViewControllerAsShowing(mOverlayViewController1); + setupOverlayViewController2(); + + mOverlayViewGlobalStateController.showView(mOverlayViewController2, mRunnable); + + verify(mOverlayViewController1, never()).refreshRotaryFocusIfNeeded(); + verify(mOverlayViewController2).refreshRotaryFocusIfNeeded(); + } + @Test public void showView_oldHighestZOrder() { setupOverlayViewController2(); @@ -345,9 +378,9 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase { @Test public void showView_oldHighestZOrder_shouldShowNavBarFalse_navigationBarsHidden() { setupOverlayViewController2(); + setOverlayViewControllerAsShowing(mOverlayViewController2); when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true); when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true); - setOverlayViewControllerAsShowing(mOverlayViewController2); when(mOverlayViewController1.shouldShowNavigationBarInsets()).thenReturn(true); when(mOverlayViewController2.shouldShowNavigationBarInsets()).thenReturn(false); reset(mWindowInsetsController); @@ -360,11 +393,12 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase { @Test public void showView_oldHighestZOrder_shouldShowNavBarTrue_navigationBarsShown() { setupOverlayViewController2(); + setOverlayViewControllerAsShowing(mOverlayViewController2); when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true); when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true); - setOverlayViewControllerAsShowing(mOverlayViewController2); when(mOverlayViewController1.shouldShowNavigationBarInsets()).thenReturn(false); when(mOverlayViewController2.shouldShowNavigationBarInsets()).thenReturn(true); + reset(mWindowInsetsController); mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable); @@ -374,9 +408,9 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase { @Test public void showView_oldHighestZOrder_shouldShowStatusBarFalse_statusBarsHidden() { setupOverlayViewController2(); + setOverlayViewControllerAsShowing(mOverlayViewController2); when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true); when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true); - setOverlayViewControllerAsShowing(mOverlayViewController2); when(mOverlayViewController1.shouldShowStatusBarInsets()).thenReturn(true); when(mOverlayViewController2.shouldShowStatusBarInsets()).thenReturn(false); reset(mWindowInsetsController); @@ -389,11 +423,12 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase { @Test public void showView_oldHighestZOrder_shouldShowStatusBarTrue_statusBarsShown() { setupOverlayViewController2(); + setOverlayViewControllerAsShowing(mOverlayViewController2); when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true); when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true); - setOverlayViewControllerAsShowing(mOverlayViewController2); when(mOverlayViewController1.shouldShowStatusBarInsets()).thenReturn(false); when(mOverlayViewController2.shouldShowStatusBarInsets()).thenReturn(true); + reset(mWindowInsetsController); mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable); @@ -425,6 +460,30 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase { OVERLAY_VIEW_CONTROLLER_2_Z_ORDER).toArray()); } + @Test + public void showView_oldHighestZOrder_topDescendantsFocusable() { + setupOverlayViewController1(); + setupOverlayViewController2(); + setOverlayViewControllerAsShowing(mOverlayViewController2); + + mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable); + + verify(mOverlayViewController1).setAllowRotaryFocus(false); + verify(mOverlayViewController2).setAllowRotaryFocus(true); + } + + @Test + public void showView_oldHighestZOrder_refreshTopFocus() { + setupOverlayViewController1(); + setupOverlayViewController2(); + setOverlayViewControllerAsShowing(mOverlayViewController2); + + mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable); + + verify(mOverlayViewController1, never()).refreshRotaryFocusIfNeeded(); + verify(mOverlayViewController2).refreshRotaryFocusIfNeeded(); + } + @Test public void showView_somethingAlreadyShown_windowVisibleNotCalled() { setupOverlayViewController1(); @@ -577,10 +636,10 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase { public void hideView_newHighestZOrder_shouldShowNavBarFalse_navigationBarHidden() { setupOverlayViewController1(); setupOverlayViewController2(); - when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true); - when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true); setOverlayViewControllerAsShowing(mOverlayViewController1); setOverlayViewControllerAsShowing(mOverlayViewController2); + when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true); + when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true); when(mOverlayViewController1.shouldShowNavigationBarInsets()).thenReturn(false); reset(mWindowInsetsController); @@ -593,10 +652,10 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase { public void hideView_newHighestZOrder_shouldShowNavBarTrue_navigationBarShown() { setupOverlayViewController1(); setupOverlayViewController2(); - when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true); - when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true); setOverlayViewControllerAsShowing(mOverlayViewController1); setOverlayViewControllerAsShowing(mOverlayViewController2); + when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true); + when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true); when(mOverlayViewController1.shouldShowNavigationBarInsets()).thenReturn(true); reset(mWindowInsetsController); @@ -609,10 +668,10 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase { public void hideView_newHighestZOrder_shouldShowStatusBarFalse_statusBarHidden() { setupOverlayViewController1(); setupOverlayViewController2(); - when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true); - when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true); setOverlayViewControllerAsShowing(mOverlayViewController1); setOverlayViewControllerAsShowing(mOverlayViewController2); + when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true); + when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true); when(mOverlayViewController1.shouldShowStatusBarInsets()).thenReturn(false); reset(mWindowInsetsController); @@ -625,10 +684,10 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase { public void hideView_newHighestZOrder_shouldShowStatusBarTrue_statusBarShown() { setupOverlayViewController1(); setupOverlayViewController2(); - when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true); - when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true); setOverlayViewControllerAsShowing(mOverlayViewController1); setOverlayViewControllerAsShowing(mOverlayViewController2); + when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true); + when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true); when(mOverlayViewController1.shouldShowStatusBarInsets()).thenReturn(true); reset(mWindowInsetsController); @@ -668,10 +727,10 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase { public void hideView_oldHighestZOrder_shouldShowNavBarFalse_navigationBarHidden() { setupOverlayViewController1(); setupOverlayViewController2(); - when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true); - when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true); setOverlayViewControllerAsShowing(mOverlayViewController1); setOverlayViewControllerAsShowing(mOverlayViewController2); + when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true); + when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true); when(mOverlayViewController2.shouldShowNavigationBarInsets()).thenReturn(false); reset(mWindowInsetsController); @@ -684,11 +743,12 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase { public void hideView_oldHighestZOrder_shouldShowNavBarTrue_navigationBarShown() { setupOverlayViewController1(); setupOverlayViewController2(); - when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true); - when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true); setOverlayViewControllerAsShowing(mOverlayViewController1); setOverlayViewControllerAsShowing(mOverlayViewController2); + when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true); + when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true); when(mOverlayViewController2.shouldShowNavigationBarInsets()).thenReturn(true); + reset(mWindowInsetsController); mOverlayViewGlobalStateController.hideView(mOverlayViewController1, mRunnable); @@ -699,10 +759,10 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase { public void hideView_oldHighestZOrder_shouldShowStatusBarFalse_statusBarHidden() { setupOverlayViewController1(); setupOverlayViewController2(); - when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true); - when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true); setOverlayViewControllerAsShowing(mOverlayViewController1); setOverlayViewControllerAsShowing(mOverlayViewController2); + when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true); + when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true); when(mOverlayViewController2.shouldShowStatusBarInsets()).thenReturn(false); reset(mWindowInsetsController); @@ -715,11 +775,12 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase { public void hideView_oldHighestZOrder_shouldShowStatusBarTrue_statusBarShown() { setupOverlayViewController1(); setupOverlayViewController2(); - when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true); - when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true); setOverlayViewControllerAsShowing(mOverlayViewController1); setOverlayViewControllerAsShowing(mOverlayViewController2); + when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true); + when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true); when(mOverlayViewController2.shouldShowStatusBarInsets()).thenReturn(true); + reset(mWindowInsetsController); mOverlayViewGlobalStateController.hideView(mOverlayViewController1, mRunnable); @@ -917,7 +978,11 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase { private void setOverlayViewControllerAsShowing(OverlayViewController overlayViewController) { mOverlayViewGlobalStateController.showView(overlayViewController, /* show= */ null); + View layout = overlayViewController.getLayout(); reset(mSystemUIOverlayWindowController); + reset(overlayViewController); when(mSystemUIOverlayWindowController.getBaseLayout()).thenReturn(mBaseLayout); + when(overlayViewController.getLayout()).thenReturn(layout); + when(overlayViewController.isInflated()).thenReturn(true); } } From 3cc2f503bf48fdaa654eafee4c3382fe1c30aa97 Mon Sep 17 00:00:00 2001 From: kwaky Date: Fri, 5 Mar 2021 08:24:55 -0800 Subject: [PATCH 203/288] Move posting logic from PerDisplay to DisplayWIndowInsetsControllerImpl. Partial backport of I9a354f742167b907c32537eb022e22c0d5bfb97a. Bug: 178071393 Test: Manual & Existing Unit Tests Merged-In: I9a354f742167b907c32537eb022e22c0d5bfb97a Change-Id: Ie8210170776d1a5a3b736b6d43989cc59ba30f48 --- .../wm/DisplaySystemBarsController.java | 31 ++-- .../wm/DisplaySystemBarsControllerTest.java | 12 +- .../systemui/wm/DisplayImeController.java | 173 +++++++++++------- 3 files changed, 136 insertions(+), 80 deletions(-) diff --git a/packages/CarSystemUI/src/com/android/systemui/wm/DisplaySystemBarsController.java b/packages/CarSystemUI/src/com/android/systemui/wm/DisplaySystemBarsController.java index c9ec34fd5f088..bbab4388f17d3 100644 --- a/packages/CarSystemUI/src/com/android/systemui/wm/DisplaySystemBarsController.java +++ b/packages/CarSystemUI/src/com/android/systemui/wm/DisplaySystemBarsController.java @@ -16,12 +16,14 @@ package com.android.systemui.wm; +import android.content.Context; import android.os.Handler; import android.os.RemoteException; import android.util.ArraySet; import android.util.Slog; import android.util.SparseArray; import android.view.IDisplayWindowInsetsController; +import android.view.IWindowManager; import android.view.InsetsController; import android.view.InsetsSourceControl; import android.view.InsetsState; @@ -48,30 +50,32 @@ public class DisplaySystemBarsController extends DisplayImeController { private static final String TAG = "DisplaySystemBarsController"; + private final Context mContext; + private final Handler mHandler; + private SparseArray mPerDisplaySparseArray; @Inject public DisplaySystemBarsController( - SystemWindows syswin, + Context context, + IWindowManager wmService, DisplayController displayController, @Main Handler mainHandler, TransactionPool transactionPool) { - super(syswin, displayController, mainHandler, transactionPool); + super(wmService, displayController, mainHandler::post, transactionPool); + mContext = context; + mHandler = mainHandler; } @Override public void onDisplayAdded(int displayId) { PerDisplay pd = new PerDisplay(displayId); - try { - mSystemWindows.mWmService.setDisplayWindowInsetsController(displayId, pd); - } catch (RemoteException e) { - Slog.w(TAG, "Unable to set insets controller on display " + displayId); - } + pd.register(); // Lazy loading policy control filters instead of during boot. if (mPerDisplaySparseArray == null) { mPerDisplaySparseArray = new SparseArray<>(); - BarControlPolicy.reloadFromSetting(mSystemWindows.mContext); - BarControlPolicy.registerContentObserver(mSystemWindows.mContext, mHandler, () -> { + BarControlPolicy.reloadFromSetting(mContext); + BarControlPolicy.registerContentObserver(mContext, mHandler, () -> { int size = mPerDisplaySparseArray.size(); for (int i = 0; i < size; i++) { mPerDisplaySparseArray.valueAt(i).modifyDisplayWindowInsets(); @@ -84,7 +88,7 @@ public class DisplaySystemBarsController extends DisplayImeController { @Override public void onDisplayRemoved(int displayId) { try { - mSystemWindows.mWmService.setDisplayWindowInsetsController(displayId, null); + mWmService.setDisplayWindowInsetsController(displayId, null); } catch (RemoteException e) { Slog.w(TAG, "Unable to remove insets controller on display " + displayId); } @@ -100,11 +104,10 @@ public class DisplaySystemBarsController extends DisplayImeController { String mPackageName; PerDisplay(int displayId) { - super(displayId, - mSystemWindows.mDisplayController.getDisplayLayout(displayId).rotation()); + super(displayId, mDisplayController.getDisplayLayout(displayId).rotation()); mDisplayId = displayId; mInsetsController = new InsetsController( - new DisplaySystemBarsInsetsControllerHost(mHandler, this)); + new DisplaySystemBarsInsetsControllerHost(mHandler, mInsetsControllerImpl)); } @Override @@ -166,7 +169,7 @@ public class DisplaySystemBarsController extends DisplayImeController { showInsets(barVisibilities[0], /* fromIme= */ false); hideInsets(barVisibilities[1], /* fromIme= */ false); try { - mSystemWindows.mWmService.modifyDisplayWindowInsets(mDisplayId, mInsetsState); + mWmService.modifyDisplayWindowInsets(mDisplayId, mInsetsState); } catch (RemoteException e) { Slog.w(TAG, "Unable to update window manager service."); } diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/wm/DisplaySystemBarsControllerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/wm/DisplaySystemBarsControllerTest.java index 29cc8eec4bc3e..765a4e7900b5c 100644 --- a/packages/CarSystemUI/tests/src/com/android/systemui/wm/DisplaySystemBarsControllerTest.java +++ b/packages/CarSystemUI/tests/src/com/android/systemui/wm/DisplaySystemBarsControllerTest.java @@ -21,6 +21,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import android.car.settings.CarSettings; import android.os.Handler; @@ -29,6 +30,7 @@ import android.provider.Settings; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.view.IWindowManager; +import android.view.Surface; import androidx.test.filters.SmallTest; @@ -60,15 +62,20 @@ public class DisplaySystemBarsControllerTest extends SysuiTestCase { private Handler mHandler; @Mock private TransactionPool mTransactionPool; + @Mock + private DisplayLayout mDisplayLayout; @Before public void setUp() { MockitoAnnotations.initMocks(this); mSystemWindows.mContext = mContext; mSystemWindows.mWmService = mIWindowManager; + when(mDisplayLayout.rotation()).thenReturn(Surface.ROTATION_0); + when(mDisplayController.getDisplayLayout(DISPLAY_ID)).thenReturn(mDisplayLayout); mController = new DisplaySystemBarsController( - mSystemWindows, + mContext, + mIWindowManager, mDisplayController, mHandler, mTransactionPool @@ -81,7 +88,8 @@ public class DisplaySystemBarsControllerTest extends SysuiTestCase { mController.onDisplayAdded(DISPLAY_ID); verify(mIWindowManager).setDisplayWindowInsetsController( - eq(DISPLAY_ID), any(DisplaySystemBarsController.PerDisplay.class)); + eq(DISPLAY_ID), + any(DisplayImeController.PerDisplay.DisplayWindowInsetsControllerImpl.class)); } @Test diff --git a/packages/SystemUI/src/com/android/systemui/wm/DisplayImeController.java b/packages/SystemUI/src/com/android/systemui/wm/DisplayImeController.java index ab4da83518e40..20e09a2df1cbe 100644 --- a/packages/SystemUI/src/com/android/systemui/wm/DisplayImeController.java +++ b/packages/SystemUI/src/com/android/systemui/wm/DisplayImeController.java @@ -24,12 +24,12 @@ import android.content.Context; import android.content.res.Configuration; import android.graphics.Point; import android.graphics.Rect; -import android.os.Handler; import android.os.RemoteException; import android.os.ServiceManager; import android.util.Slog; import android.util.SparseArray; import android.view.IDisplayWindowInsetsController; +import android.view.IWindowManager; import android.view.InsetsSource; import android.view.InsetsSourceControl; import android.view.InsetsState; @@ -39,11 +39,15 @@ import android.view.WindowInsets; import android.view.animation.Interpolator; import android.view.animation.PathInterpolator; +import androidx.annotation.BinderThread; +import androidx.annotation.VisibleForTesting; + import com.android.internal.view.IInputMethodManager; import com.android.systemui.TransactionPool; import com.android.systemui.dagger.qualifiers.Main; import java.util.ArrayList; +import java.util.concurrent.Executor; import javax.inject.Inject; import javax.inject.Singleton; @@ -66,20 +70,22 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged private static final int DIRECTION_HIDE = 2; private static final int FLOATING_IME_BOTTOM_INSET = -80; - SystemWindows mSystemWindows; - final Handler mHandler; + protected final IWindowManager mWmService; + protected final Executor mMainExecutor; final TransactionPool mTransactionPool; + final DisplayController mDisplayController; final SparseArray mImePerDisplay = new SparseArray<>(); final ArrayList mPositionProcessors = new ArrayList<>(); @Inject - public DisplayImeController(SystemWindows syswin, DisplayController displayController, - @Main Handler mainHandler, TransactionPool transactionPool) { - mHandler = mainHandler; - mSystemWindows = syswin; + public DisplayImeController(IWindowManager wmService, DisplayController displayController, + @Main Executor mainExecutor, TransactionPool transactionPool) { + mWmService = wmService; + mMainExecutor = mainExecutor; mTransactionPool = transactionPool; + mDisplayController = displayController; displayController.addDisplayWindowListener(this); } @@ -88,12 +94,8 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged // Add's a system-ui window-manager specifically for ime. This type is special because // WM will defer IME inset handling to it in multi-window scenarious. PerDisplay pd = new PerDisplay(displayId, - mSystemWindows.mDisplayController.getDisplayLayout(displayId).rotation()); - try { - mSystemWindows.mWmService.setDisplayWindowInsetsController(displayId, pd); - } catch (RemoteException e) { - Slog.w(TAG, "Unable to set insets controller on display " + displayId); - } + mDisplayController.getDisplayLayout(displayId).rotation()); + pd.register(); mImePerDisplay.put(displayId, pd); } @@ -103,7 +105,7 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged if (pd == null) { return; } - if (mSystemWindows.mDisplayController.getDisplayLayout(displayId).rotation() + if (mDisplayController.getDisplayLayout(displayId).rotation() != pd.mRotation && isImeShowing(displayId)) { pd.startAnimation(true, false /* forceRestart */); } @@ -112,7 +114,7 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged @Override public void onDisplayRemoved(int displayId) { try { - mSystemWindows.mWmService.setDisplayWindowInsetsController(displayId, null); + mWmService.setDisplayWindowInsetsController(displayId, null); } catch (RemoteException e) { Slog.w(TAG, "Unable to remove insets controller on display " + displayId); } @@ -180,9 +182,12 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged } } - class PerDisplay extends IDisplayWindowInsetsController.Stub { + /** An implementation of {@link IDisplayWindowInsetsController} for a given display id. */ + public class PerDisplay { final int mDisplayId; final InsetsState mInsetsState = new InsetsState(); + protected final DisplayWindowInsetsControllerImpl mInsetsControllerImpl = + new DisplayWindowInsetsControllerImpl(); InsetsSourceControl mImeSourceControl = null; int mAnimationDirection = DIRECTION_NONE; ValueAnimator mAnimation = null; @@ -196,28 +201,32 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged mRotation = initialRotation; } - @Override - public void insetsChanged(InsetsState insetsState) { - mHandler.post(() -> { - if (mInsetsState.equals(insetsState)) { - return; - } - - mImeShowing = insetsState.getSourceOrDefaultVisibility(InsetsState.ITYPE_IME); - - final InsetsSource newSource = insetsState.getSource(InsetsState.ITYPE_IME); - final Rect newFrame = newSource.getFrame(); - final Rect oldFrame = mInsetsState.getSource(InsetsState.ITYPE_IME).getFrame(); - - mInsetsState.set(insetsState, true /* copySources */); - if (mImeShowing && !newFrame.equals(oldFrame) && newSource.isVisible()) { - if (DEBUG) Slog.d(TAG, "insetsChanged when IME showing, restart animation"); - startAnimation(mImeShowing, true /* forceRestart */); - } - }); + public void register() { + try { + mWmService.setDisplayWindowInsetsController(mDisplayId, mInsetsControllerImpl); + } catch (RemoteException e) { + Slog.w(TAG, "Unable to set insets controller on display " + mDisplayId); + } + } + + public void insetsChanged(InsetsState insetsState) { + if (mInsetsState.equals(insetsState)) { + return; + } + + mImeShowing = insetsState.getSourceOrDefaultVisibility(InsetsState.ITYPE_IME); + + final InsetsSource newSource = insetsState.getSource(InsetsState.ITYPE_IME); + final Rect newFrame = newSource.getFrame(); + final Rect oldFrame = mInsetsState.getSource(InsetsState.ITYPE_IME).getFrame(); + + mInsetsState.set(insetsState, true /* copySources */); + if (mImeShowing && !newFrame.equals(oldFrame) && newSource.isVisible()) { + if (DEBUG) Slog.d(TAG, "insetsChanged when IME showing, restart animation"); + startAnimation(mImeShowing, true /* forceRestart */); + } } - @Override public void insetsControlChanged(InsetsState insetsState, InsetsSourceControl[] activeControls) { insetsChanged(insetsState); @@ -227,27 +236,25 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged continue; } if (activeControl.getType() == InsetsState.ITYPE_IME) { - mHandler.post(() -> { - final Point lastSurfacePosition = mImeSourceControl != null - ? mImeSourceControl.getSurfacePosition() : null; - final boolean positionChanged = - !activeControl.getSurfacePosition().equals(lastSurfacePosition); - final boolean leashChanged = - !haveSameLeash(mImeSourceControl, activeControl); - mImeSourceControl = activeControl; - if (mAnimation != null) { - if (positionChanged) { - startAnimation(mImeShowing, true /* forceRestart */); - } - } else { - if (leashChanged) { - applyVisibilityToLeash(); - } - if (!mImeShowing) { - removeImeSurface(); - } + final Point lastSurfacePosition = mImeSourceControl != null + ? mImeSourceControl.getSurfacePosition() : null; + final boolean positionChanged = + !activeControl.getSurfacePosition().equals(lastSurfacePosition); + final boolean leashChanged = + !haveSameLeash(mImeSourceControl, activeControl); + mImeSourceControl = activeControl; + if (mAnimation != null) { + if (positionChanged) { + startAnimation(mImeShowing, true /* forceRestart */); } - }); + } else { + if (leashChanged) { + applyVisibilityToLeash(); + } + if (!mImeShowing) { + removeImeSurface(); + } + } } } } @@ -267,25 +274,22 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged } } - @Override public void showInsets(int types, boolean fromIme) { if ((types & WindowInsets.Type.ime()) == 0) { return; } if (DEBUG) Slog.d(TAG, "Got showInsets for ime"); - mHandler.post(() -> startAnimation(true /* show */, false /* forceRestart */)); + startAnimation(true /* show */, false /* forceRestart */); } - @Override public void hideInsets(int types, boolean fromIme) { if ((types & WindowInsets.Type.ime()) == 0) { return; } if (DEBUG) Slog.d(TAG, "Got hideInsets for ime"); - mHandler.post(() -> startAnimation(false /* show */, false /* forceRestart */)); + startAnimation(false /* show */, false /* forceRestart */); } - @Override public void topFocusedWindowChanged(String packageName) { // no-op } @@ -296,7 +300,7 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged private void setVisibleDirectly(boolean visible) { mInsetsState.getSource(InsetsState.ITYPE_IME).setVisible(visible); try { - mSystemWindows.mWmService.modifyDisplayWindowInsets(mDisplayId, mInsetsState); + mWmService.modifyDisplayWindowInsets(mDisplayId, mInsetsState); } catch (RemoteException e) { } } @@ -315,7 +319,7 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged // an IME inset). For now, we assume that no non-floating IME will be <= this nav bar // frame height so any reported frame that is <= nav-bar frame height is assumed to // be floating. - return frame.height() <= mSystemWindows.mDisplayController.getDisplayLayout(mDisplayId) + return frame.height() <= mDisplayController.getDisplayLayout(mDisplayId) .navBarFrameHeight(); } @@ -331,7 +335,7 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged // pretend the ime has some size just below the screen. mImeFrame.set(newFrame); final int floatingInset = (int) ( - mSystemWindows.mDisplayController.getDisplayLayout(mDisplayId).density() + mDisplayController.getDisplayLayout(mDisplayId).density() * FLOATING_IME_BOTTOM_INSET); mImeFrame.bottom -= floatingInset; } else if (newFrame.height() != 0) { @@ -448,6 +452,47 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged setVisibleDirectly(true /* visible */); } } + + @VisibleForTesting + @BinderThread + public class DisplayWindowInsetsControllerImpl + extends IDisplayWindowInsetsController.Stub { + @Override + public void topFocusedWindowChanged(String packageName) throws RemoteException { + mMainExecutor.execute(() -> { + PerDisplay.this.topFocusedWindowChanged(packageName); + }); + } + + @Override + public void insetsChanged(InsetsState insetsState) throws RemoteException { + mMainExecutor.execute(() -> { + PerDisplay.this.insetsChanged(insetsState); + }); + } + + @Override + public void insetsControlChanged(InsetsState insetsState, + InsetsSourceControl[] activeControls) throws RemoteException { + mMainExecutor.execute(() -> { + PerDisplay.this.insetsControlChanged(insetsState, activeControls); + }); + } + + @Override + public void showInsets(int types, boolean fromIme) throws RemoteException { + mMainExecutor.execute(() -> { + PerDisplay.this.showInsets(types, fromIme); + }); + } + + @Override + public void hideInsets(int types, boolean fromIme) throws RemoteException { + mMainExecutor.execute(() -> { + PerDisplay.this.hideInsets(types, fromIme); + }); + } + } } void removeImeSurface() { From 4300a836e83c0fb809b5151a5afff0433d973db9 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 6 Mar 2021 06:03:48 +0000 Subject: [PATCH 204/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I0d82243b8456ec67b6e96381dff6231d6b1a845f --- core/res/res/values-be/strings.xml | 2 +- core/res/res/values-es-rUS/strings.xml | 46 +++++++++++++------------- core/res/res/values-hi/strings.xml | 2 +- core/res/res/values-ky/strings.xml | 2 +- core/res/res/values-pt-rPT/strings.xml | 4 +-- core/res/res/values-tl/strings.xml | 2 +- core/res/res/values-vi/strings.xml | 4 +-- 7 files changed, 31 insertions(+), 31 deletions(-) diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index 6fbdd4626b94a..78ed3a86a6974 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -775,7 +775,7 @@ "Гадавіна" "Іншае" "Карыстальніцкая" - "Хатні" + "Асабістая" "Працоўная" "Іншая" "Мабільны" diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 4d93d6eaf641c..e0a35ac95a9b2 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -325,8 +325,8 @@ "Controla el posicionamiento y el nivel de zoom de la pantalla." "Usar gestos" "Permite presionar, deslizar, pellizcar y usar otros gestos." - "Gestos del sensor de huellas digitales" - "Captura los gestos que se hacen en el sensor de huellas digitales del dispositivo." + "Gestos del sensor de huellas dactilares" + "Captura los gestos que se hacen en el sensor de huellas dactilares del dispositivo." "Tomar captura de pantalla" "Puede tomar una captura de la pantalla." "desactivar o modificar la barra de estado" @@ -511,9 +511,9 @@ "Permite que la app conecte el dispositivo Android TV a redes WiMAX y que lo desconecte de ellas." "Permite que la aplicación conecte el dispositivo a una red WiMAX y que lo desconecte de ella." "vincular con dispositivos Bluetooth" - "Permite que la aplicación vea la configuración de Bluetooth de la tablet y que cree y acepte conexiones con los dispositivos sincronizados." - "Permite que la app vea la configuración de Bluetooth del dispositivo Android TV, así como que cree y acepte conexiones con los dispositivos sincronizados." - "Permite que la aplicación vea la configuración de Bluetooth del dispositivo y que cree y acepte conexiones con los dispositivos sincronizados." + "Permite que la aplicación vea la configuración de Bluetooth de la tablet y que cree y acepte conexiones con los dispositivos vinculados." + "Permite que la app vea la configuración de Bluetooth del dispositivo Android TV, así como que cree y acepte conexiones con los dispositivos vinculados." + "Permite que la aplicación vea la configuración de Bluetooth del dispositivo y que cree y acepte conexiones con los dispositivos vinculados." "Información sobre servicio de pago NFC preferido" "Permite que la app reciba información del servicio de pago NFC preferido, como el servicio de asistencia registrado y el destino de la ruta." "controlar la Transmisión de datos en proximidad" @@ -524,10 +524,10 @@ "Permite que la app conozca el nivel de complejidad del bloqueo de pantalla (alta, media, baja o ninguna), lo que indica el rango de duración posible y el tipo de bloqueo. La app también puede sugerirles a los usuarios que actualicen el bloqueo de pantalla a un determinado nivel, aunque ellos pueden ignorar esta sugerencia y seguir navegando. Ten en cuenta que el bloqueo de pantalla no se almacena como texto sin formato, por lo que la app no conoce la contraseña exacta." "usar hardware biométrico" "Permite que la app use hardware biométrico para realizar la autenticación" - "Administrar el hardware de huellas digitales" - "Permite que la aplicación emplee métodos para agregar y eliminar plantillas de huellas digitales para su uso." - "Utilizar hardware de huellas digitales" - "Permite que la aplicación utilice el hardware de huellas digitales para realizar la autenticación." + "Administrar el hardware de huellas dactilares" + "Permite que la aplicación emplee métodos para agregar y eliminar plantillas de huellas dactilares para su uso." + "Utilizar hardware de huellas dactilares" + "Permite que la aplicación utilice el hardware de huellas dactilares para realizar la autenticación." "modificar tu colección de música" "Permite que la app modifique tu colección de música." "modificar tu colección de videos" @@ -542,31 +542,31 @@ "No se reconoció" "Se canceló la autenticación" "No se estableció ningún PIN, patrón ni contraseña" - "Se detectó parcialmente la huella digital. Vuelve a intentarlo." - "No se pudo procesar la huella digital. Vuelve a intentarlo." - "El sensor de huellas digitales está sucio. Limpia el sensor y vuelve a intentarlo." + "Se detectó parcialmente la huella dactilar. Vuelve a intentarlo." + "No se pudo procesar la huella dactilar. Vuelve a intentarlo." + "El sensor de huellas dactilares está sucio. Limpia el sensor y vuelve a intentarlo." "Moviste el dedo muy rápido. Vuelve a intentarlo." "Moviste el dedo muy lento. Vuelve a intentarlo." - "Se autenticó la huella digital" + "Se autenticó la huella dactilar" "Se autenticó el rostro" "Se autenticó el rostro; presiona Confirmar" - "El hardware para detectar huellas digitales no está disponible." - "No se puede almacenar la huella digital. Elimina una de las existentes." - "Finalizó el tiempo de espera para la huella digital. Vuelve a intentarlo." - "Se canceló la operación de huella digital." - "El usuario canceló la operación de huella digital." + "El hardware para detectar huellas dactilares no está disponible." + "No se puede almacenar la huella dactilar. Elimina una de las existentes." + "Finalizó el tiempo de espera para la huella dactilar. Vuelve a intentarlo." + "Se canceló la operación de huella dactilar." + "El usuario canceló la operación de huella dactilar." "Demasiados intentos. Vuelve a intentarlo más tarde." - "Realizaste demasiados intentos. Se inhabilitó el sensor de huellas digitales." + "Realizaste demasiados intentos. Se inhabilitó el sensor de huellas dactilares." "Vuelve a intentarlo." "No se registraron huellas digitales." - "Este dispositivo no tiene sensor de huellas digitales." + "Este dispositivo no tiene sensor de huellas dactilares." "Se inhabilitó temporalmente el sensor." "Dedo %d" - "Ícono de huella digital" + "Ícono de huella dactilar" "administrar el hardware de desbloqueo facial" "Permite que la app emplee métodos para agregar y borrar plantillas de rostros para su uso." "usar el hardware de desbloqueo facial" @@ -1539,8 +1539,8 @@ "Expira el:" "Número de serie:" "Huellas digitales:" - "Huella digital SHA-256" - "Huella digital SHA-1:" + "Huella dactilar SHA-256" + "Huella dactilar SHA-1:" "Ver todas" "Elige actividad" "Compartir con" diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index cd307dfb9d40e..139e6b4862b98 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -1326,7 +1326,7 @@ "आपके एडमिन ने इस डिवाइस की समस्या को हल करने में सहायता के लिए एक गड़बड़ी की रिपोर्ट का अनुरोध किया है. ऐप्लिकेशन और डेटा शेयर किए जा सकते हैं." "शेयर करें" "अस्वीकार करें" - "इनपुट पद्धति चुनें" + "इनपुट का तरीका चुनें" "सामान्य कीबोर्ड के सक्रिय होने के दौरान इसे स्‍क्रीन पर बनाए रखें" "वर्चुअल कीबोर्ड दिखाएं" "सामान्य कीबोर्ड कॉन्फ़िगर करें" diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index c42cf953c6515..ed25123ed39da 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -996,7 +996,7 @@ Акыркы %d күн Акыркы %d күн - "Өткөн ай" + "Акыркы ай" "Эскирээк" "%s күнү" "саат %s" diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index d3cb8528683f4..6de3cdffefaea 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -254,7 +254,7 @@ A tirar uma captura de ecrã do relatório de erro dentro de %d segundo… "Captura de ecrã tirada com o relatório de erro." - "Falha ao tirar captura de ecrã com o relatório de erro." + "Falha ao fazer captura de ecrã com o relatório de erro." "Modo silencioso" "Som desativado" "O som está ativado" @@ -327,7 +327,7 @@ "É possível tocar, deslizar rapidamente, juntar os dedos e realizar outros gestos" "Gestos de impressão digital" "Pode capturar gestos realizados no sensor de impressões digitais do dispositivo." - "Tirar captura de ecrã" + "Fazer captura de ecrã" "É possível tirar uma captura de ecrã." "desativar ou modificar barra de estado" "Permite à app desativar a barra de estado ou adicionar e remover ícones do sistema." diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index f68ed31dabe16..0bd750f1aa336 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -220,7 +220,7 @@ "Naghahandang i-update…" "Pinoproseso ang package ng update…" "Nagre-restart…" - "I-reset ang data ng factory" + "Pag-reset sa factory data" "Nagre-restart…" "Nagsa-shut down…" "Mag-shut down ang iyong tablet." diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index bf7fbca645810..71d93ba829513 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -967,7 +967,7 @@ "Nhớ" "Chưa bao giờ" "Bạn không được phép mở trang này." - "Đã sao chép văn bản vào khay nhớ tạm thời." + "Đã sao chép văn bản vào bảng nhớ tạm thời." "Đã sao chép" "Thêm" "Trình đơn+" @@ -1092,7 +1092,7 @@ "Chọn tất cả" "Cắt" "Sao chép" - "Không sao chép được vào khay nhớ tạm" + "Không sao chép được vào bảng nhớ tạm" "Dán" "Dán dưới dạng văn bản thuần túy" "Thay thế..." From 00a59e27cd8aea553e65b6653eb9ccba6be4b4eb Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 7 Mar 2021 14:26:31 +0000 Subject: [PATCH 205/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I7fef91b6575f26e635bdcfa0eeef688cf64ac04c --- packages/InputDevices/res/values-eu/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/InputDevices/res/values-eu/strings.xml b/packages/InputDevices/res/values-eu/strings.xml index 18d3eb745574a..fe4110aa26142 100644 --- a/packages/InputDevices/res/values-eu/strings.xml +++ b/packages/InputDevices/res/values-eu/strings.xml @@ -38,9 +38,9 @@ "Arabiarra" "Greziarra" "Hebrearra" - "Lituaniera" - "Espainiera (Latinoamerika)" - "Letoniera" + "Lituaniarra" + "Espainiarra (Latinoamerika)" + "Letoniarra" "Persiarra" "Azerbaijandarra" "Poloniarra" From f6fc46a76da7c79fe3f4e40507db4e6f1744249c Mon Sep 17 00:00:00 2001 From: wilsonshih Date: Tue, 2 Mar 2021 12:33:27 +0800 Subject: [PATCH 206/288] [RESTRICT AUTOMERGE]Fix launching app from work profile cannot show splash screen. Unable to find resource if the application is installed from work profile, which cause the splash screen window cannot build up normally. Bug: 179819075 Test: atest ActivityRecordTests Merged-In: I1bfd48fc32d549feee687c56fe9cdbcae789813f Change-Id: I1bfd48fc32d549feee687c56fe9cdbcae789813f --- .../android/server/policy/PhoneWindowManager.java | 12 +++++++----- .../android/server/policy/WindowManagerPolicy.java | 6 +++--- .../android/server/wm/SplashScreenStartingData.java | 4 ++-- .../android/server/wm/TestWindowManagerPolicy.java | 6 +++--- 4 files changed, 15 insertions(+), 13 deletions(-) diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 5e5a53d066f6e..f0439a3db4fc0 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -2299,9 +2299,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { /** {@inheritDoc} */ @Override - public StartingSurface addSplashScreen(IBinder appToken, String packageName, int theme, - CompatibilityInfo compatInfo, CharSequence nonLocalizedLabel, int labelRes, int icon, - int logo, int windowFlags, Configuration overrideConfig, int displayId) { + public StartingSurface addSplashScreen(IBinder appToken, int userId, String packageName, + int theme, CompatibilityInfo compatInfo, CharSequence nonLocalizedLabel, int labelRes, + int icon, int logo, int windowFlags, Configuration overrideConfig, int displayId) { if (!SHOW_SPLASH_SCREENS) { return null; } @@ -2328,10 +2328,12 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (theme != context.getThemeResId() || labelRes != 0) { try { - context = context.createPackageContext(packageName, CONTEXT_RESTRICTED); + context = context.createPackageContextAsUser(packageName, CONTEXT_RESTRICTED, + UserHandle.of(userId)); context.setTheme(theme); } catch (PackageManager.NameNotFoundException e) { - // Ignore + Slog.w(TAG, "Failed creating package context with package name " + + packageName + " for user " + userId, e); } } diff --git a/services/core/java/com/android/server/policy/WindowManagerPolicy.java b/services/core/java/com/android/server/policy/WindowManagerPolicy.java index b9431a6968f9f..cffeaf3f47679 100644 --- a/services/core/java/com/android/server/policy/WindowManagerPolicy.java +++ b/services/core/java/com/android/server/policy/WindowManagerPolicy.java @@ -933,9 +933,9 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants { * @return The starting surface. * */ - public StartingSurface addSplashScreen(IBinder appToken, String packageName, int theme, - CompatibilityInfo compatInfo, CharSequence nonLocalizedLabel, int labelRes, int icon, - int logo, int windowFlags, Configuration overrideConfig, int displayId); + public StartingSurface addSplashScreen(IBinder appToken, int userId, String packageName, + int theme, CompatibilityInfo compatInfo, CharSequence nonLocalizedLabel, int labelRes, + int icon, int logo, int windowFlags, Configuration overrideConfig, int displayId); /** * Set or clear a window which can behave as the keyguard. diff --git a/services/core/java/com/android/server/wm/SplashScreenStartingData.java b/services/core/java/com/android/server/wm/SplashScreenStartingData.java index 726b7dac69389..f77df2fc06c91 100644 --- a/services/core/java/com/android/server/wm/SplashScreenStartingData.java +++ b/services/core/java/com/android/server/wm/SplashScreenStartingData.java @@ -53,8 +53,8 @@ class SplashScreenStartingData extends StartingData { @Override StartingSurface createStartingSurface(ActivityRecord activity) { - return mService.mPolicy.addSplashScreen(activity.token, mPkg, mTheme, mCompatInfo, - mNonLocalizedLabel, mLabelRes, mIcon, mLogo, mWindowFlags, + return mService.mPolicy.addSplashScreen(activity.token, activity.mUserId, mPkg, mTheme, + mCompatInfo, mNonLocalizedLabel, mLabelRes, mIcon, mLogo, mWindowFlags, mMergedOverrideConfiguration, activity.getDisplayContent().getDisplayId()); } } diff --git a/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java b/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java index 4a8e8dafb57db..979bbdad250b2 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java +++ b/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java @@ -109,9 +109,9 @@ class TestWindowManagerPolicy implements WindowManagerPolicy { } @Override - public StartingSurface addSplashScreen(IBinder appToken, String packageName, int theme, - CompatibilityInfo compatInfo, CharSequence nonLocalizedLabel, int labelRes, int icon, - int logo, int windowFlags, Configuration overrideConfig, int displayId) { + public StartingSurface addSplashScreen(IBinder appToken, int userId, String packageName, + int theme, CompatibilityInfo compatInfo, CharSequence nonLocalizedLabel, int labelRes, + int icon, int logo, int windowFlags, Configuration overrideConfig, int displayId) { final com.android.server.wm.WindowState window; final ActivityRecord activity; final WindowManagerService wm = mWmSupplier.get(); From 8fc8c017f3e9c623ea273528f04425dfce0482e8 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 8 Mar 2021 08:33:51 +0000 Subject: [PATCH 207/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I1e4528f615372f2cfbbcfd068a9c31fd5bdd7157 --- packages/SystemUI/res/values-es-rUS/strings.xml | 10 +++++----- packages/SystemUI/res/values-hy/strings.xml | 2 +- packages/SystemUI/res/values-lv/strings.xml | 2 +- packages/SystemUI/res/values-my/strings.xml | 2 +- packages/SystemUI/res/values-vi/strings.xml | 4 ++-- packages/SystemUI/res/values-zh-rTW/strings.xml | 2 +- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index 36230e0be18cc..d99961434f2f6 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -58,7 +58,7 @@ "Abrir siempre %1$s cuando se conecte %2$s" "Abrir siempre %1$s cuando se conecte %2$s" "¿Permitir depuración por USB?" - "La huella digital de tu clave RSA es:\n%1$s" + "La huella dactilar de tu clave RSA es:\n%1$s" "Permitir siempre desde esta computadora" "Permitir" "No tienes permitida la depuración por USB" @@ -128,8 +128,8 @@ "Teléfono" "Asistente voz" "Desbloquear" - "Esperando huella digital" - "Desbloquear sin utilizar la huella digital" + "Esperando huella dactilar" + "Desbloquear sin utilizar la huella dactilar" "Escaneando rostro" "Enviar" "Administrar notificaciones" @@ -168,8 +168,8 @@ "Hubo demasiados intentos incorrectos. Se borrará este usuario." "Hubo demasiados intentos incorrectos. Se borrarán este perfil de trabajo y sus datos." "Descartar" - "Toca el sensor de huellas digitales" - "Ícono de huella digital" + "Toca el sensor de huellas dactilares" + "Ícono de huella dactilar" "Autenticando tu rostro…" "Ícono de rostro" "Botón de zoom de compatibilidad" diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index af9a11635cac7..514e60b3ecd74 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -997,7 +997,7 @@ "տեսախցիկը" "վայրը" "խոսափողը" - "Տվիչներն անջատած են" + "Տվիչներն անջատված են" "Սարքի ծառայություններ" "Անանուն" "Հպեք՝ հավելվածը վերագործարկելու և լիաէկրան ռեժիմին անցնելու համար։" diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index 56709cf683ba6..7c64e26136bb8 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -718,7 +718,7 @@ "Atkarībā no tālruņa iestatījumiem var zvanīt vai vibrēt" "Atkarībā no tālruņa iestatījumiem var zvanīt vai vibrēt. Sarunas no lietotnes %1$s pēc noklusējuma tiek parādītas burbulī." "Piesaista jūsu uzmanību, rādot peldošu saīsni uz šo saturu." - "Parādās sarunu sadaļas augšdaļā un kā peldošs burbulis, kā arī bloķēšanas ekrānā tiek rādīts profila attēls" + "Parādās sarunu sadaļas augšdaļā, arī kā peldošs burbulis, profila attēls parādās bloķēšanas ekrānā" "Iestatījumi" "Prioritārs" "Lietotnē %1$s netiek atbalstītas sarunu funkcijas." diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index 4367ad123ff05..837c7817f3b32 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -223,7 +223,7 @@ "LTE" "LTE+" "1X" - "ပြင်ပကွန်ရက်နှင့် ချိတ်ဆက်ခြင်း" + "ပြင်ပကွန်ရက်သုံးခြင်း" "EDGE" "Wi-Fi" "ဆင်းကဒ်မရှိပါ။" diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 8ae1e1a01bf85..9ff77b4fd6709 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -833,7 +833,7 @@ "Loại nút bổ sung bên phải" "(mặc định)" - "Khay nhớ tạm" + "Bảng nhớ tạm" "Mã phím" "Xác nhận xoay, trình chuyển đổi bàn phím" "Không có" @@ -848,7 +848,7 @@ "Lưu" "Đặt lại" "Điều chỉnh chiều rộng nút" - "Khay nhớ tạm" + "Bảng nhớ tạm" "Nút điều hướng tùy chỉnh" "Mã phím bên trái" "Mã phím bên phải" diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 010f954059a95..d54b0ae92a1cd 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -71,7 +71,7 @@ "目前登入這部裝置的使用者無法開啟無線偵錯功能。如要使用這項功能,請切換到主要使用者。" "USB 連接埠已停用" "為了避免液體或灰塵導致你的裝置受損,系統已停用 USB 連接埠,因此目前無法偵測任何配件。\n\n系統會在可繼續使用 USB 連接埠時通知你。" - "USB 通訊埠已啟用,可偵測充電器和配件" + "USB 連接埠已啟用,可偵測充電器和配件" "啟用 USB 連接埠" "瞭解詳情" "放大為全螢幕" From 031e607a5a391bc2ab704447c624f8753c9bac0d Mon Sep 17 00:00:00 2001 From: Martijn Coenen Date: Tue, 24 Nov 2020 13:24:53 +0100 Subject: [PATCH 208/288] Use futures for binding and talking to the ExternalStorageService. Patching this CL since it fixes the issue of screen freezing after switching user. The existing CountdownLatch logic had some corner cases where it would continue waiting for the latch to count down, even when it was already clear that the operation couldn't succeed (eg, a bind failed). To fix this, as well as try and simplify some of this code, switch to using futures, which have a nicely defined way of cancelling outstanding operations. Additionally, switch to using a dedicated handler thread for receiving bind events for all users, not just demo users. This avoids having to wait for a long time when the system_server main thread is busy. Fix: 180930791 Test: atest AdoptableHostTest atest CtsScopedStorageHostTest atest android.multiuser.UserLifecycleTests#managedProfileUnlock atest android.multiuser.UserLifecycleTests#managedProfileUnlockAndLaunchApp_stopped Change-Id: Id58970106d152e5d200cfd3993fd83b93b975156 Merged-In: I1b7fde2f6ed1074b9c814d56808ab1614f25aead (cherry picked from commit 9252dfb49348928247b082435a61edbacfc60ef7) --- .../server/storage/StorageUserConnection.java | 279 +++++++----------- 1 file changed, 105 insertions(+), 174 deletions(-) diff --git a/services/core/java/com/android/server/storage/StorageUserConnection.java b/services/core/java/com/android/server/storage/StorageUserConnection.java index 1c29c69239f67..af2628971bddf 100644 --- a/services/core/java/com/android/server/storage/StorageUserConnection.java +++ b/services/core/java/com/android/server/storage/StorageUserConnection.java @@ -23,6 +23,7 @@ import static android.service.storage.ExternalStorageService.FLAG_SESSION_TYPE_F import static com.android.server.storage.StorageSessionController.ExternalStorageServiceException; import android.annotation.MainThread; +import android.annotation.NonNull; import android.annotation.Nullable; import android.content.ComponentName; import android.content.Context; @@ -34,13 +35,12 @@ import android.os.IBinder; import android.os.ParcelFileDescriptor; import android.os.ParcelableException; import android.os.RemoteCallback; +import android.os.RemoteException; import android.os.UserHandle; -import android.os.UserManagerInternal; import android.os.storage.StorageManagerInternal; import android.os.storage.StorageVolume; import android.service.storage.ExternalStorageService; import android.service.storage.IExternalStorageService; -import android.text.TextUtils; import android.util.Slog; import com.android.internal.annotations.GuardedBy; @@ -48,14 +48,14 @@ import com.android.internal.util.Preconditions; import com.android.server.LocalServices; import java.io.IOException; +import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Objects; import java.util.Set; -import java.util.concurrent.CountDownLatch; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; /** * Controls the lifecycle of the {@link ActiveConnection} to an {@link ExternalStorageService} @@ -66,25 +66,20 @@ public final class StorageUserConnection { private static final int DEFAULT_REMOTE_TIMEOUT_SECONDS = 20; - private final Object mLock = new Object(); + private final Object mSessionsLock = new Object(); private final Context mContext; private final int mUserId; private final StorageSessionController mSessionController; private final ActiveConnection mActiveConnection = new ActiveConnection(); - private final boolean mIsDemoUser; @GuardedBy("mLock") private final Map mSessions = new HashMap<>(); - @GuardedBy("mLock") @Nullable private HandlerThread mHandlerThread; + private final HandlerThread mHandlerThread; public StorageUserConnection(Context context, int userId, StorageSessionController controller) { mContext = Objects.requireNonNull(context); mUserId = Preconditions.checkArgumentNonnegative(userId); mSessionController = controller; - mIsDemoUser = LocalServices.getService(UserManagerInternal.class) - .getUserInfo(userId).isDemo(); - if (mIsDemoUser) { - mHandlerThread = new HandlerThread("StorageUserConnectionThread-" + mUserId); - mHandlerThread.start(); - } + mHandlerThread = new HandlerThread("StorageUserConnectionThread-" + mUserId); + mHandlerThread.start(); } /** @@ -101,13 +96,12 @@ public final class StorageUserConnection { Objects.requireNonNull(upperPath); Objects.requireNonNull(lowerPath); - prepareRemote(); - synchronized (mLock) { + Session session = new Session(sessionId, upperPath, lowerPath); + synchronized (mSessionsLock) { Preconditions.checkArgument(!mSessions.containsKey(sessionId)); - Session session = new Session(sessionId, upperPath, lowerPath); mSessions.put(sessionId, session); - mActiveConnection.startSessionLocked(session, pfd); } + mActiveConnection.startSession(session, pfd); } /** @@ -121,10 +115,13 @@ public final class StorageUserConnection { Objects.requireNonNull(sessionId); Objects.requireNonNull(vol); - prepareRemote(); - synchronized (mLock) { - mActiveConnection.notifyVolumeStateChangedLocked(sessionId, vol); + synchronized (mSessionsLock) { + if (!mSessions.containsKey(sessionId)) { + Slog.i(TAG, "No session found for sessionId: " + sessionId); + return; + } } + mActiveConnection.notifyVolumeStateChanged(sessionId, vol); } /** @@ -135,7 +132,7 @@ public final class StorageUserConnection { * with {@link #waitForExit}. **/ public Session removeSession(String sessionId) { - synchronized (mLock) { + synchronized (mSessionsLock) { return mSessions.remove(sessionId); } } @@ -153,10 +150,7 @@ public final class StorageUserConnection { } Slog.i(TAG, "Waiting for session end " + session + " ..."); - prepareRemote(); - synchronized (mLock) { - mActiveConnection.endSessionLocked(session); - } + mActiveConnection.endSession(session); } /** Restarts all available sessions for a user without blocking. @@ -164,7 +158,7 @@ public final class StorageUserConnection { * Any failures will be ignored. **/ public void resetUserSessions() { - synchronized (mLock) { + synchronized (mSessionsLock) { if (mSessions.isEmpty()) { // Nothing to reset if we have no sessions to restart; we typically // hit this path if the user was consciously shut down. @@ -179,7 +173,7 @@ public final class StorageUserConnection { * Removes all sessions, without waiting. */ public void removeAllSessions() { - synchronized (mLock) { + synchronized (mSessionsLock) { Slog.i(TAG, "Removing " + mSessions.size() + " sessions for user: " + mUserId + "..."); mSessions.clear(); } @@ -191,68 +185,54 @@ public final class StorageUserConnection { */ public void close() { mActiveConnection.close(); - if (mIsDemoUser) { - mHandlerThread.quit(); - } + mHandlerThread.quit(); } /** Returns all created sessions. */ public Set getAllSessionIds() { - synchronized (mLock) { + synchronized (mSessionsLock) { return new HashSet<>(mSessions.keySet()); } } - private void prepareRemote() throws ExternalStorageServiceException { - try { - waitForLatch(mActiveConnection.bind(), "remote_prepare_user " + mUserId); - } catch (IllegalStateException | TimeoutException e) { - throw new ExternalStorageServiceException("Failed to prepare remote", e); - } - } - - private void waitForLatch(CountDownLatch latch, String reason) throws TimeoutException { - try { - if (!latch.await(DEFAULT_REMOTE_TIMEOUT_SECONDS, TimeUnit.SECONDS)) { - // TODO(b/140025078): Call ActivityManager ANR API? - Slog.wtf(TAG, "Failed to bind to the ExternalStorageService for user " + mUserId); - throw new TimeoutException("Latch wait for " + reason + " elapsed"); - } - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - throw new IllegalStateException("Latch wait for " + reason + " interrupted"); - } + @FunctionalInterface + interface AsyncStorageServiceCall { + void run(@NonNull IExternalStorageService service, RemoteCallback callback) throws + RemoteException; } private final class ActiveConnection implements AutoCloseable { + private final Object mLock = new Object(); + // Lifecycle connection to the external storage service, needed to unbind. @GuardedBy("mLock") @Nullable private ServiceConnection mServiceConnection; - // True if we are connecting, either bound or binding - // False && mRemote != null means we are connected - // False && mRemote == null means we are neither connecting nor connected - @GuardedBy("mLock") @Nullable private boolean mIsConnecting; - // Binder object representing the external storage service. - // Non-null indicates we are connected - @GuardedBy("mLock") @Nullable private IExternalStorageService mRemote; - // Exception, if any, thrown from #startSessionLocked or #endSessionLocked - // Local variables cannot be referenced from a lambda expression :( so we - // save the exception received in the callback here. Since we guard access - // (and clear the exception state) with the same lock which we hold during - // the entire transaction, there is no risk of race. - @GuardedBy("mLock") @Nullable private ParcelableException mLastException; - // Not guarded by any lock intentionally and non final because we cannot - // reset latches so need to create a new one after one use - private CountDownLatch mLatch; + + // A future that holds the remote interface + @GuardedBy("mLock") + @Nullable private CompletableFuture mRemoteFuture; + + // A list of outstanding futures for async calls, for which we are still waiting + // for a callback. Used to unblock waiters if the service dies. + @GuardedBy("mLock") + private ArrayList> mOutstandingOps = new ArrayList<>(); @Override public void close() { ServiceConnection oldConnection = null; synchronized (mLock) { Slog.i(TAG, "Closing connection for user " + mUserId); - mIsConnecting = false; oldConnection = mServiceConnection; mServiceConnection = null; - mRemote = null; + if (mRemoteFuture != null) { + // Let folks who are waiting for the connection know it ain't gonna happen + mRemoteFuture.cancel(true); + mRemoteFuture = null; + } + // Let folks waiting for callbacks from the remote know it ain't gonna happen + for (CompletableFuture op : mOutstandingOps) { + op.cancel(true); + } + mOutstandingOps.clear(); } if (oldConnection != null) { @@ -266,37 +246,37 @@ public final class StorageUserConnection { } } - public boolean isActiveLocked(Session session) { - if (!session.isInitialisedLocked()) { - Slog.i(TAG, "Session not initialised " + session); - return false; - } + private void waitForAsync(AsyncStorageServiceCall asyncCall) throws Exception { + CompletableFuture serviceFuture = connectIfNeeded(); + CompletableFuture opFuture = new CompletableFuture<>(); - if (mRemote == null) { - throw new IllegalStateException("Valid session with inactive connection"); + try { + synchronized (mLock) { + mOutstandingOps.add(opFuture); + } + serviceFuture.thenCompose(service -> { + try { + asyncCall.run(service, + new RemoteCallback(result -> setResult(result, opFuture))); + } catch (RemoteException e) { + opFuture.completeExceptionally(e); + } + + return opFuture; + }).get(DEFAULT_REMOTE_TIMEOUT_SECONDS, TimeUnit.SECONDS); + } finally { + synchronized (mLock) { + mOutstandingOps.remove(opFuture); + } } - return true; } - public void startSessionLocked(Session session, ParcelFileDescriptor fd) + public void startSession(Session session, ParcelFileDescriptor fd) throws ExternalStorageServiceException { - if (!isActiveLocked(session)) { - try { - fd.close(); - } catch (IOException e) { - // ignore - } - return; - } - - CountDownLatch latch = new CountDownLatch(1); try { - mRemote.startSession(session.sessionId, + waitForAsync((service, callback) -> service.startSession(session.sessionId, FLAG_SESSION_TYPE_FUSE | FLAG_SESSION_ATTRIBUTE_INDEXABLE, - fd, session.upperPath, session.lowerPath, new RemoteCallback(result -> - setResultLocked(latch, result))); - waitForLatch(latch, "start_session " + session); - maybeThrowExceptionLocked(); + fd, session.upperPath, session.lowerPath, callback)); } catch (Exception e) { throw new ExternalStorageServiceException("Failed to start session: " + session, e); } finally { @@ -308,73 +288,49 @@ public final class StorageUserConnection { } } - public void endSessionLocked(Session session) throws ExternalStorageServiceException { - if (!isActiveLocked(session)) { - // Nothing to end, not started yet - return; - } - - CountDownLatch latch = new CountDownLatch(1); + public void endSession(Session session) throws ExternalStorageServiceException { try { - mRemote.endSession(session.sessionId, new RemoteCallback(result -> - setResultLocked(latch, result))); - waitForLatch(latch, "end_session " + session); - maybeThrowExceptionLocked(); + waitForAsync((service, callback) -> + service.endSession(session.sessionId, callback)); } catch (Exception e) { throw new ExternalStorageServiceException("Failed to end session: " + session, e); } } - public void notifyVolumeStateChangedLocked(String sessionId, StorageVolume vol) throws + + public void notifyVolumeStateChanged(String sessionId, StorageVolume vol) throws ExternalStorageServiceException { - CountDownLatch latch = new CountDownLatch(1); try { - mRemote.notifyVolumeStateChanged(sessionId, vol, new RemoteCallback( - result -> setResultLocked(latch, result))); - waitForLatch(latch, "notify_volume_state_changed " + vol); - maybeThrowExceptionLocked(); + waitForAsync((service, callback) -> + service.notifyVolumeStateChanged(sessionId, vol, callback)); } catch (Exception e) { throw new ExternalStorageServiceException("Failed to notify volume state changed " + "for vol : " + vol, e); } } - private void setResultLocked(CountDownLatch latch, Bundle result) { - mLastException = result.getParcelable(EXTRA_ERROR); - latch.countDown(); - } - - private void maybeThrowExceptionLocked() throws IOException { - if (mLastException != null) { - ParcelableException lastException = mLastException; - mLastException = null; - try { - lastException.maybeRethrow(IOException.class); - } catch (IOException e) { - throw e; - } - throw new RuntimeException(lastException); + private void setResult(Bundle result, CompletableFuture future) { + ParcelableException ex = result.getParcelable(EXTRA_ERROR); + if (ex != null) { + future.completeExceptionally(ex); + } else { + future.complete(null); } } - public CountDownLatch bind() throws ExternalStorageServiceException { + private CompletableFuture connectIfNeeded() throws + ExternalStorageServiceException { ComponentName name = mSessionController.getExternalStorageServiceComponentName(); if (name == null) { // Not ready to bind throw new ExternalStorageServiceException( "Not ready to bind to the ExternalStorageService for user " + mUserId); } - synchronized (mLock) { - if (mRemote != null || mIsConnecting) { - // Connected or connecting (bound or binding) - // Will wait on a latch that will countdown when we connect, unless we are - // connected and the latch has already countdown, yay! - return mLatch; - } // else neither connected nor connecting - - mLatch = new CountDownLatch(1); - mIsConnecting = true; + if (mRemoteFuture != null) { + return mRemoteFuture; + } + CompletableFuture future = new CompletableFuture<>(); mServiceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { @@ -406,16 +362,9 @@ public final class StorageUserConnection { private void handleConnection(IBinder service) { synchronized (mLock) { - if (mIsConnecting) { - mRemote = IExternalStorageService.Stub.asInterface(service); - mIsConnecting = false; - mLatch.countDown(); - // Separate thread so we don't block the main thead - return; - } + future.complete( + IExternalStorageService.Stub.asInterface(service)); } - Slog.wtf(TAG, "Connection closed to the ExternalStorageService for user " - + mUserId); } private void handleDisconnection() { @@ -429,32 +378,19 @@ public final class StorageUserConnection { }; Slog.i(TAG, "Binding to the ExternalStorageService for user " + mUserId); - if (mIsDemoUser) { - // Schedule on a worker thread for demo user to avoid deadlock - if (mContext.bindServiceAsUser(new Intent().setComponent(name), - mServiceConnection, - Context.BIND_AUTO_CREATE | Context.BIND_IMPORTANT, - mHandlerThread.getThreadHandler(), - UserHandle.of(mUserId))) { - Slog.i(TAG, "Bound to the ExternalStorageService for user " + mUserId); - return mLatch; - } else { - mIsConnecting = false; - throw new ExternalStorageServiceException( - "Failed to bind to the ExternalStorageService for user " + mUserId); - } + // Schedule on a worker thread, because the system server main thread can be + // very busy early in boot. + if (mContext.bindServiceAsUser(new Intent().setComponent(name), + mServiceConnection, + Context.BIND_AUTO_CREATE | Context.BIND_IMPORTANT, + mHandlerThread.getThreadHandler(), + UserHandle.of(mUserId))) { + Slog.i(TAG, "Bound to the ExternalStorageService for user " + mUserId); + mRemoteFuture = future; + return future; } else { - if (mContext.bindServiceAsUser(new Intent().setComponent(name), - mServiceConnection, - Context.BIND_AUTO_CREATE | Context.BIND_IMPORTANT, - UserHandle.of(mUserId))) { - Slog.i(TAG, "Bound to the ExternalStorageService for user " + mUserId); - return mLatch; - } else { - mIsConnecting = false; - throw new ExternalStorageServiceException( - "Failed to bind to the ExternalStorageService for user " + mUserId); - } + throw new ExternalStorageServiceException( + "Failed to bind to the ExternalStorageService for user " + mUserId); } } } @@ -476,10 +412,5 @@ public final class StorageUserConnection { return "[SessionId: " + sessionId + ". UpperPath: " + upperPath + ". LowerPath: " + lowerPath + "]"; } - - @GuardedBy("mLock") - public boolean isInitialisedLocked() { - return !TextUtils.isEmpty(upperPath) && !TextUtils.isEmpty(lowerPath); - } } } From b700beab665f5d2cc8e6414bb2e9d5083730be93 Mon Sep 17 00:00:00 2001 From: kwaky Date: Mon, 8 Mar 2021 10:05:57 -0800 Subject: [PATCH 209/288] DO NOT MERGE Do not reinflate the layout if it has not been already inflated. This fixes the NPE caused when reinflate method is called before the layout is inflated. Bug: 180534861 Test: Manual Change-Id: Ia3fb6867e55c63a5fe7c17df1c3f86d048b4d1a8 --- .../car/notification/NotificationPanelViewController.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java index b83fcf4bf8b5c..7b81974e8ec1e 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java @@ -240,6 +240,9 @@ public class NotificationPanelViewController extends OverlayPanelViewController /** Reinflates the view. */ public void reinflate() { + // Do not reinflate the view if it has not been inflated at all. + if (!isInflated()) return; + ViewGroup container = (ViewGroup) getLayout(); container.removeView(mNotificationView); From 8171508fe077325781ce83ff849a1d162ab8eff5 Mon Sep 17 00:00:00 2001 From: Rubin Xu Date: Thu, 4 Mar 2021 15:42:09 +0000 Subject: [PATCH 210/288] Return copy of pending token list Make SyntheticPasswordManager.getPendingTokensForUser() return a copy of the token list, as the underlying list might change if a pending token is activated or removed. This fixes the NPE in LockSettingsService.activateEscrowTokens() where it tries to iterate through the list and activate tokens. Bug: 178560581 Test: atest com.android.server.locksettings Merged-In: I59d159d792a3d9e2a79ea521d6f01a5cb7c65695 Change-Id: I59d159d792a3d9e2a79ea521d6f01a5cb7c65695 --- .../SyntheticPasswordManager.java | 3 +- .../locksettings/SyntheticPasswordTests.java | 42 +++++++++++++++++-- 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java b/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java index d644b1dc6ca08..e2943f0a35bba 100644 --- a/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java +++ b/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java @@ -35,6 +35,7 @@ import android.security.Scrypt; import android.service.gatekeeper.GateKeeperResponse; import android.service.gatekeeper.IGateKeeperService; import android.util.ArrayMap; +import android.util.ArraySet; import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; @@ -904,7 +905,7 @@ public class SyntheticPasswordManager { if (!tokenMap.containsKey(userId)) { return Collections.emptySet(); } - return tokenMap.get(userId).keySet(); + return new ArraySet<>(tokenMap.get(userId).keySet()); } public boolean removePendingToken(long handle, int userId) { diff --git a/services/tests/servicestests/src/com/android/server/locksettings/SyntheticPasswordTests.java b/services/tests/servicestests/src/com/android/server/locksettings/SyntheticPasswordTests.java index 2c2fdcaab340f..f33f9ed1337c7 100644 --- a/services/tests/servicestests/src/com/android/server/locksettings/SyntheticPasswordTests.java +++ b/services/tests/servicestests/src/com/android/server/locksettings/SyntheticPasswordTests.java @@ -246,7 +246,8 @@ public class SyntheticPasswordTests extends BaseLockSettingsServiceTests { assertFalse(mLocalService.isEscrowTokenActive(handle, PRIMARY_USER_ID)); assertTrue(mService.hasPendingEscrowToken(PRIMARY_USER_ID)); - mService.verifyCredential(password, 0, PRIMARY_USER_ID).getResponseCode(); + assertEquals(VerifyCredentialResponse.RESPONSE_OK, mService.verifyCredential( + password, 0, PRIMARY_USER_ID).getResponseCode()); assertTrue(mLocalService.isEscrowTokenActive(handle, PRIMARY_USER_ID)); assertFalse(mService.hasPendingEscrowToken(PRIMARY_USER_ID)); @@ -275,7 +276,8 @@ public class SyntheticPasswordTests extends BaseLockSettingsServiceTests { long handle = mLocalService.addEscrowToken(token, PRIMARY_USER_ID, null); assertFalse(mLocalService.isEscrowTokenActive(handle, PRIMARY_USER_ID)); - mService.verifyCredential(password, 0, PRIMARY_USER_ID).getResponseCode(); + assertEquals(VerifyCredentialResponse.RESPONSE_OK, mService.verifyCredential( + password, 0, PRIMARY_USER_ID).getResponseCode()); assertTrue(mLocalService.isEscrowTokenActive(handle, PRIMARY_USER_ID)); mLocalService.setLockCredentialWithToken(nonePassword(), handle, token, PRIMARY_USER_ID); @@ -301,7 +303,8 @@ public class SyntheticPasswordTests extends BaseLockSettingsServiceTests { long handle = mLocalService.addEscrowToken(token, PRIMARY_USER_ID, null); assertFalse(mLocalService.isEscrowTokenActive(handle, PRIMARY_USER_ID)); - mService.verifyCredential(password, 0, PRIMARY_USER_ID).getResponseCode(); + assertEquals(VerifyCredentialResponse.RESPONSE_OK, mService.verifyCredential( + password, 0, PRIMARY_USER_ID).getResponseCode()); assertTrue(mLocalService.isEscrowTokenActive(handle, PRIMARY_USER_ID)); mService.setLockCredential(pattern, password, PRIMARY_USER_ID); @@ -376,6 +379,36 @@ public class SyntheticPasswordTests extends BaseLockSettingsServiceTests { } catch (SecurityException expected) { } } + @Test + public void testActivateMultipleEscrowTokens() throws Exception { + byte[] token0 = "some-high-entropy-secure-token-0".getBytes(); + byte[] token1 = "some-high-entropy-secure-token-1".getBytes(); + byte[] token2 = "some-high-entropy-secure-token-2".getBytes(); + + LockscreenCredential password = newPassword("password"); + LockscreenCredential pattern = newPattern("123654"); + initializeCredentialUnderSP(password, PRIMARY_USER_ID); + + long handle0 = mLocalService.addEscrowToken(token0, PRIMARY_USER_ID, null); + long handle1 = mLocalService.addEscrowToken(token1, PRIMARY_USER_ID, null); + long handle2 = mLocalService.addEscrowToken(token2, PRIMARY_USER_ID, null); + + // Activate token + assertEquals(VerifyCredentialResponse.RESPONSE_OK, mService.verifyCredential( + password, 0, PRIMARY_USER_ID).getResponseCode()); + + // Verify tokens work + assertTrue(mLocalService.isEscrowTokenActive(handle0, PRIMARY_USER_ID)); + assertTrue(mLocalService.setLockCredentialWithToken( + pattern, handle0, token0, PRIMARY_USER_ID)); + assertTrue(mLocalService.isEscrowTokenActive(handle1, PRIMARY_USER_ID)); + assertTrue(mLocalService.setLockCredentialWithToken( + pattern, handle1, token1, PRIMARY_USER_ID)); + assertTrue(mLocalService.isEscrowTokenActive(handle2, PRIMARY_USER_ID)); + assertTrue(mLocalService.setLockCredentialWithToken( + pattern, handle2, token2, PRIMARY_USER_ID)); + } + @Test public void testSetLockCredentialWithTokenFailsWithoutLockScreen() throws Exception { LockscreenCredential password = newPassword("password"); @@ -503,7 +536,8 @@ public class SyntheticPasswordTests extends BaseLockSettingsServiceTests { reset(mDevicePolicyManager); long handle = mLocalService.addEscrowToken(token, PRIMARY_USER_ID, null); - mService.verifyCredential(password, 0, PRIMARY_USER_ID).getResponseCode(); + assertEquals(VerifyCredentialResponse.RESPONSE_OK, mService.verifyCredential( + password, 0, PRIMARY_USER_ID).getResponseCode()); assertTrue(mLocalService.isEscrowTokenActive(handle, PRIMARY_USER_ID)); mService.onCleanupUser(PRIMARY_USER_ID); From 0c603d91a7f3255426d6cbf9b453e64f756457c3 Mon Sep 17 00:00:00 2001 From: Chris Li Date: Sat, 6 Feb 2021 20:39:37 -0800 Subject: [PATCH 211/288] Include whether in touch mode for WindowlessWindowManager Fix: 179583920 Fix: 180530717 Test: manually with a windowless button Change-Id: Ice37c3182a44c6284ffa8950996507025c59270b Merged-In: Ice37c3182a44c6284ffa8950996507025c59270b --- .../android/view/WindowlessWindowManager.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/core/java/android/view/WindowlessWindowManager.java b/core/java/android/view/WindowlessWindowManager.java index 1af4c3636ac55..f0006d9881635 100644 --- a/core/java/android/view/WindowlessWindowManager.java +++ b/core/java/android/view/WindowlessWindowManager.java @@ -156,7 +156,10 @@ public class WindowlessWindowManager implements IWindowSession { mStateForWindow.put(window.asBinder(), state); } - return WindowManagerGlobal.ADD_OKAY | WindowManagerGlobal.ADD_FLAG_APP_VISIBLE; + final int res = WindowManagerGlobal.ADD_OKAY | WindowManagerGlobal.ADD_FLAG_APP_VISIBLE; + + // Include whether the window is in touch mode. + return isInTouchMode() ? res | WindowManagerGlobal.ADD_FLAG_IN_TOUCH_MODE : res; } /** @@ -207,6 +210,15 @@ public class WindowlessWindowManager implements IWindowSession { return !PixelFormat.formatHasAlpha(attrs.format); } + private boolean isInTouchMode() { + try { + return WindowManagerGlobal.getWindowSession().getInTouchMode(); + } catch (RemoteException e) { + Log.e(TAG, "Unable to check if the window is in touch mode", e); + } + return false; + } + /** @hide */ protected SurfaceControl getSurfaceControl(View rootView) { final ViewRootImpl root = rootView.getViewRootImpl(); @@ -268,7 +280,8 @@ public class WindowlessWindowManager implements IWindowSession { } } - return 0; + // Include whether the window is in touch mode. + return isInTouchMode() ? WindowManagerGlobal.RELAYOUT_RES_IN_TOUCH_MODE : 0; } @Override From 183e9b78ce22ce80f9666bdd134fff5472e3851a Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Mon, 8 Mar 2021 20:20:12 -0800 Subject: [PATCH 212/288] Ensure that ML model results are still bounded by the gesture insets - In some cases, the ML model may return that it is a valid swipe even if it is out of the current inset bounds Bug: 178561216 Test: Enable ML model, rotate to landscape and try to swipe near the edges Merged-In: Iaecd11acf50a1a19fe5964e11e06fb564ca6988c Change-Id: Iaecd11acf50a1a19fe5964e11e06fb564ca6988c (cherry picked from commit 8afd10c9665c8f521ad8c076c2695d9fc6924368) --- .../phone/EdgeBackGestureHandler.java | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java index 603679afc1098..14f8363b43454 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java @@ -560,20 +560,21 @@ public class EdgeBackGestureHandler extends CurrentUserTracker implements Displa if (mVocab != null) { app = mVocab.getOrDefault(mPackageName, -1); } - // Check if we are within the tightest bounds beyond which - // we would not need to run the ML model. - boolean withinRange = x <= mMLEnableWidth + mLeftInset - || x >= (mDisplaySize.x - mMLEnableWidth - mRightInset); - if (!withinRange) { + + // Denotes whether we should proceed with the gesture. Even if it is false, we may want to + // log it assuming it is not invalid due to exclusion. + boolean withinRange = x < mEdgeWidthLeft + mLeftInset + || x >= (mDisplaySize.x - mEdgeWidthRight - mRightInset); + if (withinRange) { int results = -1; - if (mUseMLModel && (results = getBackGesturePredictionsCategory(x, y, app)) != -1) { - withinRange = results == 1; - } else { - // Denotes whether we should proceed with the gesture. - // Even if it is false, we may want to log it assuming - // it is not invalid due to exclusion. - withinRange = x <= mEdgeWidthLeft + mLeftInset - || x >= (mDisplaySize.x - mEdgeWidthRight - mRightInset); + + // Check if we are within the tightest bounds beyond which we would not need to run the + // ML model + boolean withinMinRange = x < mMLEnableWidth + mLeftInset + || x >= (mDisplaySize.x - mMLEnableWidth - mRightInset); + if (!withinMinRange && mUseMLModel + && (results = getBackGesturePredictionsCategory(x, y, app)) != -1) { + withinRange = (results == 1); } } From 1a96556be5263ec82a3b4beef9f247ec0546e6bd Mon Sep 17 00:00:00 2001 From: Heemin Seog Date: Tue, 9 Mar 2021 20:12:58 +0000 Subject: [PATCH 213/288] DO NOT MERGE Remove focus on PasswordTextView Because we provide a PIN pad, the passwordTextView does not need to be focusable. Bug: 182211814 Test: manual Change-Id: Ib0ed8c0bf6c0fd70f750e093b1fb64134866d442 --- .../layout-land/keyguard_pin_view.xml | 2 +- .../res-keyguard/layout/keyguard_pin_view.xml | 2 +- .../keyguard/UnfocusablePasswordTextView.java | 44 +++++++++++++++++++ 3 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 packages/CarSystemUI/src/com/android/systemui/car/keyguard/UnfocusablePasswordTextView.java diff --git a/packages/CarSystemUI/res-keyguard/layout-land/keyguard_pin_view.xml b/packages/CarSystemUI/res-keyguard/layout-land/keyguard_pin_view.xml index 5746102f5f275..189f33140d41b 100644 --- a/packages/CarSystemUI/res-keyguard/layout-land/keyguard_pin_view.xml +++ b/packages/CarSystemUI/res-keyguard/layout-land/keyguard_pin_view.xml @@ -55,7 +55,7 @@ android:gravity="center" android:orientation="vertical"> - - Date: Mon, 1 Mar 2021 18:12:13 +0000 Subject: [PATCH 214/288] Revert "Only allow BROWSABLE && DEFAULT Intents to be always opened" Reason for revert: Punted to future release due to invalid fix Bug: 175319005 Merged-In: I00b78d596ee05c5a4a228771bbf8082af2b0ab8a Merged-In: I78284e0a0dd5c41345753cdd2ed9a518db1df930 Change-Id: I78284e0a0dd5c41345753cdd2ed9a518db1df930 (cherry picked from commit ffe45e449799c62ee43a5cf58f87f115478bc5cf) --- .../java/com/android/server/pm/PackageManagerService.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index eaabf468fc46c..009cac624fa48 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -7782,13 +7782,6 @@ public class PackageManagerService extends IPackageManager.Stub Slog.i(TAG, " + always: " + info.activityInfo.packageName + " : linkgen=" + linkGeneration); } - - if (!intent.hasCategory(CATEGORY_BROWSABLE) - || !intent.hasCategory(CATEGORY_DEFAULT)) { - undefinedList.add(info); - continue; - } - // Use link-enabled generation as preferredOrder, i.e. // prefer newly-enabled over earlier-enabled. info.preferredOrder = linkGeneration; From 2ef71e3c859806b0f11901c77e27563b35307859 Mon Sep 17 00:00:00 2001 From: Winson Chiu Date: Mon, 1 Mar 2021 18:12:13 +0000 Subject: [PATCH 215/288] Revert "Only allow BROWSABLE && DEFAULT Intents to be always opened" Reason for revert: Punted to future release due to invalid fix Bug: 175319005 Merged-In: I00b78d596ee05c5a4a228771bbf8082af2b0ab8a Merged-In: I78284e0a0dd5c41345753cdd2ed9a518db1df930 Change-Id: I78284e0a0dd5c41345753cdd2ed9a518db1df930 --- .../java/com/android/server/pm/PackageManagerService.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index d737b733d00c9..6d2ea3c73d3ae 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -7725,13 +7725,6 @@ public class PackageManagerService extends IPackageManager.Stub Slog.i(TAG, " + always: " + info.activityInfo.packageName + " : linkgen=" + linkGeneration); } - - if (!intent.hasCategory(CATEGORY_BROWSABLE) - || !intent.hasCategory(CATEGORY_DEFAULT)) { - undefinedList.add(info); - continue; - } - // Use link-enabled generation as preferredOrder, i.e. // prefer newly-enabled over earlier-enabled. info.preferredOrder = linkGeneration; From ae39027044362347b71f92f833d98e46a41a3791 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 10 Mar 2021 18:50:25 -0800 Subject: [PATCH 216/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Id96425ec66674f92fac994225b9389b7422b600b --- packages/SettingsLib/res/values-es-rUS/strings.xml | 2 +- packages/SettingsLib/res/values-mk/arrays.xml | 4 ++-- packages/SettingsLib/res/values-nl/strings.xml | 2 +- packages/SettingsLib/res/values-ru/strings.xml | 2 +- packages/SettingsLib/res/values-te/strings.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml index 74fe05f5c0577..fd74d3267fc3d 100644 --- a/packages/SettingsLib/res/values-es-rUS/strings.xml +++ b/packages/SettingsLib/res/values-es-rUS/strings.xml @@ -219,7 +219,7 @@ "Conectado actualmente" "Detalles del dispositivo" "Olvidar" - "Huellas digitales del dispositivo: %1$s" + "Huellas dactilares del dispositivo: %1$s" "Error de conexión" "Asegúrate de que %1$s esté conectado a la red correcta." "Vincular con dispositivo" diff --git a/packages/SettingsLib/res/values-mk/arrays.xml b/packages/SettingsLib/res/values-mk/arrays.xml index 388e280196ec9..47ea24941f6ae 100644 --- a/packages/SettingsLib/res/values-mk/arrays.xml +++ b/packages/SettingsLib/res/values-mk/arrays.xml @@ -138,9 +138,9 @@ "Стерео" - "Оптимизирано за квалитет на аудиото (990 кб/с - 909 кб/с)" + "Оптимизирано за квалитет на аудиото (990 kbps - 909 kbps)" "Балансиран квалитет на звукот и врската (660 kb/s/606 kb/s)" - "Оптимизирано за квалитет на врската (330 кб/с - 303 кб/с)" + "Оптимизирано за квалитет на врската (330 kbps - 303 kbps)" "Најдобар напор (приспособлива стапка на битови)" diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml index 9c2cb983b96a8..e99a140a0d2a3 100644 --- a/packages/SettingsLib/res/values-nl/strings.xml +++ b/packages/SettingsLib/res/values-nl/strings.xml @@ -370,7 +370,7 @@ "Achtergrondproceslimiet" "ANR\'s op de achtergrond" "Dialoogvenster \'App reageert niet\' weergeven voor achtergrond-apps" - "Kanaalwaarschuwingen voor meldingen weergeven" + "Kanaalwaarschuwingen voor meldingen tonen" "Geeft een waarschuwing op het scherm weer wanneer een app een melding post zonder geldig kanaal" "Toestaan van apps op externe opslag afdwingen" "Hiermee komt elke app in aanmerking voor schrijven naar externe opslag, ongeacht de manifestwaarden" diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml index 21cacc82b178d..ebe7c455a3f90 100644 --- a/packages/SettingsLib/res/values-ru/strings.xml +++ b/packages/SettingsLib/res/values-ru/strings.xml @@ -548,7 +548,7 @@ "Чтобы создать профиль с ограниченным доступом, необходимо предварительно настроить блокировку экрана для защиты приложений и личных данных" "Включить блокировку" "Переключиться на этот аккаунт: %s" - "Добавить аккаунт гостя" + "Добавить гостя" "Удалить аккаунт гостя" "Гость" "Вариант по умолчанию" diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml index 4aa8040c6db36..268516415b6c4 100644 --- a/packages/SettingsLib/res/values-te/strings.xml +++ b/packages/SettingsLib/res/values-te/strings.xml @@ -546,7 +546,7 @@ "మీరు పరిమితం చేయబడిన ప్రొఫైల్‌ను సృష్టించడానికి ముందు, మీ యాప్‌లు మరియు వ్యక్తిగత డేటాను రక్షించడానికి స్క్రీన్ లాక్‌ను సెటప్ చేయాల్సి ఉంటుంది." "లాక్‌ను సెట్ చేయి" "%sకు మార్చు" - "అతిథిని జోడించండి" + "గెస్ట్‌ను జోడించండి" "అతిథిని తీసివేయండి" "అతిథి" "పరికర ఆటోమేటిక్ సెట్టింగ్" From fd8b6dabf9435026c867025eb3c6a85a07818f2f Mon Sep 17 00:00:00 2001 From: Jimmy Chen Date: Thu, 4 Mar 2021 13:19:52 +0800 Subject: [PATCH 217/288] wifidisplay: restrict broadcast by the proper permission WIFI_DISPLAY_STATUS_CHANGED event contains the MAC address of peers. As the MAC address is PII data, this should be restricted by proper permission. Bug: 176541017 Test: install PoC in b/176541017 and check PII data is not leaked. Change-Id: I36b85f44678fe232486702fa009f5f06d1a7af75 --- core/java/android/hardware/display/DisplayManager.java | 3 +++ .../com/android/server/display/WifiDisplayAdapter.java | 7 ++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/core/java/android/hardware/display/DisplayManager.java b/core/java/android/hardware/display/DisplayManager.java index 0fa4ca8a574b5..cfacd5d97bcb5 100644 --- a/core/java/android/hardware/display/DisplayManager.java +++ b/core/java/android/hardware/display/DisplayManager.java @@ -61,6 +61,9 @@ public final class DisplayManager { * {@link #EXTRA_WIFI_DISPLAY_STATUS} extra. *

* This broadcast is only sent to registered receivers and can only be sent by the system. + *

+ * {@link android.Manifest.permission#ACCESS_FINE_LOCATION} permission is required to + * receive this broadcast. *

* @hide */ diff --git a/services/core/java/com/android/server/display/WifiDisplayAdapter.java b/services/core/java/com/android/server/display/WifiDisplayAdapter.java index 57323170b327a..551df49b550f0 100644 --- a/services/core/java/com/android/server/display/WifiDisplayAdapter.java +++ b/services/core/java/com/android/server/display/WifiDisplayAdapter.java @@ -91,6 +91,10 @@ final class WifiDisplayAdapter extends DisplayAdapter { private boolean mPendingStatusChangeBroadcast; + private static final String[] RECEIVER_PERMISSIONS_FOR_BROADCAST = { + android.Manifest.permission.ACCESS_FINE_LOCATION, + }; + // Called with SyncRoot lock held. public WifiDisplayAdapter(DisplayManagerService.SyncRoot syncRoot, Context context, Handler handler, Listener listener, @@ -432,7 +436,8 @@ final class WifiDisplayAdapter extends DisplayAdapter { } // Send protected broadcast about wifi display status to registered receivers. - getContext().sendBroadcastAsUser(intent, UserHandle.ALL); + getContext().createContextAsUser(UserHandle.ALL, 0) + .sendBroadcastWithMultiplePermissions(intent, RECEIVER_PERMISSIONS_FOR_BROADCAST); } private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { From cff8340c84ad1d6c0b3deae6a42f781e7db64082 Mon Sep 17 00:00:00 2001 From: Jimmy Chen Date: Thu, 4 Mar 2021 13:19:52 +0800 Subject: [PATCH 218/288] wifidisplay: restrict broadcast by the proper permission WIFI_DISPLAY_STATUS_CHANGED event contains the MAC address of peers. As the MAC address is PII data, this should be restricted by proper permission. Bug: 176541017 Test: install PoC in b/176541017 and check PII data is not leaked. Change-Id: I36b85f44678fe232486702fa009f5f06d1a7af75 --- core/java/android/hardware/display/DisplayManager.java | 3 +++ .../com/android/server/display/WifiDisplayAdapter.java | 7 ++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/core/java/android/hardware/display/DisplayManager.java b/core/java/android/hardware/display/DisplayManager.java index c1ba2094d3cf6..99da669798921 100644 --- a/core/java/android/hardware/display/DisplayManager.java +++ b/core/java/android/hardware/display/DisplayManager.java @@ -61,6 +61,9 @@ public final class DisplayManager { * {@link #EXTRA_WIFI_DISPLAY_STATUS} extra. *

* This broadcast is only sent to registered receivers and can only be sent by the system. + *

+ * {@link android.Manifest.permission#ACCESS_FINE_LOCATION} permission is required to + * receive this broadcast. *

* @hide */ diff --git a/services/core/java/com/android/server/display/WifiDisplayAdapter.java b/services/core/java/com/android/server/display/WifiDisplayAdapter.java index 57323170b327a..551df49b550f0 100644 --- a/services/core/java/com/android/server/display/WifiDisplayAdapter.java +++ b/services/core/java/com/android/server/display/WifiDisplayAdapter.java @@ -91,6 +91,10 @@ final class WifiDisplayAdapter extends DisplayAdapter { private boolean mPendingStatusChangeBroadcast; + private static final String[] RECEIVER_PERMISSIONS_FOR_BROADCAST = { + android.Manifest.permission.ACCESS_FINE_LOCATION, + }; + // Called with SyncRoot lock held. public WifiDisplayAdapter(DisplayManagerService.SyncRoot syncRoot, Context context, Handler handler, Listener listener, @@ -432,7 +436,8 @@ final class WifiDisplayAdapter extends DisplayAdapter { } // Send protected broadcast about wifi display status to registered receivers. - getContext().sendBroadcastAsUser(intent, UserHandle.ALL); + getContext().createContextAsUser(UserHandle.ALL, 0) + .sendBroadcastWithMultiplePermissions(intent, RECEIVER_PERMISSIONS_FOR_BROADCAST); } private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { From ae32c0cde56accb7bc04fa2a39d17efad4874524 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 11 Mar 2021 13:54:30 -0800 Subject: [PATCH 219/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I72e5bcc7c06e1373834b046a561ccc4616d2861c --- core/res/res/values-be/strings.xml | 2 +- core/res/res/values-bg/strings.xml | 4 ++-- core/res/res/values-bn/strings.xml | 2 +- core/res/res/values-cs/strings.xml | 2 +- core/res/res/values-es-rUS/strings.xml | 4 ++-- core/res/res/values-eu/strings.xml | 8 ++++---- core/res/res/values-fa/strings.xml | 2 +- core/res/res/values-gu/strings.xml | 4 ++-- core/res/res/values-hi/strings.xml | 2 +- core/res/res/values-hy/strings.xml | 2 +- core/res/res/values-iw/strings.xml | 8 ++++---- core/res/res/values-kk/strings.xml | 4 ++-- core/res/res/values-kn/strings.xml | 2 +- core/res/res/values-ko/strings.xml | 2 +- core/res/res/values-lo/strings.xml | 2 +- core/res/res/values-mk/strings.xml | 2 +- core/res/res/values-ne/strings.xml | 2 +- core/res/res/values-or/strings.xml | 2 +- core/res/res/values-pa/strings.xml | 2 +- core/res/res/values-ru/strings.xml | 2 +- core/res/res/values-sq/strings.xml | 2 +- core/res/res/values-sw/strings.xml | 2 +- core/res/res/values-te/strings.xml | 4 ++-- core/res/res/values-uk/strings.xml | 2 +- 24 files changed, 35 insertions(+), 35 deletions(-) diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index 78ed3a86a6974..0cf27aba6c30d 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -1705,7 +1705,7 @@ "Каб пераключыцца на іншую функцыю, правядзіце ўверх трыма пальцамі і ўтрымлівайце іх на экране." "Павелічэнне" "Бягучы карыстальнік %1$s." - "Пераход да %1$s..." + "Пераход у рэжым \"%1$s\"..." "%1$s выходзіць з сістэмы…" "Уладальнік" "Памылка" diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index a7012a0c27450..8d3a23c99e3b9 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -1661,9 +1661,9 @@ "За превключване между функциите прекарайте три пръста нагоре и задръжте." "Ниво на мащаба" "Текущ потребител %1$s." - "Превключва се към %1$s…" + "Превключва се към: %1$s…" "%1$s излиза…" - "собственик" + "Собственик" "Грешка" "Тази промяна не е разрешена от администратора ви" "Няма намерено приложение за извършване на това действие" diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml index c1c40991e9028..9462be3f2f443 100644 --- a/core/res/res/values-bn/strings.xml +++ b/core/res/res/values-bn/strings.xml @@ -1661,7 +1661,7 @@ "একটি ফিচার থেকে অন্যটিতে যেতে, তিনটি আঙ্গুল দিয়ে উপরের দিকে সোয়াইপ করে ধরে থাকুন।" "বড় করে দেখা" "বর্তমান ব্যবহারকারী %1$s৷" - "%1$s নামের ব্যবহারকারীতে যাচ্ছে…" + "ব্যবহারকারী পরিবর্তন করে %1$s করা হচ্ছে…" "%1$sকে লগ-আউট করা হচ্ছে..." "মালিক" "ত্রুটি" diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 0edeb0bad4bbc..a5f421390d441 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -1705,7 +1705,7 @@ "Chcete-li přepnout mezi funkcemi, přejeďte nahoru třemi prsty a podržte je." "Zvětšení" "Aktuální uživatel je %1$s." - "Přepínání na účet %1$s…" + "Přepínání na uživatele %1$s…" "Odhlašování uživatele %1$s…" "Vlastník" "Chyba" diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index e0a35ac95a9b2..5b216612430eb 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -1539,8 +1539,8 @@ "Expira el:" "Número de serie:" "Huellas digitales:" - "Huella dactilar SHA-256" - "Huella dactilar SHA-1:" + "Huella digital SHA-256" + "Huella digital SHA-1:" "Ver todas" "Elige actividad" "Compartir con" diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index 1eaa9f7ca8298..9be1763de9676 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -305,8 +305,8 @@ "atzitu gailuko argazkiak, multimedia-edukia eta fitxategiak" "Mikrofonoa" "grabatu audioa" - "Ariketa fisikoa" - "ariketa fisikoak atzitu" + "Jarduera fisiko" + "jarduera fisikoa atzitu" "Kamera" "atera argazkiak eta grabatu bideoak" "Deien erregistroa" @@ -433,8 +433,8 @@ "Aplikazioak edonoiz erabil dezake mikrofonoa audioa grabatzeko." "bidali aginduak SIM txartelera" "SIM txartelera aginduak bidaltzeko aukera ematen die aplikazioei. Oso arriskutsua da." - "hauteman ariketa fisikoa" - "Aplikazioak ariketa fisikoa hauteman dezake." + "hauteman jarduera fisiko" + "Aplikazioak jarduera fisiko hauteman dezake." "atera argazkiak eta grabatu bideoak" "Aplikazioak edonoiz erabil dezake kamera argazkiak ateratzeko eta bideoak grabatzeko." "eman sistemako kamerak atzitzeko baimena aplikazio edo zerbitzu bati argazkiak ateratzeko eta bideoak grabatzeko" diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 737bb8f18b8b2..e80f690f3bb3c 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -1625,7 +1625,7 @@ "ویژگی‌های دسترس‌پذیری روشن شود؟" "با پایین نگه داشتن هردو کلید میزان صدا به‌مدت چند ثانیه، ویژگی‌های دسترس‌پذیری روشن می‌شود. با این کار نحوه عملکرد دستگاهتان تغییر می‌کند.\n\nویژگی‌های فعلی:\n%1$s\nمی‌توانید ویژگی‌های انتخابی را در «تنظیمات > دسترس‌پذیری» تغییر دهید." " • %1$s\n" - "%1$s روشن شود؟" + "سرویس %1$s روشن شود؟" "با پایین نگه داشتن هردو کلید میزان صدا به‌مدت چند ثانیه، %1$s (یکی از ویژگی‌های دسترس‌پذیری) روشن می‌شود. با این کار نحوه عملکرد دستگاهتان تغییر می‌کند.\n\nمی‌توانید در «تنظیمات > دسترس‌پذیری»،‌این میان‌بر را به ویژگی دیگری تغییر دهید." "روشن شود" "روشن نشود" diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index 25d997ae49bb2..087aaaf6f6e93 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -637,7 +637,7 @@ "એપ્લિકેશનને કૉલમાં વપરાશકર્તા અનુભવ પ્રદાન કરવાની મંજૂરી આપે છે." "ઐતિહાસિક નેટવર્ક ઉપયોગ વાંચો" "એપ્લિકેશનને ચોક્કસ નેટવર્ક્સ અને ઍપ્લિકેશનો માટે ઐતિહાસિક નેટવર્ક વપરાશ વાંચવાની મંજૂરી આપે છે." - "નેટવર્ક નીતિ મેનેજ કરો" + "નેટવર્ક પૉલિસી મેનેજ કરો" "ઍપને નેટવર્ક નીતિઓ મેનેજ કરવાની અને ઍપ-વિશિષ્ટ નિયમો નિર્ધારિત કરવાની મંજૂરી આપે છે." "નેટવર્ક વપરાશ એકાઉન્ટિંગ સંશોધિત કરો" "એપ્લિકેશનને કેવી રીતે ઍપ્લિકેશનો સામે નેટવર્ક વપરાશ ગણવામાં આવે છે તે સંશોધિત કરવાની મંજૂરી આપે છે. સામાન્ય ઍપ્લિકેશનો દ્વારા ઉપયોગમાં લેવા માટે નથી." @@ -691,7 +691,7 @@ "ચેતવણી વિના આ Android TV ડિવાઇસ પર રહેલો આ વપરાશકર્તાનો ડેટા કાઢી નાખો." "ચેતવણી વિના આ ફોન પરનો આ વપરાશકર્તાનો ડેટા કાઢી નાખો." "ઉપકરણ વૈશ્વિક પ્રોક્સી સેટ કરો" - "નીતિ સક્ષમ હોય તે વખતે ઉપયોગ કરવા માટેના ઉપકરણ વૈશ્વિક પ્રોક્સીને સેટ કરો. ફક્ત ઉપકરણના માલિક વૈશ્વિક પ્રોક્સી સેટ કરી શકે છે." + "પૉલિસી સક્ષમ હોય તે વખતે ઉપયોગ કરવા માટેના ડિવાઇસ વૈશ્વિક પ્રોક્સીને સેટ કરો. ફક્ત ડિવાઇસના માલિક વૈશ્વિક પ્રોક્સી સેટ કરી શકે છે." "સ્ક્રીન લૉક પાસવર્ડ સમાપ્તિ સેટ કરો" "કેટલા સમયાંતરે સ્ક્રીન લૉક પાસવર્ડ, પિન અથવા પૅટર્ન બદલવો આવશ્યક છે, તેને બદલો." "સંગ્રહ એન્ક્રિપ્શન સેટ કરો" diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 139e6b4862b98..7fdbb8a609897 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -1618,7 +1618,7 @@ "आपने अपना लॉक खोलने का पैटर्न %1$d बार गलत तरीके से बनाया है. %2$d और गलत प्रयासों के बाद, आपसे अपने Android TV डिवाइस को अपने ईमेल खाते का इस्तेमाल करके अनलॉक करने के लिए कहा जाएगा.\n\n %3$d सेकंड बाद प्रयास करें." "आपने अपने अनलॉक आकार को %1$d बार गलत तरीके से आरेखित किया है. %2$d और असफल प्रयासों के बाद, आपसे अपने फ़ोन को किसी ईमेल खाते का उपयोग करके अनलॉक करने के लिए कहा जाएगा.\n\n %3$d सेकंड में फिर से प्रयास करें." " — " - "निकालें" + "हटाएं" "वॉल्यूम को सुझाए गए स्तर से ऊपर बढ़ाएं?\n\nअत्यधिक वॉल्यूम पर ज़्यादा समय तक सुनने से आपकी सुनने की क्षमता को नुकसान हो सकता है." "सुलभता शॉर्टकट का इस्तेमाल करना चाहते हैं?" "शॉर्टकट के चालू होने पर, दाेनाें वॉल्यूम बटन (आवाज़ कम या ज़्यादा करने वाले बटन) को तीन सेकंड तक दबाने से, सुलभता सुविधा शुरू हाे जाएगी." diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index 56b415b3d980b..2288e68d7b1b2 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -1661,7 +1661,7 @@ "Մի գործառույթից մյուսին անցնելու համար երեք մատը սահեցրեք վերև և պահեք։" "Խոշորացում" "Ներկայիս օգտատերը %1$s:" - "Փոխարկվում է %1$s-ին..." + "Անցում հետևյալ պրոֆիլին՝ %1$s..." "Ելք %1$s-ից…" "Սեփականատեր" "Սխալ" diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index 00e3d60d94795..daa7cc2f74ab1 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -1329,7 +1329,7 @@ "הגדרת שעה" "הגדרת תאריך" "הגדרה" - "בוצע" + "סיום" "חדש: " "מטעם %1$s." "לא דרושים אישורים" @@ -1662,7 +1662,7 @@ "‏שרטטת קו ביטול נעילה שגוי %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, תתבקש לבטל את הנעילה של מכשיר ה-Android TV באמצעות חשבון אימייל.\n\n נסה שוב בעוד %3$d שניות." "שרטטת את קו ביטול הנעילה באופן שגוי %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, תתבקש לבטל את נעילת הטלפון באמצעות חשבון אימייל‏.\n\nנסה שוב בעוד %3$d שניות." " — " - "הסר" + "הסרה" "האם להעלות את עוצמת הקול מעל לרמה המומלצת?\n\nהאזנה בעוצמת קול גבוהה למשכי זמן ממושכים עלולה לפגוע בשמיעה." "להשתמש בקיצור הדרך לתכונת הנגישות?" "כשקיצור הדרך מופעל, לחיצה על שני לחצני עוצמת הקול למשך שלוש שניות מפעילה את תכונת הנגישות." @@ -1705,7 +1705,7 @@ "כדי לעבור בין תכונות, יש להחליק כלפי מעלה בעזרת שלוש אצבעות ולהחזיק." "הגדלה" "המשתמש הנוכחי %1$s." - "עובר אל %1$s…" + "מעבר אל %1$s…" "מתבצע ניתוק של %1$s…" "בעלים" "שגיאה" @@ -1820,7 +1820,7 @@ "צפייה במסך מלא" "כדי לצאת, פשוט מחליקים אצבע מלמעלה למטה." "הבנתי" - "בוצע" + "סיום" "מחוון שעות מעגלי" "מחוון דקות מעגלי" "בחר שעות" diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml index e92f53bd497ee..0f82870b9270a 100644 --- a/core/res/res/values-kk/strings.xml +++ b/core/res/res/values-kk/strings.xml @@ -1618,7 +1618,7 @@ "Құлыпты ашу өрнегін %1$d рет дұрыс сызбадыңыз. Енді тағы %2$d рет қателессеңіз, Android TV құрылғыңыздың құлпын ашу үшін есептік жазбаңызға кіру керек болады.\n\n %3$d секундтан кейін қайталап көріңіз." "Бекітпені ашу кескінін %1$d рет қате сыздыңыз. %2$d сәтсіз әрекеттен кейін телефоныңызды есептік жазба арқылы ашу өтінішін аласыз. \n\n %3$d секундтан кейін қайта әрекеттеніңіз." " — " - "Алып тастау" + "Жою" "Дыбыс деңгейін ұсынылған деңгейден көтеру керек пе?\n\nЖоғары дыбыс деңгейінде ұзақ кезеңдер бойы тыңдау есту қабілетіңізге зиян тигізуі мүмкін." "Арнайы мүмкіндік төте жолын пайдалану керек пе?" "Түймелер тіркесімі қосулы кезде, екі дыбыс түймесін 3 секунд басып тұрсаңыз, \"Арнайы мүмкіндіктер\" функциясы іске қосылады." @@ -1661,7 +1661,7 @@ "Бір функциядан екінші функцияға ауысу үшін үш саусақпен жоғары қарай сырғытып, ұстап тұрыңыз." "Ұлғайту" "Ағымдағы пайдаланушы %1$s." - "%1$s ауысу орындалуда…" + "%1$s профиліне ауысу…" "%1$s ішінен шығу…" "Құрылғы иесі" "Қателік" diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml index 947b28f43ce67..37d20495cbde4 100644 --- a/core/res/res/values-kn/strings.xml +++ b/core/res/res/values-kn/strings.xml @@ -1661,7 +1661,7 @@ "ವೈಶಿಷ್ಟ್ಯಗಳ ನಡುವೆ ಬದಲಿಸಲು, ಮೂರು ಬೆರಳುಗಳನ್ನು ಬಳಸಿ ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ ಮತ್ತು ಒತ್ತಿ ಹಿಡಿಯಿರಿ." "ಹಿಗ್ಗಿಸುವಿಕೆ" "ಪ್ರಸ್ತುತ ಬಳಕೆದಾರರು %1$s." - "%1$s ಗೆ ಬದಲಾಯಿಸಲಾಗುತ್ತಿದೆ…" + "%1$sಗೆ ಬದಲಾಯಿಸಲಾಗುತ್ತಿದೆ…" "%1$s ಅವರನ್ನು ಲಾಗ್‌ ಔಟ್‌ ಮಾಡಲಾಗುತ್ತಿದೆ…" "ಮಾಲೀಕರು" "ದೋಷ" diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 636de4e19f7c8..6b365b96c2292 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -1661,7 +1661,7 @@ "기능 간에 전환하려면 세 손가락을 사용하여 위로 스와이프한 다음 잠시 기다립니다." "확대" "현재 사용자는 %1$s님입니다." - "%1$s(으)로 전환하는 중…" + "%1$s로 전환하는 중…" "%1$s님을 로그아웃하는 중…" "소유자" "오류" diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml index 2197aee867f30..47bd5a8da60e0 100644 --- a/core/res/res/values-lo/strings.xml +++ b/core/res/res/values-lo/strings.xml @@ -1661,7 +1661,7 @@ "ເພື່ອສະຫຼັບລະຫວ່າງຄຸນສົມບັດຕ່າງໆ, ໃຫ້ປັດຂຶ້ນດ້ວຍສາມນິ້ວຄ້າງໄວ້." "ການຂະຫຍາຍ" "ຜູ່ໃຊ້ປັດຈຸບັນ %1$s ." - "ກຳ​ລັງ​ສະ​ລັບ​​ໄປ​ຫາ %1$s…" + "ກຳລັງສະຫຼັບໄປຫາ%1$s…" "ກຳລັງອອກຈາກລະບົບ %1$s…" "ເຈົ້າຂອງ" "ຜິດພາດ" diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml index d61a278029b34..956c4b85aa116 100644 --- a/core/res/res/values-mk/strings.xml +++ b/core/res/res/values-mk/strings.xml @@ -20,7 +20,7 @@ - "Б" + "B" "KB" "MB" "GB" diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index e2cf7f96035d9..280d72481cd8a 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -1661,7 +1661,7 @@ "एउटा सुविधाबाट अर्को सुविधामा जान तीनवटा औँलाले माथितिर स्वाइप गरी स्क्रिनमा टच एण्ड होल्ड गर्नुहोस्।" "म्याग्निफिकेसन" "अहिलेको प्रयोगकर्ता %1$s।" - "%1$s मा स्विच गर्दै..." + "स्विच गरेर %1$s बनाइँदै..." "लग आउट गर्दै %1$s…" "मालिक" "त्रुटि" diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml index e6618f023ef37..386d9e05124d0 100644 --- a/core/res/res/values-or/strings.xml +++ b/core/res/res/values-or/strings.xml @@ -1661,7 +1661,7 @@ "ଫିଚରଗୁଡ଼ିକ ମଧ୍ୟରେ ସ୍ୱିଚ୍ କରିବାକୁ, ତିନୋଟି ଆଙ୍ଗୁଠିରେ ଉପରକୁ ସ୍ୱାଇପ୍ କରି ଧରି ରଖନ୍ତୁ।" "ମ୍ୟାଗ୍ନିଫିକେସନ୍‍" "ବର୍ତ୍ତମାନର ୟୁଜର୍‌ ହେଉଛନ୍ତି %1$s।" - "%1$s ରେ ସୁଇଚ୍ କରନ୍ତୁ…" + "%1$sରେ ସ୍ୱିଚ୍ କରନ୍ତୁ…" "%1$sଙ୍କୁ ଲଗଆଉଟ୍‍ କରାଯାଉଛି…" "ମାଲିକ" "ତ୍ରୁଟି" diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml index 67b7144472ee9..77aceb7264f42 100644 --- a/core/res/res/values-pa/strings.xml +++ b/core/res/res/values-pa/strings.xml @@ -1661,7 +1661,7 @@ "ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਵਿਚਾਲੇ ਅਦਲਾ-ਬਦਲੀ ਕਰਨ ਲਈ, ਤਿੰਨ ਉਂਗਲਾਂ ਨਾਲ ਉੱਪਰ ਵੱਲ ਸਵਾਈਪ ਕਰਕੇ ਦਬਾਈ ਰੱਖੋ।" "ਵੱਡਦਰਸ਼ੀਕਰਨ" "ਮੌਜੂਦਾ ਉਪਭੋਗਤਾ %1$s।" - "%1$s ਤੇ ਸਵਿਚ ਕਰ ਰਿਹਾ ਹੈ…" + "%1$s \'ਤੇ ਸਵਿਚ ਕਰ ਰਿਹਾ ਹੈ…" "%1$s ਨੂੰ ਲਾਗ-ਆਉਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ …" "ਮਾਲਕ" "ਅਸ਼ੁੱਧੀ" diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index f7f80f2b73c90..91f91fd3e6dd1 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -1705,7 +1705,7 @@ "Для переключения между функциями проведите по экрану снизу вверх тремя пальцами и задержите их." "Увеличение" "Выбран аккаунт пользователя %1$s." - "Смена профиля на %1$s…" + "Смена профиля на \"%1$s\"…" "Выход из аккаунта %1$s…" "Владелец" "Ошибка" diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml index 8742a670270e4..0c2b143bc8084 100644 --- a/core/res/res/values-sq/strings.xml +++ b/core/res/res/values-sq/strings.xml @@ -1661,7 +1661,7 @@ "Për të kaluar mes veçorive, rrëshqit shpejt lart me tre gishta dhe mbaje prekur." "Zmadhimi" "Emri i përdoruesit aktual: %1$s" - "Po kalon në %1$s…" + "Po kalon në \"%1$s\"…" "%1$s po del…" "Zotëruesi" "Gabim" diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index 7066c0054ebff..b129b49ba3945 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -1661,7 +1661,7 @@ "Ili ubadilishe kati ya vipengele, telezesha vidole vitatu juu na ushikilie." "Ukuzaji" "Mtumiaji wa sasa %1$s." - "Inabadili kwenda %1$s…" + "Inaenda kwa %1$s…" "Inamwondoa %1$s…" "Mmiliki" "Hitilafu" diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index 699132df0f23f..f379214734c90 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -1661,9 +1661,9 @@ "ఫీచర్ల మధ్య మారడానికి, మూడు చేతి వేళ్ళతో పైకి స్వైప్ చేసి పట్టుకోండి." "మాగ్నిఫికేషన్" "ప్రస్తుత వినియోగదారు %1$s." - "%1$sకి మారుస్తోంది…" + "%1$s యూజర్‌కు స్విచ్ అవుతోంది…" "%1$sని లాగ్ అవుట్ చేస్తోంది…" - "యజమాని" + "ఓనర్" "ఎర్రర్" "ఈ మార్పును మీ నిర్వాహకులు అనుమతించలేదు" "ఈ చర్యను నిర్వహించడానికి యాప్ ఏదీ కనుగొనబడలేదు" diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index d69ac5499a3d8..067045aa08604 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -1705,7 +1705,7 @@ "Щоб переключитися між функціями, проведіть по екрану знизу вгору трьома пальцями й утримуйте їх." "Збільшення" "Поточний користувач: %1$s." - "Перехід в обліковий запис \"%1$s\"…" + "Перехід у режим \"%1$s\"…" "Вихід з облікового запису користувача %1$s…" "Власник" "Помилка" From 95cc34cd98709100eeb7a4ceafdb7c8909f815f9 Mon Sep 17 00:00:00 2001 From: Beth Thibodeau Date: Thu, 11 Mar 2021 18:01:35 -0500 Subject: [PATCH 220/288] Sanitize text fields Bug: 180518039 Test: manual, verify no ANR and media displays normally Change-Id: I1c99e3257107f71eb5049ef19614e2c6836f808c --- .../src/com/android/systemui/media/MediaControlPanel.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java index bffe05085887d..2bf75f2ddb0b5 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java +++ b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java @@ -16,6 +16,7 @@ package com.android.systemui.media; +import static android.app.Notification.safeCharSequence; import static android.provider.Settings.ACTION_MEDIA_CONTROLS_SETTINGS; import android.app.PendingIntent; @@ -261,7 +262,7 @@ public class MediaControlPanel { // Song name TextView titleText = mViewHolder.getTitleText(); - titleText.setText(data.getSong()); + titleText.setText(safeCharSequence(data.getSong())); // App title TextView appName = mViewHolder.getAppName(); @@ -269,7 +270,7 @@ public class MediaControlPanel { // Artist name TextView artistText = mViewHolder.getArtistText(); - artistText.setText(data.getArtist()); + artistText.setText(safeCharSequence(data.getArtist())); // Transfer chip mViewHolder.getSeamless().setVisibility(View.VISIBLE); From b51058da225d452f2a248b6be6a945e86417b7e6 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 12 Mar 2021 00:38:07 -0800 Subject: [PATCH 221/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ic8b967ecb544aa886302eb4a13f0542464ee1608 --- packages/SystemUI/res/values-ar/strings.xml | 2 +- packages/SystemUI/res/values-as/strings.xml | 2 +- packages/SystemUI/res/values-be/strings.xml | 2 +- packages/SystemUI/res/values-bg/strings.xml | 2 +- packages/SystemUI/res/values-bn/strings.xml | 8 ++++---- packages/SystemUI/res/values-bs/strings.xml | 6 +++--- packages/SystemUI/res/values-ca/strings.xml | 2 +- packages/SystemUI/res/values-cs/strings.xml | 2 +- packages/SystemUI/res/values-da/strings.xml | 4 ++-- packages/SystemUI/res/values-de/strings.xml | 2 +- packages/SystemUI/res/values-el/strings.xml | 4 ++-- .../SystemUI/res/values-es-rUS/strings.xml | 4 ++-- packages/SystemUI/res/values-eu/strings.xml | 2 +- packages/SystemUI/res/values-gl/strings.xml | 8 ++++---- packages/SystemUI/res/values-gu/strings.xml | 10 +++++----- packages/SystemUI/res/values-hi/strings.xml | 10 +++++----- packages/SystemUI/res/values-hy/strings.xml | 10 +++++----- packages/SystemUI/res/values-it/strings.xml | 2 +- packages/SystemUI/res/values-iw/strings.xml | 4 ++-- packages/SystemUI/res/values-kk/strings.xml | 2 +- packages/SystemUI/res/values-km/strings.xml | 20 +++++++++---------- packages/SystemUI/res/values-kn/strings.xml | 2 +- packages/SystemUI/res/values-ko/strings.xml | 8 ++++---- packages/SystemUI/res/values-ky/strings.xml | 10 ++++------ packages/SystemUI/res/values-lo/strings.xml | 4 ++-- packages/SystemUI/res/values-lt/strings.xml | 2 +- packages/SystemUI/res/values-ml/strings.xml | 6 +++--- packages/SystemUI/res/values-mn/strings.xml | 8 ++++---- packages/SystemUI/res/values-ms/strings.xml | 2 +- packages/SystemUI/res/values-my/strings.xml | 8 ++++---- packages/SystemUI/res/values-ne/strings.xml | 8 ++++---- packages/SystemUI/res/values-nl/strings.xml | 6 +++--- packages/SystemUI/res/values-or/strings.xml | 8 ++++---- packages/SystemUI/res/values-pa/strings.xml | 2 +- packages/SystemUI/res/values-pl/strings.xml | 2 +- .../SystemUI/res/values-pt-rBR/strings.xml | 10 +++++----- .../SystemUI/res/values-pt-rPT/strings.xml | 6 +++--- packages/SystemUI/res/values-pt/strings.xml | 10 +++++----- packages/SystemUI/res/values-sv/strings.xml | 4 ++-- packages/SystemUI/res/values-sw/strings.xml | 4 ++-- packages/SystemUI/res/values-ta/strings.xml | 4 ++-- packages/SystemUI/res/values-te/strings.xml | 12 +++++------ packages/SystemUI/res/values-th/strings.xml | 2 +- packages/SystemUI/res/values-tl/strings.xml | 4 ++-- packages/SystemUI/res/values-tr/strings.xml | 2 +- packages/SystemUI/res/values-uk/strings.xml | 2 +- packages/SystemUI/res/values-uz/strings.xml | 4 ++-- packages/SystemUI/res/values-vi/strings.xml | 6 +++--- .../SystemUI/res/values-zh-rCN/strings.xml | 2 +- .../SystemUI/res/values-zh-rHK/strings.xml | 4 ++-- 50 files changed, 129 insertions(+), 131 deletions(-) diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 3f3e8710730ac..3d38d5ed088c0 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -489,7 +489,7 @@ "مرحبًا بك مجددًا في جلسة الضيف" "هل تريد متابعة جلستك؟" "البدء من جديد" - "نعم، متابعة." + "نعم، متابعة" "مستخدم ضيف" "لحذف التطبيقات والبيانات، عليك إزالة حساب الضيف" "إزالة الضيف" diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index 2fb0bd7c39b6c..01879548ca855 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -478,7 +478,7 @@ "অতিথি আঁতৰাবনে?" "এই ছেশ্বনৰ সকলো এপ্ আৰু ডেটা মচা হ\'ব।" "আঁতৰাওক" - "আপোনাক পুনৰাই স্বাগতম জনাইছোঁ!" + "অতিথি, আপোনাক পুনৰ স্বাগতম!" "আপুনি আপোনাৰ ছেশ্বন অব্যাহত ৰাখিব বিচাৰেনে?" "আকৌ আৰম্ভ কৰক" "হয়, অব্যাহত ৰাখক" diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index 806f068252aef..fde579b35977d 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -493,7 +493,7 @@ "Выканаць выхад бягучага карыстальніка" "ВЫКАНАЦЬ ВЫХАД КАРЫСТАЛЬНІКА" "Дадаць новага карыстальніка?" - "Пасля стварэння профіля яго трэба наладзіць.\n\nЛюбы карыстальнік прылады можа абнаўляць праграмы ўсіх іншых карыстальнікаў." + "Пасля стварэння профілю яго трэба наладзіць.\n\nЛюбы карыстальнік прылады можа абнаўляць праграмы ўсіх іншых карыстальнікаў." "Дасягнуты ліміт карыстальнікаў" Можна дадаць %d карыстальніка. diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index 81199dd95a58d..6b8844d67d01d 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -488,7 +488,7 @@ "Излизане на потребителя" "Излезте от профила на текущия потребител" "ИЗЛИЗАНЕ НА ПОТРЕБИТЕЛЯ" - "Да се добави ли нов потреб.?" + "Да се добави ли нов потребител?" "Когато добавите нов потребител, той трябва да настрои работното си пространство.\n\nВсеки потребител може да актуализира приложенията за всички останали потребители." "Достигнахте огранич. за потребители" diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index 535dd2f76d20c..d68f46337f2bc 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -476,12 +476,12 @@ "ব্যবহারকারী জুড়ুন" "নতুন ব্যবহারকারী" "অতিথি সরাবেন?" - "এই সেশনের সব অ্যাপ্লিকেশান ও ডেটা মুছে ফেলা হবে।" + "এই সেশনের সব অ্যাপ ও ডেটা মুছে ফেলা হবে।" "সরান" "অতিথি, আপনি ফিরে আসায় আপনাকে স্বাগত!" - "আপনি কি আপনার সেশনটি অবিরত রাখতে চান?" + "আপনি কি আপনার সেশনটি চালিয়ে যেতে চান?" "আবার শুরু করুন" - "হ্যাঁ, অবিরত থাকুন" + "হ্যাঁ, চালিয়ে যান" "অতিথি ব্যবহারকারী" "অ্যাপ্লিকেশান এবং ডেটা মুছে ফেলার জন্য অতিথি ব্যবহারকারী সরান।" "অতিথি সরান" @@ -489,7 +489,7 @@ "বর্তমান ব্যবহারকারীকে লগ-আউট করুন" "ব্যবহারকারীকে লগ-আউট করুন" "নতুন ব্যবহারকারীকে যোগ করবেন?" - "আপনি একজন নতুন ব্যবহারকারী যোগ করলে তাকে তার জায়গা সেট-আপ করে নিতে হবে৷\n\nযেকোনো ব্যবহারকারী অন্য সব ব্যবহারকারীর জন্য অ্যাপ্লিকেশান আপডেট করতে পারবেন৷" + "আপনি একজন নতুন ব্যবহারকারী যোগ করলে তাকে তার জায়গা সেট-আপ করে নিতে হবে৷\n\nযেকোনও ব্যবহারকারী অন্য সব ব্যবহারকারীর জন্য অ্যাপ আপডেট করতে পারবেন৷" "আর কোনও প্রোফাইল যোগ করা যাবে না" আপনি %d জন পর্যন্ত ব্যবহারকারীর প্রোফাইল যোগ করতে পারেন। diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index 7730dcf3450f4..8b93ff1a512cc 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -477,8 +477,8 @@ "Pokaži profil" "Dodaj korisnika" "Novi korisnik" - "Želite li ukloniti gosta?" - "Sve aplikacije i svi podaci iz ove sesije bit će izbrisani." + "Ukloniti gosta?" + "Sve aplikacije i svi podaci iz ove sesije će se izbrisati." "Ukloni" "Zdravo! Lijepo je opet vidjeti goste." "Želite li nastaviti sesiju?" @@ -490,7 +490,7 @@ "Odjavi korisnika" "Odjavi trenutnog korisnika" "ODJAVI KORISNIKA" - "Želite dodati novog korisnika?" + "Dodati novog korisnika?" "Kada dodate novog korisnika, ta osoba treba postaviti svoj prostor.\n\nSvaki korisnik može ažurirati aplikacije za sve ostale korisnike." "Dostignut limit za broj korisnika" diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 02f69c6e7e318..251464d3cee8b 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -715,7 +715,7 @@ "Pot sonar o vibrar en funció de la configuració del telèfon" "Pot sonar o vibrar en funció de la configuració del telèfon. Les converses de l\'aplicació %1$s es mostren com a bombolles de manera predeterminada." "Atrau la teva atenció amb una drecera flotant a aquest contingut." - "Es mostra com a bombolla flotant a la part superior de la secció de converses i mostra la foto de perfil a la pantalla de bloqueig" + "Es mostra com a bombolla flotant a la part superior de la secció de converses i la foto de perfil apareix a la pantalla de bloqueig" "Configuració" "Prioritat" "%1$s no admet les funcions de converses" diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index 2459ed187b96c..e4b32f9fe1a02 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -721,7 +721,7 @@ "Může vyzvánět nebo vibrovat v závislosti na nastavení telefonu" "Může vyzvánět nebo vibrovat v závislosti na nastavení telefonu. Konverzace z aplikace %1$s ve výchozím nastavení bublají." "Přitahuje pozornost pomocí plovoucí zkratky k tomuto obsahu." - "Zobrazuje se v horní části sekce konverzací a má podobu plovoucí bubliny, zobrazuje profilovou fotku na obrazovce uzamčení" + "Zobrazuje se v horní části sekce konverzací, má podobu plovoucí bubliny, zobrazuje profilovou fotku na obrazovce uzamčení" "Nastavení" "Priorita" "Aplikace %1$s funkce konverzace nepodporuje" diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index c711df1d0ee2a..f72d9896b9a52 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -488,8 +488,8 @@ "Log brugeren ud" "Log den aktuelle bruger ud" "LOG BRUGEREN UD" - "Vil du tilføje den nye bruger?" - "Når du tilføjer en ny bruger, skal personen konfigurere sit område.\n\nEnhver bruger kan opdatere apps for alle andre brugere." + "Vil du tilføje en ny bruger?" + "Når du tilføjer en ny bruger, skal personen konfigurere sit område.\n\nAlle brugere kan opdatere apps for alle de andre brugere." "Grænsen for antal brugere er nået" Du kan tilføje op til %d bruger. diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 4f4fdb6683c1e..3b37ca3c4add5 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -715,7 +715,7 @@ "Kann klingeln oder vibrieren, abhängig von den Telefoneinstellungen" "Kann klingeln oder vibrieren, je nach Telefoneinstellungen. Unterhaltungen von %1$s werden standardmäßig als Bubble angezeigt." "Du wirst mit einer unverankerten Verknüpfung darauf aufmerksam gemacht." - "Wird oben im Bereich \"Unterhaltungen\" als unverankerte Bubble mit einem Profilbild auf dem Sperrbildschirm angezeigt" + "Wird oben im Bereich „Unterhaltungen“ als unverankerte Bubble angezeigt und erscheint mit einem Profilbild auf dem Sperrbildschirm" "Einstellungen" "Priorität" "%1$s unterstützt keine Funktionen für Unterhaltungen" diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index 0f83590f8ec34..89331973c532a 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -478,7 +478,7 @@ "Κατάργηση επισκέπτη;" "Όλες οι εφαρμογές και τα δεδομένα αυτής της περιόδου σύνδεσης θα διαγραφούν." "Κατάργηση" - "Επισκέπτη , καλώς όρισες ξανά!" + "Kαλώς ορίσατε ξανά!" "Θέλετε να συνεχίσετε την περίοδο σύνδεσής σας;" "Έναρξη από την αρχή" "Ναι, συνέχεια" @@ -489,7 +489,7 @@ "Αποσύνδεση τρέχοντα χρήστη" "ΑΠΟΣΥΝΔΕΣΗ ΧΡΗΣΤΗ" "Προσθήκη νέου χρήστη;" - "Κατά την προσθήκη ενός νέου χρήστη, αυτός θα πρέπει να ρυθμίσει το χώρο του.\n\nΟποιοσδήποτε χρήστης μπορεί να ενημερώσει τις εφαρμογές για όλους τους άλλους χρήστες." + "Κατά την προσθήκη ενός νέου χρήστη, αυτός θα πρέπει να ρυθμίσει τον χώρο του.\n\nΟποιοσδήποτε χρήστης μπορεί να ενημερώσει τις εφαρμογές για όλους τους άλλους χρήστες." "Συμπληρώθηκε το όριο χρηστών" Μπορείτε να προσθέσετε έως %d χρήστες. diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index d99961434f2f6..0a3df72bba054 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -58,7 +58,7 @@ "Abrir siempre %1$s cuando se conecte %2$s" "Abrir siempre %1$s cuando se conecte %2$s" "¿Permitir depuración por USB?" - "La huella dactilar de tu clave RSA es:\n%1$s" + "La huella digital de tu clave RSA es:\n%1$s" "Permitir siempre desde esta computadora" "Permitir" "No tienes permitida la depuración por USB" @@ -478,7 +478,7 @@ "¿Eliminar invitado?" "Se eliminarán las aplicaciones y los datos de esta sesión." "Eliminar" - "Bienvenido nuevamente, invitado." + "¡Hola de nuevo, invitado!" "¿Quieres retomar la sesión?" "Volver a empezar" "Sí, continuar" diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index 68605b04b0fa8..8922c85fdbca5 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -489,7 +489,7 @@ "Amaitu erabiltzailearen saioa" "AMAITU ERABILTZAILEAREN SAIOA" "Beste erabiltzaile bat gehitu?" - "Erabiltzaile bat gehitzen duzunean, horrek bere eremua konfiguratu beharko du.\n\nEdozein erabiltzailek egunera ditzake beste erabiltzaile guztien aplikazioak." + "Erabiltzaile bat gehitzen duzunean, erabiltzaile horrek bere eremua konfiguratu beharko du.\n\nEdozein erabiltzailek egunera ditzake beste erabiltzaile guztien aplikazioak." "Erabiltzaile-mugara iritsi zara" Gehienez, %d erabiltzaile gehi ditzakezu. diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index 70a486d6c47f0..56415b534ba3d 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -475,10 +475,10 @@ "Mostrar perfil" "Engadir usuario" "Novo usuario" - "Queres eliminar o invitado?" + "Queres quitar o convidado?" "Eliminaranse todas as aplicacións e datos desta sesión." - "Eliminar" - "Benvido de novo, convidado." + "Quitar" + "Benvido de novo, convidado" "Queres continuar coa túa sesión?" "Comezar de novo" "Si, continuar" @@ -489,7 +489,7 @@ "Pechar sesión do usuario actual" "PECHAR SESIÓN DO USUARIO" "Engadir un usuario novo?" - "Cando engadas un usuario novo, este deberá configurar o seu espazo\n\nCalquera usuario pode actualizar as aplicacións para todos os demais usuarios." + "Cando engadas un usuario novo, este deberá configurar o seu espazo.\n\nCalquera usuario pode actualizar as aplicacións para todos os demais usuarios." "Alcanzouse o límite de usuarios" Podes engadir ata %d usuarios. diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index d3a59a0eb9381..6c3d0ec0fdb8f 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -390,7 +390,7 @@ "સ્વતઃ" "રંગોને ઉલટાવો" "રંગ સુધારણા મોડ" - "વધુ સેટિંગ્સ" + "વધુ સેટિંગ" "થઈ ગયું" "કનેક્ટ થયેલ" "કનેક્ટ કરેલ, %1$s બૅટરી" @@ -476,10 +476,10 @@ "વપરાશકર્તા ઉમેરો" "નવો વપરાશકર્તા" "અતિથિ દૂર કરીએ?" - "આ સત્રમાંની તમામ ઍપ્લિકેશનો અને ડેટા કાઢી નાખવામાં આવશે." + "આ સત્રમાંની તમામ ઍપ અને ડેટા કાઢી નાખવામાં આવશે." "દૂર કરો" "ફરી સ્વાગત છે, અતિથિ!" - "શું તમે તમારું સત્ર ચાલુ કરવા માંગો છો?" + "શું તમે તમારું સત્ર ચાલુ રાખવા માંગો છો?" "શરૂ કરો" "હા, ચાલુ રાખો" "અતિથિ વપરાશકર્તા" @@ -489,7 +489,7 @@ "વર્તમાન વપરાશકર્તાને લૉગઆઉટ કરો" "વપરાશકર્તાને લૉગઆઉટ કરો" "નવા વપરાશકર્તાને ઉમેરીએ?" - "જ્યારે તમે કોઈ નવા વપરાશકર્તાને ઉમેરો છો, ત્યારે તે વ્યક્તિને તેમનું સ્થાન સેટ કરવાની જરૂર પડે છે.\n\nકોઈપણ વપરાશકર્તા બધા અન્ય વપરાશકર્તાઓ માટે એપ્લિકેશન્સને અપડેટ કરી શકે છે." + "જ્યારે તમે કોઈ નવા વપરાશકર્તાને ઉમેરો છો, ત્યારે તે વ્યક્તિને તેમનું સ્થાન સેટ કરવાની જરૂર પડે છે.\n\nકોઈપણ વપરાશકર્તા બધા અન્ય વપરાશકર્તાઓ માટે ઍપને અપડેટ કરી શકે છે." "વપરાશકર્તા સંખ્યાની મર્યાદા" તમે %d વપરાશકર્તા સુધી ઉમેરી શકો છો. @@ -738,7 +738,7 @@ "%1$s માટે સૂચના નિયંત્રણો ચાલુ છે" "%1$s માટે સૂચના નિયંત્રણો બંધ છે" "આ ચૅનલની સૂચનાઓને મંજૂરી આપો" - "વધુ સેટિંગ્સ" + "વધુ સેટિંગ" "કસ્ટમાઇઝ કરો" "થઈ ગયું" "રદ કરો" diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 3daab1bf489c2..9b9b99fa0367a 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -477,10 +477,10 @@ "प्रोफ़ाइल दिखाएं" "उपयोगकर्ता जोड़ें" "नया उपयोगकर्ता" - "अतिथि को निकालें?" - "इस सत्र के सभी ऐप्स और डेटा को हटा दिया जाएगा." + "क्या आप मेहमान को हटाना चाहते हैं?" + "इस सत्र के सभी ऐप्लिकेशन और डेटा को हटा दिया जाएगा." "निकालें" - "अतिथि, आपका फिर से स्वागत है!" + "मेहमान, आपका फिर से स्वागत है!" "क्‍या आप अपना सत्र जारी रखना चाहते हैं?" "फिर से शुरू करें" "हां, जारी रखें" @@ -499,7 +499,7 @@ "उपयोगकर्ता निकालें?" "इस उपयोगकर्ता के सभी ऐप और डेटा को हटा दिया जाएगा." - "निकालें" + "हटाएं" "बैटरी सेवर चालू है" "निष्‍पादन और पृष्ठभूमि डेटा को कम करता है" "बैटरी सेवर बंद करें" @@ -717,7 +717,7 @@ "फ़ोन की सेटिंग के आधार पर, सूचना आने पर घंटी बज सकती है या वाइब्रेशन हो सकता है" "फ़ोन की सेटिंग के आधार पर, सूचना आने पर घंटी बज सकती है या वाइब्रेशन हो सकता है. %1$s में होने वाली बातचीत, डिफ़ॉल्ट रूप से बबल के तौर पर दिखती है." "फ़्लोट करने वाले शॉर्टकट की मदद से इस सामग्री पर आपका ध्यान बना रहता है." - "इससे बातचीत, सेक्शन में सबसे ऊपर और फ़्लोटिंग बबल के तौर पर दिखती है. साथ ही, लॉक स्क्रीन पर प्रोफ़ाइल फ़ोटो दिखती है" + "इससे चैट, बातचीत सेक्शन में सबसे ऊपर फ़्लोटिंग बबल के तौर पर दिखती है. साथ ही, लॉक स्क्रीन पर प्रोफ़ाइल फ़ोटो दिखती है" "सेटिंग" "प्राथमिकता" "%1$s पर बातचीत की सुविधाएं काम नहीं करतीं" diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index 514e60b3ecd74..2f2883e876343 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -475,12 +475,12 @@ "Ցույց տալ դիտարկումը" "Ավելացնել օգտատեր" "Նոր օգտատեր" - "Հեռացնե՞լ հյուրին:" + "Հեռացնե՞լ հյուրին" "Այս աշխատաշրջանի բոլոր ծրագրերն ու տվյալները կջնջվեն:" "Հեռացնել" - "Բարի վերադարձ, հյուր:" - "Դուք ցանկանու՞մ եք շարունակել ձեր գործողությունը:" - "Սկսել" + "Բարի վերադարձ, հյուր" + "Շարունակե՞լ աշխատաշրջանը։" + "Վերսկսել" "Այո, շարունակել" "Հյուր" "Հավելվածները և տվյալները ջնջելու համար հեռացրեք հյուրին" @@ -488,7 +488,7 @@ "Ընթացիկ օգտատիրոջ դուրս գրում" "Ընթացիկ օգտատիրոջ դուրս գրում" "ԸՆԹԱՑԻԿ ՕԳՏՎՈՂԻ ԴՈՒՐՍ ԳՐՈՒՄ" - "Ավելացնե՞լ նոր պրոֆիլ:" + "Ավելացնե՞լ նոր օգտատեր" "Երբ նոր օգտատեր եք ավելացնում, նա պետք է կարգավորի իր պրոֆիլը:\n\nՑանկացած օգտատեր կարող է թարմացնել հավելվածները մյուս բոլոր հաշիվների համար:" "Սահմանաչափը սպառված է" diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index ffcc3b5f31bc6..8dcb5bc20303a 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -478,7 +478,7 @@ "Rimuovere l\'ospite?" "Tutte le app e i dati di questa sessione verranno eliminati." "Rimuovi" - "Bentornato, ospite." + "Ti ridiamo il benvenuto alla sessione Ospite." "Vuoi continuare la sessione?" "Ricomincia" "Sì, continua" diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index c0961822f74bc..3fd28c0088be6 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -481,7 +481,7 @@ "משתמש חדש" "להסיר אורח?" "כל האפליקציות והנתונים בפעילות זו באתר יימחקו." - "הסר" + "הסרה" "שמחים לראותך שוב!" "האם ברצונך להמשיך בפעילות באתר?" "ברצוני להתחיל מחדש" @@ -503,7 +503,7 @@ "האם להסיר את המשתמש?" "כל האפליקציות והנתונים של המשתמש הזה יימחקו." - "הסר" + "הסרה" "תכונת החיסכון בסוללה פועלת" "מפחית את הביצועים ונתונים ברקע" "כיבוי תכונת החיסכון בסוללה" diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index ebb59de27c2b4..1f16013688cee 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -478,7 +478,7 @@ "Қонақты жою керек пе?" "Осы сеанстағы барлық қолданбалар мен деректер жойылады." "Алып тастау" - "Қош келдіңіз, қонақ" + "Қош келдіңіз, қонақ!" "Сеансты жалғастыру керек пе?" "Қайта бастау" "Иә, жалғастыру" diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index 29a9491bfa1d9..1020948bf6312 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -473,23 +473,23 @@ "ប្ដូរ​អ្នកប្រើ ​អ្នកប្រើ​បច្ចុប្បន្ន %s" "អ្នកប្រើបច្ចុប្បន្ន %s" "បង្ហាញ​ប្រវត្តិរូប" - "បន្ថែម​អ្នកប្រើ" + "បញ្ចូល​អ្នកប្រើ" "អ្នកប្រើ​ថ្មី" - "លុប​ភ្ញៀវ​?" - "ទិន្នន័យ និង​កម្មវិធី​ទាំងអស់​ក្នុង​សម័យ​នេះ​នឹង​ត្រូវ​បាន​លុប។" - "លុបចេញ" + "ដកភ្ញៀវចេញឬ?" + "កម្មវិធី និងទិន្នន័យ​ទាំងអស់​ក្នុង​វគ្គ​នេះ​នឹង​ត្រូវ​លុប។" + "ដកចេញ" "សូម​ស្វាគមន៍​ការ​ត្រឡប់​មកវិញ, ភ្ញៀវ!" - "តើ​អ្នក​ចង់​បន្ត​សម័យ​របស់​អ្នក​?" - "ចាប់ផ្ដើម" + "តើ​អ្នក​ចង់​បន្ត​វគ្គ​របស់​អ្នក​ទេ?" + "ចាប់ផ្ដើមសាជាថ្មី" "បាទ​/ចាស ​បន្ត" "អ្នកប្រើភ្ញៀវ" "ដើម្បីលុបកម្មវិធី និងទិន្នន័យ សូមយកអ្នកប្រើជាភ្ញៀវចេញ" - "យកភ្ញៀវចេញ" + "ដកភ្ញៀវចេញ" "ចុះឈ្មោះអ្នកប្រើចេញ" "ចុះឈ្មោះអ្នកប្រើបច្ចុប្បន្នចេញ" "ចុះឈ្មោះអ្នកប្រើចេញ" - "បន្ថែម​អ្នកប្រើ​ថ្មី?" - "ពេល​អ្នក​បន្ថែម​អ្នកប្រើ​ថ្មី អ្នកប្រើ​នោះ​ត្រូវ​កំណត់​ទំហំ​ផ្ទាល់​របស់​គេ។\n\nអ្នក​ប្រើ​ណាមួយ​ក៏​អាច​ធ្វើ​បច្ចុប្បន្នភាព​កម្មវិធី​សម្រាប់​អ្នកប្រើ​ផ្សេង​បាន​ដែរ។" + "បញ្ចូល​អ្នកប្រើ​ថ្មីឬ?" + "នៅពេល​អ្នក​បញ្ចូល​អ្នកប្រើ​ថ្មី អ្នកប្រើ​នោះ​ត្រូវ​រៀបចំកន្លែងរបស់​គេ។\n\nអ្នក​ប្រើ​ណា​ក៏​អាច​ដំឡើងកំណែ​កម្មវិធី​សម្រាប់​អ្នកប្រើទាំងអស់ផ្សេងទៀត​បាន​ដែរ។" "​បាន​ឈាន​ដល់ចំនួន​កំណត់អ្នកប្រើប្រាស់" អ្នកអាចបញ្ចូល​អ្នក​ប្រើប្រាស់បាន​រហូតដល់ %d នាក់។ @@ -497,7 +497,7 @@ "យកអ្នកប្រើចេញ?" "កម្មវិធី និងទិន្នន័យទាំងអស់របស់អ្នកប្រើនេះនឹងត្រូវបានលុប។" - "យកចេញ" + "ដកចេញ" "មុខងារ​សន្សំ​ថ្មបានបើក" "ការ​បន្ថយ​ការ​ប្រតិបត្តិ និង​ទិន្នន័យ​ផ្ទៃ​ខាងក្រោយ" "បិទ​មុខងារ​សន្សំ​ថ្ម" diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index 64e71af99d648..b9fc905763912 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -481,7 +481,7 @@ "ಮತ್ತೆ ಸುಸ್ವಾಗತ, ಅತಿಥಿ!" "ನಿಮ್ಮ ಸೆಷನ್‌ ಮುಂದುವರಿಸಲು ಇಚ್ಚಿಸುವಿರಾ?" "ಪ್ರಾರಂಭಿಸಿ" - "ಹೌದು, ಮುಂದುವರಿ" + "ಹೌದು, ಮುಂದುವರಿಸಿ" "ಅತಿಥಿ ಬಳಕೆದಾರ" "ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಮತ್ತು ಡೇಟಾ ಅಳಿಸಲು, ಅತಿಥಿ ಬಳಕೆದಾರರನ್ನು ತೆಗೆದುಹಾಕಿ" "ಅತಿಥಿಯನ್ನು ತೆಗೆದುಹಾಕಿ" diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index 970f49e832055..f5aadc85eab4a 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -478,10 +478,10 @@ "게스트를 삭제하시겠습니까?" "이 세션에 있는 모든 앱과 데이터가 삭제됩니다." "삭제" - "게스트 세션 다시 시작" + "게스트 세션 진행" "세션을 계속 진행하시겠습니까?" "다시 시작" - "예, 계속합니다." + "계속 진행" "게스트 사용자" "앱 및 데이터를 삭제하려면 게스트 사용자를 삭제하세요." "게스트 삭제" @@ -489,7 +489,7 @@ "현재 사용자 로그아웃" "사용자 로그아웃" "신규 사용자를 추가할까요?" - "추가된 새로운 사용자는 자신의 공간을 설정해야 합니다.\n\n모든 사용자는 다른 사용자들을 위하여 앱을 업데이트할 수 있습니다." + "추가된 새로운 사용자는 자신의 공간을 설정해야 합니다.\n\n사용자라면 누구든 다른 사용자를 위해 앱을 업데이트할 수 있습니다." "사용자 제한 도달" 사용자를 %d명까지 추가할 수 있습니다. @@ -715,7 +715,7 @@ "휴대전화 설정에 따라 벨소리나 진동이 울릴 수 있음" "휴대전화 설정에 따라 벨소리나 진동이 울릴 수 있습니다. 기본적으로 %1$s의 대화는 대화창으로 표시됩니다." "이 콘텐츠로 연결되는 플로팅 바로가기로 사용자의 주의를 끕니다." - "대화 섹션 상단에 표시, 플로팅 대화창으로 표시, 그리고 잠금 화면에 프로필 사진이 표시됨" + "대화 섹션 상단에 표시, 플로팅 대화창으로 표시, 잠금 화면에 프로필 사진이 표시됨" "설정" "우선순위" "%1$s 앱은 대화 기능을 지원하지 않습니다." diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index 616cda92274a7..b281f82d5ce8c 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -181,9 +181,7 @@ "Эки таякча батарея." "Үч таякча батарея." "Батарея толук." - - - + "Батарея кубатынын деңгээли белгисиз." "Телефон сигналы жок." "Телефон сигналы бир таякча." "Телефон сигналы эки таякча." @@ -478,9 +476,9 @@ "Колдонуучу кошуу" "Жаңы колдонуучу" "Конокту алып саласызбы?" - "Бул сеанстагы бардык колдонмолор жана дайындар өчүрүлөт." + "Бул сеанстагы бардык колдонмолор жана маалыматтар өчүрүлөт." "Алып салуу" - "Кайтып келишиңиз менен, конок!" + "Кайтып келишиңиз менен!" "Сеансыңызды улантасызбы?" "Кайра баштоо" "Ооба, уланта берели" @@ -717,7 +715,7 @@ "Телефондун жөндөөлөрүнө жараша шыңгырап же дирилдеши мүмкүн" "Телефондун жөндөөлөрүнө жараша шыңгырап же дирилдеши мүмкүн. %1$s колдонмосундагы жазышуулар демейки жөндөө боюнча калкып чыкма билдирмелер түрүндө көрүнөт." "Калкыма ыкчам баскыч менен көңүлүңүздү бул мазмунга буруп турат." - "Жазышуулар тизмесинин өйдө жагында калкып чыкма билдирме түрүндө көрүнүп, профиль сүрөтү кулпуланган экрандан чагылдырылат" + "Жазышуулар тизмесинин өйдө жагында калкып чыкма билдирме түрүндө көрүнсө, профиль сүрөтү кулпуланган экранда көрүнөт" "Жөндөөлөр" "Маанилүүлүгү" "%1$s жазышуу функцияларын колдоого албайт" diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index 731af42208eb1..daae298d03171 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -478,7 +478,7 @@ "ລຶບ​ແຂກ​ບໍ?" "ແອັບຯ​ແລະ​ຂໍ້​ມູນ​ທັງ​ໝົດ​ໃນ​ເຊດ​ຊັນ​ນີ້​ຈະ​ຖືກ​ລຶບ​ອອກ." "ລຶບ​" - "ຍິນ​ດີ​ຕ້ອນ​ຮັບ​ກັບ​ມາ, ຜູ່​ຢ້ຽມ​ຢາມ!" + "ຍິນ​ດີ​ຕ້ອນ​ຮັບ​ກັບ​ມາ, ຜູ້ຢ້ຽມຢາມ!" "ທ່ານ​ຕ້ອງ​ການ​ສືບ​ຕໍ່​ເຊດ​ຊັນ​ຂອງ​ທ່ານບໍ່?" "ເລີ່ມຕົ້ນໃຫມ່" "​ຕົກ​ລົງ, ດຳ​ເນີນ​ການ​ຕໍ່" @@ -489,7 +489,7 @@ "ອອກ​ຈາກ​ຜູ້​ໃຊ້​ປະ​ຈຸ​ບັນ" "ເອົາຜູ້ໃຊ້ອອກຈາກລະບົບ" "ເພີ່ມຜູ້ໃຊ້ໃໝ່ບໍ?" - "ເມື່ອ​ທ່ານ​ເພີ່ມ​ຜູ້ໃຊ້​ໃໝ່, ຜູ້ໃຊ້​ນັ້ນ​ຈະ​ຕ້ອງ​ຕັ້ງ​ຄ່າ​ພື້ນ​ທີ່​ບ່ອນ​ຈັດ​ເກັບ​ຂໍ້​ມູນ​ຂອງ​ລາວ.\n\nຜູ້ໃຊ້​ທຸກ​ຄົນ​ສາ​ມາດ​ອັບ​ເດດ​ແອັບຯຂອງ​ຜູ້​ໃຊ້​ຄົນ​ອື່ນ​ທັງ​ໝົດ​ໄດ້." + "ເມື່ອ​ທ່ານ​ເພີ່ມ​ຜູ້ໃຊ້​ໃໝ່, ຜູ້ໃຊ້​ນັ້ນ​ຈະ​ຕ້ອງ​ຕັ້ງ​ຄ່າ​ພື້ນ​ທີ່​ບ່ອນ​ຈັດ​ເກັບ​ຂໍ້​ມູນ​ຂອງ​ລາວ.\n\nຜູ້ໃຊ້​ທຸກ​ຄົນ​ສາ​ມາດ​ອັບ​ເດດ​ແອັບຂອງ​ຜູ້​ໃຊ້​ຄົນ​ອື່ນ​ທັງ​ໝົດ​ໄດ້." "ຮອດຂີດຈຳກັດຜູ້ໃຊ້ແລ້ວ" ທ່ານສາມາດເພີ່ມໄດ້ສູງສຸດ %d ຄົນ. diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index 54a32470f91d8..5607584e73511 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -516,7 +516,7 @@ "Tvarkyti" "Istorija" "Nauja" - "Tylūs" + "Tylus" "Pranešimai" "Pokalbiai" "Išvalyti visus tylius pranešimus" diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index 817ce6653727a..8026f78be198d 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -476,9 +476,9 @@ "ഉപയോക്താവിനെ ചേര്‍ക്കുക" "പുതിയ ഉപയോക്താവ്" "അതിഥിയെ നീക്കംചെയ്യണോ?" - "ഈ സെഷനിലെ എല്ലാ അപ്ലിക്കേഷനുകളും ഡാറ്റയും ഇല്ലാതാക്കും." + "ഈ സെഷനിലെ എല്ലാ ആപ്പുകളും ഡാറ്റയും ഇല്ലാതാക്കും." "നീക്കംചെയ്യുക" - "അതിഥിയ്‌ക്ക് വീണ്ടും സ്വാഗതം!" + "അതിഥി, വീണ്ടും സ്വാഗതം!" "നിങ്ങളുടെ സെഷൻ തുടരണോ?" "പുനരാംരംഭിക്കുക" "അതെ, തുടരുക" @@ -489,7 +489,7 @@ "നിലവിലെ ഉപയോക്താവിനെ ലോഗൗട്ട് ചെയ്യുക" "ഉപയോക്താവിനെ ലോഗൗട്ട് ചെയ്യുക" "പുതിയ ഉപയോക്താവിനെ ചേർക്കണോ?" - "നിങ്ങൾ ഒരു പുതിയ ഉപയോക്താവിനെ ചേർക്കുമ്പോൾ, ആ വ്യക്തിക്ക് അവരുടെ ഇടം സജ്ജീകരിക്കേണ്ടതുണ്ട്.\n\nമറ്റ് എല്ലാ ഉപയോക്താക്കൾക്കുമായി ഏതൊരു ഉപയോക്താവിനും അപ്ലിക്കേഷനുകൾ അപ്‌ഡേറ്റ് ചെയ്യാനാവും." + "നിങ്ങൾ പുതിയൊരു ഉപയോക്താവിനെ ചേർക്കുമ്പോൾ, ആ വ്യക്തിക്ക് അവരുടെ ഇടം സജ്ജീകരിക്കേണ്ടതുണ്ട്.\n\nമറ്റ് എല്ലാ ഉപയോക്താക്കൾക്കുമായി ഏതൊരു ഉപയോക്താവിനും ആപ്പുകൾ അപ്‌ഡേറ്റ് ചെയ്യാനാവും." "ഉപയോക്തൃ പരിധി എത്തി" നിങ്ങൾക്ക് %d ഉപയോക്താക്കളെ വരെ ചേർക്കാനാവും. diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index 9befbcb18e7ff..0ecfbf91614a2 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -390,7 +390,7 @@ "АВТОМАТ" "Өнгийг урвуулах" "Өнгө залруулах горим" - "Өөр тохиргоо" + "Бусад тохиргоо" "Дууссан" "Холбогдсон" "Холбогдсон, батерей %1$s" @@ -476,9 +476,9 @@ "Хэрэглэгч нэмэх" "Шинэ хэрэглэгч" "Зочныг хасах уу?" - "Энэ сешний бүх апп болон дата устах болно." + "Энэ харилцан үйлдлийн бүх апп болон дата устах болно." "Хасах" - "Тавтай морилно уу!" + "Эргэн тавтай морилно уу!" "Та үргэлжлүүлэхийг хүсэж байна уу?" "Дахин эхлүүлэх" "Тийм, үргэлжлүүлэх" @@ -489,7 +489,7 @@ "Одоогийн хэрэглэгчийг гаргах" "ХЭРЭГЛЭГЧЭЭС ГАРАХ" "Шинэ хэрэглэгч нэмэх үү?" - "Та шинэ хэрэглэгч нэмбэл тухайн хүн өөрийн профайлыг тохируулах шаардлагатай.\n\nАль ч хэрэглэгч бүх хэрэглэгчийн апп-уудыг шинэчлэх боломжтой." + "Та шинэ хэрэглэгч нэмбэл тухайн хүн өөрийн профайлыг тохируулах шаардлагатай.\n\nАль ч хэрэглэгч бүх хэрэглэгчийн аппуудыг шинэчлэх боломжтой." "Хэрэглэгчийн хязгаарт хүрсэн" Та %d хүртэлх хэрэглэгч нэмэх боломжтой. diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index e82f0afe1ab8b..de2fcd817b7b5 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -715,7 +715,7 @@ "Mungkin berbunyi atau bergetar berdasarkan tetapan telefon" "Mungkin berbunyi atau bergetar berdasarkan tetapan telefon. Perbualan daripada gelembung %1$s secara lalai." "Memastikan anda memberikan perhatian dengan pintasan terapung ke kandungan ini." - "Ditunjukkan di sebelah atas bahagian perbualan, muncul sebagai gelembung terapung, memaparkan gambar profil pada skrin kunci" + "Ditunjukkan di sebelah atas bahagian perbualan, terpapar sebagai gelembung terapung, gambar profil dipaparkan pada skrin kunci" "Tetapan" "Keutamaan" "%1$s tidak menyokong ciri perbualan" diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index 837c7817f3b32..07400bb4f1802 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -475,12 +475,12 @@ "ပရိုဖိုင်ကို ပြရန်" "အသုံးပြုသူ ထည့်ရန်" "အသုံးပြုသူ အသစ်" - "ဧည့်သည်ကို ဖယ်ထုတ်လိုက်ရမလား?" + "ဧည့်သည်ကို ဖယ်မလား။" "ဒီချိတ်ဆက်မှု ထဲက အက်ပ်များ အားလုံး နှင့် ဒေတာကို ဖျက်ပစ်မည်။" "ဖယ်ထုတ်ပါ" - "ပြန်လာတာ ကြိုဆိုပါသည်၊ ဧည့်သည်!" - "သင်သည် သင်၏ ချိတ်ဆက်မှုကို ဆက်ပြုလုပ် လိုပါသလား?" - "အစမှ ပြန်စပါ" + "ဧည့်သည်ကို ပြန်လည် ကြိုဆိုပါသည်။" + "သင်၏ စက်ရှင်ကို ဆက်လုပ်လိုပါသလား။" + "ပြန်စပါ" "ဆက်လုပ်ပါ" "ဧည့်သည် အသုံးပြုသူ" "အက်ပ်များနှင့် ဒေတာအား ဖျက်ရန်၊ တခဏသုံးစွဲသူအား ဖယ်ရှားပါ" diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index 602d6416bccc6..dcd665a5c1449 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -476,9 +476,9 @@ "प्रयोगकर्ता थप्नुहोस्" "नयाँ प्रयोगकर्ता" "अतिथि हटाउने हो?" - "यस सत्रमा सबै एपहरू र डेटा मेटाइनेछ।" + "यो सत्रमा भएका सबै एपहरू र डेटा मेटाइने छ।" "हटाउनुहोस्" - "पुनः स्वागत, अतिथि!" + "तपाईंलाई फेरि स्वागत छ, अतिथि" "तपाईं आफ्नो सत्र जारी गर्न चाहनुहुन्छ?" "सुरु गर्नुहोस्" "हो, जारी राख्नुहोस्" @@ -489,7 +489,7 @@ "वर्तमान प्रयोगकर्ता लगआउट गर्नुहोस्" "प्रयोगकर्ता लगआउट गर्नुहोस्" "नयाँ प्रयोगकर्ता थप्ने हो?" - "जब तपाईँले नयाँ प्रयोगकर्ता थप्नुहुन्छ, त्यस प्रयोगकर्ताले आफ्नो स्थान स्थापना गर्न पर्ने छ।\n\nकुनै पनि प्रयोगकर्ताले सबै अन्य प्रयोगकर्ताहरूका लागि एपहरू अद्यावधिक गर्न सक्छन्।" + "जब तपाईँले नयाँ प्रयोगकर्ता थप्नुहुन्छ, त्यस प्रयोगकर्ताले आफ्नो स्थान स्थापना गर्न पर्ने छ।\n\nसबै प्रयोगकर्ताले अरू प्रयोगकर्ताका एपहरू अपडेट गर्न सक्छन्।" "प्रयोगकर्ताको सीमा पुग्यो" तपाईं अधिकतम %d प्रयोगहरू मात्र थप्न सक्नुहुन्छ। @@ -715,7 +715,7 @@ "फोनको सेटिङका आधारमा घन्टी बज्न वा कम्पन हुन सक्छ" "फोनको सेटिङका आधारमा घन्टी बज्न वा कम्पन हुन सक्छ। %1$s का वार्तालापहरू पूर्वनिर्धारित रूपमा बबलमा देखाइन्छन्।" "फ्लोटिङ सर्टकटमार्फत यो सामग्रीतर्फ तपाईंको ध्यान आकर्षित गर्दछ।" - "वार्तालाप खण्डको सिरानमा देखा पर्छ, तैरने बबलका रूपमा देखा पर्छ, लक स्क्रिनमा प्रोफाइल फोटो देखाइन्छ" + "वार्तालाप खण्डको सिरानमा देखा पर्छ, तैरने बबलका रूपमा देखा पर्छ, लक स्क्रिनमा प्रोफाइल फोटो देखिन्छ" "सेटिङ" "प्राथमिकता" "%1$s मा वार्तालापसम्बन्धी सुविधा प्रयोग गर्न मिल्दैन" diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index a65023251d9e0..2e79d276e5378 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -489,7 +489,7 @@ "Huidige gebruiker uitloggen" "GEBRUIKER UITLOGGEN" "Nieuwe gebruiker toevoegen?" - "Wanneer u een nieuwe gebruiker toevoegt, moet die persoon zijn eigen profiel instellen.\n\nElke gebruiker kan apps updaten voor alle andere gebruikers." + "Als je een nieuwe gebruiker toevoegt, moet die persoon zijn eigen profiel instellen.\n\nElke gebruiker kan apps updaten voor alle andere gebruikers." "Gebruikerslimiet bereikt" Je kunt maximaal %d gebruikers toevoegen. @@ -679,7 +679,7 @@ "Bluetooth inschakelen?" "Als je je toetsenbord wilt verbinden met je tablet, moet je eerst Bluetooth inschakelen." "Inschakelen" - "Meldingen zonder geluid weergeven" + "Meldingen zonder geluid tonen" "Alle meldingen blokkeren" "Niet zonder geluid weergeven" "Niet zonder geluid weergeven of blokkeren" @@ -715,7 +715,7 @@ "Kan overgaan of trillen op basis van de telefooninstellingen" "Kan overgaan of trillen op basis van de telefooninstellingen. Gesprekken uit %1$s worden standaard als bubbels weergegeven." "Trekt de aandacht met een zwevende snelkoppeling naar deze content." - "Wordt bovenaan het gespreksgedeelte weergegeven, verschijnt als zwevende bubbel, geeft profielfoto weer op vergrendelscherm" + "Verschijnt als zwevende bubbel bovenaan het gespreksgedeelte en toont profielfoto op vergrendelscherm" "Instellingen" "Prioriteit" "%1$s ondersteunt geen gespreksfuncties" diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index 1812a8d2676f6..fd1134960f1e9 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -371,7 +371,7 @@ "ସେଟିଂସ୍" "ସମୟ" "ମୁଁ" - "ୟୁଜର୍‌" + "ଉପଯୋଗକର୍ତ୍ତା‌" "ନୂଆ ଉପଯୋଗକର୍ତ୍ତା" "ୱାଇ-ଫାଇ" "ସଂଯୁକ୍ତ ହୋଇନାହିଁ" @@ -476,10 +476,10 @@ "ଉପଯୋଗକର୍ତ୍ତାଙ୍କୁ ଯୋଗ କରନ୍ତୁ" "ନୂଆ ଉପଯୋଗକର୍ତ୍ତା" "ଅତିଥିଙ୍କୁ କାଢ଼ିଦେବେ?" - "ଏହି ଅବଧିର ସମସ୍ତ ଆପ୍‌ ଓ ଡାଟା ଡିଲିଟ୍‌ ହୋଇଯିବ।" + "ଏହି ସେସନର ସମସ୍ତ ଆପ୍‌ ଓ ଡାଟା ଡିଲିଟ୍‌ ହୋଇଯିବ।" "କାଢ଼ିଦିଅନ୍ତୁ" "ପୁଣି ସ୍ୱାଗତ, ଅତିଥି!" - "ଆପଣ ନିଜର ଅବଧି ଜାରି ରଖିବାକୁ ଚାହାନ୍ତି କି?" + "ଆପଣ ନିଜର ସେସନ୍ ଜାରି ରଖିବାକୁ ଚାହାଁନ୍ତି କି?" "ଆରମ୍ଭ କରନ୍ତୁ" "ହଁ, ଜାରି ରଖନ୍ତୁ" "ଅତିଥି ୟୁଜର୍‍" @@ -489,7 +489,7 @@ "ବର୍ତ୍ତମାନର ୟୁଜରଙ୍କୁ ଲଗଆଉଟ୍‍ କରନ୍ତୁ" "ୟୁଜରଙ୍କୁ ଲଗଆଉଟ୍‍ କରନ୍ତୁ" "ନୂତନ ଉପଯୋଗକର୍ତ୍ତା ଯୋଗ କରିବେ?" - "ଜଣେ ନୂଆ ୟୁଜର୍‍ଙ୍କୁ ଯୋଡ଼ିବାବେଳେ, ସେହି ବ୍ୟକ୍ତିଙ୍କୁ ସ୍ଥାନ ସେଟ୍‍ କରିବାକୁ ପଡ଼ିବ। \n \n ଅନ୍ୟ ସମସ୍ତ ୟୁଜର୍‍ଙ୍କ ପାଇଁ ଯେକୌଣସି ୟୁଜର୍‍ ଆପ୍‌ଗୁଡ଼ିକୁ ଅପଡେଟ୍‌ କରିପାରିବେ।" + "ଆପଣ ଜଣେ ନୂଆ ଉପଯୋଗକର୍ତ୍ତାଙ୍କୁ ଯୋଗ କଲେ,ତାଙ୍କୁ ସ୍ପେସ୍ ସେଟ୍ ଅପ୍ କରିବାକୁ ପଡ଼ିବ। \n \n ଅନ୍ୟ ସମସ୍ତ ଉପଯୋଗକର୍ତ୍ତାଙ୍କ ପାଇଁ ଯେ କୌଣସି ଉପଯୋଗକର୍ତ୍ତା ଆପଗୁଡ଼ିକୁ ଅପଡେଟ୍‌ କରିପାରିବେ।" "ଉପଯୋଗକର୍ତ୍ତା ସୀମାରେ ପହଞ୍ଚିଛି" କେବଳ %d ଉପଯୋଗକର୍ତ୍ତା ହିଁ ତିଆରି କରିହେବ। diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index 0e3c64b1109a3..e3aa3b0ba3dd4 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -480,7 +480,7 @@ "ਹਟਾਓ" "ਮਹਿਮਾਨ, ਫਿਰ ਤੁਹਾਡਾ ਸੁਆਗਤ ਹੈ!" "ਕੀ ਤੁਸੀਂ ਆਪਣਾ ਸੈਸ਼ਨ ਜਾਰੀ ਰੱਖਣਾ ਚਾਹੁੰਦੇ ਹੋ?" - "ਸ਼ੁਰੂ ਕਰੋ" + "ਮੁੜ-ਸ਼ੁਰੂ ਕਰੋ" "ਹਾਂ, ਜਾਰੀ ਰੱਖੋ" "ਮਹਿਮਾਨ ਉਪਭੋਗਤਾ" "ਐਪਾਂ ਅਤੇ ਡਾਟਾ ਮਿਟਾਉਣ ਲਈ, ਮਹਿਮਾਨ ਵਰਤੋਂਕਾਰ ਹਟਾਓ" diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index adecfa4c1f33c..56ed3de4cd88f 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -482,7 +482,7 @@ "Usunąć gościa?" "Wszystkie aplikacje i dane w tej sesji zostaną usunięte." "Usuń" - "Witaj ponownie, gościu!" + "Witaj ponownie, Gościu!" "Chcesz kontynuować sesję?" "Rozpocznij nową" "Tak, kontynuuj" diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index 231c8f8c24417..860c372eec80e 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -475,16 +475,16 @@ "Mostrar perfil" "Adicionar usuário" "Novo usuário" - "Remover convidado?" + "Remover visitante?" "Todos os apps e dados nesta sessão serão excluídos." "Remover" - "Bem-vindo, convidado." + "Você voltou, visitante!" "Quer continuar a sessão?" "Recomeçar" "Sim, continuar" - "Usuário convidado" - "Para excluir apps e dados, remova o usuário convidado" - "REMOVER CONVIDADO" + "Usuário visitante" + "Para excluir apps e dados, remova o usuário visitante" + "REMOVER VISITANTE" "Desconectar usuário" "Desconectar usuário atual" "DESCONECTAR USUÁRIO" diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index e3da3b84a181f..b491bd6b8f748 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -476,9 +476,9 @@ "Adicionar utilizador" "Novo utilizador" "Remover o convidado?" - "Todas as aplicações e dados desta sessão serão eliminados." + "Todas as apps e dados desta sessão serão eliminados." "Remover" - "Bem-vindo de volta, caro(a) convidado(a)!" + "Bem-vindo de volta, convidado!" "Pretende continuar a sessão?" "Recomeçar" "Sim, continuar" @@ -489,7 +489,7 @@ "Terminar sessão do utilizador atual" "TERMINAR SESSÃO DO UTILIZADOR" "Adicionar um novo utilizador?" - "Ao adicionar um novo utilizador, essa pessoa tem de configurar o respetivo espaço.\n\nQualquer utilizador pode atualizar aplicações para todos os outros utilizadores." + "Ao adicionar um novo utilizador, essa pessoa tem de configurar o respetivo espaço.\n\nQualquer utilizador pode atualizar apps para todos os outros utilizadores." "Limite de utilizadores alcançado" Pode adicionar até %d utilizadores. diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 231c8f8c24417..860c372eec80e 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -475,16 +475,16 @@ "Mostrar perfil" "Adicionar usuário" "Novo usuário" - "Remover convidado?" + "Remover visitante?" "Todos os apps e dados nesta sessão serão excluídos." "Remover" - "Bem-vindo, convidado." + "Você voltou, visitante!" "Quer continuar a sessão?" "Recomeçar" "Sim, continuar" - "Usuário convidado" - "Para excluir apps e dados, remova o usuário convidado" - "REMOVER CONVIDADO" + "Usuário visitante" + "Para excluir apps e dados, remova o usuário visitante" + "REMOVER VISITANTE" "Desconectar usuário" "Desconectar usuário atual" "DESCONECTAR USUÁRIO" diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index ee57aabdb7930..27de6d27b3f93 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -478,7 +478,7 @@ "Vill du ta bort gästen?" "Alla appar och data i denna session kommer att raderas." "Ta bort" - "Välkommen tillbaka gäst!" + "Välkommen tillbaka som gäst!" "Vill du fortsätta sessionen?" "Börja om" "Ja, fortsätt" @@ -715,7 +715,7 @@ "Kan ringa eller vibrera beroende på inställningarna på telefonen" "Kan ringa eller vibrera beroende på inställningarna på telefonen. Konversationer från %1$s visas i bubblor som standard." "Behåller din uppmärksamhet med en flytande genväg till innehållet." - "Visas högst upp bland konversationerna som en flytande bubbla, visar profilbilden på låsskärmen" + "Visas högst upp bland konversationerna som en flytande bubbla och visar profilbilden på låsskärmen" "Inställningar" "Prioritet" "%1$s har inte stöd för konversationsfunktioner" diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index 6321b2bf2c0ba..fb1ae55690091 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -478,9 +478,9 @@ "Ungependa kumwondoa mgeni?" "Data na programu zote katika kipindi hiki zitafutwa." "Ondoa" - "Karibu tena, mwalikwa!" + "Karibu tena mgeni!" "Je, unataka kuendelea na kipindi chako?" - "Anza tena" + "Anza upya" "Ndiyo, endelea" "Mtumiaji mgeni" "Ili kufuta programu na data, mwondoe mtumiaji mgeni" diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index 18afe7dd5f228..5075d8cd4e52c 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -476,7 +476,7 @@ "பயனரைச் சேர்" "புதியவர்" "கெஸ்ட்டை அகற்றவா?" - "இந்த அமர்வின் எல்லா பயன்பாடுகளும், தரவும் நீக்கப்படும்." + "இந்த அமர்வின் எல்லா ஆப்ஸும் தரவும் நீக்கப்படும்." "அகற்று" "நல்வரவு!" "உங்கள் அமர்வைத் தொடர விருப்பமா?" @@ -489,7 +489,7 @@ "தற்போதைய பயனரிலிருந்து வெளியேறு" "பயனரை வெளியேற்று" "புதியவரைச் சேர்க்கவா?" - "புதிய பயனரைச் சேர்க்கும்போது, அவர் தனக்கான இடத்தை அமைக்க வேண்டும்.\n\nஎந்தவொரு பயனரும், மற்ற எல்லா பயனர்களுக்காகவும் பயன்பாடுகளைப் புதுப்பிக்கலாம்." + "புதிய பயனரைச் சேர்க்கும்போது, அவர் தனக்கான இடத்தை அமைக்க வேண்டும்.\n\nஎந்தவொரு பயனரும், மற்ற எல்லா பயனர்களுக்காகவும் ஆப்ஸைப் புதுப்பிக்கலாம்." "பயனர் வரம்பை அடைந்துவிட்டீர்கள்" %d பயனர்கள் வரை சேர்க்க முடியும். diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index 84a4ff8b6283b..1cc6df23c1ac1 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -371,7 +371,7 @@ "సెట్టింగ్‌లు" "సమయం" "నేను" - "వినియోగదారు" + "యూజర్" "కొత్త వినియోగదారు" "Wi-Fi" "కనెక్ట్ చేయబడలేదు" @@ -473,12 +473,12 @@ "వినియోగదారుని మార్చు, ప్రస్తుత వినియోగదారు %s" "ప్రస్తుత వినియోగదారు %s" "ప్రొఫైల్‌ని చూపు" - "వినియోగదారుని జోడించండి" + "యూజర్‌ను జోడించండి" "కొత్త వినియోగదారు" - "అతిథిని తీసివేయాలా?" + "గెస్ట్‌ను తీసివేయాలా?" "ఈ సెషన్‌లోని అన్ని యాప్‌లు మరియు డేటా తొలగించబడతాయి." "తీసివేయి" - "పునఃస్వాగతం, అతిథి!" + "గెస్ట్‌కు తిరిగి స్వాగతం!" "మీరు మీ సెషన్‌ని కొనసాగించాలనుకుంటున్నారా?" "మొదటి నుండి ప్రారంభించు" "అవును, కొనసాగించు" @@ -488,8 +488,8 @@ "వినియోగదారుని లాగ్ అవుట్ చేయండి" "ప్రస్తుత వినియోగదారును లాగ్ అవుట్ చేయండి" "వినియోగదారుని లాగ్ అవుట్ చేయి" - "కొత్త వినియోగదారుని జోడించాలా?" - "మీరు కొత్త వినియోగదారుని జోడించినప్పుడు, ఆ వ్యక్తి తన స్థలాన్ని సెటప్ చేసుకోవాలి.\n\nఏ వినియోగదారు అయినా మిగతా అందరు వినియోగదారుల కోసం అనువర్తనాలను నవీకరించగలరు." + "కొత్త యూజర్‌ను జోడించాలా?" + "ఒక కొత్త యూజర్‌ను మీరు జోడించినప్పుడు, ఆ వ్యక్తి తన స్పేస్‌ను సెటప్ చేసుకోవాలి.\n\nఏ యూజర్ అయినా మిగతా అందరు యూజర్‌ల కోసం యాప్‌లను అప్‌డేట్ చేయగలరు." "వినియోగదారు పరిమితిని చేరుకున్నారు" మీరు %d వినియోగదారుల వరకు జోడించవచ్చు. diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index 3475c85d04f15..b542be31cd08a 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -478,7 +478,7 @@ "ต้องการนำผู้เข้าร่วมออกไหม" "ระบบจะลบแอปและข้อมูลทั้งหมดในเซสชันนี้" "นำออก" - "ยินดีต้อนรับท่านผู้เยี่ยมชมกลับมาอีกครั้ง!" + "ยินดีต้อนรับผู้เข้าร่วมกลับมาอีกครั้ง" "คุณต้องการอยู่ในเซสชันต่อไปไหม" "เริ่มต้นใหม่" "ใช่ ดำเนินการต่อ" diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index 9499461966e1d..238fbc92b1efc 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -390,7 +390,7 @@ "AUTO" "I-invert ang mga kulay" "Correction mode ng kulay" - "Marami pang setting" + "Higit pang setting" "Tapos na" "Nakakonekta" "Nakakonekta, baterya %1$s" @@ -478,7 +478,7 @@ "Alisin ang bisita?" "Ide-delete ang lahat ng app at data sa session na ito." "Alisin" - "Maligayang pagbabalik, bisita!" + "Welcome ulit, bisita!" "Gusto mo bang ipagpatuloy ang iyong session?" "Magsimulang muli" "Oo, magpatuloy" diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 2bc6c6ab8774b..093f18f699a9a 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -478,7 +478,7 @@ "Misafir oturumu kaldırılsın mı?" "Bu oturumdaki tüm uygulamalar ve veriler silinecek." "Kaldır" - "Tekrar hoş geldiniz sayın misafir!" + "Misafir kullanıcı, tekrar hoşgeldiniz" "Oturumunuza devam etmek istiyor musunuz?" "Baştan başla" "Evet, devam et" diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 39f915fbc5683..52e41ff57059b 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -479,7 +479,7 @@ "Показати профіль" "Додати користувача" "Новий користувач" - "Вийти з режиму гостя?" + "Видалити гостя?" "Усі додатки й дані з цього сеансу буде видалено." "Вийти" "З поверненням!" diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index 6371ecd1fab8c..59240ee1754a0 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -475,7 +475,7 @@ "Profilni ko‘rsatish" "Foydalanuvchi" "Yangi foydalanuvchi" - "Mehmon hisobi o‘chirib tashlansinmi?" + "Mehmon olib tashlansinmi?" "Ushbu seansdagi barcha ilovalar va ma’lumotlar o‘chirib tashlanadi." "Olib tashlash" "Xush kelibsiz, mehmon!" @@ -484,7 +484,7 @@ "Ha, davom ettirilsin" "Mehmon foydalanuvchi" "Ilova va ma’l-ni o‘chirish u-n mehmon hisobini o‘chiring" - "MEHMON HISOBINI O‘CHIRISH" + "MEHMONNI OLIB TASHLASH" "Foydalanuvchi nomidan chiqish" "Joriy foydalanuvchini tizimdan chiqaring" "FOYDALANUVCHI NOMIDAN CHIQISH" diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 9ff77b4fd6709..e51036a745e3a 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -390,7 +390,7 @@ "TỰ ĐỘNG" "Đảo ngược màu" "Chế độ chỉnh màu" - "Cài đặt khác" + "Chế độ cài đặt khác" "Xong" "Đã kết nối" "Đã kết nối, mức pin %1$s" @@ -715,7 +715,7 @@ "Có thể đổ chuông hoặc rung tùy theo chế độ cài đặt trên điện thoại" "Có thể đổ chuông hoặc rung tùy theo chế độ cài đặt trên điện thoại. Theo mặc định, các cuộc trò chuyện từ %1$s được phép hiển thị dưới dạng bong bóng." "Luôn chú ý vào nội dung này bằng phím tắt nổi." - "Hiển thị cuộc trò chuyện ở đầu phần cuộc trò chuyện và dưới dạng bong bóng nổi, hiển thị ảnh hồ sơ trên màn hình khóa" + "Hiển thị ở đầu phần cuộc trò chuyện, dưới dạng bong bóng nổi và hiển thị ảnh hồ sơ trên màn hình khóa" "Cài đặt" "Mức độ ưu tiên" "%1$s không hỗ trợ các tính năng trò chuyện" @@ -738,7 +738,7 @@ "Đã mở điều khiển thông báo đối với %1$s" "Đã đóng điều khiển thông báo đối với %1$s" "Cho phép thông báo từ kênh này" - "Cài đặt khác" + "Chế độ cài đặt khác" "Tùy chỉnh" "Xong" "Hoàn tác" diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index 9efdf7005773f..b42c89d306340 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -509,7 +509,7 @@ "全部清除" "管理" "历史记录" - "新" + "最新" "静音" "通知" "对话" diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index 29eb279d72d16..a1e7054c9faa1 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -715,9 +715,9 @@ "可能會根據手機設定發出鈴聲或震動" "可能會根據手機設定發出鈴聲或震動。「%1$s」的對話會預設以對話氣泡顯示。" "為此內容建立浮動捷徑以保持注意力。" - "以浮動對話泡顯示在對話部分的頂部,並在上鎖畫面顯示個人檔案相片" + "在對話部分頂部顯示浮動對話氣泡,並在上鎖畫面上顯示個人檔案相片" "設定" - "重要" + "優先" "「%1$s」不支援對話功能" "沒有最近曾使用的小視窗" "最近使用和關閉的小視窗會在這裡顯示" From b197862d974a9265abeca0b4d83944eb4288f2ee Mon Sep 17 00:00:00 2001 From: 1 Date: Fri, 12 Mar 2021 16:03:52 +0800 Subject: [PATCH 222/288] Make sure to hide IME adjust dims when exiting split mode If the IME is showing while exiting split mode, the IME-adjust dims won't be changed to hidden. This makes sure to hide the IME-adjust dims when leaving split mode. This phases in fix of ag/12683264 to R. Bug: 168505685 Fix: 181781489 Test: atest WMShellUnitTests Test: manual check switching user while showing IME in split mode, there won't have overlapping dim remains on the screen. Merged-In: I778df71616827c01f415231d8bbc20b037181d10 Change-Id: Ib7b843effd6c58e2d2546c8845a629701d87a521 --- .../systemui/stackdivider/DividerView.java | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java index be4009838fcc4..e59dca9d98c72 100644 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java +++ b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java @@ -845,15 +845,7 @@ public class DividerView extends FrameLayout implements OnTouchListener, } void enterSplitMode(boolean isHomeStackResizable) { - post(() -> { - final SurfaceControl sc = getWindowSurfaceControl(); - if (sc == null) { - return; - } - Transaction t = mTiles.getTransaction(); - t.show(sc).apply(); - mTiles.releaseTransaction(t); - }); + setHidden(false); SnapTarget miniMid = mSplitLayout.getMinimizedSnapAlgorithm(isHomeStackResizable).getMiddleTarget(); @@ -880,14 +872,17 @@ public class DividerView extends FrameLayout implements OnTouchListener, } void exitSplitMode() { - // Reset tile bounds final SurfaceControl sc = getWindowSurfaceControl(); if (sc == null) { return; } Transaction t = mTiles.getTransaction(); - t.hide(sc).apply(); + t.hide(sc); + mImeController.setDimsHidden(t, true); + t.apply(); mTiles.releaseTransaction(t); + + // Reset tile bounds int midPos = mSplitLayout.getSnapAlgorithm().getMiddleTarget().position; mWindowManagerProxy.applyResizeSplits(midPos, mSplitLayout); } From 1f2cb484f94d980f7c8bae14937f81b3c579c388 Mon Sep 17 00:00:00 2001 From: kwaky Date: Wed, 10 Mar 2021 20:43:35 -0800 Subject: [PATCH 223/288] DO NOT MERGE Delete superfluous call of mInsetsController.onControlsChanged. This is already called by systemui and the redundant call causes leash access after invalidation. Bug: 179307474 Bug: 171031234 Bug: 177940325 Test: Manual Change-Id: Ie2d12fc857a8b6dd5d8ee8b57ad693c822b896a4 --- .../android/systemui/wm/DisplaySystemBarsController.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/packages/CarSystemUI/src/com/android/systemui/wm/DisplaySystemBarsController.java b/packages/CarSystemUI/src/com/android/systemui/wm/DisplaySystemBarsController.java index bbab4388f17d3..c0b5c50b288c2 100644 --- a/packages/CarSystemUI/src/com/android/systemui/wm/DisplaySystemBarsController.java +++ b/packages/CarSystemUI/src/com/android/systemui/wm/DisplaySystemBarsController.java @@ -25,7 +25,6 @@ import android.util.SparseArray; import android.view.IDisplayWindowInsetsController; import android.view.IWindowManager; import android.view.InsetsController; -import android.view.InsetsSourceControl; import android.view.InsetsState; import android.view.WindowInsets; @@ -123,13 +122,6 @@ public class DisplaySystemBarsController extends DisplayImeController { } } - @Override - public void insetsControlChanged(InsetsState insetsState, - InsetsSourceControl[] activeControls) { - super.insetsControlChanged(insetsState, activeControls); - mInsetsController.onControlsChanged(activeControls); - } - @Override public void hideInsets(@WindowInsets.Type.InsetsType int types, boolean fromIme) { if ((types & WindowInsets.Type.ime()) == 0) { From ba987ca94fdec3a1ada76756b6ac77a1584c9051 Mon Sep 17 00:00:00 2001 From: Seigo Nonaka Date: Mon, 1 Mar 2021 19:23:10 -0800 Subject: [PATCH 224/288] Override isRestricted for preventing unexpected resource loading Bug: 179461812 Test: atest FontResourceTest Change-Id: Ifb731310d31b80522bc82052625716083cac9e6f (cherry picked from commit 0de34e9d87aaed7ed5e0e74f2d6668e886579ff9) --- core/java/android/widget/RemoteViews.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java index 7016c5cf0de6f..a9b2c4df255f1 100644 --- a/core/java/android/widget/RemoteViews.java +++ b/core/java/android/widget/RemoteViews.java @@ -593,6 +593,14 @@ public class RemoteViews implements Parcelable, Filter { public String getPackageName() { return mContextForResources.getPackageName(); } + + @Override + public boolean isRestricted() { + // Override isRestricted and direct to resource's implementation. The isRestricted is + // used for determining the risky resources loading, e.g. fonts, thus direct to context + // for resource. + return mContextForResources.isRestricted(); + } } private class SetEmptyView extends Action { From 595002a0acd4b68cf996e333defbed8f3bd9edfe Mon Sep 17 00:00:00 2001 From: Jeffrey Huang Date: Thu, 11 Mar 2021 11:13:49 -0800 Subject: [PATCH 225/288] Fix an NPE in BatteryService mCallback is possible to be null. Avoid registering null callbacks. Bug: 175184519 Test: TH Change-Id: Ic382d268f40a8ea31aaeedc7a85b6dc9b4e6c210 Merged-In: Ic382d268f40a8ea31aaeedc7a85b6dc9b4e6c210 (cherry picked from commit 780ca87adc239f295a26b7f0e89502a7f8758878) --- services/core/java/com/android/server/BatteryService.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/services/core/java/com/android/server/BatteryService.java b/services/core/java/com/android/server/BatteryService.java index 8dd4fa6d8fd10..c9ba58a5fef5d 100644 --- a/services/core/java/com/android/server/BatteryService.java +++ b/services/core/java/com/android/server/BatteryService.java @@ -1505,6 +1505,8 @@ public final class BatteryService extends SystemService { if (Objects.equals(newService, oldService)) return; Slog.i(TAG, "health: new instance registered " + mInstanceName); + // #init() may be called with null callback. Skip null callbacks. + if (mCallback == null) return; mCallback.onRegistration(oldService, newService, mInstanceName); } catch (NoSuchElementException | RemoteException ex) { Slog.e(TAG, "health: Cannot get instance '" + mInstanceName From 0a820901e3a35cfa896b0365f7f5873ab5acce12 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 14 Mar 2021 07:19:31 +0000 Subject: [PATCH 226/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I2511b1f3d40988285aa02f545d288812b58b38b3 --- packages/SettingsLib/res/values-da/strings.xml | 4 ++-- packages/SettingsLib/res/values-kk/strings.xml | 6 +++--- packages/SettingsLib/res/values-km/strings.xml | 2 +- packages/SettingsLib/res/values-ne/strings.xml | 2 +- packages/SettingsLib/res/values-sw/strings.xml | 2 +- packages/SettingsLib/res/values-uz/strings.xml | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml index b1530a22e994b..5372cedd282a5 100644 --- a/packages/SettingsLib/res/values-da/strings.xml +++ b/packages/SettingsLib/res/values-da/strings.xml @@ -532,7 +532,7 @@ "Begrænset profil" "Vil du tilføje en ny bruger?" "Du kan dele denne enhed med andre ved at oprette ekstra brugere. Hver bruger har sit personlige område, som kan tilpasses med apps, baggrund osv. Brugerne kan også justere enhedsindstillinger, som for eksempel Wi-Fi, som påvirker alle.\n\nNår du tilføjer en ny bruger, skal vedkommende konfigurere sit område.\n\nAlle brugere kan opdatere apps for alle andre brugere. Indstillinger og tjenester for hjælpefunktioner overføres muligvis ikke til den nye bruger." - "Når du tilføjer en ny bruger, skal personen konfigurere sit rum.\n\nEnhver bruger kan opdatere apps for alle andre brugere." + "Når du tilføjer en ny bruger, skal personen konfigurere sit rum.\n\nAlle brugere kan opdatere apps for alle de andre brugere." "Vil du konfigurere brugeren nu?" "Sørg for, at brugeren har mulighed for at tage enheden og konfigurere sit eget rum" "Vil du oprette en profil nu?" @@ -546,7 +546,7 @@ "Før du kan oprette en begrænset profil, skal du oprette en skærmlås for at beskytte dine apps og personlige data." "Konfigurer låseskærmen" "Skift til %s" - "Tilføj gæsten" + "Tilføj gæst" "Fjern gæsten" "Gæst" "Enhedens standardindstilling" diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml index 991d936ac8012..decf940f14b7b 100644 --- a/packages/SettingsLib/res/values-kk/strings.xml +++ b/packages/SettingsLib/res/values-kk/strings.xml @@ -496,7 +496,7 @@ "Бас тарту" "Жарайды" "Қосу" - "\"Мазаламау\" режимін қосу" + "Мазаламау режимін қосу" "Ешқашан" "Маңыздылары ғана" "%1$s. %2$s" @@ -546,8 +546,8 @@ "Шектелген профайл жасақтауға дейін қолданбалар мен жеке деректерді қорғау үшін экран бекітпесін тағайындау қажет." "Бекітпе тағайындау" "%s пайдаланушысына ауысу" - "Қонақты енгізу" - "Қонақты өшіру" + "Қонақ қосу" + "Қонақты жою" "Қонақ" "Құрылғыны әдепкісінше реттеу" "Өшірулі" diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml index ce5ee87cc6928..800e273941c7b 100644 --- a/packages/SettingsLib/res/values-km/strings.xml +++ b/packages/SettingsLib/res/values-km/strings.xml @@ -547,7 +547,7 @@ "កំណត់​ការ​ចាក់​សោ" "ប្ដូរទៅ %s" "បញ្ចូល​ភ្ញៀវ" - "លុប​​​ភ្ញៀវ" + "ដកភ្ញៀវចេញ" "ភ្ញៀវ" "លំនាំដើម​របស់ឧបករណ៍" "បានបិទ" diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml index aa759c82a87d2..721fa2dfdf5da 100644 --- a/packages/SettingsLib/res/values-ne/strings.xml +++ b/packages/SettingsLib/res/values-ne/strings.xml @@ -532,7 +532,7 @@ "प्रतिबन्धित प्रोफाइल" "नयाँ प्रयोगकर्ता थप्ने हो?" "तपाईं थप प्रयोगकर्ताहरू सिर्जना गरेर ती प्रयोगकर्तालाई यो यन्त्र प्रयोग गर्न दिन सक्नुहुन्छ। हरेक प्रयोगकर्ताको आफ्नै ठाउँ हुन्छ। उनीहरू यो ठाउँमा आफ्नै एप, वालपेपर आदिका लागि प्रयोग गर्न सक्छन्। उनीहरू सबैजनालाई असर पार्ने Wi-Fi जस्ता यन्त्रका सेटिङहरू पनि परिवर्तन गर्न सक्छन्।\n\nतपाईंले नयाँ प्रयोगकर्ता थप्दा उक्त व्यक्तिले आफ्नो ठाउँ सेटअप गर्नु पर्ने हुन्छ।\n\nसबै प्रयोगकर्ता अन्य सबै प्रयोगकर्ताले प्रयोग गर्ने एपहरू अद्यावधिक गर्न सक्छन्। तर पहुँचसम्बन्धी सेटिङ तथा सेवाहरू नयाँ प्रयोगकर्तामा नसर्न सक्छ।" - "जब तपाईंले नयाँ प्रयोगकर्ता थप्नुहुन्छ, त्यो व्यक्तिले आफ्नो ठाउँ सेट गर्न आवश्यक छ।\n\nकुनै पनि प्रयोगकर्ताले सबै अन्य प्रयोगकर्ताहरूका लागि एपहरू अद्यावधिक गर्न सक्छन्।" + "तपाईंले नयाँ प्रयोगकर्ता थप्नुभयो भने ती प्रयोगकर्ताले आफ्नो स्पेस सेट गर्नु पर्ने हुन्छ।\n\nसबै प्रयोगकर्ताले अरू प्रयोगकर्ताका एपहरू अपडेट गर्न सक्छन्।" "अहिले प्रयोगकर्ता सेटअप गर्ने हो?" "यी व्यक्ति यन्त्र यो यन्त्र चलाउन र आफ्नो ठाउँ सेट गर्न उपलब्ध छन् भन्ने कुरा सुनिश्चित गर्नुहोस्" "अहिले प्रोफाइल सेटअप गर्ने हो?" diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml index b151052989339..def4238780b56 100644 --- a/packages/SettingsLib/res/values-sw/strings.xml +++ b/packages/SettingsLib/res/values-sw/strings.xml @@ -546,7 +546,7 @@ "Kabla uunde wasifu uliowekekwa vikwazo, utahitajika kuweka skrini iliyofungwa ili kulinda programu zako na data binafsi." "Weka ufunguo" "Badili utumie %s" - "Weka mgeni" + "Ongeza mgeni" "Ondoa mgeni" "Mgeni" "Hali chaguomsingi ya kifaa" diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml index b456241ac21e6..2591e3aad578f 100644 --- a/packages/SettingsLib/res/values-uz/strings.xml +++ b/packages/SettingsLib/res/values-uz/strings.xml @@ -547,7 +547,7 @@ "Qulf o‘rnatish" "Bunga almashish: %s" "Mehmon kiritish" - "Mehmon rejimini olib tashlash" + "Mehmonni olib tashlash" "Mehmon" "Qurilma standarti" "Yoqilmagan" From aec7cbecdcdcce9fe2ea2a8c8c9ae58efa51951e Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Fri, 12 Mar 2021 18:04:04 -0500 Subject: [PATCH 227/288] Vibrate as system instead of as an app When DND is on, apps aren't allowed to play vibrations on blocked usages. However, we still need to play vibrations for notifications from those apps that meet DND criteria. Previously we accomplished this by passing in the bypass DND flag, however this flag is also being used to bypass camera audio restrictions, which we don't want. So now we'll play vibrations as "android", which is always exception from DND restrictions and isn't exempt from the camera restriction. In order to maintain debugging from bugreports, the package name and uid that we're vibrating for are now included in the vibration reason. Test: BuzzBeepBlinkTest Test: trigger notification vibration Test: trigger notification vibration, DND on, notif allowed Test: fail to trigger notification vibration, DND on, notif intercepted Test: fail to trigger notification vibration, camera is recording video Test: check bugreport output Bug: 171946151 Change-Id: I8958852403827341480351ee0c60a4fd30f5280d (cherry picked from commit e13866164bd4ed143fdaadeb057e7868a175787b) Merged-In: e13866164bd4ed143fdaadeb057e7868a175787b --- .../NotificationManagerService.java | 23 ++++++++++--------- .../notification/BuzzBeepBlinkTest.java | 12 ++++++++-- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index a7606339b7d96..40d09d4b42287 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -7153,15 +7153,7 @@ public class NotificationManagerService extends SystemService { // so need to check the notification still valide for vibrate. synchronized (mNotificationLock) { if (mNotificationsByKey.get(record.getKey()) != null) { - // Vibrator checks the appops for the op package, not the caller, - // so we need to add the bypass dnd flag to be heard. it's ok to - // always add this flag here because we've already checked that we can - // bypass dnd - AudioAttributes.Builder aab = - new AudioAttributes.Builder(record.getAudioAttributes()) - .setFlags(FLAG_BYPASS_INTERRUPTION_POLICY); - mVibrator.vibrate(record.getSbn().getUid(), record.getSbn().getOpPkg(), - effect, "Notification (delayed)", aab.build()); + vibrate(record, effect, true); } else { Slog.e(TAG, "No vibration for canceled notification : " + record.getKey()); @@ -7169,8 +7161,7 @@ public class NotificationManagerService extends SystemService { } }).start(); } else { - mVibrator.vibrate(record.getSbn().getUid(), record.getSbn().getPackageName(), - effect, "Notification", record.getAudioAttributes()); + vibrate(record, effect, false); } return true; } finally{ @@ -7178,6 +7169,16 @@ public class NotificationManagerService extends SystemService { } } + private void vibrate(NotificationRecord record, VibrationEffect effect, boolean delayed) { + // We need to vibrate as "android" so we can breakthrough DND. VibratorManagerService + // doesn't have a concept of vibrating on an app's behalf, so add the app information + // to the reason so we can still debug from bugreports + String reason = "Notification (" + record.getSbn().getOpPkg() + " " + + record.getSbn().getUid() + ") " + (delayed ? "(Delayed)" : ""); + mVibrator.vibrate(Process.SYSTEM_UID, PackageManagerService.PLATFORM_PACKAGE_NAME, + effect, reason, record.getAudioAttributes()); + } + private boolean isNotificationForCurrentUser(NotificationRecord record) { final int currentUser; final long token = Binder.clearCallingIdentity(); diff --git a/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java b/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java index 2e0f1992478d0..cfda07c552084 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java @@ -57,6 +57,7 @@ import android.media.AudioAttributes; import android.media.AudioManager; import android.net.Uri; import android.os.Handler; +import android.os.Process; import android.os.RemoteException; import android.os.UserHandle; import android.os.VibrationEffect; @@ -77,10 +78,12 @@ import com.android.internal.logging.InstanceIdSequenceFake; import com.android.internal.util.IntPair; import com.android.server.UiServiceTestCase; import com.android.server.lights.LogicalLight; +import com.android.server.pm.PackageManagerService; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; import org.mockito.ArgumentMatcher; import org.mockito.Mock; import org.mockito.Mockito; @@ -407,12 +410,17 @@ public class BuzzBeepBlinkTest extends UiServiceTestCase { } private void verifyVibrate() { + ArgumentCaptor captor = ArgumentCaptor.forClass(AudioAttributes.class); verify(mVibrator, times(1)).vibrate(anyInt(), anyString(), argThat(mVibrateOnceMatcher), - anyString(), any()); + anyString(), captor.capture()); + assertEquals(0, (captor.getValue().getAllFlags() + & AudioAttributes.FLAG_BYPASS_INTERRUPTION_POLICY)); } private void verifyVibrate(int times) { - verify(mVibrator, times(times)).vibrate(anyInt(), anyString(), any(), anyString(), any()); + verify(mVibrator, times(times)).vibrate(eq(Process.SYSTEM_UID), + eq(PackageManagerService.PLATFORM_PACKAGE_NAME), any(), anyString(), + any(AudioAttributes.class)); } private void verifyVibrateLooped() { From 92d80a96263669e369d5354746e5a7766515137e Mon Sep 17 00:00:00 2001 From: kwaky Date: Wed, 10 Mar 2021 12:43:25 -0800 Subject: [PATCH 228/288] DO NOT MERGE Remove superfluous resetting of Keyguard on unocclusion. Bug: 182245575 Test: Manual Change-Id: I6fc7aa47a7880f321a50e687dd0882bd530a586b Merged-In: I23eed3a1edbcbe946d14500d92d139b941a53ca4 --- .../systemui/car/keyguard/CarKeyguardViewController.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java index 53d2320b3f9fb..8fe59d07f9d2b 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java @@ -238,9 +238,6 @@ public class CarKeyguardViewController extends OverlayViewController implements public void setOccluded(boolean occluded, boolean animate) { mIsOccluded = occluded; getOverlayViewGlobalStateController().setOccluded(occluded); - if (!occluded) { - reset(/* hideBouncerWhenShowing= */ false); - } } @Override From 23de41f97bcd4e76b7a4baa53af515da13633886 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 17 Mar 2021 02:13:01 +0000 Subject: [PATCH 229/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Idd607d6d991c4a487625b042b8362c7cc7bd23f9 --- core/res/res/values-eu/strings.xml | 6 +++--- core/res/res/values-fr-rCA/strings.xml | 2 +- core/res/res/values-fr/strings.xml | 2 +- core/res/res/values-kk/strings.xml | 10 +++++----- core/res/res/values-pl/strings.xml | 2 +- core/res/res/values-tr/strings.xml | 2 +- core/res/res/values-uz/strings.xml | 2 +- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index 9be1763de9676..c8bd3dc686ce0 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -192,7 +192,7 @@ "Jabeak kudeatzen du gailua" "Erakundeak kudeatzen du gailua eta baliteke sareko trafikoa gainbegiratzea. Sakatu hau xehetasunak ikusteko." "Aplikazioek zure kokapena atzi dezakete" - "Informazio gehiago lortzeko, jo IKT sailaren administratzailearengana" + "Informazio gehiago lortzeko, jo IKT saileko administratzailearengana" "Herrialde-hautemailea" "Kokapen-zerbitzua" "Sentsorearen jakinarazpen-zerbitzua" @@ -1183,7 +1183,7 @@ "Erakutsi beti" "Android sistema eragilearen bertsio bateraezin baterako dago egina %1$s; beraz, espero ez bezala funtziona lezake. Baliteke aplikazioaren bertsio eguneratuago bat eskuragarri egotea." "Erakutsi beti" - "Bilatu eguneratzea" + "Bilatu eguneratzeak" "%1$s aplikazioak (%2$s prozesua) berak aplikatutako StrictMode gidalerroa urratu du." "%1$s prozesuak bere kabuz ezarritako StrictMode gidalerroak urratu ditu." "Telefonoa eguneratzen ari da…" @@ -1661,7 +1661,7 @@ "Eginbide batetik bestera aldatzeko, pasatu hiru hatz pantailaren behealdetik gora eta eduki sakatuta une batez." "Lupa" "Erabiltzailea: %1$s." - "%1$s erabiltzailera aldatzen…" + "\"%1$s\" erabiltzailera aldatzen…" "%1$s erabiltzailearen saioa amaitzen…" "Jabea" "Errorea" diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index f12725ff7c155..8002080a10051 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -1661,7 +1661,7 @@ "Pour basculer entre les fonctionnalités, balayez l\'écran vers le haut avec trois doigts et maintenez-les-y." "Zoom" "Utilisateur actuel : %1$s" - "Changement d\'utilisateur (%1$s) en cours…" + "Passage au profil : %1$s…" "Déconnexion de %1$s en cours..." "Propriétaire" "Erreur" diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 29b68a3d1aa52..7d777542e6f44 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -1661,7 +1661,7 @@ "Pour changer de fonctionnalité, balayez l\'écran vers le haut avec trois doigts et appuyez de manière prolongée." "Agrandissement" "Utilisateur actuel : %1$s" - "Chargement du profil de %1$s..." + "Passage au profil : %1$s..." "Déconnexion de %1$s…" "Propriétaire" "Erreur" diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml index 0f82870b9270a..f225ca2ba2f15 100644 --- a/core/res/res/values-kk/strings.xml +++ b/core/res/res/values-kk/strings.xml @@ -665,7 +665,7 @@ "Иесіне оператордың хабар алмасу қызметінің жоғарғы деңгейлі интерфейсіне байластыруға рұқсат етеді. Қалыпты қолданбалар үшін ешқашан қажет болмайды." "оператор қызметтеріне қосылу" "Иесіне оператор қызметтеріне қосылуға мүмкіндік береді. Қалыпты қолданбалар үшін қажет болмайды." - "\"Мазаламау\" режиміне кіру" + "Мазаламау режиміне кіру" "Қолданбаға «Мазаламау» конфигурациясын оқу және жазу мүмкіндігін береді." "рұқсаттарды пайдалану туралы деректерді көру" "Пайдаланушы қолданбаға берілетін рұқсаттарды басқара алады. Ондай рұқсаттар әдеттегі қолданбаларға керек емес." @@ -1832,7 +1832,7 @@ "%1$s дейін" "%1$s дейін (келесі дабыл)" "Өшірілгенге дейін" - "\"Мазаламау\" режимін өшіргенше" + "Мазаламау режимін өшіргенше" "%1$s/%2$s" "Тасалау" "Мазаламау" @@ -1987,10 +1987,10 @@ "Қоңыраулар мен хабарландырулардың вибрациясы болады" "Қоңыраулар мен хабарландырулардың дыбыстық сигналы өшіріледі" "Жүйе өзгерістері" - "\"Мазаламау\" режимі" - "Жаңа: \"Мазаламау\" режимі хабарландыруларды жасыруда" + "Мазаламау режимі" + "Жаңа: Мазаламау режимі хабарландыруларды жасыруда" "Толығырақ ақпарат алу және өзгерту үшін түртіңіз." - "\"Мазаламау\" режимі өзгерді" + "Мазаламау режимі өзгерді" "Түймені түртіп, неге тыйым салынатынын көріңіз." "Жүйе" "Параметрлер" diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index c206b12b8514f..9b6edd21b6ac8 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -542,7 +542,7 @@ "Zezwala aplikacji na modyfikowanie kolekcji zdjęć." "odczytywanie lokalizacji z kolekcji multimediów" "Zezwala aplikacji na odczytywanie lokalizacji z kolekcji multimediów." - "Potwierdź swoją tożsamość" + "Potwierdź, że to Ty" "Sprzęt biometryczny niedostępny" "Anulowano uwierzytelnianie" "Nie rozpoznano" diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index c0266d6b33977..87d97599a9bbf 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -1663,7 +1663,7 @@ "Geçerli kullanıcı: %1$s." "%1$s adlı kullanıcıya geçiliyor…" "%1$s hesabından çıkış yapılıyor…" - "Sahibi" + "Sahip" "Hata" "Yöneticiniz bu değişikliğe izin vermiyor" "Bu eylemi gerçekleştirecek bir uygulama bulunamadı" diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml index 31937a00c50c7..e3ed7829f1ecf 100644 --- a/core/res/res/values-uz/strings.xml +++ b/core/res/res/values-uz/strings.xml @@ -1661,7 +1661,7 @@ "Funksiyalarni almashtirish uchun uchta barmoq bilan tepaga suring va ushlab turing." "Kattalashtirish" "Joriy foydalanuvchi %1$s." - "Quyidagi foydalanuvchiga o‘tilmoqda: %1$s…" + "Bunga almashilmoqda: %1$s" "%1$s hisobidan chiqilmoqda…" "Egasi" "Xato" From 41016aa07994e167d74a7227433121a793f96589 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 17 Mar 2021 02:31:44 +0000 Subject: [PATCH 230/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I1bb43899dd3980ea532bed2e664417303341ddb8 --- .../res/values-mcc001-mnc01-bn/strings.xml | 24 ------------------- 1 file changed, 24 deletions(-) delete mode 100644 core/res/res/values-mcc001-mnc01-bn/strings.xml diff --git a/core/res/res/values-mcc001-mnc01-bn/strings.xml b/core/res/res/values-mcc001-mnc01-bn/strings.xml deleted file mode 100644 index e965acd9136eb..0000000000000 --- a/core/res/res/values-mcc001-mnc01-bn/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - "ফোন অনুমোদিত নয় MM#6" - From 93bf3312626d6f7879cada66b8e51e53de1bbec4 Mon Sep 17 00:00:00 2001 From: Narayan Kamath Date: Fri, 11 Dec 2020 14:06:19 +0000 Subject: [PATCH 231/288] TelephonyRegistry: Pass featureId to LocationAccessPolicy Bug: 162850073 Test: manual Change-Id: I3a5afddfc151e06f5deb0220620bbd40849626c4 Merged-In: I3a5afddfc151e06f5deb0220620bbd40849626c4 --- services/core/java/com/android/server/TelephonyRegistry.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java index c4f1c805398b3..918aeb72105d6 100644 --- a/services/core/java/com/android/server/TelephonyRegistry.java +++ b/services/core/java/com/android/server/TelephonyRegistry.java @@ -2623,6 +2623,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { LocationAccessPolicy.LocationPermissionQuery.Builder locationQueryBuilder = new LocationAccessPolicy.LocationPermissionQuery.Builder() .setCallingPackage(callingPackage) + .setCallingFeatureId(callingFeatureId) .setMethod(message + " events: " + events) .setCallingPid(Binder.getCallingPid()) .setCallingUid(Binder.getCallingUid()); @@ -2761,6 +2762,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { LocationAccessPolicy.LocationPermissionQuery query = new LocationAccessPolicy.LocationPermissionQuery.Builder() .setCallingPackage(r.callingPackage) + .setCallingFeatureId(r.callingFeatureId) .setCallingPid(r.callerPid) .setCallingUid(r.callerUid) .setMethod("TelephonyRegistry push") @@ -2779,6 +2781,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { LocationAccessPolicy.LocationPermissionQuery query = new LocationAccessPolicy.LocationPermissionQuery.Builder() .setCallingPackage(r.callingPackage) + .setCallingFeatureId(r.callingFeatureId) .setCallingPid(r.callerPid) .setCallingUid(r.callerUid) .setMethod("TelephonyRegistry push") From 04cdf3a7d4077046d6a9e45d5298ab8b0aeda12c Mon Sep 17 00:00:00 2001 From: Alex Stetson Date: Wed, 17 Mar 2021 09:26:13 -0700 Subject: [PATCH 232/288] DO NOT MERGE Inflate NotificationPanel on instantiation If the NotificationPanel is not inflated, the proper listeners are not setup and certain behavior will be broken until the panel is opened for the first time. Bug: 182531816 Test: manual Change-Id: If55156b963c0a83ff644524dea0106708f1635cc --- .../car/notification/NotificationPanelViewController.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java index d7d7f53eb46d3..3d79b06ca3252 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java @@ -166,6 +166,10 @@ public class NotificationPanelViewController extends OverlayPanelViewController mEnableHeadsUpNotificationWhenNotificationShadeOpen = mResources.getBoolean( com.android.car.notification.R.bool .config_enableHeadsUpNotificationWhenNotificationShadeOpen); + + // Inflate view on instantiation to properly initialize listeners even if panel has + // not been opened. + getOverlayViewGlobalStateController().inflateView(this); } // CommandQueue.Callbacks From 2a33098b6c5a1e6094786a8c1ed64ce00bc87245 Mon Sep 17 00:00:00 2001 From: Christopher Tate Date: Wed, 18 Nov 2020 17:22:45 -0800 Subject: [PATCH 233/288] DO NOT MERGE - Disallow deletion of channels with FGS notifications Bug: 156090809 Test: atest CtsAppTestCases:NotificationManagerTest Test: atest CtsAppTestCases:android.app.cts.ServiceTest Change-Id: I1c2bb78d86f194585d273661cecf3419f51965df Merged-In: I1c2bb78d86f194585d273661cecf3419f51965df (cherry picked from commit 39b3890268913bc2dc8b90671d042c0e9b4090d2) --- .../android/app/ActivityManagerInternal.java | 15 ++++++ .../com/android/server/am/ActiveServices.java | 40 ++++++++++++++++ .../server/am/ActivityManagerService.java | 16 +++++++ .../NotificationManagerService.java | 47 +++++++++++++++---- .../NotificationManagerServiceTest.java | 3 +- .../server/notification/RoleObserverTest.java | 4 +- 6 files changed, 114 insertions(+), 11 deletions(-) diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java index a5965bc7f85fd..fcb5e0bd0b027 100644 --- a/core/java/android/app/ActivityManagerInternal.java +++ b/core/java/android/app/ActivityManagerInternal.java @@ -377,6 +377,21 @@ public abstract class ActivityManagerInternal { */ public abstract boolean hasRunningForegroundService(int uid, int foregroundServiceType); + /** + * Returns {@code true} if the given notification channel currently has a + * notification associated with a foreground service. This is an AMS check + * because that is the source of truth for the FGS state. + */ + public abstract boolean hasForegroundServiceNotification(String pkg, @UserIdInt int userId, + String channelId); + + /** + * If the given app has any FGSs whose notifications are in the given channel, + * stop them. + */ + public abstract void stopForegroundServicesForChannel(String pkg, @UserIdInt int userId, + String channelId); + /** * Registers the specified {@code processObserver} to be notified of future changes to * process state. diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index dd0e1f6458f99..b8de4a759b607 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -119,6 +119,7 @@ import java.io.StringWriter; import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import java.util.Objects; import java.util.Set; import java.util.function.Predicate; @@ -433,6 +434,45 @@ public final class ActiveServices { return smap != null ? smap.mStartingBackground.size() >= mMaxStartingBackground : false; } + boolean hasForegroundServiceNotificationLocked(String pkg, int userId, String channelId) { + final ServiceMap smap = mServiceMap.get(userId); + if (smap != null) { + for (int i = 0; i < smap.mServicesByInstanceName.size(); i++) { + final ServiceRecord sr = smap.mServicesByInstanceName.valueAt(i); + if (sr.appInfo.packageName.equals(pkg) && sr.isForeground) { + if (Objects.equals(sr.foregroundNoti.getChannelId(), channelId)) { + if (DEBUG_FOREGROUND_SERVICE) { + Slog.d(TAG_SERVICE, "Channel u" + userId + "/pkg=" + pkg + + "/channelId=" + channelId + + " has fg service notification"); + } + return true; + } + } + } + } + return false; + } + + void stopForegroundServicesForChannelLocked(String pkg, int userId, String channelId) { + final ServiceMap smap = mServiceMap.get(userId); + if (smap != null) { + for (int i = 0; i < smap.mServicesByInstanceName.size(); i++) { + final ServiceRecord sr = smap.mServicesByInstanceName.valueAt(i); + if (sr.appInfo.packageName.equals(pkg) && sr.isForeground) { + if (Objects.equals(sr.foregroundNoti.getChannelId(), channelId)) { + if (DEBUG_FOREGROUND_SERVICE) { + Slog.d(TAG_SERVICE, "Stopping FGS u" + userId + "/pkg=" + pkg + + "/channelId=" + channelId + + " for conversation channel clear"); + } + stopServiceLocked(sr); + } + } + } + } + } + private ServiceMap getServiceMapLocked(int callingUser) { ServiceMap smap = mServiceMap.get(callingUser); if (smap == null) { diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 5134f498928b4..1376badba3cf3 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -19718,6 +19718,22 @@ public class ActivityManagerService extends IActivityManager.Stub return false; } + @Override + public boolean hasForegroundServiceNotification(String pkg, int userId, + String channelId) { + synchronized (ActivityManagerService.this) { + return mServices.hasForegroundServiceNotificationLocked(pkg, userId, channelId); + } + } + + @Override + public void stopForegroundServicesForChannel(String pkg, int userId, + String channelId) { + synchronized (ActivityManagerService.this) { + mServices.stopForegroundServicesForChannelLocked(pkg, userId, channelId); + } + } + @Override public void registerProcessObserver(IProcessObserver processObserver) { ActivityManagerService.this.registerProcessObserver(processObserver); diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index a7606339b7d96..5474af5fb6287 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -403,6 +403,7 @@ public class NotificationManagerService extends SystemService { private IActivityManager mAm; private ActivityTaskManagerInternal mAtm; private ActivityManager mActivityManager; + private ActivityManagerInternal mAmi; private IPackageManager mPackageManager; private PackageManager mPackageManagerClient; AudioManager mAudioManager; @@ -1876,7 +1877,7 @@ public class NotificationManagerService extends SystemService { DevicePolicyManagerInternal dpm, IUriGrantsManager ugm, UriGrantsManagerInternal ugmInternal, AppOpsManager appOps, UserManager userManager, NotificationHistoryManager historyManager, StatsManager statsManager, - TelephonyManager telephonyManager) { + TelephonyManager telephonyManager, ActivityManagerInternal ami) { mHandler = handler; Resources resources = getContext().getResources(); mMaxPackageEnqueueRate = Settings.Global.getFloat(getContext().getContentResolver(), @@ -1897,6 +1898,7 @@ public class NotificationManagerService extends SystemService { mAlarmManager = (AlarmManager) getContext().getSystemService(Context.ALARM_SERVICE); mCompanionManager = companionManager; mActivityManager = activityManager; + mAmi = ami; mDeviceIdleController = IDeviceIdleController.Stub.asInterface( ServiceManager.getService(Context.DEVICE_IDLE_CONTROLLER)); mDpm = dpm; @@ -2119,7 +2121,8 @@ public class NotificationManagerService extends SystemService { new NotificationHistoryManager(getContext(), handler), mStatsManager = (StatsManager) getContext().getSystemService( Context.STATS_MANAGER), - getContext().getSystemService(TelephonyManager.class)); + getContext().getSystemService(TelephonyManager.class), + LocalServices.getService(ActivityManagerInternal.class)); // register for various Intents IntentFilter filter = new IntentFilter(); @@ -3405,15 +3408,30 @@ public class NotificationManagerService extends SystemService { pkg, uid, channelId, conversationId, true, includeDeleted); } + // Returns 'true' if the given channel has a notification associated + // with an active foreground service. + private void enforceDeletingChannelHasNoFgService(String pkg, int userId, + String channelId) { + if (mAmi.hasForegroundServiceNotification(pkg, userId, channelId)) { + Slog.w(TAG, "Package u" + userId + "/" + pkg + + " may not delete notification channel '" + + channelId + "' with fg service"); + throw new SecurityException("Not allowed to delete channel " + channelId + + " with a foreground service"); + } + } + @Override public void deleteNotificationChannel(String pkg, String channelId) { checkCallerIsSystemOrSameApp(pkg); final int callingUid = Binder.getCallingUid(); + final int callingUser = UserHandle.getUserId(callingUid); if (NotificationChannel.DEFAULT_CHANNEL_ID.equals(channelId)) { throw new IllegalArgumentException("Cannot delete default channel"); } + enforceDeletingChannelHasNoFgService(pkg, callingUser, channelId); cancelAllNotificationsInt(MY_UID, MY_PID, pkg, channelId, 0, 0, true, - UserHandle.getUserId(callingUid), REASON_CHANNEL_BANNED, null); + callingUser, REASON_CHANNEL_BANNED, null); mPreferencesHelper.deleteNotificationChannel(pkg, callingUid, channelId); mListeners.notifyNotificationChannelChanged(pkg, UserHandle.getUserHandleForUid(callingUid), @@ -3426,19 +3444,23 @@ public class NotificationManagerService extends SystemService { public void deleteConversationNotificationChannels(String pkg, int uid, String conversationId) { checkCallerIsSystem(); - final int callingUid = Binder.getCallingUid(); List channels = mPreferencesHelper.getNotificationChannelsByConversationId( pkg, uid, conversationId); if (!channels.isEmpty()) { + // Preflight for fg service notifications in these channels: do nothing + // unless they're all eligible + final int appUserId = UserHandle.getUserId(uid); for (NotificationChannel nc : channels) { + final String channelId = nc.getId(); + mAmi.stopForegroundServicesForChannel(pkg, appUserId, channelId); cancelAllNotificationsInt(MY_UID, MY_PID, pkg, nc.getId(), 0, 0, true, - UserHandle.getUserId(callingUid), REASON_CHANNEL_BANNED, null); - mPreferencesHelper.deleteNotificationChannel(pkg, callingUid, nc.getId()); + appUserId, REASON_CHANNEL_BANNED, null); + mPreferencesHelper.deleteNotificationChannel(pkg, uid, channelId); mListeners.notifyNotificationChannelChanged(pkg, - UserHandle.getUserHandleForUid(callingUid), + UserHandle.getUserHandleForUid(uid), mPreferencesHelper.getNotificationChannel( - pkg, callingUid, nc.getId(), true), + pkg, uid, channelId, true), NOTIFICATION_CHANNEL_OR_GROUP_DELETED); } handleSavePolicyFile(); @@ -3469,13 +3491,20 @@ public class NotificationManagerService extends SystemService { NotificationChannelGroup groupToDelete = mPreferencesHelper.getNotificationChannelGroup(groupId, pkg, callingUid); if (groupToDelete != null) { + // Preflight for allowability + final int userId = UserHandle.getUserId(callingUid); + List groupChannels = groupToDelete.getChannels(); + for (int i = 0; i < groupChannels.size(); i++) { + enforceDeletingChannelHasNoFgService(pkg, userId, + groupChannels.get(i).getId()); + } List deletedChannels = mPreferencesHelper.deleteNotificationChannelGroup(pkg, callingUid, groupId); for (int i = 0; i < deletedChannels.size(); i++) { final NotificationChannel deletedChannel = deletedChannels.get(i); cancelAllNotificationsInt(MY_UID, MY_PID, pkg, deletedChannel.getId(), 0, 0, true, - UserHandle.getUserId(Binder.getCallingUid()), REASON_CHANNEL_BANNED, + userId, REASON_CHANNEL_BANNED, null); mListeners.notifyNotificationChannelChanged(pkg, UserHandle.getUserHandleForUid(callingUid), diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java index 1d783532374b0..e101b98a78848 100755 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -499,7 +499,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { mGroupHelper, mAm, mAtm, mAppUsageStats, mock(DevicePolicyManagerInternal.class), mUgm, mUgmInternal, mAppOpsManager, mUm, mHistoryManager, mStatsManager, - mock(TelephonyManager.class)); + mock(TelephonyManager.class), + mock(ActivityManagerInternal.class)); mService.onBootPhase(SystemService.PHASE_SYSTEM_SERVICES_READY); mService.setAudioManager(mAudioManager); diff --git a/services/tests/uiservicestests/src/com/android/server/notification/RoleObserverTest.java b/services/tests/uiservicestests/src/com/android/server/notification/RoleObserverTest.java index ac2c6193c6774..1918edb335542 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/RoleObserverTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/RoleObserverTest.java @@ -32,6 +32,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.ActivityManager; +import android.app.ActivityManagerInternal; import android.app.AppOpsManager; import android.app.IActivityManager; import android.app.IUriGrantsManager; @@ -156,7 +157,8 @@ public class RoleObserverTest extends UiServiceTestCase { mock(DevicePolicyManagerInternal.class), mock(IUriGrantsManager.class), mock(UriGrantsManagerInternal.class), mock(AppOpsManager.class), mUm, mock(NotificationHistoryManager.class), - mock(StatsManager.class), mock(TelephonyManager.class)); + mock(StatsManager.class), mock(TelephonyManager.class), + mock(ActivityManagerInternal.class)); } catch (SecurityException e) { if (!e.getMessage().contains("Permission Denial: not allowed to send broadcast")) { throw e; From 73c06b92183bcf94a9ad7216d8ce372ad2242f48 Mon Sep 17 00:00:00 2001 From: Jerry Chang Date: Fri, 12 Mar 2021 00:09:54 +0800 Subject: [PATCH 234/288] Prevent caching unexpected IME shown state for legacy split Due to DisplayImeController listens to insetsChanged and display rotation at all time, it might caching unexpected IME shown state in DividerImeController. Since RemoteInsetsControllerTarget only controlling insets during split mode, it won't receive hideInsets event when the target app request to hide IME. Thus leaving unexpected IME state in split component. When the next time entering split screen, it'll adjust split layout with wrong IME state. Update to not caching IME shown state in DividerImeController if the split is not activated. Bug: 176846448 Test: atest WMShellUnitTests Test: open IME and rotate and dock two apps in split mode, observed the divider bar is interactable and there's no dim layer on the secondary split Merged-In: I2f63eebb208b8c987a0a05615ddef4f6feef10d6 Change-Id: I2f63eebb208b8c987a0a05615ddef4f6feef10d6 --- .../systemui/stackdivider/DividerImeController.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerImeController.java b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerImeController.java index 5aeca5e07bdde..6c9f61be29860 100644 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerImeController.java +++ b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerImeController.java @@ -141,14 +141,14 @@ class DividerImeController implements DisplayImeController.ImePositionProcessor @ImeAnimationFlags public int onImeStartPositioning(int displayId, int hiddenTop, int shownTop, boolean imeShouldShow, boolean imeIsFloating, SurfaceControl.Transaction t) { - mHiddenTop = hiddenTop; - mShownTop = shownTop; - mTargetShown = imeShouldShow; if (!isDividerVisible()) { return 0; } - final boolean splitIsVisible = !getView().isHidden(); + mHiddenTop = hiddenTop; + mShownTop = shownTop; + mTargetShown = imeShouldShow; mSecondaryHasFocus = getSecondaryHasFocus(displayId); + final boolean splitIsVisible = !getView().isHidden(); final boolean targetAdjusted = splitIsVisible && imeShouldShow && mSecondaryHasFocus && !imeIsFloating && !getLayout().mDisplayLayout.isLandscape() && !mSplits.mDivider.isMinimized(); From 8cb7e0a881fed2a7d80b69aed77275bd483043ad Mon Sep 17 00:00:00 2001 From: Christopher Tate Date: Wed, 18 Nov 2020 17:22:45 -0800 Subject: [PATCH 235/288] DO NOT MERGE - Disallow deletion of channels with FGS notifications Bug: 156090809 Test: atest CtsAppTestCases:NotificationManagerTest Test: atest CtsAppTestCases:android.app.cts.ServiceTest Change-Id: I1c2bb78d86f194585d273661cecf3419f51965df (cherry picked from commit 39b3890268913bc2dc8b90671d042c0e9b4090d2) --- .../android/app/ActivityManagerInternal.java | 15 ++++++ .../com/android/server/am/ActiveServices.java | 40 ++++++++++++++++ .../server/am/ActivityManagerService.java | 16 +++++++ .../NotificationManagerService.java | 47 +++++++++++++++---- .../NotificationManagerServiceTest.java | 3 +- .../server/notification/RoleObserverTest.java | 4 +- 6 files changed, 114 insertions(+), 11 deletions(-) diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java index a5965bc7f85fd..fcb5e0bd0b027 100644 --- a/core/java/android/app/ActivityManagerInternal.java +++ b/core/java/android/app/ActivityManagerInternal.java @@ -377,6 +377,21 @@ public abstract class ActivityManagerInternal { */ public abstract boolean hasRunningForegroundService(int uid, int foregroundServiceType); + /** + * Returns {@code true} if the given notification channel currently has a + * notification associated with a foreground service. This is an AMS check + * because that is the source of truth for the FGS state. + */ + public abstract boolean hasForegroundServiceNotification(String pkg, @UserIdInt int userId, + String channelId); + + /** + * If the given app has any FGSs whose notifications are in the given channel, + * stop them. + */ + public abstract void stopForegroundServicesForChannel(String pkg, @UserIdInt int userId, + String channelId); + /** * Registers the specified {@code processObserver} to be notified of future changes to * process state. diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index dd0e1f6458f99..b8de4a759b607 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -119,6 +119,7 @@ import java.io.StringWriter; import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import java.util.Objects; import java.util.Set; import java.util.function.Predicate; @@ -433,6 +434,45 @@ public final class ActiveServices { return smap != null ? smap.mStartingBackground.size() >= mMaxStartingBackground : false; } + boolean hasForegroundServiceNotificationLocked(String pkg, int userId, String channelId) { + final ServiceMap smap = mServiceMap.get(userId); + if (smap != null) { + for (int i = 0; i < smap.mServicesByInstanceName.size(); i++) { + final ServiceRecord sr = smap.mServicesByInstanceName.valueAt(i); + if (sr.appInfo.packageName.equals(pkg) && sr.isForeground) { + if (Objects.equals(sr.foregroundNoti.getChannelId(), channelId)) { + if (DEBUG_FOREGROUND_SERVICE) { + Slog.d(TAG_SERVICE, "Channel u" + userId + "/pkg=" + pkg + + "/channelId=" + channelId + + " has fg service notification"); + } + return true; + } + } + } + } + return false; + } + + void stopForegroundServicesForChannelLocked(String pkg, int userId, String channelId) { + final ServiceMap smap = mServiceMap.get(userId); + if (smap != null) { + for (int i = 0; i < smap.mServicesByInstanceName.size(); i++) { + final ServiceRecord sr = smap.mServicesByInstanceName.valueAt(i); + if (sr.appInfo.packageName.equals(pkg) && sr.isForeground) { + if (Objects.equals(sr.foregroundNoti.getChannelId(), channelId)) { + if (DEBUG_FOREGROUND_SERVICE) { + Slog.d(TAG_SERVICE, "Stopping FGS u" + userId + "/pkg=" + pkg + + "/channelId=" + channelId + + " for conversation channel clear"); + } + stopServiceLocked(sr); + } + } + } + } + } + private ServiceMap getServiceMapLocked(int callingUser) { ServiceMap smap = mServiceMap.get(callingUser); if (smap == null) { diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 67c64e94db9bc..28c9e4914e68b 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -19730,6 +19730,22 @@ public class ActivityManagerService extends IActivityManager.Stub return false; } + @Override + public boolean hasForegroundServiceNotification(String pkg, int userId, + String channelId) { + synchronized (ActivityManagerService.this) { + return mServices.hasForegroundServiceNotificationLocked(pkg, userId, channelId); + } + } + + @Override + public void stopForegroundServicesForChannel(String pkg, int userId, + String channelId) { + synchronized (ActivityManagerService.this) { + mServices.stopForegroundServicesForChannelLocked(pkg, userId, channelId); + } + } + @Override public void registerProcessObserver(IProcessObserver processObserver) { ActivityManagerService.this.registerProcessObserver(processObserver); diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index e94507bccea0e..65b3221747a19 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -402,6 +402,7 @@ public class NotificationManagerService extends SystemService { private IActivityManager mAm; private ActivityTaskManagerInternal mAtm; private ActivityManager mActivityManager; + private ActivityManagerInternal mAmi; private IPackageManager mPackageManager; private PackageManager mPackageManagerClient; AudioManager mAudioManager; @@ -1875,7 +1876,7 @@ public class NotificationManagerService extends SystemService { DevicePolicyManagerInternal dpm, IUriGrantsManager ugm, UriGrantsManagerInternal ugmInternal, AppOpsManager appOps, UserManager userManager, NotificationHistoryManager historyManager, StatsManager statsManager, - TelephonyManager telephonyManager) { + TelephonyManager telephonyManager, ActivityManagerInternal ami) { mHandler = handler; Resources resources = getContext().getResources(); mMaxPackageEnqueueRate = Settings.Global.getFloat(getContext().getContentResolver(), @@ -1896,6 +1897,7 @@ public class NotificationManagerService extends SystemService { mAlarmManager = (AlarmManager) getContext().getSystemService(Context.ALARM_SERVICE); mCompanionManager = companionManager; mActivityManager = activityManager; + mAmi = ami; mDeviceIdleController = IDeviceIdleController.Stub.asInterface( ServiceManager.getService(Context.DEVICE_IDLE_CONTROLLER)); mDpm = dpm; @@ -2111,7 +2113,8 @@ public class NotificationManagerService extends SystemService { new NotificationHistoryManager(getContext(), handler), mStatsManager = (StatsManager) getContext().getSystemService( Context.STATS_MANAGER), - getContext().getSystemService(TelephonyManager.class)); + getContext().getSystemService(TelephonyManager.class), + LocalServices.getService(ActivityManagerInternal.class)); // register for various Intents IntentFilter filter = new IntentFilter(); @@ -3395,15 +3398,30 @@ public class NotificationManagerService extends SystemService { pkg, uid, channelId, conversationId, true, includeDeleted); } + // Returns 'true' if the given channel has a notification associated + // with an active foreground service. + private void enforceDeletingChannelHasNoFgService(String pkg, int userId, + String channelId) { + if (mAmi.hasForegroundServiceNotification(pkg, userId, channelId)) { + Slog.w(TAG, "Package u" + userId + "/" + pkg + + " may not delete notification channel '" + + channelId + "' with fg service"); + throw new SecurityException("Not allowed to delete channel " + channelId + + " with a foreground service"); + } + } + @Override public void deleteNotificationChannel(String pkg, String channelId) { checkCallerIsSystemOrSameApp(pkg); final int callingUid = Binder.getCallingUid(); + final int callingUser = UserHandle.getUserId(callingUid); if (NotificationChannel.DEFAULT_CHANNEL_ID.equals(channelId)) { throw new IllegalArgumentException("Cannot delete default channel"); } + enforceDeletingChannelHasNoFgService(pkg, callingUser, channelId); cancelAllNotificationsInt(MY_UID, MY_PID, pkg, channelId, 0, 0, true, - UserHandle.getUserId(callingUid), REASON_CHANNEL_BANNED, null); + callingUser, REASON_CHANNEL_BANNED, null); mPreferencesHelper.deleteNotificationChannel(pkg, callingUid, channelId); mListeners.notifyNotificationChannelChanged(pkg, UserHandle.getUserHandleForUid(callingUid), @@ -3416,19 +3434,23 @@ public class NotificationManagerService extends SystemService { public void deleteConversationNotificationChannels(String pkg, int uid, String conversationId) { checkCallerIsSystem(); - final int callingUid = Binder.getCallingUid(); List channels = mPreferencesHelper.getNotificationChannelsByConversationId( pkg, uid, conversationId); if (!channels.isEmpty()) { + // Preflight for fg service notifications in these channels: do nothing + // unless they're all eligible + final int appUserId = UserHandle.getUserId(uid); for (NotificationChannel nc : channels) { + final String channelId = nc.getId(); + mAmi.stopForegroundServicesForChannel(pkg, appUserId, channelId); cancelAllNotificationsInt(MY_UID, MY_PID, pkg, nc.getId(), 0, 0, true, - UserHandle.getUserId(callingUid), REASON_CHANNEL_BANNED, null); - mPreferencesHelper.deleteNotificationChannel(pkg, callingUid, nc.getId()); + appUserId, REASON_CHANNEL_BANNED, null); + mPreferencesHelper.deleteNotificationChannel(pkg, uid, channelId); mListeners.notifyNotificationChannelChanged(pkg, - UserHandle.getUserHandleForUid(callingUid), + UserHandle.getUserHandleForUid(uid), mPreferencesHelper.getNotificationChannel( - pkg, callingUid, nc.getId(), true), + pkg, uid, channelId, true), NOTIFICATION_CHANNEL_OR_GROUP_DELETED); } handleSavePolicyFile(); @@ -3459,13 +3481,20 @@ public class NotificationManagerService extends SystemService { NotificationChannelGroup groupToDelete = mPreferencesHelper.getNotificationChannelGroup(groupId, pkg, callingUid); if (groupToDelete != null) { + // Preflight for allowability + final int userId = UserHandle.getUserId(callingUid); + List groupChannels = groupToDelete.getChannels(); + for (int i = 0; i < groupChannels.size(); i++) { + enforceDeletingChannelHasNoFgService(pkg, userId, + groupChannels.get(i).getId()); + } List deletedChannels = mPreferencesHelper.deleteNotificationChannelGroup(pkg, callingUid, groupId); for (int i = 0; i < deletedChannels.size(); i++) { final NotificationChannel deletedChannel = deletedChannels.get(i); cancelAllNotificationsInt(MY_UID, MY_PID, pkg, deletedChannel.getId(), 0, 0, true, - UserHandle.getUserId(Binder.getCallingUid()), REASON_CHANNEL_BANNED, + userId, REASON_CHANNEL_BANNED, null); mListeners.notifyNotificationChannelChanged(pkg, UserHandle.getUserHandleForUid(callingUid), diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java index a55d28ee60655..876e63e9eb0a0 100755 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -496,7 +496,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { mGroupHelper, mAm, mAtm, mAppUsageStats, mock(DevicePolicyManagerInternal.class), mUgm, mUgmInternal, mAppOpsManager, mUm, mHistoryManager, mStatsManager, - mock(TelephonyManager.class)); + mock(TelephonyManager.class), + mock(ActivityManagerInternal.class)); mService.onBootPhase(SystemService.PHASE_SYSTEM_SERVICES_READY); mService.setAudioManager(mAudioManager); diff --git a/services/tests/uiservicestests/src/com/android/server/notification/RoleObserverTest.java b/services/tests/uiservicestests/src/com/android/server/notification/RoleObserverTest.java index ac2c6193c6774..1918edb335542 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/RoleObserverTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/RoleObserverTest.java @@ -32,6 +32,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.ActivityManager; +import android.app.ActivityManagerInternal; import android.app.AppOpsManager; import android.app.IActivityManager; import android.app.IUriGrantsManager; @@ -156,7 +157,8 @@ public class RoleObserverTest extends UiServiceTestCase { mock(DevicePolicyManagerInternal.class), mock(IUriGrantsManager.class), mock(UriGrantsManagerInternal.class), mock(AppOpsManager.class), mUm, mock(NotificationHistoryManager.class), - mock(StatsManager.class), mock(TelephonyManager.class)); + mock(StatsManager.class), mock(TelephonyManager.class), + mock(ActivityManagerInternal.class)); } catch (SecurityException e) { if (!e.getMessage().contains("Permission Denial: not allowed to send broadcast")) { throw e; From 8b15af2a92227878e1ccb8e513ce8aeecbd58d24 Mon Sep 17 00:00:00 2001 From: Janis Danisevskis Date: Tue, 16 Mar 2021 14:24:43 -0700 Subject: [PATCH 236/288] Keystore 2.0: Enable by default. Keystore 2.0 is to replace Keystore. This patch removes checking the keystore2 enable property and installs the Keystore 2.0 SPI by default. cherry-pick from commit 7aa8d2aae2dec664452ddef7454dc58441031959 Bug: 171563717 Test: N/A Merged-In: I13a3db8ca736cceb06e864457046ff9ca641322d Change-Id: I13a3db8ca736cceb06e864457046ff9ca641322d --- core/java/com/android/internal/os/ZygoteInit.java | 14 +------------- .../server/locksettings/LockSettingsService.java | 10 +--------- 2 files changed, 2 insertions(+), 22 deletions(-) diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java index c220428df58b0..5fea76a7228ec 100644 --- a/core/java/com/android/internal/os/ZygoteInit.java +++ b/core/java/com/android/internal/os/ZygoteInit.java @@ -41,7 +41,6 @@ import android.os.UserHandle; import android.os.ZygoteProcess; import android.os.storage.StorageManager; import android.provider.DeviceConfig; -import android.security.keystore.AndroidKeyStoreProvider; import android.system.ErrnoException; import android.system.Os; import android.system.OsConstants; @@ -74,7 +73,6 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.security.Provider; import java.security.Security; -import java.util.Optional; /** * Startup class for the zygote process. @@ -227,17 +225,7 @@ public class ZygoteInit { // AndroidKeyStoreProvider.install() manipulates the list of JCA providers to insert // preferred providers. Note this is not done via security.properties as the JCA providers // are not on the classpath in the case of, for example, raw dalvikvm runtimes. - // TODO b/171305684 This code is used to conditionally enable the installation of the - // Keystore 2.0 provider to enable teams adjusting to Keystore 2.0 at their own - // pace. This code will be removed when all calling code was adjusted to - // Keystore 2.0. - Optional keystore2_enabled = - android.sysprop.Keystore2Properties.keystore2_enabled(); - if (keystore2_enabled.isPresent() && keystore2_enabled.get()) { - android.security.keystore2.AndroidKeyStoreProvider.install(); - } else { - AndroidKeyStoreProvider.install(); - } + android.security.keystore2.AndroidKeyStoreProvider.install(); Log.i(TAG, "Installed AndroidKeyStoreProvider in " + (SystemClock.uptimeMillis() - startTime) + "ms."); Trace.traceEnd(Trace.TRACE_TAG_DALVIK); diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java index 294d7e257b6e8..0215188bc1a48 100644 --- a/services/core/java/com/android/server/locksettings/LockSettingsService.java +++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java @@ -92,7 +92,6 @@ import android.provider.Settings.SettingNotFoundException; import android.security.AndroidKeyStoreMaintenance; import android.security.Authorization; import android.security.KeyStore; -import android.security.keystore.AndroidKeyStoreProvider; import android.security.keystore.KeyProperties; import android.security.keystore.KeyProtection; import android.security.keystore.UserNotAuthenticatedException; @@ -157,7 +156,6 @@ import java.util.List; import java.util.Map; import java.util.NoSuchElementException; import java.util.Objects; -import java.util.Optional; import java.util.Set; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; @@ -264,13 +262,7 @@ public class LockSettingsService extends ILockSettings.Stub { @Override public void onStart() { - Optional keystore2_enabled = - android.sysprop.Keystore2Properties.keystore2_enabled(); - if (keystore2_enabled.isPresent() && keystore2_enabled.get()) { - android.security.keystore2.AndroidKeyStoreProvider.install(); - } else { - AndroidKeyStoreProvider.install(); - } + android.security.keystore2.AndroidKeyStoreProvider.install(); mLockSettingsService = new LockSettingsService(getContext()); publishBinderService("lock_settings", mLockSettingsService); } From ed9f50dd589b2dfa0f01e2783c56ae9b7b48a1f5 Mon Sep 17 00:00:00 2001 From: Louis Chang Date: Wed, 17 Mar 2021 14:21:10 +0800 Subject: [PATCH 237/288] Dump warning logs to prevent app crash while no top-resumed changes Applications crashed due to duplicated top resumed activity change events. Currently, the only possible scenario we know if that the application invokes Looper#loop() and reverse the messages order. Write warning logs vs. throwing exceptions to prevent application crashes. Bug: 140571893 Test: build and boot pass Change-Id: If6f6c502b96ccc11b230ba075c61118f03e13d5c --- core/java/android/app/ActivityThread.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index b47d44d607907..4cc486a0b9b44 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -4602,6 +4602,10 @@ public final class ActivityThread extends ClientTransactionHandler { } if (r.isTopResumedActivity == onTop) { + if (!Build.IS_DEBUGGABLE) { + Slog.w(TAG, "Activity top position already set to onTop=" + onTop); + return; + } throw new IllegalStateException("Activity top position already set to onTop=" + onTop); } From 92c80af4714e8c627d88545e17ebec2cce3b6081 Mon Sep 17 00:00:00 2001 From: Patrick Baumann Date: Thu, 18 Mar 2021 13:32:00 -0700 Subject: [PATCH 238/288] RESTRICT AUTOMERGE Revert "Handling removing tag" This reverts commit 27c28b94283b491c58d5981fc580cd89e5c251c5. Change-Id: Ic11952e0ebc913ee453aa47e559b0fd0232816db Bug: 169414761 --- .../java/com/android/server/pm/PackageManagerService.java | 2 -- services/core/java/com/android/server/pm/Settings.java | 4 ---- 2 files changed, 6 deletions(-) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 6d2ea3c73d3ae..15a41edca8a3f 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -11139,8 +11139,6 @@ public class PackageManagerService extends IPackageManager.Stub mSettings.addRenamedPackageLPw(parsedPackage.getRealPackage(), originalPkgSetting.name); mTransferredPackages.add(originalPkgSetting.name); - } else { - mSettings.removeRenamedPackageLPw(parsedPackage.getPackageName()); } } if (pkgSetting.sharedUser != null) { diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index a7164f94f66b7..aeea2514d0a49 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -476,10 +476,6 @@ public final class Settings { return mRenamedPackages.put(pkgName, origPkgName); } - void removeRenamedPackageLPw(String pkgName) { - mRenamedPackages.remove(pkgName); - } - public boolean canPropagatePermissionToInstantApp(String permName) { return mPermissions.canPropagatePermissionToInstantApp(permName); } From 552bf38f661110414eb883cb8efbfb52a52fa19b Mon Sep 17 00:00:00 2001 From: Patrick Baumann Date: Thu, 18 Mar 2021 13:32:21 -0700 Subject: [PATCH 239/288] RESTRICT AUTOMERGE Handling removing tag This reverts commit I7b9d3c786d653a9b00a553e89d7390bcef45c0f2. Fixes: 169414761 Test: Manual Test: Add package A Test: Verify package A exists Test: Remove A, add package B w/ original-package A Test: Verify package A exists, but codepath is to package B Test: Replace package B w/o original-package A Test: Verify package A removed and package B added This reverts commit dd13be00dc5654e98ddcb206dc15fc4e07829526. Change-Id: I5d66c2b2649bd4d19b5318ea6bbcd31cb6d405fc --- .../android/server/pm/PackageManagerService.java | 4 ++-- .../server/pm/PackageManagerShellCommand.java | 13 +++++++++++++ .../core/java/com/android/server/pm/Settings.java | 4 ++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 15a41edca8a3f..c643307c5f51e 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -3658,8 +3658,6 @@ public class PackageManagerService extends IPackageManager.Stub PackageParser.readConfigUseRoundIcon(mContext.getResources()); mServiceStartWithDelay = SystemClock.uptimeMillis() + (60 * 1000L); - - Slog.i(TAG, "Fix for b/169414761 is applied"); } /** @@ -11139,6 +11137,8 @@ public class PackageManagerService extends IPackageManager.Stub mSettings.addRenamedPackageLPw(parsedPackage.getRealPackage(), originalPkgSetting.name); mTransferredPackages.add(originalPkgSetting.name); + } else { + mSettings.removeRenamedPackageLPw(parsedPackage.getPackageName()); } } if (pkgSetting.sharedUser != null) { diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java index 7b4e4d94baa2e..8ab2b35c6cee9 100644 --- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java +++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java @@ -168,6 +168,8 @@ class PackageManagerShellCommand extends ShellCommand { switch (cmd) { case "path": return runPath(); + case "validate": + return runValidate(); case "dump": return runDump(); case "list": @@ -322,6 +324,17 @@ class PackageManagerShellCommand extends ShellCommand { return -1; } + private int runValidate() { + final PrintWriter pw = getOutPrintWriter(); + String identifier = getNextArgRequired(); + if ("169414761".equals(identifier)) { + pw.println("applied"); + } else { + pw.println("missing"); + } + return 0; + } + /** * Shows module info * diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index aeea2514d0a49..a7164f94f66b7 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -476,6 +476,10 @@ public final class Settings { return mRenamedPackages.put(pkgName, origPkgName); } + void removeRenamedPackageLPw(String pkgName) { + mRenamedPackages.remove(pkgName); + } + public boolean canPropagatePermissionToInstantApp(String permName) { return mPermissions.canPropagatePermissionToInstantApp(permName); } From 75a4e3f38c52366d59447cc865b65e4d51622697 Mon Sep 17 00:00:00 2001 From: Jing Ji Date: Fri, 19 Mar 2021 22:20:29 -0700 Subject: [PATCH 240/288] DO NOT MERGE: Don't take the AM lock in cached app compaction handler A single oomAdjUpdate pass could trigger quite a few app compactions, each of them would need to acquire the AM lock during the handling, results in lock contentions. Now use its own lock. Also skip the scheduling if the given app is pending with compaction already. Bug: 163297662 Test: atest CachedAppOptimizerTest Test: Manual - Boot & check the logs Change-Id: I4618a3ae78838cd9783a431e7364130270ebb4d6 --- .../server/am/ActivityManagerService.java | 5 +- .../android/server/am/CachedAppOptimizer.java | 83 ++++++++++++------- .../com/android/server/am/OomAdjuster.java | 3 + .../com/android/server/am/ProcessRecord.java | 31 ++++++- .../server/am/CachedAppOptimizerTest.java | 4 +- 5 files changed, 92 insertions(+), 34 deletions(-) diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 5134f498928b4..d7a9e05d94aad 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -2124,7 +2124,7 @@ public class ActivityManagerService extends IActivityManager.Stub 0, new HostingRecord("system")); app.setPersistent(true); - app.pid = MY_PID; + app.pid = app.mPidForCompact = MY_PID; app.getWindowProcessController().setPid(MY_PID); app.maxAdj = ProcessList.SYSTEM_ADJ; app.makeActive(mSystemThread.getApplicationThread(), mProcessStats); @@ -5105,6 +5105,9 @@ public class ActivityManagerService extends IActivityManager.Stub EventLogTags.writeAmProcBound(app.userId, app.pid, app.processName); app.curAdj = app.setAdj = app.verifiedAdj = ProcessList.INVALID_ADJ; + synchronized (mOomAdjuster.mCachedAppOptimizer) { + app.mSetAdjForCompact = ProcessList.INVALID_ADJ; + } mOomAdjuster.setAttachingSchedGroupLocked(app); app.forcingToImportant = null; updateProcessForegroundLocked(app, false, 0, false); diff --git a/services/core/java/com/android/server/am/CachedAppOptimizer.java b/services/core/java/com/android/server/am/CachedAppOptimizer.java index edd0c5b72c5e8..2f776fc55034f 100644 --- a/services/core/java/com/android/server/am/CachedAppOptimizer.java +++ b/services/core/java/com/android/server/am/CachedAppOptimizer.java @@ -151,6 +151,7 @@ public final class CachedAppOptimizer { */ final ServiceThread mCachedAppOptimizerThread; + @GuardedBy("this") private final ArrayList mPendingCompactionProcesses = new ArrayList(); private final ActivityManagerService mAm; @@ -348,51 +349,74 @@ public final class CachedAppOptimizer { @GuardedBy("mAm") void compactAppSome(ProcessRecord app) { - app.reqCompactAction = COMPACT_PROCESS_SOME; - mPendingCompactionProcesses.add(app); - mCompactionHandler.sendMessage( - mCompactionHandler.obtainMessage( - COMPACT_PROCESS_MSG, app.setAdj, app.setProcState)); + synchronized (this) { + app.reqCompactAction = COMPACT_PROCESS_SOME; + if (!app.mPendingCompact) { + app.mPendingCompact = true; + mPendingCompactionProcesses.add(app); + mCompactionHandler.sendMessage( + mCompactionHandler.obtainMessage( + COMPACT_PROCESS_MSG, app.setAdj, app.setProcState)); + } + } } @GuardedBy("mAm") void compactAppFull(ProcessRecord app) { - app.reqCompactAction = COMPACT_PROCESS_FULL; - mPendingCompactionProcesses.add(app); - mCompactionHandler.sendMessage( - mCompactionHandler.obtainMessage( - COMPACT_PROCESS_MSG, app.setAdj, app.setProcState)); - + synchronized (this) { + app.reqCompactAction = COMPACT_PROCESS_FULL; + if (!app.mPendingCompact) { + app.mPendingCompact = true; + mPendingCompactionProcesses.add(app); + mCompactionHandler.sendMessage( + mCompactionHandler.obtainMessage( + COMPACT_PROCESS_MSG, app.setAdj, app.setProcState)); + } + } } @GuardedBy("mAm") void compactAppPersistent(ProcessRecord app) { - app.reqCompactAction = COMPACT_PROCESS_PERSISTENT; - mPendingCompactionProcesses.add(app); - mCompactionHandler.sendMessage( - mCompactionHandler.obtainMessage( - COMPACT_PROCESS_MSG, app.curAdj, app.setProcState)); + synchronized (this) { + app.reqCompactAction = COMPACT_PROCESS_PERSISTENT; + if (!app.mPendingCompact) { + app.mPendingCompact = true; + mPendingCompactionProcesses.add(app); + mCompactionHandler.sendMessage( + mCompactionHandler.obtainMessage( + COMPACT_PROCESS_MSG, app.curAdj, app.setProcState)); + } + } } @GuardedBy("mAm") boolean shouldCompactPersistent(ProcessRecord app, long now) { - return (app.lastCompactTime == 0 - || (now - app.lastCompactTime) > mCompactThrottlePersistent); + synchronized (this) { + return (app.lastCompactTime == 0 + || (now - app.lastCompactTime) > mCompactThrottlePersistent); + } } @GuardedBy("mAm") void compactAppBfgs(ProcessRecord app) { - app.reqCompactAction = COMPACT_PROCESS_BFGS; - mPendingCompactionProcesses.add(app); - mCompactionHandler.sendMessage( - mCompactionHandler.obtainMessage( - COMPACT_PROCESS_MSG, app.curAdj, app.setProcState)); + synchronized (this) { + app.reqCompactAction = COMPACT_PROCESS_BFGS; + if (!app.mPendingCompact) { + app.mPendingCompact = true; + mPendingCompactionProcesses.add(app); + mCompactionHandler.sendMessage( + mCompactionHandler.obtainMessage( + COMPACT_PROCESS_MSG, app.curAdj, app.setProcState)); + } + } } @GuardedBy("mAm") boolean shouldCompactBFGS(ProcessRecord app, long now) { - return (app.lastCompactTime == 0 - || (now - app.lastCompactTime) > mCompactThrottleBFGS); + synchronized (this) { + return (app.lastCompactTime == 0 + || (now - app.lastCompactTime) > mCompactThrottleBFGS); + } } @GuardedBy("mAm") @@ -854,18 +878,19 @@ public final class CachedAppOptimizer { LastCompactionStats lastCompactionStats; int lastOomAdj = msg.arg1; int procState = msg.arg2; - synchronized (mAm) { + synchronized (CachedAppOptimizer.this) { proc = mPendingCompactionProcesses.remove(0); pendingAction = proc.reqCompactAction; - pid = proc.pid; + pid = proc.mPidForCompact; name = proc.processName; + proc.mPendingCompact = false; // don't compact if the process has returned to perceptible // and this is only a cached/home/prev compaction if ((pendingAction == COMPACT_PROCESS_SOME || pendingAction == COMPACT_PROCESS_FULL) - && (proc.setAdj <= ProcessList.PERCEPTIBLE_APP_ADJ)) { + && (proc.mSetAdjForCompact <= ProcessList.PERCEPTIBLE_APP_ADJ)) { if (DEBUG_COMPACTION) { Slog.d(TAG_AM, "Skipping compaction as process " + name + " is " @@ -1052,7 +1077,7 @@ public final class CachedAppOptimizer { lastOomAdj, ActivityManager.processStateAmToProto(procState), zramFreeKbBefore, zramFreeKbAfter); } - synchronized (mAm) { + synchronized (CachedAppOptimizer.this) { proc.lastCompactTime = end; proc.lastCompactAction = pendingAction; } diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java index f0343e1d807ca..faa7dce316900 100644 --- a/services/core/java/com/android/server/am/OomAdjuster.java +++ b/services/core/java/com/android/server/am/OomAdjuster.java @@ -2198,6 +2198,9 @@ public final class OomAdjuster { } app.setAdj = app.curAdj; app.verifiedAdj = ProcessList.INVALID_ADJ; + synchronized (mCachedAppOptimizer) { + app.mSetAdjForCompact = app.setAdj; + } } final int curSchedGroup = app.getCurrentSchedulingGroup(); diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java index c5152c081e70e..284903d390d46 100644 --- a/services/core/java/com/android/server/am/ProcessRecord.java +++ b/services/core/java/com/android/server/am/ProcessRecord.java @@ -59,6 +59,7 @@ import android.util.SparseArray; import android.util.TimeUtils; import android.util.proto.ProtoOutputStream; +import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.app.procstats.ProcessState; import com.android.internal.app.procstats.ProcessStats; @@ -162,8 +163,11 @@ class ProcessRecord implements WindowProcessListener { int curCapability; // Current capability flags of this process. For example, // PROCESS_CAPABILITY_FOREGROUND_LOCATION is one capability. int setCapability; // Last set capability flags. + @GuardedBy("mService.mOomAdjuster.mCachedAppOptimizer") long lastCompactTime; // The last time that this process was compacted + @GuardedBy("mService.mOomAdjuster.mCachedAppOptimizer") int reqCompactAction; // The most recent compaction action requested for this app. + @GuardedBy("mService.mOomAdjuster.mCachedAppOptimizer") int lastCompactAction; // The most recent compaction action performed for this app. boolean frozen; // True when the process is frozen. long freezeUnfreezeTime; // Last time the app was (un)frozen, 0 for never @@ -352,6 +356,24 @@ class ProcessRecord implements WindowProcessListener { boolean mReachable; // Whether or not this process is reachable from given process + /** + * The snapshot of {@link #setAdj}, meant to be read by {@link CachedAppOptimizer} only. + */ + @GuardedBy("mService.mOomAdjuster.mCachedAppOptimizer") + int mSetAdjForCompact; + + /** + * The snapshot of {@link #pid}, meant to be read by {@link CachedAppOptimizer} only. + */ + @GuardedBy("mService.mOomAdjuster.mCachedAppOptimizer") + int mPidForCompact; + + /** + * This process has been scheduled for a memory compaction. + */ + @GuardedBy("mService.mOomAdjuster.mCachedAppOptimizer") + boolean mPendingCompact; + void setStartParams(int startUid, HostingRecord hostingRecord, String seInfo, long startTime) { this.startUid = startUid; @@ -447,8 +469,10 @@ class ProcessRecord implements WindowProcessListener { pw.print(" setRaw="); pw.print(setRawAdj); pw.print(" cur="); pw.print(curAdj); pw.print(" set="); pw.println(setAdj); - pw.print(prefix); pw.print("lastCompactTime="); pw.print(lastCompactTime); - pw.print(" lastCompactAction="); pw.println(lastCompactAction); + synchronized (mService.mOomAdjuster.mCachedAppOptimizer) { + pw.print(prefix); pw.print("lastCompactTime="); pw.print(lastCompactTime); + pw.print(" lastCompactAction="); pw.println(lastCompactAction); + } pw.print(prefix); pw.print("mCurSchedGroup="); pw.print(mCurSchedGroup); pw.print(" setSchedGroup="); pw.print(setSchedGroup); pw.print(" systemNoUi="); pw.print(systemNoUi); @@ -672,6 +696,9 @@ class ProcessRecord implements WindowProcessListener { public void setPid(int _pid) { pid = _pid; + synchronized (mService.mOomAdjuster.mCachedAppOptimizer) { + mPidForCompact = _pid; + } mWindowProcessController.setPid(pid); procStatFile = null; shortStringName = null; diff --git a/services/tests/mockingservicestests/src/com/android/server/am/CachedAppOptimizerTest.java b/services/tests/mockingservicestests/src/com/android/server/am/CachedAppOptimizerTest.java index 96a44a46bbafb..8d245ce4c6434 100644 --- a/services/tests/mockingservicestests/src/com/android/server/am/CachedAppOptimizerTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/am/CachedAppOptimizerTest.java @@ -134,11 +134,11 @@ public final class CachedAppOptimizerTest { ApplicationInfo ai = new ApplicationInfo(); ai.packageName = packageName; ProcessRecord app = new ProcessRecord(mAms, ai, processName, uid); - app.pid = pid; + app.pid = app.mPidForCompact = pid; app.info.uid = packageUid; // Exact value does not mater, it can be any state for which compaction is allowed. app.setProcState = PROCESS_STATE_BOUND_FOREGROUND_SERVICE; - app.setAdj = 905; + app.setAdj = app.mSetAdjForCompact = 905; return app; } From 291dfebc5231118e08a92572602b6e7c3d3f8afa Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 22 Mar 2021 09:47:26 +0000 Subject: [PATCH 241/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I6003ab9c212695a31695991f30a7e8dd2716930e --- .../SettingsLib/res/values-am/strings.xml | 4 +-- .../SettingsLib/res/values-iw/strings.xml | 2 +- packages/SettingsLib/res/values-nl/arrays.xml | 4 +-- .../SettingsLib/res/values-nl/strings.xml | 26 +++++++++---------- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml index 4887428246fe0..8ee8fe953f988 100644 --- a/packages/SettingsLib/res/values-am/strings.xml +++ b/packages/SettingsLib/res/values-am/strings.xml @@ -210,7 +210,7 @@ "Wi-Fi ሲገናኝ የማረም ሁነታ" "ስህተት" "ገመድ-አልባ debugging" - "የሚገኙ መሣሪያዎችን ለመመልከትና ለመጠቀም ገመድ-አልባ debuggingን ያብሩ" + "የሚገኙ መሣሪያዎችን ለመመልከትና ለመጠቀም ገመድ-አልባ ማረምን ያብሩ" "የQR ኮድን በመጠቀም መሣሪያን ያጣምሩ" "የQR ኮድ መቃኛን በመጠቀም አዲስ መሣሪያዎችን ያጣምሩ" "የማጣመሪያ ኮድን በመጠቀም መሣሪያን ያጣምሩ" @@ -302,7 +302,7 @@ "የUSB ማረሚያ ይፈቀድ?" "የUSB አድስ ለግንባታ አላማ ብቻ የታሰበ ነው። ከኮምፒዩተርህ ወደ መሳሪያህ ውሂብ ለመገልበጥ፣ መሣሪያህ ላይ ያለ ማሳወቂያ መተግበሪያዎችን መጫን፣ እና ማስታወሻ ውሂብ ማንበብ ለመጠቀም ይቻላል።" "ገመድ-አልባ debugging ይፈቀድ?" - "ገመድ-አልባ debugging ለግንባታ አላማዎች ብቻ የታሰበ ነው። ውሂብን ከኮምፒዩተርዎ ወደ መሳሪያዎ ለመቅዳት፣ መሣሪያዎ ላይ ያለማሳወቂያ መተግበሪያዎችን ለመጫን እና የምዝግብ ማስታወሻ ውሂብን ለማንበብ ይጠቀሙበት።" + "ገመድ-አልባ ማረም ለግንባታ አላማዎች ብቻ የታሰበ ነው። ውሂብን ከኮምፒዩተርዎ ወደ መሳሪያዎ ለመቅዳት፣ መሣሪያዎ ላይ ያለማሳወቂያ መተግበሪያዎችን ለመጫን እና የምዝግብ ማስታወሻ ውሂብን ለማንበብ ይጠቀሙበት።" "የዩ ኤስ ቢ ማረም መዳረሻ ከዚህ ቀደም ፍቃድ ከሰጧቸው ኮምፒውተሮች ላይ ይሻሩ?" "የግንባታ ቅንብሮችን ፍቀድ?" "እነዚህ ቅንብሮች የታሰቡት ለግንባታ አጠቃቀም ብቻ ናቸው። መሳሪያህን እና በሱ ላይ ያሉትን መተግበሪያዎች እንዲበለሹ ወይም በትክክል እንዳይሰሩ ሊያደርጉ ይችላሉ።" diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml index f55664a518531..f098bf3edaf45 100644 --- a/packages/SettingsLib/res/values-iw/strings.xml +++ b/packages/SettingsLib/res/values-iw/strings.xml @@ -130,7 +130,7 @@ "מתבצעת התאמה של מכשיר שמיעה שמאלי…" "מתבצעת התאמה של מכשיר שמיעה ימני…" "שמאלי - טעינת הסוללה: %1$s" - "ימני - טעינת הסוללה: %1$s" + "ימני – טעינת הסוללה: %1$s" "‏Wi-Fi כבוי." "‏Wi-Fi מנותק." "‏פס אחד של Wi-Fi." diff --git a/packages/SettingsLib/res/values-nl/arrays.xml b/packages/SettingsLib/res/values-nl/arrays.xml index bfbbae041a50a..7ad044dade203 100644 --- a/packages/SettingsLib/res/values-nl/arrays.xml +++ b/packages/SettingsLib/res/values-nl/arrays.xml @@ -248,8 +248,8 @@
"Uit" - "Gedeeltes met overbelasting weergeven" - "Gebieden voor deuteranomalie weergeven" + "Gedeelten met overbelasting tonen" + "Gebieden voor deuteranomalie tonen" "Standaardlimiet" diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml index e99a140a0d2a3..0735fb1570dbf 100644 --- a/packages/SettingsLib/res/values-nl/strings.xml +++ b/packages/SettingsLib/res/values-nl/strings.xml @@ -235,7 +235,7 @@ "Maak verbinding met een wifi-netwerk" "adb, foutopsporing, ontwikkeling" "Snelle link naar bugrapport" - "Een knop in het aan/uit-menu weergeven om een bugrapport te maken" + "Een knop in het aan/uit-menu tonen om een bugrapport te maken" "Stand-by" "Scherm gaat nooit uit tijdens het opladen" "Snoop-logbestand voor Bluetooth-HCI inschakelen" @@ -254,7 +254,7 @@ "Via wifi ondersteunde MAC-herschikking" "Mobiele data altijd actief" "Hardwareversnelling voor tethering" - "Bluetooth-apparaten zonder namen weergeven" + "Bluetooth-apparaten zonder naam tonen" "Absoluut volume uitschakelen" "Gabeldorsche inschakelen" "Bluetooth-AVRCP-versie" @@ -280,8 +280,8 @@ "Hostnaam van privé-DNS-provider" "Geef hostnaam van DNS-provider op" "Kan geen verbinding maken" - "Opties weergeven voor certificering van draadloze weergave" - "Logniveau voor wifi verhogen, weergeven per SSID RSSI in wifi-kiezer" + "Opties tonen voor certificering van draadloze weergave" + "Logniveau voor wifi verhogen, tonen per SSID RSSI in wifi-kiezer" "Verlaagt het batterijverbruik en verbetert de netwerkprestaties" "Als deze modus is ingeschakeld, kan het MAC-adres van dit apparaat elke keer wijzigen als het verbinding maakt met een netwerk waarvoor MAC-herschikking is ingeschakeld." "Met datalimiet" @@ -296,7 +296,7 @@ "USB-configuratie selecteren" "Neplocaties toestaan" "Neplocaties toestaan" - "Inspectie van weergavekenmerk inschakelen" + "Inspectie van weergavekenmerk aanzetten" "Mobiele data altijd actief houden, ook als wifi actief is (voor sneller schakelen tussen netwerken)." "Hardwareversnelling voor tethering gebruiken indien beschikbaar" "USB-foutopsporing toestaan?" @@ -308,7 +308,7 @@ "Deze instellingen zijn uitsluitend bedoeld voor ontwikkelingsgebruik. Je apparaat en apps kunnen hierdoor vastlopen of anders reageren." "Apps verifiëren via USB" "Apps die zijn geïnstalleerd via ADB/ADT, controleren op schadelijk gedrag" - "Bluetooth-apparaten zonder namen (alleen MAC-adressen) worden weergegeven" + "Bluetooth-apparaten zonder naam (alleen MAC-adressen) worden weergegeven" "Hiermee wordt de functie voor absoluut volume van Bluetooth uitgeschakeld in geval van volumeproblemen met externe apparaten, zoals een onacceptabel hoog volume of geen volumeregeling." "Hierdoor wordt de Gabeldorsche-functiestack voor bluetooth ingeschakeld." "Hiermee wordt de functie voor verbeterde connectiviteit ingeschakeld." @@ -333,12 +333,12 @@ "Knipperend scherm bij lange bewerkingen door apps" "Cursorlocatie" "Schermoverlay met huidige aanraakgegevens" - "Tikken weergeven" - "Visuele feedback weergeven voor tikken" - "Oppervlakupdates weergeven" + "Tikken tonen" + "Visuele feedback tonen voor tikken" + "Oppervlakupdates tonen" "Volledige vensteroppervlakken flashen bij updates" "Weergave-updates tonen" - "Flash-weergave in vensters bij update" + "Flash-weergaven in vensters bij update" "Hardwarelayer-upd. tonen" "Hardwarelagen knipperen groen bij updates" "Foutopsporing GPU-overbelasting" @@ -348,8 +348,8 @@ "OpenGL-sporen inschakelen" "USB-audiorouting uitsch." "Autom. routing naar USB-randapparatuur uitsch." - "Indelingsgrenzen weergeven" - "Clipgrenzen, marges en meer weergeven" + "Indelingsgrenzen tonen" + "Clipgrenzen, marges en meer tonen" "V.r.n.l.-indelingsrichting afdwingen" "Schermindelingsrichting geforceerd instellen op v.r.n.l. voor alle talen" "4x MSAA forceren" @@ -400,7 +400,7 @@ "Actief. Tik om te schakelen." "Stand-bystatus app: %s" "Actieve services" - "Services die momenteel actief zijn, weergeven en beheren" + "Services die momenteel actief zijn, bekijken en beheren" "WebView-implementatie" "WebView-implementatie instellen" "Deze keuze is niet meer geldig. Probeer het opnieuw." From f8c3e2eb4edd97106cdbc40125f4d96c425ebe0b Mon Sep 17 00:00:00 2001 From: Chiachang Wang Date: Mon, 22 Feb 2021 18:36:38 +0800 Subject: [PATCH 242/288] Replace the usage of UidRange UidRange is used in a shared way between ConnectivityService and VPN through the use of NetworkCapabilities. UidRange will be part of the ConnectivityService mainline but Vpn.java will stay in the framework. We need a way to replace the APIs using UidRange, or to make UidRange system API. The only really relevant surface here is NetworkCapabilities#{setUids, getUids}. The need for UidRange could be replaced by an integer Range, so replace the usage of UidRange by a integer Range in NetworkCapabilities#{setUids, getUids} and update the relevant callers. Bug: 172183305 Test: atest FrameworksNetTests CtsNetTestCasesLatestSdk Merged-In: I4e5aec6ef1ea02e038fcd7ed117a3b67b69c5cb9 Change-Id: Idb7f353788c5779a4fbbd107595e9326b99fe0a8 --- .../src/android/net/NetworkCapabilities.java | 31 ++-- .../src/android/net/NetworkRequest.java | 5 +- .../framework/src/android/net/UidRange.java | 31 ++++ .../android/server/ConnectivityService.java | 22 +-- .../com/android/server/connectivity/Vpn.java | 80 ++++---- .../android/net/NetworkCapabilitiesTest.java | 173 ++++++++++-------- .../android/server/NetworkAgentWrapper.java | 4 +- .../server/ConnectivityServiceTest.java | 60 +++--- .../android/server/connectivity/VpnTest.java | 133 ++++++++------ 9 files changed, 319 insertions(+), 220 deletions(-) diff --git a/packages/Connectivity/framework/src/android/net/NetworkCapabilities.java b/packages/Connectivity/framework/src/android/net/NetworkCapabilities.java index cbd6d6140b63e..fb4ef2b50e285 100644 --- a/packages/Connectivity/framework/src/android/net/NetworkCapabilities.java +++ b/packages/Connectivity/framework/src/android/net/NetworkCapabilities.java @@ -33,6 +33,7 @@ import android.os.Parcelable; import android.os.Process; import android.text.TextUtils; import android.util.ArraySet; +import android.util.Range; import android.util.proto.ProtoOutputStream; import com.android.internal.annotations.VisibleForTesting; @@ -216,7 +217,7 @@ public final class NetworkCapabilities implements Parcelable { setTransportInfo(null); } mSignalStrength = nc.mSignalStrength; - setUids(nc.mUids); // Will make the defensive copy + mUids = (nc.mUids == null) ? null : new ArraySet<>(nc.mUids); setAdministratorUids(nc.getAdministratorUids()); mOwnerUid = nc.mOwnerUid; mUnwantedNetworkCapabilities = nc.mUnwantedNetworkCapabilities; @@ -1519,9 +1520,8 @@ public final class NetworkCapabilities implements Parcelable { * @hide */ public @NonNull NetworkCapabilities setSingleUid(int uid) { - final ArraySet identity = new ArraySet<>(1); - identity.add(new UidRange(uid, uid)); - setUids(identity); + mUids = new ArraySet<>(1); + mUids.add(new UidRange(uid, uid)); return this; } @@ -1530,12 +1530,8 @@ public final class NetworkCapabilities implements Parcelable { * This makes a copy of the set so that callers can't modify it after the call. * @hide */ - public @NonNull NetworkCapabilities setUids(Set uids) { - if (null == uids) { - mUids = null; - } else { - mUids = new ArraySet<>(uids); - } + public @NonNull NetworkCapabilities setUids(@Nullable Set> uids) { + mUids = UidRange.fromIntRanges(uids); return this; } @@ -1544,8 +1540,19 @@ public final class NetworkCapabilities implements Parcelable { * This returns a copy of the set so that callers can't modify the original object. * @hide */ - public @Nullable Set getUids() { - return null == mUids ? null : new ArraySet<>(mUids); + public @Nullable Set> getUids() { + return UidRange.toIntRanges(mUids); + } + + /** + * Get the list of UIDs this network applies to. + * This returns a copy of the set so that callers can't modify the original object. + * @hide + */ + public @Nullable Set getUidRanges() { + if (mUids == null) return null; + + return new ArraySet<>(mUids); } /** diff --git a/packages/Connectivity/framework/src/android/net/NetworkRequest.java b/packages/Connectivity/framework/src/android/net/NetworkRequest.java index dbe3ecc4d775e..4ebbf06c512af 100644 --- a/packages/Connectivity/framework/src/android/net/NetworkRequest.java +++ b/packages/Connectivity/framework/src/android/net/NetworkRequest.java @@ -45,6 +45,7 @@ import android.os.Parcel; import android.os.Parcelable; import android.os.Process; import android.text.TextUtils; +import android.util.Range; import android.util.proto.ProtoOutputStream; import java.util.Arrays; @@ -277,11 +278,11 @@ public class NetworkRequest implements Parcelable { * Set the watched UIDs for this request. This will be reset and wiped out unless * the calling app holds the CHANGE_NETWORK_STATE permission. * - * @param uids The watched UIDs as a set of UidRanges, or null for everything. + * @param uids The watched UIDs as a set of {@code Range}, or null for everything. * @return The builder to facilitate chaining. * @hide */ - public Builder setUids(Set uids) { + public Builder setUids(@Nullable Set> uids) { mNetworkCapabilities.setUids(uids); return this; } diff --git a/packages/Connectivity/framework/src/android/net/UidRange.java b/packages/Connectivity/framework/src/android/net/UidRange.java index 26518d32edcba..bc67c745c98fb 100644 --- a/packages/Connectivity/framework/src/android/net/UidRange.java +++ b/packages/Connectivity/framework/src/android/net/UidRange.java @@ -20,8 +20,11 @@ import android.annotation.Nullable; import android.os.Parcel; import android.os.Parcelable; import android.os.UserHandle; +import android.util.ArraySet; +import android.util.Range; import java.util.Collection; +import java.util.Set; /** * An inclusive range of UIDs. @@ -149,4 +152,32 @@ public final class UidRange implements Parcelable { } return false; } + + /** + * Convert a set of {@code Range} to a set of {@link UidRange}. + */ + @Nullable + public static ArraySet fromIntRanges(@Nullable Set> ranges) { + if (null == ranges) return null; + + final ArraySet uids = new ArraySet<>(); + for (Range range : ranges) { + uids.add(new UidRange(range.getLower(), range.getUpper())); + } + return uids; + } + + /** + * Convert a set of {@link UidRange} to a set of {@code Range}. + */ + @Nullable + public static ArraySet> toIntRanges(@Nullable Set ranges) { + if (null == ranges) return null; + + final ArraySet> uids = new ArraySet<>(); + for (UidRange range : ranges) { + uids.add(new Range(range.start, range.stop)); + } + return uids; + } } diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 9df115f29fca3..6fcb3f74c7572 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -1338,7 +1338,7 @@ public class ConnectivityService extends IConnectivityManager.Stub netCap.addCapability(NET_CAPABILITY_INTERNET); netCap.addCapability(NET_CAPABILITY_NOT_VCN_MANAGED); netCap.removeCapability(NET_CAPABILITY_NOT_VPN); - netCap.setUids(Collections.singleton(uids)); + netCap.setUids(UidRange.toIntRanges(Collections.singleton(uids))); return netCap; } @@ -2968,7 +2968,7 @@ public class ConnectivityService extends IConnectivityManager.Stub if (0 == defaultRequest.mRequests.size()) { pw.println("none, this should never occur."); } else { - pw.println(defaultRequest.mRequests.get(0).networkCapabilities.getUids()); + pw.println(defaultRequest.mRequests.get(0).networkCapabilities.getUidRanges()); } pw.decreaseIndent(); pw.decreaseIndent(); @@ -5393,9 +5393,8 @@ public class ConnectivityService extends IConnectivityManager.Stub private Set getUids() { // networkCapabilities.getUids() returns a defensive copy. // multilayer requests will all have the same uids so return the first one. - final Set uids = null == mRequests.get(0).networkCapabilities.getUids() - ? new ArraySet<>() : mRequests.get(0).networkCapabilities.getUids(); - return uids; + final Set uids = mRequests.get(0).networkCapabilities.getUidRanges(); + return (null == uids) ? new ArraySet<>() : uids; } NetworkRequestInfo(@NonNull final NetworkRequest r, @Nullable final PendingIntent pi, @@ -6206,7 +6205,7 @@ public class ConnectivityService extends IConnectivityManager.Stub for (final NetworkRequestInfo nri : mDefaultNetworkRequests) { // Currently, all network requests will have the same uids therefore checking the first // one is sufficient. If/when uids are tracked at the nri level, this can change. - final Set uids = nri.mRequests.get(0).networkCapabilities.getUids(); + final Set uids = nri.mRequests.get(0).networkCapabilities.getUidRanges(); if (null == uids) { continue; } @@ -6647,7 +6646,7 @@ public class ConnectivityService extends IConnectivityManager.Stub return; } - final Set ranges = nai.networkCapabilities.getUids(); + final Set ranges = nai.networkCapabilities.getUidRanges(); final int vpnAppUid = nai.networkCapabilities.getOwnerUid(); // TODO: this create a window of opportunity for apps to receive traffic between the time // when the old rules are removed and the time when new rules are added. To fix this, @@ -7012,8 +7011,8 @@ public class ConnectivityService extends IConnectivityManager.Stub private void updateUids(NetworkAgentInfo nai, NetworkCapabilities prevNc, NetworkCapabilities newNc) { - Set prevRanges = null == prevNc ? null : prevNc.getUids(); - Set newRanges = null == newNc ? null : newNc.getUids(); + Set prevRanges = null == prevNc ? null : prevNc.getUidRanges(); + Set newRanges = null == newNc ? null : newNc.getUidRanges(); if (null == prevRanges) prevRanges = new ArraySet<>(); if (null == newRanges) newRanges = new ArraySet<>(); final Set prevRangesCopy = new ArraySet<>(prevRanges); @@ -9344,7 +9343,7 @@ public class ConnectivityService extends IConnectivityManager.Stub final ArrayList nrs = new ArrayList<>(); nrs.add(createNetworkRequest(NetworkRequest.Type.REQUEST, pref.capabilities)); nrs.add(createDefaultRequest()); - setNetworkRequestUids(nrs, pref.capabilities.getUids()); + setNetworkRequestUids(nrs, UidRange.fromIntRanges(pref.capabilities.getUids())); final NetworkRequestInfo nri = new NetworkRequestInfo(nrs); result.add(nri); } @@ -9560,9 +9559,8 @@ public class ConnectivityService extends IConnectivityManager.Stub private static void setNetworkRequestUids(@NonNull final List requests, @NonNull final Set uids) { - final Set ranges = new ArraySet<>(uids); for (final NetworkRequest req : requests) { - req.networkCapabilities.setUids(ranges); + req.networkCapabilities.setUids(UidRange.toIntRanges(uids)); } } diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java index e35a1ab714928..30e0c7e9b9aa0 100644 --- a/services/core/java/com/android/server/connectivity/Vpn.java +++ b/services/core/java/com/android/server/connectivity/Vpn.java @@ -19,6 +19,7 @@ package com.android.server.connectivity; import static android.Manifest.permission.BIND_VPN_SERVICE; import static android.net.ConnectivityManager.NETID_UNSET; import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED; +import static android.os.UserHandle.PER_USER_RANGE; import static android.net.RouteInfo.RTN_THROW; import static android.net.RouteInfo.RTN_UNREACHABLE; import static android.net.VpnManager.NOTIFICATION_CHANNEL_VPN; @@ -70,7 +71,6 @@ import android.net.NetworkProvider; import android.net.NetworkRequest; import android.net.NetworkScore; import android.net.RouteInfo; -import android.net.UidRange; import android.net.UidRangeParcel; import android.net.UnderlyingNetworkInfo; import android.net.VpnManager; @@ -1351,7 +1351,7 @@ public class Vpn { String oldInterface = mInterface; Connection oldConnection = mConnection; NetworkAgent oldNetworkAgent = mNetworkAgent; - Set oldUsers = mNetworkCapabilities.getUids(); + Set> oldUsers = mNetworkCapabilities.getUids(); // Configure the interface. Abort if any of these steps fails. ParcelFileDescriptor tun = ParcelFileDescriptor.adoptFd(jniCreate(config.mtu)); @@ -1457,7 +1457,7 @@ public class Vpn { } /** - * Creates a {@link Set} of non-intersecting {@link UidRange} objects including all UIDs + * Creates a {@link Set} of non-intersecting {@code Range} objects including all UIDs * associated with one user, and any restricted profiles attached to that user. * *

If one of {@param allowedApplications} or {@param disallowedApplications} is provided, @@ -1470,10 +1470,10 @@ public class Vpn { * @param disallowedApplications (optional) List of applications to deny. */ @VisibleForTesting - Set createUserAndRestrictedProfilesRanges(@UserIdInt int userId, + Set> createUserAndRestrictedProfilesRanges(@UserIdInt int userId, @Nullable List allowedApplications, @Nullable List disallowedApplications) { - final Set ranges = new ArraySet<>(); + final Set> ranges = new ArraySet<>(); // Assign the top-level user to the set of ranges addUserToRanges(ranges, userId, allowedApplications, disallowedApplications); @@ -1497,20 +1497,20 @@ public class Vpn { } /** - * Updates a {@link Set} of non-intersecting {@link UidRange} objects to include all UIDs + * Updates a {@link Set} of non-intersecting {@code Range} objects to include all UIDs * associated with one user. * *

If one of {@param allowedApplications} or {@param disallowedApplications} is provided, * the UID ranges will match the app allowlist or denylist specified there. Otherwise, all UIDs * in the user will be included. * - * @param ranges {@link Set} of {@link UidRange}s to which to add. + * @param ranges {@link Set} of {@code Range}s to which to add. * @param userId The userId to add to {@param ranges}. * @param allowedApplications (optional) allowlist of applications to include. * @param disallowedApplications (optional) denylist of applications to exclude. */ @VisibleForTesting - void addUserToRanges(@NonNull Set ranges, @UserIdInt int userId, + void addUserToRanges(@NonNull Set> ranges, @UserIdInt int userId, @Nullable List allowedApplications, @Nullable List disallowedApplications) { if (allowedApplications != null) { @@ -1520,40 +1520,41 @@ public class Vpn { if (start == -1) { start = uid; } else if (uid != stop + 1) { - ranges.add(new UidRange(start, stop)); + ranges.add(new Range(start, stop)); start = uid; } stop = uid; } - if (start != -1) ranges.add(new UidRange(start, stop)); + if (start != -1) ranges.add(new Range(start, stop)); } else if (disallowedApplications != null) { // Add all ranges for user skipping UIDs for disallowedApplications. - final UidRange userRange = UidRange.createForUser(UserHandle.of(userId)); - int start = userRange.start; + final Range userRange = createUidRangeForUser(userId); + int start = userRange.getLower(); for (int uid : getAppsUids(disallowedApplications, userId)) { if (uid == start) { start++; } else { - ranges.add(new UidRange(start, uid - 1)); + ranges.add(new Range(start, uid - 1)); start = uid + 1; } } - if (start <= userRange.stop) ranges.add(new UidRange(start, userRange.stop)); + if (start <= userRange.getUpper()) { + ranges.add(new Range(start, userRange.getUpper())); + } } else { // Add all UIDs for the user. - ranges.add(UidRange.createForUser(UserHandle.of(userId))); + ranges.add(createUidRangeForUser(userId)); } } // Returns the subset of the full list of active UID ranges the VPN applies to (mVpnUsers) that // apply to userId. - private static List uidRangesForUser(int userId, Set existingRanges) { - // UidRange#createForUser returns the entire range of UIDs available to a macro-user. - // This is something like 0-99999 ; {@see UserHandle#PER_USER_RANGE} - final UidRange userRange = UidRange.createForUser(UserHandle.of(userId)); - final List ranges = new ArrayList<>(); - for (UidRange range : existingRanges) { - if (userRange.containsRange(range)) { + private static List> uidRangesForUser(int userId, + Set> existingRanges) { + final Range userRange = createUidRangeForUser(userId); + final List> ranges = new ArrayList<>(); + for (Range range : existingRanges) { + if (userRange.contains(range)) { ranges.add(range); } } @@ -1570,7 +1571,7 @@ public class Vpn { UserInfo user = mUserManager.getUserInfo(userId); if (user.isRestricted() && user.restrictedProfileParentId == mUserId) { synchronized(Vpn.this) { - final Set existingRanges = mNetworkCapabilities.getUids(); + final Set> existingRanges = mNetworkCapabilities.getUids(); if (existingRanges != null) { try { addUserToRanges(existingRanges, userId, mConfig.allowedApplications, @@ -1598,10 +1599,10 @@ public class Vpn { UserInfo user = mUserManager.getUserInfo(userId); if (user.isRestricted() && user.restrictedProfileParentId == mUserId) { synchronized(Vpn.this) { - final Set existingRanges = mNetworkCapabilities.getUids(); + final Set> existingRanges = mNetworkCapabilities.getUids(); if (existingRanges != null) { try { - final List removedRanges = + final List> removedRanges = uidRangesForUser(userId, existingRanges); existingRanges.removeAll(removedRanges); mNetworkCapabilities.setUids(existingRanges); @@ -1662,7 +1663,7 @@ public class Vpn { final Set rangesToRemove = new ArraySet<>(mBlockedUidsAsToldToConnectivity); final Set rangesToAdd; if (enforce) { - final Set restrictedProfilesRanges = + final Set> restrictedProfilesRanges = createUserAndRestrictedProfilesRanges(mUserId, /* allowedApplications */ null, /* disallowedApplications */ exemptedPackages); @@ -1671,11 +1672,12 @@ public class Vpn { // The UID range of the first user (0-99999) would block the IPSec traffic, which comes // directly from the kernel and is marked as uid=0. So we adjust the range to allow // it through (b/69873852). - for (UidRange range : restrictedProfilesRanges) { - if (range.start == 0 && range.stop != 0) { - rangesThatShouldBeBlocked.add(new UidRangeParcel(1, range.stop)); - } else if (range.start != 0) { - rangesThatShouldBeBlocked.add(new UidRangeParcel(range.start, range.stop)); + for (Range range : restrictedProfilesRanges) { + if (range.getLower() == 0 && range.getUpper() != 0) { + rangesThatShouldBeBlocked.add(new UidRangeParcel(1, range.getUpper())); + } else if (range.getLower() != 0) { + rangesThatShouldBeBlocked.add( + new UidRangeParcel(range.getLower(), range.getUpper())); } } @@ -1697,12 +1699,12 @@ public class Vpn { } /** - * Tell ConnectivityService to add or remove a list of {@link UidRange}s to the list of UIDs - * that are only allowed to make connections through sockets that have had {@code protect()} - * called on them. + * Tell ConnectivityService to add or remove a list of {@link UidRangeParcel}s to the list of + * UIDs that are only allowed to make connections through sockets that have had + * {@code protect()} called on them. * * @param enforce {@code true} to add to the denylist, {@code false} to remove. - * @param ranges {@link Collection} of {@link UidRange}s to add (if {@param enforce} is + * @param ranges {@link Collection} of {@link UidRangeParcel}s to add (if {@param enforce} is * {@code true}) or to remove. * @return {@code true} if all of the UIDs were added/removed. {@code false} otherwise, * including added ranges that already existed or removed ones that didn't. @@ -3346,4 +3348,12 @@ public class Vpn { firstChildSessionCallback); } } + + /** + * Returns the entire range of UIDs available to a macro-user. This is something like 0-99999. + */ + @VisibleForTesting + static Range createUidRangeForUser(int userId) { + return new Range(userId * PER_USER_RANGE, (userId + 1) * PER_USER_RANGE - 1); + } } diff --git a/tests/net/common/java/android/net/NetworkCapabilitiesTest.java b/tests/net/common/java/android/net/NetworkCapabilitiesTest.java index 17165fc32dd7f..d40b88ca599f4 100644 --- a/tests/net/common/java/android/net/NetworkCapabilitiesTest.java +++ b/tests/net/common/java/android/net/NetworkCapabilitiesTest.java @@ -70,6 +70,7 @@ import android.net.wifi.aware.WifiAwareNetworkSpecifier; import android.os.Build; import android.test.suitebuilder.annotation.SmallTest; import android.util.ArraySet; +import android.util.Range; import androidx.test.runner.AndroidJUnit4; @@ -241,72 +242,93 @@ public class NetworkCapabilitiesTest { @Test public void testSetUids() { final NetworkCapabilities netCap = new NetworkCapabilities(); - final Set uids = new ArraySet<>(); - uids.add(new UidRange(50, 100)); - uids.add(new UidRange(3000, 4000)); - netCap.setUids(uids); - assertTrue(netCap.appliesToUid(50)); - assertTrue(netCap.appliesToUid(80)); - assertTrue(netCap.appliesToUid(100)); + // Null uids match all UIDs + netCap.setUids(null); + assertTrue(netCap.appliesToUid(10)); + assertTrue(netCap.appliesToUid(200)); assertTrue(netCap.appliesToUid(3000)); - assertTrue(netCap.appliesToUid(3001)); - assertFalse(netCap.appliesToUid(10)); - assertFalse(netCap.appliesToUid(25)); - assertFalse(netCap.appliesToUid(49)); - assertFalse(netCap.appliesToUid(101)); - assertFalse(netCap.appliesToUid(2000)); - assertFalse(netCap.appliesToUid(100000)); - + assertTrue(netCap.appliesToUid(10010)); assertTrue(netCap.appliesToUidRange(new UidRange(50, 100))); assertTrue(netCap.appliesToUidRange(new UidRange(70, 72))); assertTrue(netCap.appliesToUidRange(new UidRange(3500, 3912))); - assertFalse(netCap.appliesToUidRange(new UidRange(1, 100))); - assertFalse(netCap.appliesToUidRange(new UidRange(49, 100))); - assertFalse(netCap.appliesToUidRange(new UidRange(1, 10))); - assertFalse(netCap.appliesToUidRange(new UidRange(60, 101))); - assertFalse(netCap.appliesToUidRange(new UidRange(60, 3400))); - - NetworkCapabilities netCap2 = new NetworkCapabilities(); - // A new netcap object has null UIDs, so anything will satisfy it. - assertTrue(netCap2.satisfiedByUids(netCap)); - // Still not equal though. - assertFalse(netCap2.equalsUids(netCap)); - netCap2.setUids(uids); - assertTrue(netCap2.satisfiedByUids(netCap)); - assertTrue(netCap.equalsUids(netCap2)); - assertTrue(netCap2.equalsUids(netCap)); - - uids.add(new UidRange(600, 700)); - netCap2.setUids(uids); - assertFalse(netCap2.satisfiedByUids(netCap)); - assertFalse(netCap.appliesToUid(650)); - assertTrue(netCap2.appliesToUid(650)); - netCap.combineCapabilities(netCap2); - assertTrue(netCap2.satisfiedByUids(netCap)); - assertTrue(netCap.appliesToUid(650)); - assertFalse(netCap.appliesToUid(500)); - - assertTrue(new NetworkCapabilities().satisfiedByUids(netCap)); - netCap.combineCapabilities(new NetworkCapabilities()); - assertTrue(netCap.appliesToUid(500)); assertTrue(netCap.appliesToUidRange(new UidRange(1, 100000))); - assertFalse(netCap2.appliesToUid(500)); - assertFalse(netCap2.appliesToUidRange(new UidRange(1, 100000))); - assertTrue(new NetworkCapabilities().satisfiedByUids(netCap)); + + if (isAtLeastS()) { + final Set> uids = new ArraySet<>(); + uids.add(uidRange(50, 100)); + uids.add(uidRange(3000, 4000)); + netCap.setUids(uids); + assertTrue(netCap.appliesToUid(50)); + assertTrue(netCap.appliesToUid(80)); + assertTrue(netCap.appliesToUid(100)); + assertTrue(netCap.appliesToUid(3000)); + assertTrue(netCap.appliesToUid(3001)); + assertFalse(netCap.appliesToUid(10)); + assertFalse(netCap.appliesToUid(25)); + assertFalse(netCap.appliesToUid(49)); + assertFalse(netCap.appliesToUid(101)); + assertFalse(netCap.appliesToUid(2000)); + assertFalse(netCap.appliesToUid(100000)); + + assertTrue(netCap.appliesToUidRange(new UidRange(50, 100))); + assertTrue(netCap.appliesToUidRange(new UidRange(70, 72))); + assertTrue(netCap.appliesToUidRange(new UidRange(3500, 3912))); + assertFalse(netCap.appliesToUidRange(new UidRange(1, 100))); + assertFalse(netCap.appliesToUidRange(new UidRange(49, 100))); + assertFalse(netCap.appliesToUidRange(new UidRange(1, 10))); + assertFalse(netCap.appliesToUidRange(new UidRange(60, 101))); + assertFalse(netCap.appliesToUidRange(new UidRange(60, 3400))); + + NetworkCapabilities netCap2 = new NetworkCapabilities(); + // A new netcap object has null UIDs, so anything will satisfy it. + assertTrue(netCap2.satisfiedByUids(netCap)); + // Still not equal though. + assertFalse(netCap2.equalsUids(netCap)); + netCap2.setUids(uids); + assertTrue(netCap2.satisfiedByUids(netCap)); + assertTrue(netCap.equalsUids(netCap2)); + assertTrue(netCap2.equalsUids(netCap)); + + uids.add(uidRange(600, 700)); + netCap2.setUids(uids); + assertFalse(netCap2.satisfiedByUids(netCap)); + assertFalse(netCap.appliesToUid(650)); + assertTrue(netCap2.appliesToUid(650)); + netCap.combineCapabilities(netCap2); + assertTrue(netCap2.satisfiedByUids(netCap)); + assertTrue(netCap.appliesToUid(650)); + assertFalse(netCap.appliesToUid(500)); + + assertTrue(new NetworkCapabilities().satisfiedByUids(netCap)); + netCap.combineCapabilities(new NetworkCapabilities()); + assertTrue(netCap.appliesToUid(500)); + assertTrue(netCap.appliesToUidRange(new UidRange(1, 100000))); + assertFalse(netCap2.appliesToUid(500)); + assertFalse(netCap2.appliesToUidRange(new UidRange(1, 100000))); + assertTrue(new NetworkCapabilities().satisfiedByUids(netCap)); + + // Null uids satisfies everything. + netCap.setUids(null); + assertTrue(netCap2.satisfiedByUids(netCap)); + assertTrue(netCap.satisfiedByUids(netCap2)); + netCap2.setUids(null); + assertTrue(netCap2.satisfiedByUids(netCap)); + assertTrue(netCap.satisfiedByUids(netCap2)); + } } @Test public void testParcelNetworkCapabilities() { - final Set uids = new ArraySet<>(); - uids.add(new UidRange(50, 100)); - uids.add(new UidRange(3000, 4000)); + final Set> uids = new ArraySet<>(); + uids.add(uidRange(50, 100)); + uids.add(uidRange(3000, 4000)); final NetworkCapabilities netCap = new NetworkCapabilities() .addCapability(NET_CAPABILITY_INTERNET) - .setUids(uids) .addCapability(NET_CAPABILITY_EIMS) .addCapability(NET_CAPABILITY_NOT_METERED); if (isAtLeastS()) { netCap.setSubIds(Set.of(TEST_SUBID1, TEST_SUBID2)); + netCap.setUids(uids); } else if (isAtLeastR()) { netCap.setOwnerUid(123); netCap.setAdministratorUids(new int[] {5, 11}); @@ -531,12 +553,16 @@ public class NetworkCapabilitiesTest { assertFalse(nc1.satisfiedByNetworkCapabilities(nc2)); } - private ArraySet uidRange(int from, int to) { - final ArraySet range = new ArraySet<>(1); - range.add(new UidRange(from, to)); + private ArraySet> uidRanges(int from, int to) { + final ArraySet> range = new ArraySet<>(1); + range.add(uidRange(from, to)); return range; } + private Range uidRange(int from, int to) { + return new Range(from, to); + } + @Test @IgnoreUpTo(Build.VERSION_CODES.Q) public void testSetAdministratorUids() { NetworkCapabilities nc = @@ -592,23 +618,23 @@ public class NetworkCapabilitiesTest { } catch (IllegalStateException expected) {} nc1.setSSID(TEST_SSID); - nc1.setUids(uidRange(10, 13)); - assertNotEquals(nc1, nc2); - nc2.combineCapabilities(nc1); // Everything + 10~13 is still everything. - assertNotEquals(nc1, nc2); - nc1.combineCapabilities(nc2); // 10~13 + everything is everything. - assertEquals(nc1, nc2); - nc1.setUids(uidRange(10, 13)); - nc2.setUids(uidRange(20, 23)); - assertNotEquals(nc1, nc2); - nc1.combineCapabilities(nc2); - assertTrue(nc1.appliesToUid(12)); - assertFalse(nc2.appliesToUid(12)); - assertTrue(nc1.appliesToUid(22)); - assertTrue(nc2.appliesToUid(22)); - - // Verify the subscription id list can be combined only when they are equal. if (isAtLeastS()) { + nc1.setUids(uidRanges(10, 13)); + assertNotEquals(nc1, nc2); + nc2.combineCapabilities(nc1); // Everything + 10~13 is still everything. + assertNotEquals(nc1, nc2); + nc1.combineCapabilities(nc2); // 10~13 + everything is everything. + assertEquals(nc1, nc2); + nc1.setUids(uidRanges(10, 13)); + nc2.setUids(uidRanges(20, 23)); + assertNotEquals(nc1, nc2); + nc1.combineCapabilities(nc2); + assertTrue(nc1.appliesToUid(12)); + assertFalse(nc2.appliesToUid(12)); + assertTrue(nc1.appliesToUid(22)); + assertTrue(nc2.appliesToUid(22)); + + // Verify the subscription id list can be combined only when they are equal. nc1.setSubIds(Set.of(TEST_SUBID1, TEST_SUBID2)); nc2.setSubIds(Set.of(TEST_SUBID2)); assertThrows(IllegalStateException.class, () -> nc2.combineCapabilities(nc1)); @@ -764,8 +790,11 @@ public class NetworkCapabilitiesTest { if (isAtLeastR()) { assertTrue(DIFFERENT_TEST_SSID.equals(nc2.getSsid())); } - - nc1.setUids(uidRange(10, 13)); + if (isAtLeastS()) { + nc1.setUids(uidRanges(10, 13)); + } else { + nc1.setUids(null); + } nc2.set(nc1); // Overwrites, as opposed to combineCapabilities assertEquals(nc1, nc2); diff --git a/tests/net/integration/util/com/android/server/NetworkAgentWrapper.java b/tests/net/integration/util/com/android/server/NetworkAgentWrapper.java index 01d8186c7d1bd..e2d43cbb8efd6 100644 --- a/tests/net/integration/util/com/android/server/NetworkAgentWrapper.java +++ b/tests/net/integration/util/com/android/server/NetworkAgentWrapper.java @@ -44,11 +44,11 @@ import android.net.NetworkProvider; import android.net.NetworkSpecifier; import android.net.QosFilter; import android.net.SocketKeepalive; -import android.net.UidRange; import android.os.ConditionVariable; import android.os.HandlerThread; import android.os.Message; import android.util.Log; +import android.util.Range; import com.android.net.module.util.ArrayTrackRecord; import com.android.server.connectivity.ConnectivityConstants; @@ -222,7 +222,7 @@ public class NetworkAgentWrapper implements TestableNetworkCallback.HasNetwork { mNetworkAgent.sendNetworkCapabilities(mNetworkCapabilities); } - public void setUids(Set uids) { + public void setUids(Set> uids) { mNetworkCapabilities.setUids(uids); mNetworkAgent.sendNetworkCapabilities(mNetworkCapabilities); } diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index 86f99f3a15680..ed9a44b614d51 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -271,6 +271,7 @@ import android.text.TextUtils; import android.util.ArraySet; import android.util.Log; import android.util.Pair; +import android.util.Range; import android.util.SparseArray; import androidx.test.InstrumentationRegistry; @@ -1161,7 +1162,7 @@ public class ConnectivityServiceTest { } public void setUids(Set uids) { - mNetworkCapabilities.setUids(uids); + mNetworkCapabilities.setUids(UidRange.toIntRanges(uids)); if (mAgentRegistered) { mMockNetworkAgent.setNetworkCapabilities(mNetworkCapabilities, true); } @@ -1451,6 +1452,8 @@ public class ConnectivityServiceTest { } private static final int PRIMARY_USER = 0; + private static final UidRange PRIMARY_UIDRANGE = + UidRange.createForUser(UserHandle.of(PRIMARY_USER)); private static final int APP1_UID = UserHandle.getUid(PRIMARY_USER, 10100); private static final int APP2_UID = UserHandle.getUid(PRIMARY_USER, 10101); private static final int VPN_UID = UserHandle.getUid(PRIMARY_USER, 10043); @@ -6949,7 +6952,7 @@ public class ConnectivityServiceTest { final int uid = Process.myUid(); NetworkCapabilities nc = mCm.getNetworkCapabilities(mMockVpn.getNetwork()); assertNotNull("nc=" + nc, nc.getUids()); - assertEquals(nc.getUids(), uidRangesForUids(uid)); + assertEquals(nc.getUids(), UidRange.toIntRanges(uidRangesForUids(uid))); assertVpnTransportInfo(nc, VpnManager.TYPE_VPN_SERVICE); // Set an underlying network and expect to see the VPN transports change. @@ -6974,10 +6977,13 @@ public class ConnectivityServiceTest { // Expect that the VPN UID ranges contain both |uid| and the UID range for the newly-added // restricted user. + final UidRange rRange = UidRange.createForUser(UserHandle.of(RESTRICTED_USER)); + final Range restrictUidRange = new Range(rRange.start, rRange.stop); + final Range singleUidRange = new Range(uid, uid); callback.expectCapabilitiesThat(mMockVpn, (caps) -> caps.getUids().size() == 2 - && caps.getUids().contains(new UidRange(uid, uid)) - && caps.getUids().contains(createUidRange(RESTRICTED_USER)) + && caps.getUids().contains(singleUidRange) + && caps.getUids().contains(restrictUidRange) && caps.hasTransport(TRANSPORT_VPN) && caps.hasTransport(TRANSPORT_WIFI)); @@ -6986,8 +6992,8 @@ public class ConnectivityServiceTest { callback.expectCallback(CallbackEntry.LOST, mWiFiNetworkAgent); callback.expectCapabilitiesThat(mMockVpn, (caps) -> caps.getUids().size() == 2 - && caps.getUids().contains(new UidRange(uid, uid)) - && caps.getUids().contains(createUidRange(RESTRICTED_USER)) + && caps.getUids().contains(singleUidRange) + && caps.getUids().contains(restrictUidRange) && caps.hasTransport(TRANSPORT_VPN) && !caps.hasTransport(TRANSPORT_WIFI)); @@ -7001,7 +7007,7 @@ public class ConnectivityServiceTest { // change made just before that (i.e., loss of TRANSPORT_WIFI) is preserved. callback.expectCapabilitiesThat(mMockVpn, (caps) -> caps.getUids().size() == 1 - && caps.getUids().contains(new UidRange(uid, uid)) + && caps.getUids().contains(singleUidRange) && caps.hasTransport(TRANSPORT_VPN) && !caps.hasTransport(TRANSPORT_WIFI)); } @@ -7675,7 +7681,7 @@ public class ConnectivityServiceTest { assertNotNull(underlying); mMockVpn.setVpnType(VpnManager.TYPE_VPN_LEGACY); // The legacy lockdown VPN only supports userId 0. - final Set ranges = Collections.singleton(createUidRange(PRIMARY_USER)); + final Set ranges = Collections.singleton(PRIMARY_UIDRANGE); mMockVpn.registerAgent(ranges); mMockVpn.setUnderlyingNetworks(new Network[]{underlying}); mMockVpn.connect(true); @@ -8637,7 +8643,7 @@ public class ConnectivityServiceTest { lp.addRoute(new RouteInfo(new IpPrefix(Inet4Address.ANY, 0), null)); lp.addRoute(new RouteInfo(new IpPrefix(Inet6Address.ANY, 0), RTN_UNREACHABLE)); // The uid range needs to cover the test app so the network is visible to it. - final Set vpnRange = Collections.singleton(createUidRange(PRIMARY_USER)); + final Set vpnRange = Collections.singleton(PRIMARY_UIDRANGE); mMockVpn.establish(lp, VPN_UID, vpnRange); assertVpnUidRangesUpdated(true, vpnRange, VPN_UID); @@ -8665,7 +8671,7 @@ public class ConnectivityServiceTest { lp.addRoute(new RouteInfo(new IpPrefix(Inet6Address.ANY, 0), null)); lp.addRoute(new RouteInfo(new IpPrefix(Inet4Address.ANY, 0), null)); // The uid range needs to cover the test app so the network is visible to it. - final Set vpnRange = Collections.singleton(createUidRange(PRIMARY_USER)); + final Set vpnRange = Collections.singleton(PRIMARY_UIDRANGE); mMockVpn.establish(lp, Process.SYSTEM_UID, vpnRange); assertVpnUidRangesUpdated(true, vpnRange, Process.SYSTEM_UID); @@ -8681,7 +8687,7 @@ public class ConnectivityServiceTest { lp.addRoute(new RouteInfo(new IpPrefix("192.0.2.0/24"), null, "tun0")); lp.addRoute(new RouteInfo(new IpPrefix(Inet6Address.ANY, 0), RTN_UNREACHABLE)); // The uid range needs to cover the test app so the network is visible to it. - final Set vpnRange = Collections.singleton(createUidRange(PRIMARY_USER)); + final Set vpnRange = Collections.singleton(PRIMARY_UIDRANGE); mMockVpn.establish(lp, Process.SYSTEM_UID, vpnRange); assertVpnUidRangesUpdated(true, vpnRange, Process.SYSTEM_UID); @@ -8696,7 +8702,7 @@ public class ConnectivityServiceTest { lp.addRoute(new RouteInfo(new IpPrefix(Inet4Address.ANY, 0), null)); lp.addRoute(new RouteInfo(new IpPrefix(Inet6Address.ANY, 0), null)); // The uid range needs to cover the test app so the network is visible to it. - final Set vpnRange = Collections.singleton(createUidRange(PRIMARY_USER)); + final Set vpnRange = Collections.singleton(PRIMARY_UIDRANGE); mMockVpn.establish(lp, VPN_UID, vpnRange); assertVpnUidRangesUpdated(true, vpnRange, VPN_UID); @@ -8748,7 +8754,7 @@ public class ConnectivityServiceTest { lp.addRoute(new RouteInfo(new IpPrefix(Inet4Address.ANY, 0), RTN_UNREACHABLE)); lp.addRoute(new RouteInfo(new IpPrefix(Inet6Address.ANY, 0), null)); // The uid range needs to cover the test app so the network is visible to it. - final UidRange vpnRange = createUidRange(PRIMARY_USER); + final UidRange vpnRange = PRIMARY_UIDRANGE; final Set vpnRanges = Collections.singleton(vpnRange); mMockVpn.establish(lp, VPN_UID, vpnRanges); assertVpnUidRangesUpdated(true, vpnRanges, VPN_UID); @@ -9213,7 +9219,7 @@ public class ConnectivityServiceTest { private void setupConnectionOwnerUid(int vpnOwnerUid, @VpnManager.VpnType int vpnType) throws Exception { - final Set vpnRange = Collections.singleton(createUidRange(PRIMARY_USER)); + final Set vpnRange = Collections.singleton(PRIMARY_UIDRANGE); mMockVpn.setVpnType(vpnType); mMockVpn.establish(new LinkProperties(), vpnOwnerUid, vpnRange); assertVpnUidRangesUpdated(true, vpnRange, vpnOwnerUid); @@ -9773,7 +9779,7 @@ public class ConnectivityServiceTest { lp.setInterfaceName("tun0"); lp.addRoute(new RouteInfo(new IpPrefix(Inet4Address.ANY, 0), null)); lp.addRoute(new RouteInfo(new IpPrefix(Inet6Address.ANY, 0), null)); - final UidRange vpnRange = createUidRange(PRIMARY_USER); + final UidRange vpnRange = PRIMARY_UIDRANGE; Set vpnRanges = Collections.singleton(vpnRange); mMockVpn.establish(lp, VPN_UID, vpnRanges); assertVpnUidRangesUpdated(true, vpnRanges, VPN_UID); @@ -9971,7 +9977,7 @@ public class ConnectivityServiceTest { .thenReturn(hasFeature); } - private UidRange getNriFirstUidRange( + private Range getNriFirstUidRange( @NonNull final ConnectivityService.NetworkRequestInfo nri) { return nri.mRequests.get(0).networkCapabilities.getUids().iterator().next(); } @@ -10154,11 +10160,11 @@ public class ConnectivityServiceTest { pref)); // Sort by uid to access nris by index - nris.sort(Comparator.comparingInt(nri -> getNriFirstUidRange(nri).start)); - assertEquals(TEST_PACKAGE_UID, getNriFirstUidRange(nris.get(0)).start); - assertEquals(TEST_PACKAGE_UID, getNriFirstUidRange(nris.get(0)).stop); - assertEquals(testPackageNameUid2, getNriFirstUidRange(nris.get(1)).start); - assertEquals(testPackageNameUid2, getNriFirstUidRange(nris.get(1)).stop); + nris.sort(Comparator.comparingInt(nri -> getNriFirstUidRange(nri).getLower())); + assertEquals(TEST_PACKAGE_UID, (int) getNriFirstUidRange(nris.get(0)).getLower()); + assertEquals(TEST_PACKAGE_UID, (int) getNriFirstUidRange(nris.get(0)).getUpper()); + assertEquals(testPackageNameUid2, (int) getNriFirstUidRange(nris.get(1)).getLower()); + assertEquals(testPackageNameUid2, (int) getNriFirstUidRange(nris.get(1)).getUpper()); } @Test @@ -10188,17 +10194,17 @@ public class ConnectivityServiceTest { // UIDs for all users and all managed packages should be present. // Two users each with two packages. final int expectedUidSize = 2; - final List uids = + final List> uids = new ArrayList<>(nris.get(0).mRequests.get(0).networkCapabilities.getUids()); assertEquals(expectedUidSize, uids.size()); // Sort by uid to access nris by index - uids.sort(Comparator.comparingInt(uid -> uid.start)); + uids.sort(Comparator.comparingInt(uid -> uid.getLower())); final int secondUserTestPackageUid = UserHandle.getUid(secondUser, TEST_PACKAGE_UID); - assertEquals(TEST_PACKAGE_UID, uids.get(0).start); - assertEquals(TEST_PACKAGE_UID, uids.get(0).stop); - assertEquals(secondUserTestPackageUid, uids.get(1).start); - assertEquals(secondUserTestPackageUid, uids.get(1).stop); + assertEquals(TEST_PACKAGE_UID, (int) uids.get(0).getLower()); + assertEquals(TEST_PACKAGE_UID, (int) uids.get(0).getUpper()); + assertEquals(secondUserTestPackageUid, (int) uids.get(1).getLower()); + assertEquals(secondUserTestPackageUid, (int) uids.get(1).getUpper()); } @Test diff --git a/tests/net/java/com/android/server/connectivity/VpnTest.java b/tests/net/java/com/android/server/connectivity/VpnTest.java index 11fcea60d98d1..6ad4900989f52 100644 --- a/tests/net/java/com/android/server/connectivity/VpnTest.java +++ b/tests/net/java/com/android/server/connectivity/VpnTest.java @@ -23,6 +23,7 @@ import static android.content.pm.UserInfo.FLAG_RESTRICTED; import static android.net.ConnectivityManager.NetworkCallback; import static android.net.INetd.IF_STATE_DOWN; import static android.net.INetd.IF_STATE_UP; +import static android.os.UserHandle.PER_USER_RANGE; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; @@ -74,7 +75,6 @@ import android.net.Network; import android.net.NetworkCapabilities; import android.net.NetworkInfo.DetailedState; import android.net.RouteInfo; -import android.net.UidRange; import android.net.UidRangeParcel; import android.net.VpnManager; import android.net.VpnService; @@ -181,8 +181,7 @@ public class VpnTest { mPackages.put(PKGS[i], PKG_UIDS[i]); } } - private static final UidRange PRI_USER_RANGE = - UidRange.createForUser(UserHandle.of(primaryUser.id)); + private static final Range PRI_USER_RANGE = uidRangeForUser(primaryUser.id); @Mock(answer = Answers.RETURNS_DEEP_STUBS) private Context mContext; @Mock private UserManager mUserManager; @@ -260,6 +259,21 @@ public class VpnTest { .thenReturn(tunnelResp); } + private Set> rangeSet(Range ... ranges) { + final Set> range = new ArraySet<>(); + for (Range r : ranges) range.add(r); + + return range; + } + + private static Range uidRangeForUser(int userId) { + return new Range(userId * PER_USER_RANGE, (userId + 1) * PER_USER_RANGE - 1); + } + + private Range uidRange(int start, int stop) { + return new Range(start, stop); + } + @Test public void testRestrictedProfilesAreAddedToVpn() { setMockedUsers(primaryUser, secondaryUser, restrictedProfileA, restrictedProfileB); @@ -268,12 +282,10 @@ public class VpnTest { // Assume the user can have restricted profiles. doReturn(true).when(mUserManager).canHaveRestrictedProfile(); - final Set ranges = + final Set> ranges = vpn.createUserAndRestrictedProfilesRanges(primaryUser.id, null, null); - assertEquals(new ArraySet<>(Arrays.asList(new UidRange[] { - PRI_USER_RANGE, UidRange.createForUser(UserHandle.of(restrictedProfileA.id)) - })), ranges); + assertEquals(rangeSet(PRI_USER_RANGE, uidRangeForUser(restrictedProfileA.id)), ranges); } @Test @@ -281,10 +293,10 @@ public class VpnTest { setMockedUsers(primaryUser, managedProfileA); final Vpn vpn = createVpn(primaryUser.id); - final Set ranges = vpn.createUserAndRestrictedProfilesRanges(primaryUser.id, + final Set> ranges = vpn.createUserAndRestrictedProfilesRanges(primaryUser.id, null, null); - assertEquals(new ArraySet<>(Arrays.asList(new UidRange[] { PRI_USER_RANGE })), ranges); + assertEquals(rangeSet(PRI_USER_RANGE), ranges); } @Test @@ -292,35 +304,38 @@ public class VpnTest { setMockedUsers(primaryUser, restrictedProfileA, managedProfileA); final Vpn vpn = createVpn(primaryUser.id); - final Set ranges = new ArraySet<>(); + final Set> ranges = new ArraySet<>(); vpn.addUserToRanges(ranges, primaryUser.id, null, null); - assertEquals(new ArraySet<>(Arrays.asList(new UidRange[] { PRI_USER_RANGE })), ranges); + assertEquals(rangeSet(PRI_USER_RANGE), ranges); } @Test public void testUidAllowAndDenylist() throws Exception { final Vpn vpn = createVpn(primaryUser.id); - final UidRange user = PRI_USER_RANGE; + final Range user = PRI_USER_RANGE; + final int userStart = user.getLower(); + final int userStop = user.getUpper(); final String[] packages = {PKGS[0], PKGS[1], PKGS[2]}; // Allowed list - final Set allow = vpn.createUserAndRestrictedProfilesRanges(primaryUser.id, - Arrays.asList(packages), null); - assertEquals(new ArraySet<>(Arrays.asList(new UidRange[] { - new UidRange(user.start + PKG_UIDS[0], user.start + PKG_UIDS[0]), - new UidRange(user.start + PKG_UIDS[1], user.start + PKG_UIDS[2]) - })), allow); + final Set> allow = vpn.createUserAndRestrictedProfilesRanges(primaryUser.id, + Arrays.asList(packages), null /* disallowedApplications */); + assertEquals(rangeSet( + uidRange(userStart + PKG_UIDS[0], userStart + PKG_UIDS[0]), + uidRange(userStart + PKG_UIDS[1], userStart + PKG_UIDS[2])), + allow); // Denied list - final Set disallow = vpn.createUserAndRestrictedProfilesRanges(primaryUser.id, - null, Arrays.asList(packages)); - assertEquals(new ArraySet<>(Arrays.asList(new UidRange[] { - new UidRange(user.start, user.start + PKG_UIDS[0] - 1), - new UidRange(user.start + PKG_UIDS[0] + 1, user.start + PKG_UIDS[1] - 1), - /* Empty range between UIDS[1] and UIDS[2], should be excluded, */ - new UidRange(user.start + PKG_UIDS[2] + 1, user.stop) - })), disallow); + final Set> disallow = + vpn.createUserAndRestrictedProfilesRanges(primaryUser.id, + null /* allowedApplications */, Arrays.asList(packages)); + assertEquals(rangeSet( + uidRange(userStart, userStart + PKG_UIDS[0] - 1), + uidRange(userStart + PKG_UIDS[0] + 1, userStart + PKG_UIDS[1] - 1), + /* Empty range between UIDS[1] and UIDS[2], should be excluded, */ + uidRange(userStart + PKG_UIDS[2] + 1, userStop)), + disallow); } @Test @@ -350,84 +365,86 @@ public class VpnTest { @Test public void testLockdownChangingPackage() throws Exception { final Vpn vpn = createVpn(primaryUser.id); - final UidRange user = PRI_USER_RANGE; - + final Range user = PRI_USER_RANGE; + final int userStart = user.getLower(); + final int userStop = user.getUpper(); // Set always-on without lockdown. assertTrue(vpn.setAlwaysOnPackage(PKGS[1], false, null)); // Set always-on with lockdown. assertTrue(vpn.setAlwaysOnPackage(PKGS[1], true, null)); verify(mConnectivityManager).setRequireVpnForUids(true, toRanges(new UidRangeParcel[] { - new UidRangeParcel(user.start, user.start + PKG_UIDS[1] - 1), - new UidRangeParcel(user.start + PKG_UIDS[1] + 1, user.stop) + new UidRangeParcel(userStart, userStart + PKG_UIDS[1] - 1), + new UidRangeParcel(userStart + PKG_UIDS[1] + 1, userStop) })); // Switch to another app. assertTrue(vpn.setAlwaysOnPackage(PKGS[3], true, null)); verify(mConnectivityManager).setRequireVpnForUids(false, toRanges(new UidRangeParcel[] { - new UidRangeParcel(user.start, user.start + PKG_UIDS[1] - 1), - new UidRangeParcel(user.start + PKG_UIDS[1] + 1, user.stop) + new UidRangeParcel(userStart, userStart + PKG_UIDS[1] - 1), + new UidRangeParcel(userStart + PKG_UIDS[1] + 1, userStop) })); verify(mConnectivityManager).setRequireVpnForUids(true, toRanges(new UidRangeParcel[] { - new UidRangeParcel(user.start, user.start + PKG_UIDS[3] - 1), - new UidRangeParcel(user.start + PKG_UIDS[3] + 1, user.stop) + new UidRangeParcel(userStart, userStart + PKG_UIDS[3] - 1), + new UidRangeParcel(userStart + PKG_UIDS[3] + 1, userStop) })); } @Test public void testLockdownAllowlist() throws Exception { final Vpn vpn = createVpn(primaryUser.id); - final UidRange user = PRI_USER_RANGE; - + final Range user = PRI_USER_RANGE; + final int userStart = user.getLower(); + final int userStop = user.getUpper(); // Set always-on with lockdown and allow app PKGS[2] from lockdown. assertTrue(vpn.setAlwaysOnPackage( PKGS[1], true, Collections.singletonList(PKGS[2]))); - verify(mConnectivityManager).setRequireVpnForUids(true, toRanges(new UidRangeParcel[] { - new UidRangeParcel(user.start, user.start + PKG_UIDS[1] - 1), - new UidRangeParcel(user.start + PKG_UIDS[2] + 1, user.stop) + verify(mConnectivityManager).setRequireVpnForUids(true, toRanges(new UidRangeParcel[] { + new UidRangeParcel(userStart, userStart + PKG_UIDS[1] - 1), + new UidRangeParcel(userStart + PKG_UIDS[2] + 1, userStop) })); // Change allowed app list to PKGS[3]. assertTrue(vpn.setAlwaysOnPackage( PKGS[1], true, Collections.singletonList(PKGS[3]))); verify(mConnectivityManager).setRequireVpnForUids(false, toRanges(new UidRangeParcel[] { - new UidRangeParcel(user.start + PKG_UIDS[2] + 1, user.stop) + new UidRangeParcel(userStart + PKG_UIDS[2] + 1, userStop) })); verify(mConnectivityManager).setRequireVpnForUids(true, toRanges(new UidRangeParcel[] { - new UidRangeParcel(user.start + PKG_UIDS[1] + 1, user.start + PKG_UIDS[3] - 1), - new UidRangeParcel(user.start + PKG_UIDS[3] + 1, user.stop) + new UidRangeParcel(userStart + PKG_UIDS[1] + 1, userStart + PKG_UIDS[3] - 1), + new UidRangeParcel(userStart + PKG_UIDS[3] + 1, userStop) })); // Change the VPN app. assertTrue(vpn.setAlwaysOnPackage( PKGS[0], true, Collections.singletonList(PKGS[3]))); verify(mConnectivityManager).setRequireVpnForUids(false, toRanges(new UidRangeParcel[] { - new UidRangeParcel(user.start, user.start + PKG_UIDS[1] - 1), - new UidRangeParcel(user.start + PKG_UIDS[1] + 1, user.start + PKG_UIDS[3] - 1) + new UidRangeParcel(userStart, userStart + PKG_UIDS[1] - 1), + new UidRangeParcel(userStart + PKG_UIDS[1] + 1, userStart + PKG_UIDS[3] - 1) })); verify(mConnectivityManager).setRequireVpnForUids(true, toRanges(new UidRangeParcel[] { - new UidRangeParcel(user.start, user.start + PKG_UIDS[0] - 1), - new UidRangeParcel(user.start + PKG_UIDS[0] + 1, user.start + PKG_UIDS[3] - 1) + new UidRangeParcel(userStart, userStart + PKG_UIDS[0] - 1), + new UidRangeParcel(userStart + PKG_UIDS[0] + 1, userStart + PKG_UIDS[3] - 1) })); // Remove the list of allowed packages. assertTrue(vpn.setAlwaysOnPackage(PKGS[0], true, null)); verify(mConnectivityManager).setRequireVpnForUids(false, toRanges(new UidRangeParcel[] { - new UidRangeParcel(user.start + PKG_UIDS[0] + 1, user.start + PKG_UIDS[3] - 1), - new UidRangeParcel(user.start + PKG_UIDS[3] + 1, user.stop) + new UidRangeParcel(userStart + PKG_UIDS[0] + 1, userStart + PKG_UIDS[3] - 1), + new UidRangeParcel(userStart + PKG_UIDS[3] + 1, userStop) })); verify(mConnectivityManager).setRequireVpnForUids(true, toRanges(new UidRangeParcel[] { - new UidRangeParcel(user.start + PKG_UIDS[0] + 1, user.stop), + new UidRangeParcel(userStart + PKG_UIDS[0] + 1, userStop), })); // Add the list of allowed packages. assertTrue(vpn.setAlwaysOnPackage( PKGS[0], true, Collections.singletonList(PKGS[1]))); verify(mConnectivityManager).setRequireVpnForUids(false, toRanges(new UidRangeParcel[] { - new UidRangeParcel(user.start + PKG_UIDS[0] + 1, user.stop) + new UidRangeParcel(userStart + PKG_UIDS[0] + 1, userStop) })); verify(mConnectivityManager).setRequireVpnForUids(true, toRanges(new UidRangeParcel[] { - new UidRangeParcel(user.start + PKG_UIDS[0] + 1, user.start + PKG_UIDS[1] - 1), - new UidRangeParcel(user.start + PKG_UIDS[1] + 1, user.stop) + new UidRangeParcel(userStart + PKG_UIDS[0] + 1, userStart + PKG_UIDS[1] - 1), + new UidRangeParcel(userStart + PKG_UIDS[1] + 1, userStop) })); // Try allowing a package with a comma, should be rejected. @@ -439,12 +456,12 @@ public class VpnTest { assertTrue(vpn.setAlwaysOnPackage( PKGS[0], true, Arrays.asList("com.foo.app", PKGS[2], "com.bar.app"))); verify(mConnectivityManager).setRequireVpnForUids(false, toRanges(new UidRangeParcel[] { - new UidRangeParcel(user.start + PKG_UIDS[0] + 1, user.start + PKG_UIDS[1] - 1), - new UidRangeParcel(user.start + PKG_UIDS[1] + 1, user.stop) + new UidRangeParcel(userStart + PKG_UIDS[0] + 1, userStart + PKG_UIDS[1] - 1), + new UidRangeParcel(userStart + PKG_UIDS[1] + 1, userStop) })); verify(mConnectivityManager).setRequireVpnForUids(true, toRanges(new UidRangeParcel[] { - new UidRangeParcel(user.start + PKG_UIDS[0] + 1, user.start + PKG_UIDS[2] - 1), - new UidRangeParcel(user.start + PKG_UIDS[2] + 1, user.stop) + new UidRangeParcel(userStart + PKG_UIDS[0] + 1, userStart + PKG_UIDS[2] - 1), + new UidRangeParcel(userStart + PKG_UIDS[2] + 1, userStop) })); } @@ -452,7 +469,7 @@ public class VpnTest { public void testLockdownRuleRepeatability() throws Exception { final Vpn vpn = createVpn(primaryUser.id); final UidRangeParcel[] primaryUserRangeParcel = new UidRangeParcel[] { - new UidRangeParcel(PRI_USER_RANGE.start, PRI_USER_RANGE.stop)}; + new UidRangeParcel(PRI_USER_RANGE.getLower(), PRI_USER_RANGE.getUpper())}; // Given legacy lockdown is already enabled, vpn.setLockdown(true); verify(mConnectivityManager, times(1)).setRequireVpnForUids(true, @@ -484,7 +501,7 @@ public class VpnTest { public void testLockdownRuleReversibility() throws Exception { final Vpn vpn = createVpn(primaryUser.id); final UidRangeParcel[] entireUser = { - new UidRangeParcel(PRI_USER_RANGE.start, PRI_USER_RANGE.stop) + new UidRangeParcel(PRI_USER_RANGE.getLower(), PRI_USER_RANGE.getUpper()) }; final UidRangeParcel[] exceptPkg0 = { new UidRangeParcel(entireUser[0].start, entireUser[0].start + PKG_UIDS[0] - 1), From 02ed58ad2448156cefaa95ec43e07adbadceeae4 Mon Sep 17 00:00:00 2001 From: Chiachang Wang Date: Thu, 11 Mar 2021 16:13:13 +0800 Subject: [PATCH 243/288] Expose uids related APIs in NetworkRequest and NetworkCapabilities NetworkRequest is moving into the incoming connectivity mainline module. The hidden setUids becomes inaccessible outside the module. Shims for support cts in different API levels will need to use it to verify the behavior of NetworkRequest. Thus, expose it to the API surface. Also, VPN uses getUids and setUids to control network capabilities. Networkcapabilities is a part of incoming connectivity mainline module but VPN is not. Thus, exposing these two methods are needed to allow VPN to continue using it. Test: make update-api Bug: 172183305 Merged-In: I107c329d4d7130d488772166eae8b5e7aaa2ff04 Change-Id: If76877e6bde7abe3b5ddde078f87eefd027e675c --- .../framework/api/module-lib-current.txt | 9 ++++++++ .../src/android/net/NetworkCapabilities.java | 21 +++++++++++++++++++ .../src/android/net/NetworkRequest.java | 4 ++++ 3 files changed, 34 insertions(+) diff --git a/packages/Connectivity/framework/api/module-lib-current.txt b/packages/Connectivity/framework/api/module-lib-current.txt index 34dd149824048..aa7a0ac46598c 100644 --- a/packages/Connectivity/framework/api/module-lib-current.txt +++ b/packages/Connectivity/framework/api/module-lib-current.txt @@ -38,6 +38,7 @@ package android.net { public final class NetworkCapabilities implements android.os.Parcelable { ctor public NetworkCapabilities(@Nullable android.net.NetworkCapabilities, long); + method @Nullable public java.util.Set> getUids(); field public static final long REDACT_ALL = -1L; // 0xffffffffffffffffL field public static final long REDACT_FOR_ACCESS_FINE_LOCATION = 1L; // 0x1L field public static final long REDACT_FOR_LOCAL_MAC_ADDRESS = 2L; // 0x2L @@ -46,6 +47,14 @@ package android.net { field public static final int TRANSPORT_TEST = 7; // 0x7 } + public static final class NetworkCapabilities.Builder { + method @NonNull public android.net.NetworkCapabilities.Builder setUids(@Nullable java.util.Set>); + } + + public static class NetworkRequest.Builder { + method @NonNull public android.net.NetworkRequest.Builder setUids(@Nullable java.util.Set>); + } + public class ParseException extends java.lang.RuntimeException { ctor public ParseException(@NonNull String); ctor public ParseException(@NonNull String, @NonNull Throwable); diff --git a/packages/Connectivity/framework/src/android/net/NetworkCapabilities.java b/packages/Connectivity/framework/src/android/net/NetworkCapabilities.java index fb4ef2b50e285..c9c0940dfdf5e 100644 --- a/packages/Connectivity/framework/src/android/net/NetworkCapabilities.java +++ b/packages/Connectivity/framework/src/android/net/NetworkCapabilities.java @@ -23,6 +23,7 @@ import android.annotation.LongDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; +import android.annotation.SuppressLint; import android.annotation.SystemApi; import android.compat.annotation.UnsupportedAppUsage; import android.net.ConnectivityManager.NetworkCallback; @@ -1538,8 +1539,13 @@ public final class NetworkCapabilities implements Parcelable { /** * Get the list of UIDs this network applies to. * This returns a copy of the set so that callers can't modify the original object. + * + * @return the list of UIDs this network applies to. If {@code null}, then the network applies + * to all UIDs. * @hide */ + @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES) + @SuppressLint("NullableCollection") public @Nullable Set> getUids() { return UidRange.toIntRanges(mUids); } @@ -2741,6 +2747,21 @@ public final class NetworkCapabilities implements Parcelable { return this; } + /** + * Set the list of UIDs this network applies to. + * + * @param uids the list of UIDs this network applies to, or {@code null} if this network + * applies to all UIDs. + * @return this builder + * @hide + */ + @NonNull + @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES) + public Builder setUids(@Nullable Set> uids) { + mCaps.setUids(uids); + return this; + } + /** * Builds the instance of the capabilities. * diff --git a/packages/Connectivity/framework/src/android/net/NetworkRequest.java b/packages/Connectivity/framework/src/android/net/NetworkRequest.java index 4ebbf06c512af..cf131f0df6070 100644 --- a/packages/Connectivity/framework/src/android/net/NetworkRequest.java +++ b/packages/Connectivity/framework/src/android/net/NetworkRequest.java @@ -36,6 +36,7 @@ import static android.net.NetworkCapabilities.TRANSPORT_TEST; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; +import android.annotation.SuppressLint; import android.annotation.SystemApi; import android.compat.annotation.UnsupportedAppUsage; import android.net.NetworkCapabilities.NetCapability; @@ -282,6 +283,9 @@ public class NetworkRequest implements Parcelable { * @return The builder to facilitate chaining. * @hide */ + @NonNull + @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES) + @SuppressLint("MissingGetterMatchingBuilder") public Builder setUids(@Nullable Set> uids) { mNetworkCapabilities.setUids(uids); return this; From 1d83fdbaf6ff11e82f46de9b1559b5d71df5c8ef Mon Sep 17 00:00:00 2001 From: Louis Chang Date: Thu, 10 Dec 2020 10:47:38 +0800 Subject: [PATCH 244/288] Ensure the next activity of non-focusable task to be visible The top activity of the dock task was finished due to starting the singleTask root activity. However, the root activity was remained in STOPPED state because the activities in dock task cannot be resumed while in split-screen mode. Ensure the activity visibility if the target task is unfocusable. Bug: 174440887 Bug: 177038047 Test: start singleTask activity on dock task Change-Id: I4f02758287ca4ef0e710bb556b5910600e725e40 Merged-In: I4f02758287ca4ef0e710bb556b5910600e725e40 (cherry picked from commit fc165b971c08534dd5a4e55d4b2b5fcf9b283634) --- .../core/java/com/android/server/wm/ActivityStarter.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index 7af237b80cfab..54ad4acaca4c2 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -2545,7 +2545,11 @@ class ActivityStarter { private void resumeTargetStackIfNeeded() { if (mDoResume) { - mRootWindowContainer.resumeFocusedStacksTopActivities(mTargetStack, null, mOptions); + if (mTargetStack.isFocusable()) { + mRootWindowContainer.resumeFocusedStacksTopActivities(mTargetStack, null, mOptions); + } else { + mRootWindowContainer.ensureActivitiesVisible(null, 0, !PRESERVE_WINDOWS); + } } else { ActivityOptions.abort(mOptions); } From ebfad50cc1450843c169e52e9c9a869970d35e98 Mon Sep 17 00:00:00 2001 From: Hui Yu Date: Sun, 14 Mar 2021 12:37:29 -0700 Subject: [PATCH 245/288] Allow FGS started from MediaButtonReceiver to have while-in-use permissions. 1. Create FgsWhileInUseTempAllowList, the uid on this list is allowed to have while-in-use permission when the FGS is started from background for a duration of time. 2. When media button is pressed, the targetUid is added to FgsWhileInUseTempAllowList for the duration of 10 seconds, this way the targetUid can start FGS from background and have while-in-use permission. 3. When checking for ProcessRecord. mAllowBackgroundActivityStartsTokens, it is the caller app's ProcessRecord should be checked instead of the service's ProcessRecord. Bug: 182481312 Test: use b/167998084 reproduce steps, use Line app to make a voip call, the receiver side screen is unlocked, the receiver side uses bluetooth headset button to pick up the call, "dumpsys activity -a" shows the FGS "com.linecorp.voip.core.common.notification.VoipNotificationCommand" has "allowWhileInUsePermissionInFgs=true" and "isForeground=true". Change-Id: Ic80aefe4202fe2210881bb8eea24b6e34cb1e7d0 Merged-In: I32a14d675550cd262976bb8e16a48a070387d318 --- .../android/app/ActivityManagerInternal.java | 7 ++ .../com/android/server/am/ActiveServices.java | 23 ++++-- .../server/am/ActivityManagerService.java | 25 ++++++ .../server/am/FgsWhileInUseTempAllowList.java | 82 +++++++++++++++++++ .../android/server/appop/AppOpsService.java | 8 ++ .../media/MediaButtonReceiverHolder.java | 9 +- .../server/media/MediaSessionRecord.java | 12 +++ .../server/media/MediaSessionService.java | 24 ++++++ 8 files changed, 183 insertions(+), 7 deletions(-) create mode 100644 services/core/java/com/android/server/am/FgsWhileInUseTempAllowList.java diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java index a5965bc7f85fd..eb2a40f4a7ddf 100644 --- a/core/java/android/app/ActivityManagerInternal.java +++ b/core/java/android/app/ActivityManagerInternal.java @@ -440,4 +440,11 @@ public abstract class ActivityManagerInternal { * @return true if exists, false otherwise. */ public abstract boolean isPendingTopUid(int uid); + + public abstract void tempAllowWhileInUsePermissionInFgs(int uid, long duration); + + public abstract boolean isTempAllowlistedForFgsWhileInUse(int uid); + + public abstract boolean canAllowWhileInUsePermissionInFgs(int pid, int uid, + @NonNull String packageName); } diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index dd0e1f6458f99..2461a9129f82a 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -4878,17 +4878,20 @@ public final class ActiveServices { return true; } - if (r.app != null) { + if (r != null && r.app != null) { ActiveInstrumentation instr = r.app.getActiveInstrumentation(); if (instr != null && instr.mHasBackgroundActivityStartsPermission) { return true; } } - final boolean hasAllowBackgroundActivityStartsToken = r.app != null - ? !r.app.mAllowBackgroundActivityStartsTokens.isEmpty() : false; - if (hasAllowBackgroundActivityStartsToken) { - return true; + for (int i = mAm.mProcessList.mLruProcesses.size() - 1; i >= 0; i--) { + final ProcessRecord pr = mAm.mProcessList.mLruProcesses.get(i); + if (pr.uid == callingUid) { + if (!pr.mAllowBackgroundActivityStartsTokens.isEmpty()) { + return true; + } + } } if (mAm.checkPermission(START_ACTIVITIES_FROM_BACKGROUND, callingPid, callingUid) @@ -4907,6 +4910,10 @@ public final class ActiveServices { return true; } + if (mAm.mInternal.isTempAllowlistedForFgsWhileInUse(callingUid)) { + return true; + } + final boolean isWhiteListedPackage = mWhiteListAllowWhileInUsePermissionInFgs.contains(callingPackage); if (isWhiteListedPackage) { @@ -4920,4 +4927,10 @@ public final class ActiveServices { } return false; } + + boolean canAllowWhileInUsePermissionInFgsLocked(int callingPid, int callingUid, + String callingPackage) { + return shouldAllowWhileInUsePermissionInFgsLocked( + callingPackage, callingPid, callingUid, null, null, false); + } } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 5134f498928b4..bff563b67c896 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -1261,6 +1261,13 @@ public class ActivityManagerService extends IActivityManager.Stub final PendingTempWhitelists mPendingTempWhitelist = new PendingTempWhitelists(this); + /** + * List of uids that are allowed to have while-in-use permission when FGS is started from + * background. + */ + private final FgsWhileInUseTempAllowList mFgsWhileInUseTempAllowList = + new FgsWhileInUseTempAllowList(); + /** * Information about and control over application operations */ @@ -19770,6 +19777,24 @@ public class ActivityManagerService extends IActivityManager.Stub public boolean isPendingTopUid(int uid) { return mPendingStartActivityUids.isPendingTopUid(uid); } + + @Override + public void tempAllowWhileInUsePermissionInFgs(int uid, long duration) { + mFgsWhileInUseTempAllowList.add(uid, duration); + } + + @Override + public boolean isTempAllowlistedForFgsWhileInUse(int uid) { + return mFgsWhileInUseTempAllowList.isAllowed(uid); + } + + @Override + public boolean canAllowWhileInUsePermissionInFgs(int pid, int uid, + @NonNull String packageName) { + synchronized (ActivityManagerService.this) { + return mServices.canAllowWhileInUsePermissionInFgsLocked(pid, uid, packageName); + } + } } long inputDispatchingTimedOut(int pid, final boolean aboveSystem, String reason) { diff --git a/services/core/java/com/android/server/am/FgsWhileInUseTempAllowList.java b/services/core/java/com/android/server/am/FgsWhileInUseTempAllowList.java new file mode 100644 index 0000000000000..ed0f264049ef0 --- /dev/null +++ b/services/core/java/com/android/server/am/FgsWhileInUseTempAllowList.java @@ -0,0 +1,82 @@ +/* + * 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.am; + +import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM; + +import android.os.SystemClock; +import android.util.Slog; +import android.util.SparseLongArray; + +/** + * List of uids that are allowed to have while-in-use permission when FGS is started + * from background. + */ +final class FgsWhileInUseTempAllowList { + /** + * This list is supposed to have a small number of entries. If exceeds MAX_SIZE, log a warning + * message. + */ + private static final int MAX_SIZE = 100; + /** + * The key is the UID, the value is expiration elapse time in ms of this temp-allowed UID. + */ + private final SparseLongArray mTempAllowListFgs = new SparseLongArray(); + + private final Object mLock = new Object(); + + void add(int uid, long durationMs) { + synchronized (mLock) { + if (durationMs <= 0) { + Slog.e(TAG_AM, "FgsWhileInUseTempAllowList bad duration:" + durationMs + + " uid: " + uid); + return; + } + // The temp allowlist should be a short list with only a few entries in it. + final int size = mTempAllowListFgs.size(); + if (size > MAX_SIZE) { + Slog.w(TAG_AM, "FgsWhileInUseTempAllowList length:" + size + " exceeds " + + MAX_SIZE); + } + final long now = SystemClock.elapsedRealtime(); + for (int index = mTempAllowListFgs.size() - 1; index >= 0; index--) { + if (mTempAllowListFgs.valueAt(index) < now) { + mTempAllowListFgs.removeAt(index); + } + } + final long existingExpirationTime = mTempAllowListFgs.get(uid, -1); + final long expirationTime = now + durationMs; + if (existingExpirationTime == -1 || existingExpirationTime < expirationTime) { + mTempAllowListFgs.put(uid, expirationTime); + } + } + } + + boolean isAllowed(int uid) { + synchronized (mLock) { + final int index = mTempAllowListFgs.indexOfKey(uid); + if (index < 0) { + return false; + } else if (mTempAllowListFgs.valueAt(index) < SystemClock.elapsedRealtime()) { + mTempAllowListFgs.removeAt(index); + return false; + } else { + return true; + } + } + } +} diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java index 902b2e2228f88..63b5af59c3c1a 100644 --- a/services/core/java/com/android/server/appop/AppOpsService.java +++ b/services/core/java/com/android/server/appop/AppOpsService.java @@ -583,6 +583,10 @@ public class AppOpsService extends IAppOpsService.Stub { if (mActivityManagerInternal != null && mActivityManagerInternal.isPendingTopUid(uid)) { return MODE_ALLOWED; + } else if (mActivityManagerInternal != null + && mActivityManagerInternal.isTempAllowlistedForFgsWhileInUse( + uid)) { + return MODE_ALLOWED; } else if ((capability & PROCESS_CAPABILITY_FOREGROUND_CAMERA) != 0) { return MODE_ALLOWED; } else { @@ -592,6 +596,10 @@ public class AppOpsService extends IAppOpsService.Stub { if (mActivityManagerInternal != null && mActivityManagerInternal.isPendingTopUid(uid)) { return MODE_ALLOWED; + } else if (mActivityManagerInternal != null + && mActivityManagerInternal.isTempAllowlistedForFgsWhileInUse( + uid)) { + return MODE_ALLOWED; } else if ((capability & PROCESS_CAPABILITY_FOREGROUND_MICROPHONE) != 0) { return MODE_ALLOWED; } else { diff --git a/services/core/java/com/android/server/media/MediaButtonReceiverHolder.java b/services/core/java/com/android/server/media/MediaButtonReceiverHolder.java index 6e655eafa0e99..d1eaaf86d7ca2 100644 --- a/services/core/java/com/android/server/media/MediaButtonReceiverHolder.java +++ b/services/core/java/com/android/server/media/MediaButtonReceiverHolder.java @@ -18,6 +18,7 @@ package com.android.server.media; import android.annotation.IntDef; import android.annotation.NonNull; +import android.app.BroadcastOptions; import android.app.PendingIntent; import android.content.ComponentName; import android.content.Context; @@ -196,6 +197,8 @@ final class MediaButtonReceiverHolder { // TODO: Find a way to also send PID/UID in secure way. mediaButtonIntent.putExtra(Intent.EXTRA_PACKAGE_NAME, callingPackageName); + final BroadcastOptions options = BroadcastOptions.makeBasic(); + options.setBackgroundActivityStartsAllowed(true); if (mPendingIntent != null) { if (DEBUG_KEY_EVENT) { Log.d(TAG, "Sending " + keyEvent + " to the last known PendingIntent " @@ -203,7 +206,8 @@ final class MediaButtonReceiverHolder { } try { mPendingIntent.send( - context, resultCode, mediaButtonIntent, onFinishedListener, handler); + context, resultCode, mediaButtonIntent, onFinishedListener, handler, + /* requiredPermission= */null, options.toBundle()); } catch (PendingIntent.CanceledException e) { Log.w(TAG, "Error sending key event to media button receiver " + mPendingIntent, e); return false; @@ -226,7 +230,8 @@ final class MediaButtonReceiverHolder { break; default: // Legacy behavior for other cases. - context.sendBroadcastAsUser(mediaButtonIntent, userHandle); + context.sendBroadcastAsUser(mediaButtonIntent, userHandle, + /* requiredPermission= */null, options.toBundle()); } } catch (Exception e) { Log.w(TAG, "Error sending media button to the restored intent " diff --git a/services/core/java/com/android/server/media/MediaSessionRecord.java b/services/core/java/com/android/server/media/MediaSessionRecord.java index 02b7582a8637c..348e9c122a9a3 100644 --- a/services/core/java/com/android/server/media/MediaSessionRecord.java +++ b/services/core/java/com/android/server/media/MediaSessionRecord.java @@ -986,6 +986,12 @@ public class MediaSessionRecord implements IBinder.DeathRecipient, MediaSessionR public boolean sendMediaButton(String packageName, int pid, int uid, boolean asSystemService, KeyEvent keyEvent, int sequenceId, ResultReceiver cb) { try { + if (KeyEvent.isMediaSessionKey(keyEvent.getKeyCode())) { + final String reason = "action=" + KeyEvent.actionToString(keyEvent.getAction()) + + ";code=" + KeyEvent.keyCodeToString(keyEvent.getKeyCode()); + mService.tempAllowlistTargetPkgIfPossible(getUid(), getPackageName(), + pid, uid, packageName, reason); + } if (asSystemService) { mCb.onMediaButton(mContext.getPackageName(), Process.myPid(), Process.SYSTEM_UID, createMediaButtonIntent(keyEvent), sequenceId, cb); @@ -1003,6 +1009,12 @@ public class MediaSessionRecord implements IBinder.DeathRecipient, MediaSessionR public boolean sendMediaButton(String packageName, int pid, int uid, boolean asSystemService, KeyEvent keyEvent) { try { + if (KeyEvent.isMediaSessionKey(keyEvent.getKeyCode())) { + final String reason = "action=" + KeyEvent.actionToString(keyEvent.getAction()) + + ";code=" + KeyEvent.keyCodeToString(keyEvent.getKeyCode()); + mService.tempAllowlistTargetPkgIfPossible(getUid(), getPackageName(), + pid, uid, packageName, reason); + } if (asSystemService) { mCb.onMediaButton(mContext.getPackageName(), Process.myPid(), Process.SYSTEM_UID, createMediaButtonIntent(keyEvent), 0, null); diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java index 803eb862e0f11..1a2743f73b49e 100644 --- a/services/core/java/com/android/server/media/MediaSessionService.java +++ b/services/core/java/com/android/server/media/MediaSessionService.java @@ -25,6 +25,7 @@ import static com.android.server.media.MediaKeyDispatcher.isSingleTapOverridden; import static com.android.server.media.MediaKeyDispatcher.isTripleTapOverridden; import android.app.ActivityManager; +import android.app.ActivityManagerInternal; import android.app.INotificationManager; import android.app.KeyguardManager; import android.app.PendingIntent; @@ -114,6 +115,8 @@ public class MediaSessionService extends SystemService implements Monitor { + /* Buffer for delayed delivery of key event */ 50; private static final int MULTI_TAP_TIMEOUT = ViewConfiguration.getMultiPressTimeout(); + private static final int TEMP_ALLOW_WHILE_IN_USE_PERMISSION_IN_FGS_DURATION_MS = 10_000; + private final Context mContext; private final SessionManagerImpl mSessionManagerImpl; private final MessageHandler mHandler = new MessageHandler(); @@ -133,6 +136,7 @@ public class MediaSessionService extends SystemService implements Monitor { private final List mSession2TokensListenerRecords = new ArrayList<>(); + private ActivityManagerInternal mActivityManagerInternal; private KeyguardManager mKeyguardManager; private AudioManagerInternal mAudioManagerInternal; private ContentResolver mContentResolver; @@ -168,6 +172,7 @@ public class MediaSessionService extends SystemService implements Monitor { public void onStart() { publishBinderService(Context.MEDIA_SESSION_SERVICE, mSessionManagerImpl); Watchdog.getInstance().addMonitor(this); + mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class); mKeyguardManager = (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE); mAudioManagerInternal = LocalServices.getService(AudioManagerInternal.class); mAudioPlayerStateMonitor = AudioPlayerStateMonitor.getInstance(mContext); @@ -493,6 +498,25 @@ public class MediaSessionService extends SystemService implements Monitor { throw new IllegalArgumentException("packageName is not owned by the calling process"); } + void tempAllowlistTargetPkgIfPossible(int targetUid, String targetPackage, + int callingPid, int callingUid, String callingPackage, String reason) { + final long token = Binder.clearCallingIdentity(); + try { + enforcePackageName(callingPackage, callingUid); + if (targetUid != callingUid + && mActivityManagerInternal.canAllowWhileInUsePermissionInFgs(callingPid, + callingUid, callingPackage)) { + Log.d(TAG, "tempAllowlistTargetPkgIfPossible callingPackage:" + + callingPackage + " targetPackage:" + targetPackage + + " reason:" + reason); + mActivityManagerInternal.tempAllowWhileInUsePermissionInFgs(targetUid, + TEMP_ALLOW_WHILE_IN_USE_PERMISSION_IN_FGS_DURATION_MS); + } + } finally { + Binder.restoreCallingIdentity(token); + } + } + /** * Checks a caller's authorization to register an IRemoteControlDisplay. * Authorization is granted if one of the following is true: From 28644e3b9e5cf0681af4836d78d80ee5b1357706 Mon Sep 17 00:00:00 2001 From: Hui Yu Date: Sun, 14 Mar 2021 22:07:55 -0700 Subject: [PATCH 246/288] BG-FGS while-in-use restriction uses the same grace period mechanism as BG-Activity-Launch. WindowProcessController.areBackgroundActivityStartsAllowed() has the 10 seconds grace period, starts from last activity's launch time or finish time. Expose this method for AMS to call, to determine if BG-FGS while-in-use permission is allowed. Bug: 182400165 Test: atest cts/tests/app/src/android/app/cts/ActivityManagerFgsBgStartTest.java Merged-In: I30706dc1950bf5d49926a8e26c0493d9e168eb1b Change-Id: I3615d0a2dc3464b6e980237b906c83872c3b4bce --- .../com/android/server/am/ActiveServices.java | 4 +++ .../server/wm/WindowProcessController.java | 32 +++++++++++++------ 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index 2461a9129f82a..59f06836440c4 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -4891,6 +4891,10 @@ public final class ActiveServices { if (!pr.mAllowBackgroundActivityStartsTokens.isEmpty()) { return true; } + if (pr.getWindowProcessController() + .areBackgroundActivityStartsAllowedByGracePeriodSafe()) { + return true; + } } } diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java index df49ac71334f9..e6a35f1267b55 100644 --- a/services/core/java/com/android/server/wm/WindowProcessController.java +++ b/services/core/java/com/android/server/wm/WindowProcessController.java @@ -455,15 +455,13 @@ public class WindowProcessController extends ConfigurationContainer Date: Thu, 25 Mar 2021 04:46:25 +0000 Subject: [PATCH 247/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I839198e64ea8ea374d42a1894e71e29351bd2639 --- .../res/values-mcc001-mnc01-bn/strings.xml | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 core/res/res/values-mcc001-mnc01-bn/strings.xml diff --git a/core/res/res/values-mcc001-mnc01-bn/strings.xml b/core/res/res/values-mcc001-mnc01-bn/strings.xml new file mode 100644 index 0000000000000..e965acd9136eb --- /dev/null +++ b/core/res/res/values-mcc001-mnc01-bn/strings.xml @@ -0,0 +1,24 @@ + + + + + "ফোন অনুমোদিত নয় MM#6" + From cdd1d2a4fe8d59834535e9c469402f666c508282 Mon Sep 17 00:00:00 2001 From: Miranda Kephart Date: Fri, 23 Oct 2020 08:47:48 -0400 Subject: [PATCH 248/288] [DO NOT MERGE] Make PendingIntents in screenshots immutable S and later will require PendingIntents to explicitly specify whether they are mutable or immutable. Bug: 182166925 Bug: 162738636 Test: manual, just a flag change (tested that normal screenshot flow works, verified that the log nags for unspecified mutability disappeared) Change-Id: I79b78f80c2d6af07a3826b6f79d0d86a5fc2f756 (cherry picked from commit ba571eaa74daaf39c1ae544c886bc3c2a4a21974) --- .../screenshot/SaveImageInBackgroundTask.java | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java b/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java index 468b9b16addb0..5f0a8a705178f 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java @@ -283,8 +283,10 @@ class SaveImageInBackgroundTask extends AsyncTask { .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // cancel current pending intent (if any) since clipData isn't used for matching - PendingIntent pendingIntent = PendingIntent.getActivityAsUser(context, 0, - sharingChooserIntent, PendingIntent.FLAG_CANCEL_CURRENT, null, UserHandle.CURRENT); + PendingIntent pendingIntent = PendingIntent.getActivityAsUser( + context, 0, sharingChooserIntent, + PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE, + null, UserHandle.CURRENT); // Create a share action for the notification PendingIntent shareAction = PendingIntent.getBroadcastAsUser(context, requestCode, @@ -296,7 +298,8 @@ class SaveImageInBackgroundTask extends AsyncTask { mSmartActionsEnabled) .setAction(Intent.ACTION_SEND) .addFlags(Intent.FLAG_RECEIVER_FOREGROUND), - PendingIntent.FLAG_CANCEL_CURRENT, UserHandle.SYSTEM); + PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE, + UserHandle.SYSTEM); Notification.Action.Builder shareActionBuilder = new Notification.Action.Builder( Icon.createWithResource(r, R.drawable.ic_screenshot_share), @@ -325,7 +328,7 @@ class SaveImageInBackgroundTask extends AsyncTask { editIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); PendingIntent pendingIntent = PendingIntent.getActivityAsUser(context, 0, - editIntent, 0, null, UserHandle.CURRENT); + editIntent, PendingIntent.FLAG_IMMUTABLE, null, UserHandle.CURRENT); // Make sure pending intents for the system user are still unique across users // by setting the (otherwise unused) request code to the current user id. @@ -342,7 +345,8 @@ class SaveImageInBackgroundTask extends AsyncTask { mSmartActionsEnabled) .setAction(Intent.ACTION_EDIT) .addFlags(Intent.FLAG_RECEIVER_FOREGROUND), - PendingIntent.FLAG_CANCEL_CURRENT, UserHandle.SYSTEM); + PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE, + UserHandle.SYSTEM); Notification.Action.Builder editActionBuilder = new Notification.Action.Builder( Icon.createWithResource(r, R.drawable.ic_screenshot_edit), r.getString(com.android.internal.R.string.screenshot_edit), editAction); @@ -364,7 +368,9 @@ class SaveImageInBackgroundTask extends AsyncTask { .putExtra(GlobalScreenshot.EXTRA_SMART_ACTIONS_ENABLED, mSmartActionsEnabled) .addFlags(Intent.FLAG_RECEIVER_FOREGROUND), - PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_ONE_SHOT); + PendingIntent.FLAG_CANCEL_CURRENT + | PendingIntent.FLAG_ONE_SHOT + | PendingIntent.FLAG_IMMUTABLE); Notification.Action.Builder deleteActionBuilder = new Notification.Action.Builder( Icon.createWithResource(r, R.drawable.ic_screenshot_delete), r.getString(com.android.internal.R.string.delete), deleteAction); @@ -405,7 +411,7 @@ class SaveImageInBackgroundTask extends AsyncTask { PendingIntent broadcastIntent = PendingIntent.getBroadcast(context, mRandom.nextInt(), intent, - PendingIntent.FLAG_CANCEL_CURRENT); + PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE); broadcastActions.add(new Notification.Action.Builder(action.getIcon(), action.title, broadcastIntent).setContextual(true).addExtras(extras).build()); } From 165607099624e7a9e5d5e513c43060086d088297 Mon Sep 17 00:00:00 2001 From: Miranda Kephart Date: Fri, 23 Oct 2020 08:47:48 -0400 Subject: [PATCH 249/288] [DO NOT MERGE] Make PendingIntents in screenshots immutable S and later will require PendingIntents to explicitly specify whether they are mutable or immutable. Bug: 182166925 Bug: 162738636 Test: manual, just a flag change (tested that normal screenshot flow works, verified that the log nags for unspecified mutability disappeared) Change-Id: I79b78f80c2d6af07a3826b6f79d0d86a5fc2f756 (cherry picked from commit ba571eaa74daaf39c1ae544c886bc3c2a4a21974) --- .../screenshot/SaveImageInBackgroundTask.java | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java b/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java index df1d78953f46c..8d74344834d05 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java @@ -283,8 +283,10 @@ class SaveImageInBackgroundTask extends AsyncTask { .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // cancel current pending intent (if any) since clipData isn't used for matching - PendingIntent pendingIntent = PendingIntent.getActivityAsUser(context, 0, - sharingChooserIntent, PendingIntent.FLAG_CANCEL_CURRENT, null, UserHandle.CURRENT); + PendingIntent pendingIntent = PendingIntent.getActivityAsUser( + context, 0, sharingChooserIntent, + PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE, + null, UserHandle.CURRENT); // Create a share action for the notification PendingIntent shareAction = PendingIntent.getBroadcastAsUser(context, requestCode, @@ -296,7 +298,8 @@ class SaveImageInBackgroundTask extends AsyncTask { mSmartActionsEnabled) .setAction(Intent.ACTION_SEND) .addFlags(Intent.FLAG_RECEIVER_FOREGROUND), - PendingIntent.FLAG_CANCEL_CURRENT, UserHandle.SYSTEM); + PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE, + UserHandle.SYSTEM); Notification.Action.Builder shareActionBuilder = new Notification.Action.Builder( Icon.createWithResource(r, R.drawable.ic_screenshot_share), @@ -325,7 +328,7 @@ class SaveImageInBackgroundTask extends AsyncTask { editIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); PendingIntent pendingIntent = PendingIntent.getActivityAsUser(context, 0, - editIntent, 0, null, UserHandle.CURRENT); + editIntent, PendingIntent.FLAG_IMMUTABLE, null, UserHandle.CURRENT); // Make sure pending intents for the system user are still unique across users // by setting the (otherwise unused) request code to the current user id. @@ -340,7 +343,8 @@ class SaveImageInBackgroundTask extends AsyncTask { mSmartActionsEnabled) .setAction(Intent.ACTION_EDIT) .addFlags(Intent.FLAG_RECEIVER_FOREGROUND), - PendingIntent.FLAG_CANCEL_CURRENT, UserHandle.SYSTEM); + PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE, + UserHandle.SYSTEM); Notification.Action.Builder editActionBuilder = new Notification.Action.Builder( Icon.createWithResource(r, R.drawable.ic_screenshot_edit), r.getString(com.android.internal.R.string.screenshot_edit), editAction); @@ -362,7 +366,9 @@ class SaveImageInBackgroundTask extends AsyncTask { .putExtra(GlobalScreenshot.EXTRA_SMART_ACTIONS_ENABLED, mSmartActionsEnabled) .addFlags(Intent.FLAG_RECEIVER_FOREGROUND), - PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_ONE_SHOT); + PendingIntent.FLAG_CANCEL_CURRENT + | PendingIntent.FLAG_ONE_SHOT + | PendingIntent.FLAG_IMMUTABLE); Notification.Action.Builder deleteActionBuilder = new Notification.Action.Builder( Icon.createWithResource(r, R.drawable.ic_screenshot_delete), r.getString(com.android.internal.R.string.delete), deleteAction); @@ -403,7 +409,7 @@ class SaveImageInBackgroundTask extends AsyncTask { PendingIntent broadcastIntent = PendingIntent.getBroadcast(context, mRandom.nextInt(), intent, - PendingIntent.FLAG_CANCEL_CURRENT); + PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE); broadcastActions.add(new Notification.Action.Builder(action.getIcon(), action.title, broadcastIntent).setContextual(true).addExtras(extras).build()); } From b68b97f2e31e4bdff2bdcc8f94309492b8b87ff1 Mon Sep 17 00:00:00 2001 From: Hansong Zhang Date: Wed, 9 Dec 2020 14:25:15 -0800 Subject: [PATCH 250/288] Bluetooth airplane listener: Check for null Check mAirplaneHelper != null before accessing it. Note that this can be null if Settings.Global.RADIO_BLUETOOTH is enabled in AIRPLANE_MODE_RADIOS. We don't need to disable Bluetooth if it's allowed in airplane mode. Test: atest FrameworksServicesTests Bug: 174254527 Change-Id: I93ae4ec6b75b7ffb8e75848d7779ab64593221bd (cherry picked from commit b49f86605411035817a305bed6d1ef6c389c6c7b) --- .../com/android/server/BluetoothAirplaneModeListener.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/BluetoothAirplaneModeListener.java b/services/core/java/com/android/server/BluetoothAirplaneModeListener.java index 31cd5d519d87f..0b2cc88909222 100644 --- a/services/core/java/com/android/server/BluetoothAirplaneModeListener.java +++ b/services/core/java/com/android/server/BluetoothAirplaneModeListener.java @@ -127,7 +127,9 @@ class BluetoothAirplaneModeListener { } return; } - mAirplaneHelper.onAirplaneModeChanged(mBluetoothManager); + if (mAirplaneHelper != null) { + mAirplaneHelper.onAirplaneModeChanged(mBluetoothManager); + } } @VisibleForTesting From ad2a4b39d589a709c10072ee5b2cd02a1a6c5336 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 26 Mar 2021 17:12:14 -0700 Subject: [PATCH 251/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ib27fc0c1020464d7b12835114907745f2fb093a8 --- packages/SettingsLib/res/values-iw/arrays.xml | 30 +++--- .../SettingsLib/res/values-iw/strings.xml | 92 +++++++++---------- .../SettingsLib/res/values-ky/strings.xml | 2 +- .../SettingsLib/res/values-nb/strings.xml | 2 +- .../SettingsLib/res/values-nl/strings.xml | 26 +++--- .../SettingsLib/res/values-pa/strings.xml | 2 +- packages/SettingsLib/res/values-te/arrays.xml | 2 +- .../SettingsLib/res/values-te/strings.xml | 2 +- 8 files changed, 79 insertions(+), 79 deletions(-) diff --git a/packages/SettingsLib/res/values-iw/arrays.xml b/packages/SettingsLib/res/values-iw/arrays.xml index fa53ab8ed45df..a81c29459674d 100644 --- a/packages/SettingsLib/res/values-iw/arrays.xml +++ b/packages/SettingsLib/res/values-iw/arrays.xml @@ -22,13 +22,13 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - "סורק..." - "מתחבר ..." - "מאמת…" + "מתבצעת סריקה..." + "מתבצעת התחברות..." + "מתבצע אימות…" "‏משיג כתובת IP…" "מחובר" "בהשעיה" - "מתנתק..." + "מתבצעת התנתקות..." "מנותק" "נכשל" "חסומה" @@ -36,26 +36,26 @@ - "סורק..." + "מתבצעת סריקה..." "מתחבר אל %1$s…" - "מאמת עם %1$s..." - "‏משיג כתובת IP מ-%1$s…" + "מתבצע אימות מול %1$s..." + "‏המערכת משיגה כתובת IP מ-%1$s…" "מחובר אל %1$s" "בהשעיה" "מתנתק מרשת %1$s..." "מנותק" "נכשל" "חסומה" - "נמנע זמנית מחיבור חלש" + "המערכת נמנעת זמנית מחיבור חלש" "בלי לבדוק לעולם" - "‏בדוק אם יש תוכן DRM בלבד" + "‏בדיקה אם יש תוכן DRM בלבד" "בדוק תמיד" - "‏לעולם אל תשתמש בבדיקת HDCP" - "‏השתמש בבדיקת HDCP עבור תוכן DRM בלבד" + "‏אני לעולם לא רוצה להשתמש בבדיקת HDCP" + "‏שימוש בבדיקת HDCP עבור תוכן DRM בלבד" "‏תמיד השתמש בבדיקת HDCP" @@ -123,7 +123,7 @@ "השתמש בבחירת המערכת (ברירת המחדל)" - "16 סיביות לדגימה" + "16 ביטים לדגימה" "24 סיביות לדגימה" "32 סיביות לדגימה" @@ -145,7 +145,7 @@ "אופטימיזציה להשגת איכות אודיו מרבית" - "אזן בין איכות החיבור לאיכות אודיו" + "איזון בין איכות החיבור לאיכות אודיו" "אופטימיזציה להשגת איכות חיבור מרבית" "האיכות הטובה ביותר (קצב העברת נתונים מותאם)" @@ -238,8 +238,8 @@ "כבוי" - "שרטט אזור חיתוך שאינו מלבני בצבע כחול" - "הדגש את פקודות האיור שנבדקות בצבע ירוק" + "שרטוט אזור חיתוך שאינו מלבני בצבע כחול" + "הדגשת פקודות האיור שנבדקות בצבע ירוק" "כבוי" diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml index f098bf3edaf45..9c851e7478a75 100644 --- a/packages/SettingsLib/res/values-iw/strings.xml +++ b/packages/SettingsLib/res/values-iw/strings.xml @@ -31,7 +31,7 @@ "בעיית אימות" "לא ניתן להתחבר" "לא ניתן להתחבר אל %1$s" - "בדוק את הסיסמה ונסה שוב" + "יש לבדוק את הסיסמה ולנסות שוב" "מחוץ לטווח" "לא יתבצע חיבור באופן אוטומטי" "אין גישה לאינטרנט" @@ -64,7 +64,7 @@ "התוקף פג" "%1$s / %2$s" "מנותק" - "מתנתק..." + "מתבצעת התנתקות..." "מתחבר ..." "%1$s מחובר" "מבצע התאמה..." @@ -104,7 +104,7 @@ "מחובר למכשיר קלט" "יש חיבור למכשיר לצורך גישה לאינטרנט" "המערכת משתפת חיבור אינטרנט מקומי עם המכשיר" - "השתמש עבור גישה לאינטרנט" + "שימוש עבור גישה לאינטרנט" "שימוש עבור מפה" "‏השתמש לגישה של SIM" "שימוש לאודיו של מדיה" @@ -163,7 +163,7 @@ "שפה" "שימוש בשפת המערכת" "לא נבחרה שפה" - "מגדיר קול ספציפי לשפה עבור הטקסט הנאמר" + "הגדרת קול ספציפי לשפה עבור הטקסט הנאמר" "דוגמה" "הפעלת הדגמה קצרה של סינתזת דיבור" "התקנת נתוני קול" @@ -175,9 +175,9 @@ "%1$s נתמכת באופן מלא" "%1$s מצריכה חיבור לרשת" "%1$s אינה נתמכת" - "בודק…" + "מתבצעת בדיקה…" "הגדרות עבור %s" - "השק הגדרות מנוע" + "הפעלת הגדרות מנוע" "מנוע מועדף" "כללי" "איפוס של גובה צליל הדיבור" @@ -244,7 +244,7 @@ "אפשר ביטול של נעילת מנהל האתחול" "‏האם לאפשר ביטול נעילה של OEM (יצרן ציוד מקורי)?" "אזהרה: תכונות הגנת מכשיר לא יפעלו במכשיר הזה כשההגדרה הזו פועלת." - "בחר אפליקציה של מיקום מדומה" + "בחירת אפליקציה של מיקום מדומה" "לא הוגדרה אפליקציה של מיקום מדומה" "אפליקציה של מיקום מדומה: %1$s" "תקשורת רשתות" @@ -255,10 +255,10 @@ "חבילת הגלישה פעילה תמיד" "שיפור מהירות באמצעות חומרה לצורך שיתוף אינטרנט בין ניידים" "‏הצגת מכשירי Bluetooth ללא שמות" - "השבת עוצמת קול מוחלטת" + "השבתת עוצמת קול מוחלטת" "‏הפעלת Gabeldorsche" "‏Bluetooth גרסה AVRCP" - "‏בחר Bluetooth גרסה AVRCP" + "‏בחירת Bluetooth גרסה AVRCP" "‏גרסת Bluetooth MAP" "‏יש לבחור גרסה של Bluetooth MAP" "‏Codec אודיו ל-Bluetooth" @@ -267,7 +267,7 @@ "‏הפעלת ‏Codec אודיו ל-Bluetooth\nבחירה: קצב דגימה" "כשזה מופיע באפור, אין לזה תמיכה בטלפון או באוזניות" "‏מספר סיביות לדגימה באודיו ל-Bluetooth" - "‏הפעלת ‏Codec אודיו ל-Bluetooth\nבחירה: סיביות לדגימה" + "‏הפעלת ‏Codec אודיו ל-Bluetooth\nבחירה: ביטים לדגימה" "‏מצב של ערוץ אודיו ל-Bluetooth" "‏הפעלת ‏Codec אודיו ל-Bluetooth\nבחירה: מצב ערוץ" "‏Codec אודיו LDAC ל-Bluetooth: איכות נגינה" @@ -280,33 +280,33 @@ "‏שם מארח של ספק DNS פרטי" "‏צריך להזין את שם המארח של ספק DNS" "לא ניתן היה להתחבר" - "‏הצג אפשרויות עבור אישור של תצוגת WiFi" - "‏העלה את רמת הרישום של Wi‑Fi ביומן, הצג לכל SSID RSSI ב-Wi‑Fi Picker" - "מפחית את קצב התרוקנות הסוללה ומשפר את ביצועי הרשת" + "‏הצגת אפשרויות עבור אישור של תצוגת WiFi" + "‏העלאת רמת הרישום של Wi‑Fi ביומן, הצגה לכל SSID RSSI ב-Wi‑Fi Picker" + "אפשרות זו מפחיתה את קצב התרוקנות הסוללה ומשפרת את ביצועי הרשת" "‏כשמצב זה מופעל, כתובת ה-MAC של המכשיר הזה עשויה להשתנות בכל פעם שהוא מתחבר לרשת שפועלת בה רנדומיזציה של כתובות MAC." "נמדדת" "לא נמדדת" "גדלי מאגר של יומן רישום" - "בחר גדלים של יוצר יומן לכל מאגר יומן" + "יש לבחור גדלים של יוצר יומן לכל מאגר יומן" "האם למחוק את אחסון המתעד המתמיד?" "כשאנחנו כבר לא מבצעים מעקב באמצעות המתעד המתמיד, אנחנו נדרשים למחוק את נתוני המתעד המקומי במכשיר." "אחסון מתמיד של נתוני תיעוד במכשיר" "בחר מאגר נתונים זמני ליומן לשם אחסון מתמיד במכשיר" "‏בחר תצורת USB" - "‏בחר תצורת USB" + "‏יש לבחור תצורת USB" "אפשרות של מיקומים מדומים" "אפשרות של מיקומים מדומים" "אפשר בדיקת תכונת תצוגה" - "‏השאר את חבילת הגלישה פעילה תמיד, גם כש-Wi‑Fi פעיל (למעבר מהיר בין רשתות)." + "‏השארת חבילת הגלישה פעילה תמיד, גם כש-Wi‑Fi פעיל (למעבר מהיר בין רשתות)." "אם השירות זמין, יש להשתמש בשיפור מהירות באמצעות חומרה לצורך שיתוף אינטרנט בין ניידים" "‏לאפשר ניפוי באגים של USB?" - "‏ניפוי באגים באמצעות USB מיועד למטרות פיתוח בלבד. השתמש בו להעתקת נתונים בין המחשב והמכשיר שלך, להתקנת אפליקציות במכשיר ללא התראה ולקריאת נתוני יומן." + "‏ניפוי באגים באמצעות USB מיועד למטרות פיתוח בלבד. אפשר להשתמש בו להעתקת נתונים בין המחשב והמכשיר, להתקנת אפליקציות במכשיר ללא התראה ולקריאת נתוני יומן." "האם לאפשר ניפוי באגים אלחוטי?" "ניפוי באגים אלחוטי מיועד למטרות פיתוח בלבד. יש להשתמש בו להעתקת נתונים בין המחשב והמכשיר שלך, להתקנת אפליקציות במכשיר ללא התראה ולקריאת נתוני יומן." "‏האם לבטל את הגישה לניפוי ב-USB מכל המחשבים שהענקת להם בעבר הרשאה?" "האם להתיר הגדרות פיתוח?" "הגדרות אלה מיועדות לשימוש בפיתוח בלבד. הן עלולות לגרום למכשיר או לאפליקציות המותקנות בו לקרוס או לפעול באופן לא תקין." - "‏אמת אפליקציות באמצעות USB" + "‏אימות אפליקציות באמצעות USB" "‏בדוק אפליקציות שהותקנו באמצעות ADB/ADT לאיתור התנהגות מזיקה." "‏יוצגו מכשירי Bluetooth ללא שמות (כתובות MAC בלבד)" "‏משבית את תכונת עוצמת הקול המוחלטת ב-Bluetooth במקרה של בעיות בעוצמת הקול במכשירים מרוחקים, כגון עוצמת קול רמה מדי או חוסר שליטה ברמת העוצמה." @@ -320,9 +320,9 @@ "בחר אפליקציה לניפוי באגים" "לא הוגדרה אפליקציה לניפוי" "אפליקציה לניפוי: %1$s" - "בחר אפליקציה" + "בחירת אפליקציה" "אף אחת" - "המתן למנקה באגים" + "יש להמתין לכלי לניפוי באגים" "אפליקציה שנוקו בה הבאגים ממתינה למנקה הבאגים לצירוף לפני ביצוע" "קלט" "שרטוט" @@ -330,29 +330,29 @@ "מדיה" "מעקב" "מצב קפדני מופעל" - "גרום למסך להבהב כאשר אפליקציות מבצעות פעולות ארוכות בשרשור הראשי" + "המסך יהבהב כאשר אפליקציות יבצעו פעולות ארוכות בשרשור הראשי" "מיקום מצביע" "שכבת-על של המסך המציגה את נתוני המגע הנוכחיים" - "הצג הקשות" - "הצג משוב ויזואלי להקשות" + "הצגת הקשות" + "הצגת משוב ויזואלי להקשות" "הצג עדכונים על פני השטח" - "הבזק את כל שטחי החלון כשהם מתעדכנים" + "הבזקת כל שטחי החלון כשהם מתעדכנים" "תצוגת \'הצגת עדכונים\'" "הבזק תצוגות בתוך חלונות בעת ציור" "הצג עדכוני שכבות חומרה" - "הצג הבהוב ירוק לשכבות חומרה כשהן מתעדכנות" + "הצגת הבהוב ירוק לשכבות חומרה כשהן מתעדכנות" "‏חריגה בניפוי באגים ב-GPU" - "‏השבת שכבות על של HW" + "‏השבתת שכבות על של HW" "‏השתמש תמיד ב-GPU להרכבת מסך" "יצירת הדמיה של מרחב צבעים" "‏הפעל מעקבי OpenGL" "‏השבת ניתוב אודיו ב-USB" - "‏השבת ניתוב אוטומטי אל התקני אודיו חיצוניים ב-USB" - "הצג את גבולות הפריסה" - "הצג גבולות אזור, שוליים וכדומה" + "‏השבתת ניתוב אוטומטי אל התקני אודיו חיצוניים ב-USB" + "הצגת גבולות הפריסה" + "הצגת גבולות אזור, שוליים וכדומה" "אלץ כיוון פריסה מימין לשמאל" - "אלץ כיוון פריסת מסך מימין לשמאל עבור כל השפות בכל המקומות" - "‏אלץ הפעלת 4x MSAA" + "אילוץ של כיוון פריסת מסך מימין לשמאל עבור כל השפות בכל המקומות" + "‏אילוץ הפעלת 4x MSAA" "‏הפעל 4x MSAA ביישומי OpenGL ES 2.0" "ניפוי באגים בפעולות באזור שאינו מלבני" "‏עיבוד פרופיל ב-HWUI" @@ -366,7 +366,7 @@ "צור הדמיית תצוגות משניות" "אפליקציות" "ללא שמירת פעילויות" - "השמד כל פעילות ברגע שהמשתמש עוזב אותה" + "השמדת כל פעילות ברגע שהמשתמש עוזב אותה" "מגבלה של תהליכים ברקע" "‏הצגת מקרי ANR ברקע" "הצגת תיבת דו-שיח של \'אפליקציה לא מגיבה\' עבור אפליקציות שפועלות ברקע" @@ -374,10 +374,10 @@ "הצגת אזהרה כשאפליקציה שולחת התראה ללא ערוץ חוקי" "אילוץ הרשאת אפליקציות באחסון חיצוני" "מאפשר כתיבה של כל אפליקציה באחסון חיצוני, ללא התחשבות בערכי המניפסט" - "אלץ יכולת קביעת גודל של הפעילויות" + "אילוץ יכולת קביעת גודל של הפעילויות" "אפשר יכולת קביעת גודל של כל הפעילויות לריבוי חלונות, ללא קשר לערך המניפסט." - "הפעל את האפשרות לשנות את הגודל והמיקום של החלונות" - "הפעל תמיכה בתכונה הניסיונית של שינוי הגודל והמיקום של החלונות." + "הפעלת האפשרות לשנות את הגודל והמיקום של החלונות" + "הפעלת תמיכה בתכונה הניסיונית של שינוי הגודל והמיקום של החלונות." "סיסמת גיבוי שולחן העבודה" "גיבויים מלאים בשולחן העבודה אינם מוגנים כעת" "הקש כדי לשנות או להסיר את הסיסמה לגיבויים מלאים בשולחן העבודה" @@ -397,18 +397,18 @@ "אפליקציות בהמתנה" "אפליקציה לא פעילה. הקש כדי להחליף מצב." - "אפליקציה פעילה. הקש כדי להחליף מצב." + "אפליקציה פעילה. יש להקיש כדי להחליף מצב." "אפליקציה במצב המתנה: %s" "שירותים פועלים" "הצגת השירותים הפועלים כעת ושליטה בהם" "‏יישום WebView" "‏הגדרת יישום WebView" - "אפשרות זו כבר אינה תקפה. נסה שוב." + "אפשרות זו כבר אינה תקפה. אפשר לנסות שוב." "המרה לצורך הצפנת קבצים" - "המר..." + "להמרה..." "הצפנת קבצים כבר מוגדרת" "המרה להצפנה מבוססת קבצים" - "המר את מחיצת הנתונים להצפנה מבוססת-קבצים.\n אזהרה!! פעולה זו תמחק את כל הנתונים.\n תכונה זו זמינה בגרסת אלפא וייתכן שלא תפעל כראוי.\n הקש על \'מחיקה והמרה…\' כדי להמשיך." + "המרת מחיצת הנתונים להצפנה מבוססת-קבצים.\n אזהרה!! פעולה זו תמחק את כל הנתונים.\n תכונה זו זמינה בגרסת אלפא וייתכן שלא תפעל כראוי.\n יש להקיש על \'מחיקה והמרה…\' כדי להמשיך." "מחיקה והמרה…" "מצב צבע התמונה" "‏שימוש ב-sRGB" @@ -420,7 +420,7 @@ "תיקון צבע" "תיקון צבע מאפשר לשנות את האופן שבו צבעים מוצגים במכשיר שלך" "נעקף על ידי %1$s" - "%1$s - %2$s" + "%1$s – %2$s" "הזמן הנותר: בערך %1$s" "הזמן הנותר: בערך %1$s (%2$s)" "הזמן הנותר על סמך השימוש שלך: בערך %1$s" @@ -443,9 +443,9 @@ "הטלפון עלול להיכבות בקרוב (%1$s)" "הטאבלט עלול להיכבות בקרוב (%1$s)" "המכשיר עלול להיכבות בקרוב (%1$s)" - "%1$s‏ - %2$s" + "%1$s‏ – %2$s" "נשארו %1$s עד הטעינה" - "%1$s - %2$s עד הטעינה" + "%1$s – %2$s עד הטעינה" "%1$s ﹣ מופעל מיטוב לשמירה על תקינות הסוללה" "לא ידוע" "בטעינה" @@ -474,14 +474,14 @@ "הכי גדול" "מותאם אישית (%d)" "תפריט" - "הזן סיסמה כדי לבצע איפוס להגדרות היצרן במצב הדגמה" + "יש להזין סיסמה כדי לבצע איפוס להגדרות היצרן במצב הדגמה" "הבא" "דרושה סיסמה" "שיטות קלט פעילות" "שימוש בשפות מערכת" "פתיחת הגדרות עבור %1$s נכשלה" - "ייתכן ששיטת קלט זו תוכל לאסוף את כל הטקסט שאתה מקליד, כולל נתונים אישיים כגון סיסמאות ומספרי כרטיס אשראי. היא מגיעה מהאפליקציה %1$s. האם להשתמש בשיטת קלט זו?" - "שים לב: לאחר הפעלה מחדש של המכשיר, ניתן להפעיל את האפליקציה רק לאחר שתבטל את נעילת הטלפון" + "ייתכן ששיטת קלט זו תוכל לאסוף את כל הטקסט המוקלד, כולל נתונים אישיים כגון סיסמאות ומספרי כרטיס אשראי. היא מגיעה מהאפליקציה %1$s. האם להשתמש בשיטת קלט זו?" + "לתשומת ליבך: לאחר הפעלה מחדש של המכשיר, ניתן להפעיל את האפליקציה רק לאחר שתבטל את נעילת הטלפון" "‏סטטוס הרשמה ל-IMS" "רשום" "לא רשום" @@ -545,7 +545,7 @@ "פרופיל חדש" "פרטי משתמש" "פרטי פרופיל" - "לפני שתוכל ליצור פרופיל מוגבל, תצטרך להגדיר נעילת מסך כדי להגן על האפליקציות ועל הנתונים האישיים שלך." + "לפני שיתאפשר לך ליצור פרופיל מוגבל, יהיה עליך להגדיר נעילת מסך כדי להגן על האפליקציות ועל הנתונים האישיים שלך." "הגדרת נעילה" "מעבר אל %s" "הוספת אורח" diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml index 82286ab72c29b..47dd2665a665f 100644 --- a/packages/SettingsLib/res/values-ky/strings.xml +++ b/packages/SettingsLib/res/values-ky/strings.xml @@ -254,7 +254,7 @@ "Wi‑Fi иштетилген MAC даректерин башаламан түзүү" "Мобилдик Интернет иштей берет" "Модем режиминде аппараттын иштешин тездетүү" - "Аталышсыз Bluetooth түзмөктөрү көрсөтүлсүн" + "Аталышсыз Bluetooth түзмөктөрү көрүнсүн" "Үндүн абсолюттук деңгээли өчүрүлсүн" "Gabeldorsche функциясын иштетүү" "Bluetooth AVRCP версиясы" diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml index d4385758d3469..634bc1cc3d7e5 100644 --- a/packages/SettingsLib/res/values-nb/strings.xml +++ b/packages/SettingsLib/res/values-nb/strings.xml @@ -117,7 +117,7 @@ "Avbryt" "Med sammenkobling får den andre enheten tilgang til kontaktene og anropsloggen din når den er tilkoblet." "Kan ikke koble til %1$s." - "Kan ikke koble til %1$s på grunn av feil personlig kode eller passord." + "Kan ikke koble til %1$s på grunn av feil PIN-kode eller passord." "Kan ikke kommunisere med %1$s." "%1$s avslo paring." "Datamaskin" diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml index 0735fb1570dbf..f04afa29d4659 100644 --- a/packages/SettingsLib/res/values-nl/strings.xml +++ b/packages/SettingsLib/res/values-nl/strings.xml @@ -168,7 +168,7 @@ "Een korte demonstratie van spraaksynthese afspelen" "Spraakgegevens installeren" "De spraakgegevens voor spraaksynthese installeren" - "Deze engine voor spraaksynthese kan mogelijk alle tekst verzamelen die wordt gesproken, waaronder persoonsgegevens zoals wachtwoorden en creditcardnummers. Deze engine is afkomstig van de %s-engine. Het gebruik van deze engine voor spraaksynthese inschakelen?" + "Deze engine voor spraaksynthese kan mogelijk alle tekst verzamelen die wordt gesproken, waaronder persoonsgegevens zoals wachtwoorden en creditcardnummers. Deze engine is afkomstig van de %s-engine. Het gebruik van deze engine voor spraaksynthese aanzetten?" "Deze taal heeft een werkende netwerkverbinding nodig voor tekst-naar-spraak-uitvoer." "Dit is een voorbeeld van spraaksynthese" "Status van standaardtaal" @@ -197,7 +197,7 @@ "Persoonlijk" "Werk" "Ontwikkelaarsopties" - "Opties voor ontwikkelaars inschakelen" + "Opties voor ontwikkelaars aanzetten" "Opties instellen voor appontwikkeling" "Ontwikkelaarsopties zijn niet beschikbaar voor deze gebruiker" "Instellingen voor VPN zijn niet beschikbaar voor deze gebruiker" @@ -238,7 +238,7 @@ "Een knop in het aan/uit-menu tonen om een bugrapport te maken" "Stand-by" "Scherm gaat nooit uit tijdens het opladen" - "Snoop-logbestand voor Bluetooth-HCI inschakelen" + "Snoop-logbestand voor bluetooth-HCI aanzetten" "Bluetooth-pakketten opslaan. (Schakel Bluetooth in nadat je deze instelling hebt gewijzigd)." "OEM-ontgrendeling" "Toestaan dat de bootloader wordt ontgrendeld" @@ -256,7 +256,7 @@ "Hardwareversnelling voor tethering" "Bluetooth-apparaten zonder naam tonen" "Absoluut volume uitschakelen" - "Gabeldorsche inschakelen" + "Gabeldorsche aanzetten" "Bluetooth-AVRCP-versie" "Bluetooth-AVRCP-versie selecteren" "MAP-versie voor bluetooth" @@ -313,7 +313,7 @@ "Hierdoor wordt de Gabeldorsche-functiestack voor bluetooth ingeschakeld." "Hiermee wordt de functie voor verbeterde connectiviteit ingeschakeld." "Lokale terminal" - "Terminal-app inschakelen die lokale shell-toegang biedt" + "Terminal-app aanzetten die lokale shell-toegang biedt" "HDCP-controle" "HDCP-controlegedrag instellen" "Foutopsporing" @@ -345,7 +345,7 @@ "HW-overlays uitschakelen" "GPU altijd gebruiken voor schermcompositing" "Kleurruimte simuleren" - "OpenGL-sporen inschakelen" + "OpenGL-sporen aanzetten" "USB-audiorouting uitsch." "Autom. routing naar USB-randapparatuur uitsch." "Indelingsgrenzen tonen" @@ -353,12 +353,12 @@ "V.r.n.l.-indelingsrichting afdwingen" "Schermindelingsrichting geforceerd instellen op v.r.n.l. voor alle talen" "4x MSAA forceren" - "4x MSAA inschakelen in OpenGL ES 2.0-apps" + "4x MSAA aanzetten in OpenGL ES 2.0-apps" "Foutopsporing niet-rechthoekig bijsnijden" "HWUI-weergave van profiel" - "GPU-foutopsporingslagen inschakelen" + "GPU-foutopsporingslagen aanzetten" "Laden van GPU-foutopsporingslagen toestaan voor foutopsporingsapps" - "Uitgebreide leverancierslogboeken inschakelen" + "Uitgebreide leverancierslogboeken aanzetten" "Aanvullende apparaatspecifieke leverancierslogboeken opnemen in bugrapporten. Deze kunnen privégegevens bevatten, meer batterijlading gebruiken en/of meer opslagruimte gebruiken." "Venster­animatieschaal" "Overgangs­animatieschaal" @@ -376,8 +376,8 @@ "Hiermee komt elke app in aanmerking voor schrijven naar externe opslag, ongeacht de manifestwaarden" "Formaat activiteiten geforceerd aanpasbaar maken" "Het formaat van alle activiteiten aanpasbaar maken, ongeacht de manifestwaarden." - "Vensters met vrije vorm inschakelen" - "Ondersteuning voor vensters met experimentele vrije vorm inschakelen." + "Vensters met vrije vorm aanzetten" + "Ondersteuning voor vensters met experimentele vrije vorm aanzetten." "Wachtwoord desktopback-up" "Volledige back-ups naar desktops zijn momenteel niet beveiligd" "Tik om het wachtwoord voor volledige back-ups naar desktops te wijzigen of te verwijderen" @@ -480,7 +480,7 @@ "Actieve invoermethoden" "Systeemtalen gebruiken" "Instellingen openen voor %1$s mislukt" - "Deze invoermethode verzamelt mogelijk alle tekst die je typt, inclusief persoonsgegevens zoals wachtwoorden en creditcardnummers. De methode is afkomstig uit de app %1$s. Deze invoermethode inschakelen?" + "Deze invoermethode verzamelt mogelijk alle tekst die je typt, inclusief persoonsgegevens zoals wachtwoorden en creditcardnummers. De methode is afkomstig uit de app %1$s. Deze invoermethode aanzetten?" "Opmerking: Wanneer je telefoon opnieuw is opgestart, kan deze app pas worden gestart nadat je je telefoon hebt ontgrendeld" "IMS-registratiestatus" "Geregistreerd" @@ -495,7 +495,7 @@ "Minder tijd." "Annuleren" "OK" - "Inschakelen" + "Aanzetten" "Schakel Niet storen in." "Nooit" "Alleen prioriteit" diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml index b1735a3294e38..84dc9fe9a38bf 100644 --- a/packages/SettingsLib/res/values-pa/strings.xml +++ b/packages/SettingsLib/res/values-pa/strings.xml @@ -468,7 +468,7 @@ "%1$s ਪਹਿਲਾਂ" "%1$s ਬਾਕੀ" "ਛੋਟਾ" - "ਪੂਰਵ-ਨਿਰਧਾਰਤ" + "ਪੂਰਵ-ਨਿਰਧਾਰਿਤ" "ਵੱਡੀ" "ਥੋੜ੍ਹਾ ਵੱਡੀ" "ਸਭ ਤੋਂ ਵੱਡੀ" diff --git a/packages/SettingsLib/res/values-te/arrays.xml b/packages/SettingsLib/res/values-te/arrays.xml index e1c0406ee168c..b120df8a69f7b 100644 --- a/packages/SettingsLib/res/values-te/arrays.xml +++ b/packages/SettingsLib/res/values-te/arrays.xml @@ -252,7 +252,7 @@ "డ్యూటెరానోమలీ కోసం ప్రాంతాలను చూపండి" - "ప్రామాణిక పరిమితి" + "స్టాండర్డ్ పరిమితి" "నేపథ్య ప్రాసెస్‌లు లేవు" "గరిష్టంగా 1 ప్రాసెస్" "గరిష్టంగా 2 ప్రాసెస్‌లు" diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml index 268516415b6c4..cb6461fe45c31 100644 --- a/packages/SettingsLib/res/values-te/strings.xml +++ b/packages/SettingsLib/res/values-te/strings.xml @@ -388,7 +388,7 @@ "సచేతనం (డిఫాల్ట్)" "సహజం" - "ప్రామాణికం" + "స్టాండర్డ్" "మెరుగైన రంగులు" From 7b2f860dd02b4662802c9ded3b4936067a2f2e99 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 27 Mar 2021 01:36:26 +0000 Subject: [PATCH 252/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I419de50bd53cb082cb36fa570ca8cdb29409824d --- .../PackageInstaller/res/values-iw/strings.xml | 16 ++++++++-------- .../PackageInstaller/res/values-sv/strings.xml | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/PackageInstaller/res/values-iw/strings.xml b/packages/PackageInstaller/res/values-iw/strings.xml index 7cabdd532ffb9..5b17d7411698a 100644 --- a/packages/PackageInstaller/res/values-iw/strings.xml +++ b/packages/PackageInstaller/res/values-iw/strings.xml @@ -21,9 +21,9 @@ "סיום" "ביטול" "מתקין…" - "מתקין את %1$s…" + "מתבצעת התקנה של %1$s…" "האפליקציה הותקנה." - "האם ברצונך להתקין אפליקציה זו?" + "להתקין את האפליקציה הזו?" "האם ברצונך להתקין עדכון עבור אפליקציה קיימת זו? הנתונים הקיימים שלך לא יאבדו." "האם ברצונך להתקין עדכון עבור אפליקציה מובנית זו? הנתונים הקיימים שלך לא יאבדו." "האפליקציה לא הותקנה." @@ -31,14 +31,14 @@ "האפליקציה לא הותקנה כי החבילה מתנגשת עם חבילה קיימת." "האפליקציה לא הותקנה כי האפליקציה אינה תואמת לטאבלט." "האפליקציה הזו אינה תואמת לטלוויזיה שלך." - "האפליקציה לא הותקנה כי האפליקציה אינה תואמת לטלפון." + "האפליקציה לא הותקנה כי היא לא תואמת לטלפון." "האפליקציה לא הותקנה כי נראה שהחבילה לא תקפה." "לא ניתן להתקין את %1$s בטאבלט שלך." "לא ניתן להתקין את %1$s בטלוויזיה שלך." "לא ניתן להתקין את %1$s בטלפון שלך." "פתיחה" "מנהל המערכת שלך לא מתיר התקנה של אפליקציות ממקורות לא ידועים" - "למשתמש זה אין הרשאה להתקין אפליקציות שאינן מוכרות" + "למשתמש הזה אין הרשאה להתקין אפליקציות שאינן מוכרות" "למשתמש הזה אין הרשאה להתקין אפליקציות" "אישור" "ניהול אפליקציות" @@ -52,16 +52,16 @@ "לא ניתן היה להסיר את התקנת האפליקציה." "הסרת התקנה של האפליקציה" "הסרת התקנה של עדכון" - "%1$s הוא חלק מהאפליקציה הבאה:" + "הפעילות %1$s היא חלק מהאפליקציה הבאה:" "האם ברצונך להסיר את ההתקנה של אפליקציה זו?" - "האם אתה רוצה להסיר את האפליקציה הזו עבור ""כל"" המשתמשים? האפליקציה והנתונים שלה יוסרו מ""כל"" המשתמשים במכשיר." - "האם ברצונך להסיר את התקנתה של אפליקציה זו עבור המשתמש %1$s?" + "להסיר את האפליקציה הזו עבור ""כל"" המשתמשים? האפליקציה והנתונים שלה יוסרו עבור ""כל"" המשתמשים במכשיר." + "להסיר את ההתקנה של האפליקציה הזו עבור %1$s?" "האם להחליף את האפליקציה הזאת בגרסת היצרן? כל הנתונים יוסרו." "האם להחליף את האפליקציה הזאת בגרסת היצרן? כל הנתונים יוסרו. הפעולה תשפיע על כל משתמשי המכשיר, כולל משתמשים בעלי פרופיל עבודה." "שמירת %1$s מנתוני האפליקציה." "התקנות בתהליכי הסרה" "הסרות התקנה שנכשלו" - "מסיר התקנה..." + "בתהליך הסרת התקנה..." "מסיר את ההתקנה של %1$s…" "הסרת ההתקנה הסתיימה." "ההתקנה של %1$s הוסרה" diff --git a/packages/PackageInstaller/res/values-sv/strings.xml b/packages/PackageInstaller/res/values-sv/strings.xml index d0902c34ccc94..28ad6aafd77de 100644 --- a/packages/PackageInstaller/res/values-sv/strings.xml +++ b/packages/PackageInstaller/res/values-sv/strings.xml @@ -24,8 +24,8 @@ "%1$s installeras …" "Appen har installerats." "Vill du installera det här programmet?" - "Vill du installera en uppdatering till den här befintliga appen? Dina befintliga data försvinner inte." - "Vill du installera en uppdatering av den inbyggda appen? Dina befintliga data försvinner inte." + "Vill du installera en uppdatering till den här befintliga appen? Din befintliga data försvinner inte." + "Vill du installera en uppdatering av den inbyggda appen? Din befintliga data försvinner inte." "Appen har inte installerats." "Paketet har blockerats för installation." "Appen har inte installerats på grund av en konflikt mellan detta paket och ett befintligt paket." From 226dd2b58926787d3a4369f9a46549edb1a5a970 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 27 Mar 2021 02:56:18 +0000 Subject: [PATCH 253/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I9dec7659f6d51ab4885ae395738f606d9f19da05 --- packages/PrintSpooler/res/values-iw/strings.xml | 10 +++++----- packages/PrintSpooler/res/values-nl/strings.xml | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/PrintSpooler/res/values-iw/strings.xml b/packages/PrintSpooler/res/values-iw/strings.xml index 64db711def154..5dcd7f21c60df 100644 --- a/packages/PrintSpooler/res/values-iw/strings.xml +++ b/packages/PrintSpooler/res/values-iw/strings.xml @@ -32,10 +32,10 @@ "טווח של %1$s" "למשל 1–5‏,8,‏11–13" "תצוגה מקדימה של הדפסה" - "‏התקן מציג PDF ליצירת תצוגה מקדימה" + "‏התקנה של PDF viewer‏ ליצירת תצוגה מקדימה" "אפליקציית ההדפסה קרסה" "יוצר עבודת הדפסה" - "‏שמור כ-PDF" + "‏שמירה כ-PDF" "כל המדפסות…" "תיבת דו שיח של מדפסת" "%1$d/%2$d" @@ -44,7 +44,7 @@ "ידית הרחבה" "ידית כיווץ" "הדפס" - "‏שמור כ-PDF" + "‏שמירה כ-PDF" "אפשרויות ההדפסה הורחבו" "אפשרויות ההדפסה כווצו" "חיפוש" @@ -91,7 +91,7 @@ "הפעלה מחדש" "אין חיבור למדפסת" "לא ידוע" - "האם להשתמש ב-%1$s?" + "האם להשתמש בשירות %1$s?" "ייתכן שהמסמך שלך יעבור בשרת אחד או יותר בדרכו למדפסת." "שחור ולבן" @@ -107,7 +107,7 @@ "לרוחב" "לא ניתן היה לכתוב לקובץ" - "מצטערים, אך זה לא עבד. נסה שוב." + "מצטערים, הפעולה לא בוצעה. אפשר לנסות שוב." "כדאי לנסות שוב" "המדפסת הזו אינה זמינה כעת." "לא ניתן להציג תצוגה מקדימה" diff --git a/packages/PrintSpooler/res/values-nl/strings.xml b/packages/PrintSpooler/res/values-nl/strings.xml index 6448acc36902d..2cd8d9baacdaa 100644 --- a/packages/PrintSpooler/res/values-nl/strings.xml +++ b/packages/PrintSpooler/res/values-nl/strings.xml @@ -50,7 +50,7 @@ "Zoeken" "Alle printers" "Service toevoegen" - "Zoekvak weergegeven" + "Zoekvak wordt getoond" "Zoekvak verborgen" "Printer toevoegen" "Printer selecteren" From 5a496b8aea8bc06441a620ec08862fdc750d9b20 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 27 Mar 2021 05:40:17 +0000 Subject: [PATCH 254/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I9824a40916c5d274af59fefc01d3f80d948f4173 --- packages/SoundPicker/res/values-pa/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/SoundPicker/res/values-pa/strings.xml b/packages/SoundPicker/res/values-pa/strings.xml index 2653c6442ae79..eb630c9002449 100644 --- a/packages/SoundPicker/res/values-pa/strings.xml +++ b/packages/SoundPicker/res/values-pa/strings.xml @@ -17,7 +17,7 @@ "ਪੂਰਵ-ਨਿਰਧਾਰਤ ਰਿੰਗਟੋਨ" - "ਪੂਰਵ-ਨਿਰਧਾਰਤ ਸੂਚਨਾ ਧੁਨੀ" + "ਪੂਰਵ-ਨਿਰਧਾਰਿਤ ਸੂਚਨਾ ਧੁਨੀ" "ਪੂਰਵ-ਨਿਰਧਾਰਤ ਅਲਾਰਮ ਧੁਨੀ" "ਰਿੰਗਟੋਨ ਸ਼ਾਮਲ ਕਰੋ" "ਅਲਾਰਮ ਸ਼ਾਮਲ ਕਰੋ" From 3156171e774fc157806c2ec6b53035b2b0b4c238 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 27 Mar 2021 07:01:49 +0000 Subject: [PATCH 255/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I87669a1e468060aedf8580200fc893815ed629a8 --- packages/Shell/res/values-iw/strings.xml | 6 +++--- packages/Shell/res/values-nl/strings.xml | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/Shell/res/values-iw/strings.xml b/packages/Shell/res/values-iw/strings.xml index c99e69e7f481a..76429d2972bbb 100644 --- a/packages/Shell/res/values-iw/strings.xml +++ b/packages/Shell/res/values-iw/strings.xml @@ -18,9 +18,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "מעטפת" "דוחות על באגים" - "יצירת הדוח על הבאג #%d מתבצעת" + "בתהליך יצירה של דוח על באג (#%d)" "הדוח על הבאג #%d צולם" - "מוסיף פרטים לדוח על הבאג" + "בתהליך הוספת פרטים לדוח על הבאג" "המתן…" "הדוח על הבאג יופיע בטלפון בקרוב" "הקש כדי לשתף את הדוח על הבאג" @@ -29,7 +29,7 @@ "הקש כדי לשתף את הדוח על הבאג ללא צילום מסך, או המתן להשלמת צילום המסך" "הקש כדי לשתף את הדוח על הבאג ללא צילום מסך, או המתן להשלמת צילום המסך" "דוחות על באגים כוללים נתונים מקובצי היומן השונים במערכת, שעשויים לכלול נתונים הנחשבים רגישים (כגון שימוש באפליקציות ונתוני מיקום). שתף דוחות על באגים רק עם אפליקציות ואנשים שאתה סומך עליהם." - "אל תציג שוב" + "אל תציגו זאת שוב" "דוחות באגים" "לא ניתן היה לקרוא את קובץ הדוח על הבאג" "‏לא ניתן היה להוסיף את פרטי הדוח על הבאג לקובץ ה-zip" diff --git a/packages/Shell/res/values-nl/strings.xml b/packages/Shell/res/values-nl/strings.xml index 3868f4a270219..dadf9fa4b3270 100644 --- a/packages/Shell/res/values-nl/strings.xml +++ b/packages/Shell/res/values-nl/strings.xml @@ -22,14 +22,14 @@ "Bugrapport #%d is vastgelegd" "Details toevoegen aan het bugrapport" "Even geduld…" - "Het bugrapport wordt over enkele ogenblikken op de telefoon weergegeven" + "Het bugrapport zie je over enkele ogenblikken op de telefoon" "Selecteer dit om je bugrapport te delen" "Tik om je bugrapport te delen" "Selecteer dit om je bugrapport te delen zonder screenshot of wacht tot het screenshot is voltooid" "Tik om je bugrapport te delen zonder screenshot of wacht tot het screenshot is voltooid" "Tik om je bugrapport te delen zonder screenshot of wacht tot het screenshot is voltooid" "Bugrapporten bevatten gegevens uit de verschillende logbestanden van het systeem, die gegevens kunnen bevatten die je als gevoelig beschouwt (zoals gegevens met betrekking tot app-gebruik en locatie). Deel bugrapporten alleen met mensen en apps die je vertrouwt." - "Niet opnieuw weergeven" + "Niet opnieuw tonen" "Bugrapporten" "Bestand met bugrapport kan niet worden gelezen" "Kan details van bugrapport niet toevoegen aan zip-bestand" From 60f6eb1f2a151206529a99149ba2239820884d0f Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 27 Mar 2021 09:56:42 +0000 Subject: [PATCH 256/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I993d5d541f2e86e4b17cdeeadf96a3b81da9c09d --- packages/SystemUI/res/values-am/strings.xml | 2 +- packages/SystemUI/res/values-bs/strings.xml | 2 +- packages/SystemUI/res/values-gu/strings.xml | 2 +- packages/SystemUI/res/values-hi/strings.xml | 4 +- packages/SystemUI/res/values-hr/strings.xml | 8 +- packages/SystemUI/res/values-iw/strings.xml | 110 ++++++++++---------- packages/SystemUI/res/values-kk/strings.xml | 18 ++-- packages/SystemUI/res/values-ky/strings.xml | 12 +-- packages/SystemUI/res/values-ml/strings.xml | 2 +- packages/SystemUI/res/values-ne/strings.xml | 10 +- packages/SystemUI/res/values-nl/strings.xml | 74 ++++++------- packages/SystemUI/res/values-pa/strings.xml | 2 +- packages/SystemUI/res/values-te/strings.xml | 2 +- 13 files changed, 123 insertions(+), 125 deletions(-) diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index a129f6767f077..2900060b84b6e 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -68,7 +68,7 @@ "ሁልጊዜ በዚህ አውታረ መረብ ላይ ፍቀድ" "ፍቀድ" "ገመድ-አልባ debugging አይፈቀድም" - "በአሁኑ ጊዜ በመለያ ወደዚህ መሣሪያ የገባው ተጠቃሚ የገመድ-አልባ debuggingን ማብራት አይችልም። ይህን ባህሪ ለመጠቀም ወደ ዋና ተጠቃሚ ይቀይሩ።" + "በአሁኑ ጊዜ በመለያ ወደዚህ መሣሪያ የገባው ተጠቃሚ የገመድ-አልባ ማረምን ማብራት አይችልም። ይህን ባህሪ ለመጠቀም ወደ ዋና ተጠቃሚ ይቀይሩ።" "የዩኤስቢ ወደብ ተሰናክሏል" "መሣሪያዎን ከፈሳሽ ወይም ፍርስራሽ ለመጠበቅ ሲባል የዩኤስቢ ወደቡ ተሰናክሏል፣ እና ማናቸውም ተቀጥላዎችን አያገኝም።\n\nየዩኤስቢ ወደቡን እንደገና መጠቀም ችግር በማይኖረው ጊዜ ማሳወቂያ ይደርሰዎታል።" "ኃይል መሙያዎችን እና ተጨማሪ መሣሪያዎችን ፈልጎ ለማግኘት የነቃ የዩኤስቢ ወደብ" diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index 8b93ff1a512cc..e69d9c6c6e029 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -478,7 +478,7 @@ "Dodaj korisnika" "Novi korisnik" "Ukloniti gosta?" - "Sve aplikacije i svi podaci iz ove sesije će se izbrisati." + "Sve aplikacije i podaci iz ove sesije će se izbrisati." "Ukloni" "Zdravo! Lijepo je opet vidjeti goste." "Želite li nastaviti sesiju?" diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index 6c3d0ec0fdb8f..6cce91acfdd1f 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -543,7 +543,7 @@ "CA પ્રમાણપત્રો" "VPN અક્ષમ કરો" "VPN ડિસ્કનેક્ટ કરો" - "નીતિઓ જુઓ" + "પૉલિસીઓ જુઓ" "આ ડિવાઇસ %1$sની માલિકીનું છે.\n\nતમારા IT વ્યવસ્થાપક સેટિંગ, કૉર્પોરેટ ઍક્સેસ, ઍપ, તમારા ડિવાઇસ સાથે સંકળાયેલો ડેટા અને તમારા ડિવાઇસની સ્થાન માહિતીનું નિરીક્ષણ તેમજ તેને મેનેજ કરી શકે છે.\n\nવધુ માહિતી માટે, તમારા IT વ્યવસ્થાપકનો સંપર્ક કરો." "આ ડિવાઇસ તમારી સંસ્થાની માલિકીનું છે.\n\nતમારા IT વ્યવસ્થાપક સેટિંગ, કૉર્પોરેટ ઍક્સેસ, ઍપ, તમારા ડિવાઇસ સાથે સંકળાયેલો ડેટા અને તમારા ડિવાઇસની સ્થાન માહિતીનું નિરીક્ષણ તેમજ તેને મેનેજ કરી શકે છે.\n\nવધુ માહિતી માટે, તમારા IT વ્યવસ્થાપકનો સંપર્ક કરો." "તમારી સંસ્થાએ આ ઉપકરણ પર પ્રમાણપત્ર સત્તાધિકારી ઇન્સ્ટૉલ કર્યું છે. તમારા સુરક્ષિત નેટવર્ક ટ્રાફિકનું નિયમન થઈ શકે છે અથવા તેમાં ફેરફાર કરવામાં આવી શકે છે." diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 9b9b99fa0367a..a0cb9b2a072b1 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -240,9 +240,7 @@ "बैटरी का विवरण खोलें" "%d प्रति‍शत बैटरी." "%1$s प्रतिशत बैटरी बची है और आपके इस्तेमाल के हिसाब से यह %2$s में खत्म हो जाएगी" - - - + "बैटरी चार्ज हो रही है, %d प्रतिशत." "सिस्टम सेटिंग." "सूचनाएं." "पूरी सूचनाएं देखें" diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index a4881a7c0a231..d22c319cc0e55 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -968,10 +968,10 @@ "%1$s, %2$s" "Wi-Fi je isključen" "Bluetooth je isključen" - "Način Ne ometaj isključen" - "Način Ne ometaj uključilo je automatsko pravilo (%s)." - "Način Ne ometaj uključila je aplikacija (%s)." - "Način Ne ometaj uključilo je automatsko pravilo ili aplikacija." + "Način Ne uznemiravaj isključen" + "Način Ne uznemiravaj uključilo je automatsko pravilo (%s)." + "Način Ne uznemiravaj uključila je aplikacija (%s)." + "Način Ne uznemiravaj uključilo je automatsko pravilo ili aplikacija." "Do %s" "Zadrži" "Zamijeni" diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index 3fd28c0088be6..73e6101684b6b 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -28,7 +28,7 @@ "נותרו %s" "נותרו %1$s, נשארו בערך %2$s על סמך השימוש במכשיר" "נותרו %1$s, נשארו בערך %2$s" - "נותרו %s. הופעלה תכונת החיסכון בסוללה." + "נותרו %s. התכונה \'חיסכון בסוללה\' הופעלה." "‏לא ניתן לטעון באמצעות USB. ניתן להשתמש במטען שצורף למכשיר שלך." "‏לא ניתן לטעון באמצעות USB" "שימוש במטען שסופק עם המכשיר" @@ -40,7 +40,7 @@ "הגדרות" "Wi-Fi" "סיבוב אוטומטי של המסך" - "השתק" + "השתקה" "אוטומטי" "התראות" "‏Bluetooth קשור" @@ -109,14 +109,14 @@ "ביטול" "שיתוף" "הקלטת המסך בוטלה" - "הקלטת המסך נשמרה, יש להקיש כדי להציג" + "הקלטת המסך נשמרה, אפשר להקיש כדי לצפות בה" "שגיאה במחיקת הקלטת המסך" "קבלת ההרשאות נכשלה" "שגיאה בהפעלה של הקלטת המסך" "‏אפשרויות העברת קבצים ב-USB" "‏טען כנגן מדיה (MTP)" - "‏טען כמצלמה (PTP)" - "‏התקן את אפליקציית העברת הקבצים של Android עבור Mac" + "‏טעינה כמצלמה (PTP)" + "‏התקנת האפליקציה \'העברת קבצים ב-Android\' עבור Mac" "הקודם" "בית" "תפריט" @@ -134,7 +134,7 @@ "שליחה" "ניהול התראות" "פתח את הטלפון" - "פתח את המסייע הקולי" + "פתיחת האסיסטנט" "פתח את המצלמה" "ביטול" "אישור" @@ -156,13 +156,13 @@ "יש לנסות שוב. ניסיון %1$d מתוך %2$d." "הנתונים שלך יימחקו" "הזנת קו ביטול נעילה שגוי בניסיון הבא תגרום למחיקת הנתונים במכשיר." - "הזנת קוד גישה שגוי בניסיון הבא תגרום למחיקת הנתונים במכשיר." + "הזנת קוד אימות שגוי בניסיון הבא תגרום למחיקת הנתונים במכשיר." "הזנת סיסמה שגויה בניסיון הבא תגרום למחיקת הנתונים במכשיר." "הזנת קו ביטול נעילה שגוי בניסיון הבא תגרום למחיקת המשתמש הזה." "הזנת קוד גישה שגוי בניסיון הבא תגרום למחיקת המשתמש הזה." "הזנת סיסמה שגויה בניסיון הבא תגרום למחיקת המשתמש הזה." "הזנת קו ביטול נעילה שגוי בניסיון הבא תגרום למחיקת פרופיל העבודה והנתונים המשויכים אליו." - "הזנת קוד גישה שגוי בניסיון הבא תגרום למחיקת פרופיל העבודה והנתונים המשויכים אליו." + "הזנה של קוד אימות שגוי בניסיון הבא תגרום למחיקת פרופיל העבודה והנתונים המשויכים אליו." "הזנת סיסמה שגויה בניסיון הבא תגרום למחיקת פרופיל העבודה והנתונים המשויכים אליו." "נעשו יותר מדי ניסיונות שגויים. הנתונים במכשיר יימחקו." "נעשו יותר מדי ניסיונות שגויים. המשתמש הזה יימחק." @@ -212,7 +212,7 @@ "פועל." "כבוי." "מחובר." - "מתחבר." + "מתבצע חיבור." "GPRS" "HSPA" "3G" @@ -236,7 +236,7 @@ "מצב טיסה" "‏VPN פועל." "‏אין כרטיס SIM." - "רשת ספק משתנה" + "רשת הספק משתנה" "פתיחת פרטי סוללה" "%d אחוזים של סוללה." "רמת הטעינה בסוללה: %1$s אחוזים, הזמן הנותר המשוער על סמך השימוש שלך:%2$s" @@ -285,11 +285,11 @@ "‏Bluetooth נכבה." "‏Bluetooth הופעל." "דיווח מיקום כבוי." - "דיווח מיקום מופעל." + "התכונה \'דיווח מיקום\' מופעלת." "דיווח מיקום נכבה." "דיווח מיקום הופעל." "ההתראה נקבעה ל-%s." - "סגור לוח." + "סגירת הלוח." "יותר זמן." "פחות זמן." "הפנס כבוי." @@ -319,7 +319,7 @@ "הגעת למגבלת הנתונים שהגדרת. אתה כבר לא משתמש בחבילת גלישה.\n\nאם תמשיך, ייתכנו חיובים על שימוש בנתונים." "המשך" "‏מחפש GPS" - "‏מיקום מוגדר על ידי GPS" + "‏המיקום מוגדר על ידי GPS" "בקשות מיקום פעילות" "ההגדרה \'חיישנים כבויים\' פעילה" "הסרת כל ההתראות." @@ -336,7 +336,7 @@ "המסך יסתובב באופן אוטומטי." "המסך נעול כעת לרוחב." "המסך נעול כעת לאורך." - "המסך יסתובב כעת באופן אוטומטי." + "המסך יסתובב עכשיו באופן אוטומטי." "המסך נעול כעת לרוחב." "המסך נעול כעת לאורך." "מזנון קינוחים" @@ -361,12 +361,12 @@ "סיבוב אוטומטי" "סיבוב אוטומטי של המסך" "מצב %s" - "סיבוב נעול" + "סיבוב המסך נעול" "לאורך" "לרוחב" "שיטת קלט" "מיקום" - "מיקום כבוי" + "המיקום מושבת" "מכשיר מדיה" "RSSI" "שיחות חירום בלבד" @@ -381,7 +381,7 @@ "‏Wi-Fi כבוי" "‏Wi-Fi פועל" "‏אין רשתות Wi-Fi זמינות" - "ההפעלה מתבצעת…" + "בתהליך הפעלה…" "העברת מסך" "מעביר" "מכשיר ללא שם" @@ -413,13 +413,13 @@ "חבילת גלישה" "שימוש בנתונים" "מכסת נתונים נותרת" - "חריגה מההגבלה" + "חריגה מהמגבלה" "%s בשימוש" "הגבלה של %s" "אזהרה - %s" "פרופיל עבודה" "תאורת לילה" - "מופעל בשקיעה" + "התכונה מופעלת בשקיעה" "עד הזריחה" "מופעל בשעה %s" "עד %s" @@ -451,10 +451,10 @@ "כדי לא להפריע לך, המכשיר לא ירטוט ולא ישמיע שום צליל, חוץ מהתראות. המצב הזה לא ישפיע על צלילים שהם חלק מתוכן שבחרת להפעיל, כמו מוזיקה, סרטונים ומשחקים." "התאמה אישית" "פעולה זו מבטלת את כל הצלילים והרטט, כולל צלילים ורטט שמקורם בהתראות, מוזיקה, סרטונים ומשחקים. בכל מקרה, עדיין אפשר להתקשר." - "פעולה זו מבטלת את כל הצלילים והרטט, כולל בהתראות, מוזיקה, סרטונים ומשחקים." + "הפעולה הזו מבטלת את כל הצלילים והרטט, כולל בהתראות, מוזיקה, סרטונים ומשחקים." "+%d" "התראות בדחיפות נמוכה יותר בהמשך" - "הקש שוב כדי לפתוח" + "יש להקיש שוב כדי לפתוח את ההתראה" "צריך להחליק כדי לפתוח" "יש להחליק למעלה כדי לנסות שוב" "המכשיר הזה שייך לארגון שלך" @@ -492,7 +492,7 @@ "ניתוק משתמש" "צא מהמשתמש הנוכחי" "נתק משתמש" - "האם להוסיף משתמש חדש?" + "להוסיף משתמש חדש?" "בעת הוספת משתמש חדש, על משתמש זה להגדיר את השטח שלו.\n\nכל משתמש יכול לעדכן אפליקציות עבור כל המשתמשים האחרים." "הגעת למגבלת המשתמשים שניתן להוסיף" @@ -506,13 +506,13 @@ "הסרה" "תכונת החיסכון בסוללה פועלת" "מפחית את הביצועים ונתונים ברקע" - "כיבוי תכונת החיסכון בסוללה" + "השבתת התכונה \'חיסכון בסוללה\'" "‏לאפליקציית %s תהיה גישה לכל המידע הגלוי במסך שלך ולכל תוכן שמופעל במכשיר שלך בזמן הקלטה או העברה (casting). המידע הזה כולל פרטים כמו סיסמאות, פרטי תשלום, תמונות, הודעות ואודיו שמושמע מהמכשיר." "‏לשירות שמספק את הפונקציה הזו תהיה גישה לכל הפרטים שגלויים במסך שלך או מופעלים מהמכשיר שלך בזמן הקלטה או העברה (cast). זה כולל פרטים כמו סיסמאות, פרטי תשלום, תמונות, הודעות ואודיו שמושמע מהמכשיר." "‏להתחיל להקליט או להעביר (cast)?" "‏להתחיל להקליט או להעביר (cast) באמצעות %s?" "אל תציג שוב" - "ניקוי הכל" + "ניקוי הכול" "ניהול" "היסטוריה" "התראות חדשות" @@ -527,7 +527,7 @@ "ייתכן שהרשת נמצאת במעקב" "ייתכן שהרשת מנוטרת" "הארגון שלך הוא הבעלים של מכשיר זה והוא עשוי לנטר את התנועה ברשת" - "הארגון %1$s הוא הבעלים של מכשיר זה והוא עשוי לנטר את התנועה ברשת" + "הארגון %1$s הוא הבעלים של המכשיר הזה והוא עשוי לנטר את התנועה ברשת" "המכשיר הזה שייך לארגון שלך, והוא מחובר ל-%1$s" "המכשיר הזה שייך לארגון %1$s והוא מחובר ל-%2$s" "המכשיר הזה שייך לארגון שלך" @@ -548,7 +548,7 @@ "רישום התנועה ברשת" "‏אישורי CA" "‏השבת VPN" - "‏נתק את ה-VPN" + "‏ניתוק ה-VPN" "הצג מדיניות" "‏המכשיר הזה שייך לארגון %1$s.\n\nמנהל ה-IT יכול לנטר ולנהל הגדרות, גישה ארגונית, אפליקציות, נתונים המשויכים למכשיר ומידע על מיקום המכשיר.\n\nלמידע נוסף, יש לפנות למנהל ה-IT." "‏המכשיר הזה שייך לארגון שלך.\n\nמנהל ה-IT יכול לנטר ולנהל הגדרות, גישה ארגונית, אפליקציות, נתונים המשויכים למכשיר ומידע על מיקום המכשיר.\n\nלמידע נוסף, יש לפנות למנהל ה-IT." @@ -556,7 +556,7 @@ "הארגון שלך התקין רשות אישורים בפרופיל העבודה. ניתן לעקוב אחר התנועה ברשת המאובטחת או לשנות אותה." "במכשיר זה מותקנת רשות אישורים. ניתן לעקוב אחר התנועה ברשת המאובטחת או לשנות אותה." "מנהל המערכת הפעיל את התכונה \'רישום התנועה ברשת\', שמנטרת את תנועת הנתונים במכשיר." - "אתה מחובר לאפליקציה %1$s, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים." + "התחברת לאפליקציה %1$s, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים." "אתה מחובר לאפליקציות %1$s ו-%2$s, שיכולות לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים." "פרופיל העבודה שלך מחובר לאפליקציה %1$s, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים." "הפרופיל האישי שלך מחובר לאפליקציה %1$s, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים." @@ -565,22 +565,22 @@ "מנהל המערכת יכול לנטר ולנהל הגדרות, גישה ארגונית, אפליקציות, נתונים המשויכים למכשיר ומידע על מיקום המכשיר." " " "למידע נוסף" - "אתה מחובר לאפליקציה %1$s, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים." + "התחברת לאפליקציה %1$s, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים." " " "‏להגדרות ה-VPN" " " - "פתח את פרטי הכניסה המהימנים" + "פתיחה של פרטי הכניסה המהימנים" "מנהל המערכת הפעיל את תכונת רישום התנועה ברשת, שמנטרת את תנועת הנתונים במכשיר.\n\nלמידע נוסף, צור קשר עם מנהל המערכת." "‏נתת לאפליקציה כלשהי הרשאה להגדיר חיבור ‏VPN‏.\n\nהאפליקציה הזו יכולה לעקוב אחר הפעילות שלך ברשת ובמכשיר, כולל הודעות אימייל, אפליקציות ואתרים." "‏פרופיל העבודה שלך מנוהל על-ידי %1$s.\n\n מנהל המערכת שלך יכול לעקוב אחרי הפעילות שלך ברשת, כולל פעילות באימייל, באפליקציות ובאתרים.\n\n למידע נוסף, צור קשר עם מנהל המערכת.\n\nבנוסף, אתה מחובר ל-VPN, שגם באמצעותו ניתן לעקוב אחרי הפעילות שלך ברשת." "VPN" "אתה מחובר לאפליקציה %1$s, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים." - "אתה מחובר לאפליקציה %1$s, שיכולה לעקוב אחר הפעילות שלך ברשת הפרטית, כולל הודעות אימייל, אפליקציות ואתרים." + "התחברת לאפליקציית %1$s, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים." "אתה מחובר לאפליקציה %1$s, שיכולה לעקוב אחר הפעילות שלך ברשת הפרטית, כולל הודעות אימייל, אפליקציות ואתרים." "פרופיל העבודה שלך מנוהל על ידי %1$s. הפרופיל מחובר לאפליקציה %2$s, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים.\n\nלמידע נוסף, פנה למנהל המערכת." "פרופיל העבודה שלך מנוהל על ידי %1$s. הפרופיל מחובר לאפליקציה %2$s, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים.\n\nהפרופיל מחובר גם לאפליקציה %3$s, שיכולה לעקוב אחר הפעילות שלך ברשת." "הנעילה נמנעת על ידי סביבה אמינה" - "המכשיר יישאר נעול עד שתבטל את נעילתו באופן ידני" + "המכשיר יישאר נעול עד שהנעילה שלו תבוטל באופן ידני" "%1$s\n%2$s" "קבלה מהירה של התראות" "צפה בהן לפני שתבטל נעילה" @@ -589,7 +589,7 @@ "%1$s‏. %2$s" "כבה עכשיו" "הגדרות צליל" - "הרחב" + "הרחבה" "כווץ" "הוספת כתוביות אוטומטית למדיה" "סגירת הטיפ לגבי כתוביות" @@ -613,7 +613,7 @@ "האפליקציה הוצמדה" "הצמדת האפליקציה בוטלה" "להסתיר%1$s?" - "יופיע מחדש בפעם הבאה שתפעיל את האפשרות בהגדרות." + "יופיע מחדש בפעם הבאה שהאפשרות הזו תופעל בהגדרות." "הסתר" "שיחה" "מערכת" @@ -631,14 +631,14 @@ "הטלפון במצב רטט" "הטלפון מושתק" "‏%1$s. הקש כדי לבטל את ההשתקה." - "‏%1$s. הקש כדי להגדיר רטט. ייתכן ששירותי הנגישות מושתקים." + "‏%1$s. צריך להקיש כדי להגדיר רטט. ייתכן ששירותי הנגישות מושתקים." "‏%1$s. הקש כדי להשתיק. ייתכן ששירותי הנגישות מושתקים." - "‏%1$s. הקש כדי להעביר למצב רטט." - "‏%1$s. הקש כדי להשתיק." + "‏%1$s. יש להקיש כדי להעביר למצב רטט." + "‏%1$s. יש להקיש כדי להשתיק." "השתקה" "ביטול ההשתקה" "רטט" - "‏בקרי עוצמת שמע של %s" + "‏בקרי עוצמת קול של %s" "הטלפון יצלצל כשמתקבלות שיחות והתראות (%1$s)" "פלט מדיה" "פלט שיחת טלפון" @@ -654,16 +654,16 @@ "שורת סטטוס" "סקירה" "מצב הדגמה בממשק המשתמש של המערכת" - "הפעל מצב הדגמה" - "הצג מצב הדגמה" + "הפעלת מצב הדגמה" + "הצגת מצב הדגמה" "אתרנט" "התראה" "פרופיל עבודה" "מצב טיסה" - "הוסף אריח" + "הוספת אריח" "אריח שידור" - "לא תשמע את ההתראה הבאה שלך %1$s, אלא אם תשבית קודם את ההגדרה הזו" - "לא תשמע את ההתראה הבאה שלך %1$s" + "כדי לשמוע את ההתראה הבאה שלך %1$s, עליך להשבית את התכונה הזו" + "לא ניתן יהיה לשמוע את ההתראה הבאה שלך %1$s" "בשעה %1$s" "ב-%1$s" "הגדרות מהירות, %s." @@ -677,11 +677,11 @@ "הסר מההגדרות" "‏האם להסיר את System UI Tuner ולהפסיק להשתמש בכל התכונות שלו?" "האפליקציה אינה מותקנת במכשיר" - "הצג שניות בשעון" + "הצגת שניות בשעון" "הצג שניות בשעון בשורת הסטטוס. פעולה זו עשויה להשפיע על אורך חיי הסוללה." "סידור מחדש של הגדרות מהירות" "הצג בהירות בהגדרות מהירות" - "ניסיוני" + "ניסיוניות" "‏האם להפעיל את ה-Bluetooth?" "‏כדי לחבר את המקלדת לטאבלט, תחילה עליך להפעיל את ה-Bluetooth." "הפעלה" @@ -778,7 +778,7 @@ "שימוש בסוללה" "תכונת החיסכון בסוללה אינה זמינה בעת טעינת המכשיר" "חיסכון בסוללה" - "מפחית את רמת הביצועים ואת נתוני הרקע" + "מפחיתה את רמת הביצועים ואת נתוני הרקע" "לחצן %1$s" "דף הבית" "הקודם" @@ -873,7 +873,7 @@ "הצג שעות, דקות ושניות" "הצג שעות ודקות (ברירת מחדל)" - "אל תציג את הסמל הזה" + "לא להציג את הסמל הזה" "הצג תמיד באחוזים" @@ -910,7 +910,7 @@ "פתיחה של \'הגדרות מהירות\'." "סגירה של \'הגדרות מהירות\'." "הגדרת התראה." - "מחובר בתור %s" + "בוצעה כניסה בתור %s" "אין אינטרנט" "פתיחת פרטים." "לא זמין כי %s" @@ -918,22 +918,22 @@ "עריכת סדר ההגדרות." "דף %1$d מתוך %2$d" "מסך נעילה" - "הרחב" + "הרחבה" "מזער" "סגירה" "הגדרות" "גרור למטה כדי לסגור" "תפריט" "%s במצב תמונה בתוך תמונה" - "אם אינך רוצה שהתכונה הזו תשמש את %s, יש להקיש כדי לפתוח את ההגדרות ולכבות את התכונה." - "הפעל" - "השהה" + "אם אינך רוצה שהתכונה הזו תשמש את %s, יש להקיש כדי לפתוח את ההגדרות ולהשבית את התכונה." + "הפעלה" + "השהיה" "אפשר לדלג אל הבא" "אפשר לדלג אל הקודם" "שינוי גודל" "הטלפון כבה עקב התחממות" "הטלפון פועל כרגיל עכשיו.\nיש להקיש כדי להציג מידע נוסף" - "הטלפון שלך התחמם יותר מדי וכבה כדי להתקרר. הטלפון פועל כרגיל עכשיו.\n\nייתכן שהטלפון יתחמם יותר מדי אם:\n • תשתמש באפליקציות עתירות משאבים (כגון משחקים, אפליקציות וידאו או אפליקציות ניווט)\n • תוריד או תעלה קבצים גדולים\n • תשתמש בטלפון בטמפרטורות גבוהות" + "הטלפון שלך התחמם יותר מדי וכבה כדי להתקרר. הטלפון פועל כרגיל עכשיו.\n\nייתכן שהטלפון יתחמם יותר מדי אם:\n • משתמשים באפליקציות עתירות משאבים (כגון משחקים, אפליקציות וידאו או אפליקציות ניווט)\n • מורידים או מעלים קבצים גדולים\n • משתמשים בטלפון בסביבה עם טמפרטורות גבוהות" "לצפייה בשלבי הטיפול" "הטלפון מתחמם" "חלק מהתכונות מוגבלות כל עוד הטלפון מתקרר.\nיש להקיש כדי להציג מידע נוסף" @@ -987,7 +987,7 @@ "הספק שלך" "יש אפליקציה שמסתירה את בקשת ההרשאה, ולכן להגדרות אין אפשרות לאמת את התשובה." "האם לאפשר ל-%1$s להציג חלקים מ-%2$s?" - "- תהיה לה אפשרות לקרוא מידע מ-%1$s" + "- תהיה לה אפשרות לקרוא מידע מאפליקציית %1$s" "- תהיה לה יכולת לנקוט פעולה בתוך %1$s" "יש לאשר ל-%1$s להראות חלקים מכל אפליציה שהיא" "אני רוצה לאשר" @@ -1011,7 +1011,7 @@ "שירותים למכשיר" "ללא שם" "צריך להקיש כדי להפעיל מחדש את האפליקציה הזו ולעבור למסך מלא." - "הגדרות בשביל בועות של %1$s" + "הגדרות לבועות של %1$s" "גלישה" "הוספה בחזרה לערימה" "ניהול" @@ -1060,7 +1060,7 @@ "סומן כהעדפה, במיקום %d" "הוסר מהמועדפים" "להוסיף למועדפים" - "להוסיף למועדפים" + "להסיר מהמועדפים" "העברה למיקום %d" "פקדים" "יש לבחור פקדים לגישה מתפריט ההפעלה" diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index 1f16013688cee..685cbfcca91ae 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -275,8 +275,8 @@ "үнсіз" "оятқыштар ғана" "Мазаламау." - "\"Мазаламау\" режимі өшірілді." - "\"Мазаламау\" режимі қосылды." + "Мазаламау режимі өшірілді." + "Мазаламау режимі қосылды." "Bluetooth." "Bluetooth өшірулі." "Bluetooth қосулы." @@ -514,7 +514,7 @@ "Хабарландырулар" "Әңгімелер" "Барлық дыбыссыз хабарландыруларды өшіру" - "Хабарландырулар \"Мазаламау\" режимінде кідіртілді" + "Хабарландырулар Мазаламау режимінде кідіртілді" "Қазір бастау" "Хабарландырулар жоқ" "Профиль бақылануы мүмкін" @@ -814,7 +814,7 @@ "Дыбыс деңгейін басқару элементтерімен бірге көрсету" "Мазаламау" "Дыбыс деңгейі түймелерінің төте жолы" - "Дыбысы арттырылған кезде, \"Мазаламау\" режимінен шығу" + "Дыбысы арттырылған кезде, Мазаламау режимінен шығу" "Батарея" "Сағат" "Құлақаспап жинағы" @@ -963,10 +963,10 @@ "%1$s, %2$s" "Wi-Fi өшірулі" "Bluetooth өшірулі" - "\"Мазаламау\" режимі өшірулі" - "\"Мазаламау\" режимі (%s) автоматты ережесі арқылы қосылды." - "\"Мазаламау\" режимі (%s) қолданбасы арқылы қосылды." - "\"Мазаламау\" режимі автоматты ереже немесе қолданба арқылы қосылды." + "Мазаламау режимі өшірулі" + "Мазаламау режимі (%s) автоматты ережесі арқылы қосылды." + "Мазаламау режимі (%s) қолданбасы арқылы қосылды." + "Мазаламау режимі автоматты ереже немесе қолданба арқылы қосылды." "%s дейін" "Қалсын" "Ауыстыру" @@ -1028,7 +1028,7 @@ "Әңгімелер бөлімінің жоғарғы жағында көрсетіледі." "Профиль суреті құлыптаулы экранда көрсетіледі." "Қолданбалар терезесінің бергі жағынан қалқыма хабарлар түрінде көрсетіледі." - "\"Мазаламау\" режимінде көрсетіледі." + "Мазаламау режимінде көрсетіледі." "Түсінікті" "Параметрлер" "Ұлғайту терезесін қабаттастыру" diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index b281f82d5ce8c..d1b6a09b4d675 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -671,8 +671,8 @@ "Жөндөөлөрдөн алып салуу" "System UI Tuner Жөндөөлөрдөн өчүрүлүп, анын бардык функциялары токтотулсунбу?" "Колдонмо сиздин түзмөгүңүздө орнотулган эмес" - "Сааттын секунддары көрсөтүлсүн" - "Абал тилкесинен сааттын секунддары көрсөтүлсүн. Батареянын кубаты көбүрөөк сарпталышы мүмкүн." + "Сааттын секунддары көрүнсүн" + "Абал тилкесинен сааттын секунддары көрүнсүн. Батареянын кубаты көбүрөөк сарпталышы мүмкүн." "Ыкчам жөндөөлөрдү кайра коюу" "Ыкчам жөндөөлөрдөн жарык деңгээлин көрсөтүү" "Сынамык" @@ -681,7 +681,7 @@ "Күйгүзүү" "Үнсүз көрүнөт" "Бардык билдирмелерди бөгөттөө" - "Үнү менен көрсөтүлсүн" + "Үнү менен көрүнсүн" "Үнү менен көрсөтүлүп бөгөттөлбөсүн" "Эскертмелерди башкаруу каражаттары" "Күйүк" @@ -811,7 +811,7 @@ "Музыка" "YouTube" "Жылнаама" - "Үн көзөмөлдөгүчтөрү менен көрсөтүлсүн" + "Үн көзөмөлдөгүчтөрү менен көрүнсүн" "Тынчымды алба" "Үндү көзөмөлдөөчү баскычтардын кыска жолдору" "Үн катуулатылганда \"Тынчымды алба\" режиминен чыгуу" @@ -866,8 +866,8 @@ "Бул сүрөтчө көрүнбөсүн" - "Ар дайым пайызы көрсөтүлсүн" - "Кубаттоо учурунда пайызы көрсөтүлсүн (демейки)" + "Ар дайым пайызы көрүнсүн" + "Кубаттоо учурунда пайызы көрүнсүн (демейки)" "Бул сүрөтчө көрүнбөсүн" "Анча маанилүү эмес билдирменин сүрөтчөлөрүн көрсөтүү" diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index 8026f78be198d..dc07b609756da 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -712,7 +712,7 @@ "ബബ്ൾ" "ശബ്ദമോ വൈബ്രേഷനോ ഇല്ല" "ശബ്‌ദമോ വൈബ്രേഷനോ ഇല്ല, സംഭാഷണ വിഭാഗത്തിന് താഴെയായി ദൃശ്യമാകും" - "ഫോൺ ക്രമീകരണം അടിസ്ഥാനമാക്കി റിംഗ് ചെയ്‌തേക്കാം അല്ലെങ്കിൽ വൈബ്രേറ്റ് ചെയ്‌തേക്കാം" + "ഫോൺ ക്രമീകരണം അടിസ്ഥാനമാക്കി റിംഗ്/വൈബ്രേറ്റ് ചെയ്യും" "ഫോൺ ക്രമീകരണം അടിസ്ഥാനമാക്കി റിംഗ് ചെയ്‌തേക്കാം അല്ലെങ്കിൽ വൈബ്രേറ്റ് ചെയ്‌തേക്കാം. %1$s-ൽ നിന്നുള്ള സംഭാഷണങ്ങൾ ഡിഫോൾട്ടായി ബബ്ൾ ആവുന്നു." "ഈ ഉള്ളടക്കത്തിലേക്ക് ഒരു ഫ്ലോട്ടിംഗ് കുറുക്കുവഴി ഉപയോഗിച്ച് നിങ്ങളുടെ ശ്രദ്ധ നിലനിർത്തുന്നു." "സംഭാഷണ വിഭാഗത്തിന് മുകളിലായി കാണിക്കുന്നു, ഫ്ലോട്ടിംഗ് ബബിളായി ദൃശ്യമാകുന്നു, ലോക്ക് സ്ക്രീനിൽ പ്രൊഫൈൽ ചിത്രം പ്രദർശിപ്പിക്കുന്നു" diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index dcd665a5c1449..4af7294beecfb 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -510,7 +510,7 @@ "व्यवस्थित गर्नुहोस्" "इतिहास" "नयाँ" - "मौन" + "साइलेन्ट" "सूचनाहरू" "वार्तालापहरू" "सबै मौन सूचनाहरू हटाउनुहोस्" @@ -701,19 +701,19 @@ "रोक लगाउनुहोस्" "देखाउने क्रम जारी राख्नुहोस्" "सानो बनाउनुहोस्" - "मौन" + "साइलेन्ट" "मौन रहनुहोस्" "सतर्क गराउने" "सर्तक गराइरहनुहोस्" "सूचनाहरू निष्क्रिय पार्नुहोस्" "यो एपका सूचनाहरू देखाउने क्रम जारी राख्ने हो?" - "मौन" + "साइलेन्ट" "पूर्वनिर्धारित" "बबल" "न घन्टी बज्छ न त कम्पन नै हुन्छ" "न घन्टी बज्छ न त कम्पन नै हुन्छ र वार्तालाप खण्डको तलतिर देखा पर्छ" - "फोनको सेटिङका आधारमा घन्टी बज्न वा कम्पन हुन सक्छ" - "फोनको सेटिङका आधारमा घन्टी बज्न वा कम्पन हुन सक्छ। %1$s का वार्तालापहरू पूर्वनिर्धारित रूपमा बबलमा देखाइन्छन्।" + "फोनको सेटिङका आधारमा घन्टी बज्न वा भाइब्रेट हुन सक्छ" + "फोनको सेटिङका आधारमा घन्टी बज्न वा भाइब्रेट हुन सक्छ। %1$s का वार्तालापहरू पूर्वनिर्धारित रूपमा बबलमा देखाइन्छन्।" "फ्लोटिङ सर्टकटमार्फत यो सामग्रीतर्फ तपाईंको ध्यान आकर्षित गर्दछ।" "वार्तालाप खण्डको सिरानमा देखा पर्छ, तैरने बबलका रूपमा देखा पर्छ, लक स्क्रिनमा प्रोफाइल फोटो देखिन्छ" "सेटिङ" diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index 2e79d276e5378..aa85421145288 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -54,7 +54,7 @@ "%1$s openen om %2$s te verwerken?" "Er werken geen geïnstalleerde apps met dit USB-accessoire. Meer informatie op: %1$s" "USB-accessoire" - "Weergeven" + "Bekijken" "%1$s altijd openen wanneer %2$s is verbonden" "%1$s altijd openen wanneer %2$s is verbonden" "USB-foutopsporing toestaan?" @@ -101,7 +101,7 @@ "Starten" "Scherm opnemen" "Scherm en audio opnemen" - "Tikken op het scherm weergeven" + "Tikken op het scherm tonen" "Tik om te stoppen" "Stoppen" "Pauzeren" @@ -472,7 +472,7 @@ "Gebruiker wijzigen" "Schakelen tussen gebruikers, huidige gebruiker %s" "Huidige gebruiker %s" - "Profiel weergeven" + "Profiel tonen" "Gebruiker toevoegen" "Nieuwe gebruiker" "Gast verwijderen?" @@ -505,7 +505,7 @@ "De service die deze functie levert, krijgt toegang tot alle informatie die zichtbaar is op je scherm of die wordt afgespeeld vanaf je apparaat tijdens het opnemen of casten. Dit omvat informatie zoals wachtwoorden, betalingsgegevens, foto\'s, berichten en audio die je afspeelt." "Beginnen met opnemen of casten?" "Beginnen met opnemen of casten met %s?" - "Niet opnieuw weergeven" + "Niet opnieuw tonen" "Alles wissen" "Beheren" "Geschiedenis" @@ -607,7 +607,7 @@ "App vastgezet" "App losgemaakt" "%1$s verbergen?" - "Deze wordt opnieuw weergegeven zodra u de instelling weer inschakelt." + "Deze zie je opnieuw zodra je de instelling weer aanzet." "Verbergen" "Bellen" "Systeem" @@ -642,14 +642,14 @@ "Wifi" "Bluetooth en wifi" "Systeem-UI-tuner" - "Percentage ingebouwde batterij weergeven" - "Accupercentage weergeven in het icoon op de statusbalk wanneer er niet wordt opgeladen" + "Percentage ingebouwde batterij tonen" + "Batterijniveau (percentage) tonen in het icoon op de statusbalk wanneer niet wordt opgeladen" "Snelle instellingen" "Statusbalk" "Overzicht" "Demomodus voor systeemgebruikersinterface" "Demomodus inschakelen" - "Demomodus weergeven" + "Demomodus tonen" "Ethernet" "Wekker" "Werkprofiel" @@ -671,10 +671,10 @@ "Verwijderen uit Instellingen" "Systeem-UI-tuner uit Instellingen verwijderen en het gebruik van alle functies daarvan stopzetten?" "Deze app is niet geïnstalleerd op je apparaat" - "Klokseconden weergeven" - "Klokseconden op de statusbalk weergeven. Kan van invloed zijn op de accuduur." + "Klokseconden tonen" + "Klokseconden op de statusbalk tonen. Kan van invloed zijn op de batterijduur." "Snelle instellingen opnieuw indelen" - "Helderheid weergeven in Snelle instellingen" + "Helderheid tonen in Snelle instellingen" "Experimenteel" "Bluetooth inschakelen?" "Als je je toetsenbord wilt verbinden met je tablet, moet je eerst Bluetooth inschakelen." @@ -686,46 +686,46 @@ "Beheeropties voor meldingen met betrekking tot stroomverbruik" "Aan" "Uit" - "Met beheeropties voor meldingen met betrekking tot stroomverbruik kun je een belangrijkheidsniveau van 0 tot 5 instellen voor de meldingen van een app. \n\n""Niveau 5"" \n- Boven aan de lijst met meldingen weergeven \n- Onderbreking op volledig scherm toestaan \n- Altijd korte weergave \n\n""Niveau 4"" \n- Geen onderbreking op volledig scherm \n- Altijd korte weergave \n\n""Niveau 3"" \n- Geen onderbreking op volledig scherm \n- Nooit korte weergave \n\n""Niveau 2"" \n- Geen onderbreking op volledig scherm \n- Nooit korte weergave \n- Nooit geluid laten horen of trillen \n\n""Niveau 1"" \n- Geen onderbreking op volledig scherm \n- Nooit korte weergave \n- Nooit geluid laten horen of trillen \n- Verbergen op vergrendelscherm en statusbalk \n- Onder aan de lijst met meldingen weergeven \n\n""Niveau 0"" \n- Alle meldingen van de app blokkeren" + "Met beheeropties voor meldingen met betrekking tot stroomverbruik kun je een belangrijkheidsniveau van 0 tot 5 instellen voor de meldingen van een app. \n\n""Niveau 5"" \n- Bovenaan de lijst met meldingen tonen \n- Onderbreking op volledig scherm toestaan \n- Altijd korte weergave \n\n""Niveau 4"" \n- Geen onderbreking op volledig scherm \n- Altijd korte weergave \n\n""Niveau 3"" \n- Geen onderbreking op volledig scherm \n- Nooit korte weergave \n\n""Niveau 2"" \n- Geen onderbreking op volledig scherm \n- Nooit korte weergave \n- Nooit geluid laten horen of trillen \n\n""Niveau 1"" \n- Geen onderbreking op volledig scherm \n- Nooit korte weergave \n- Nooit geluid laten horen of trillen \n- Verbergen op vergrendelscherm en statusbalk \n- Onderaan de lijst met meldingen tonen \n\n""Niveau 0"" \n- Alle meldingen van de app blokkeren" "Meldingen" - "Meldingen worden niet meer weergegeven" + "Je ziet deze meldingen niet meer" "Deze meldingen worden geminimaliseerd" - "Deze meldingen worden zonder geluid weergegeven" + "Deze meldingen worden zonder geluid getoond" "Deze meldingen stellen je op de hoogte" - "Meestal sluit je deze meldingen. \nWil je ze blijven weergeven?" + "Meestal sluit je deze meldingen. \nWil je ze blijven tonen?" "Klaar" "Toepassen" - "Deze meldingen blijven weergeven?" + "Deze meldingen blijven tonen?" "Meldingen stoppen" "Zonder geluid afleveren" "Blokkeren" - "Blijven weergeven" + "Blijven tonen" "Minimaliseren" "Stil" "Stil blijven" "Waarschuwen" "Blijven waarschuwen" "Meldingen uitschakelen" - "Meldingen van deze app blijven weergeven?" + "Meldingen van deze app blijven tonen?" "Stil" "Standaard" "Bubbel" "Geen geluid of trilling" - "Geen geluid of trilling en wordt lager in het gedeelte met gesprekken weergegeven" + "Geen geluid of trilling en wordt lager in het gedeelte met gesprekken getoond" "Kan overgaan of trillen op basis van de telefooninstellingen" - "Kan overgaan of trillen op basis van de telefooninstellingen. Gesprekken uit %1$s worden standaard als bubbels weergegeven." + "Kan overgaan of trillen op basis van de telefooninstellingen. Gesprekken uit %1$s worden standaard als bubbels getoond." "Trekt de aandacht met een zwevende snelkoppeling naar deze content." "Verschijnt als zwevende bubbel bovenaan het gespreksgedeelte en toont profielfoto op vergrendelscherm" "Instellingen" "Prioriteit" "%1$s ondersteunt geen gespreksfuncties" "Geen recente bubbels" - "Recente bubbels en gesloten bubbels worden hier weergegeven" + "Recente bubbels en gesloten bubbels zie je hier" "Deze meldingen kunnen niet worden aangepast." "Deze groep meldingen kan hier niet worden ingesteld" "Melding via proxy" "Alle meldingen van %1$s" - "Meer weergeven" + "Meer tonen" "Deze app gebruikt de camera." "Deze app gebruikt de microfoon." "Deze app wordt over andere apps op je scherm heen weergegeven." @@ -747,7 +747,7 @@ "Geen belangrijk gesprek" "Zonder geluid" "Waarschuwen" - "Ballon weergeven" + "Ballon tonen" "Bubbels verwijderen" "Toevoegen aan startscherm" "%1$s %2$s" @@ -811,7 +811,7 @@ "Muziek" "YouTube" "Agenda" - "Weergeven met volumeknoppen" + "Tonen met volumeknoppen" "Niet storen" "Volumeknoppen als sneltoets" "\'Niet storen\' afsluiten bij volume omhoog" @@ -861,16 +861,16 @@ "Bewerken" "Tijd" - "Uren, minuten en seconden weergeven" - "Uren en minuten weergeven (standaard)" - "Dit icoon niet weergeven" + "Uren, minuten en seconden tonen" + "Uren en minuten tonen (standaard)" + "Dit icoon niet tonen" - "Percentage altijd weergeven" - "Percentage weergeven tijdens opladen (standaard)" - "Dit icoon niet weergeven" + "Percentage altijd tonen" + "Percentage tonen tijdens opladen (standaard)" + "Dit icoon niet tonen" - "Pictogrammen voor meldingen met lage prioriteit weergeven" + "Iconen voor meldingen met lage prioriteit tonen" "Overig" "Scheiding voor gesplitst scherm" "Linkerscherm op volledig scherm" @@ -976,10 +976,10 @@ "Je hebt dan geen toegang meer tot data of internet via %s. Internet is alleen nog beschikbaar via wifi." "je provider" "Aangezien een app een rechtenverzoek afdekt, kan Instellingen je reactie niet verifiëren." - "%1$s toestaan om segmenten van %2$s weer te geven?" + "%1$s toestaan om segmenten van %2$s te tonen?" "- Deze kan informatie lezen van %1$s" "- Deze kan acties uitvoeren in %1$s" - "%1$s toestaan om segmenten van apps weer te geven" + "%1$s toestaan om segmenten van apps te tonen" "Toestaan" "Weigeren" "Tikken om Batterijbesparing in te schakelen" @@ -1013,9 +1013,9 @@ "Naar linksonder verplaatsen" "Naar rechtsonder verplaatsen" "Bubbel sluiten" - "Gesprekken niet in bubbels weergeven" + "Gesprekken niet in bubbels tonen" "Chatten met bubbels" - "Nieuwe gesprekken worden weergegeven als zwevende iconen of \'bubbels\'. Tik om een bubbel te openen. Sleep om de bubbel te verplaatsen." + "Nieuwe gesprekken worden als zwevende iconen of bubbels getoond. Tik om een bubbel te openen. Sleep om een bubbel te verplaatsen." "Beheer bubbels wanneer je wilt" "Tik op Beheren om bubbels van deze app uit te schakelen" "OK" @@ -1025,9 +1025,9 @@ "Stand-by" "Gesprek ingesteld als prioriteit" "Prioriteitsgesprekken:" - "Worden bovenaan het gespreksgedeelte weergegeven" + "Worden bovenaan het gespreksgedeelte getoond" "Tonen profielafbeelding op vergrendelscherm" - "Worden als zwevende ballon weergegeven vóór apps" + "Zijn als zwevende ballon zichtbaar vóór apps" "Onderbreken \'Niet storen\'" "OK" "Instellingen" diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index e3aa3b0ba3dd4..7da4635b77e93 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -708,7 +708,7 @@ "ਸੂਚਨਾਵਾਂ ਬੰਦ ਕਰੋ" "ਕੀ ਇਸ ਐਪ ਤੋਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਦਿਖਾਉਣਾ ਜਾਰੀ ਰੱਖਣਾ ਹੈ?" "ਸ਼ਾਂਤ" - "ਪੂਰਵ-ਨਿਰਧਾਰਤ" + "ਪੂਰਵ-ਨਿਰਧਾਰਿਤ" "ਬੁਲਬੁਲਾ" "ਕੋਈ ਧੁਨੀ ਜਾਂ ਥਰਥਰਾਹਟ ਨਹੀਂ" "ਕੋਈ ਧੁਨੀ ਜਾਂ ਥਰਥਰਾਹਟ ਨਹੀਂ ਅਤੇ ਸੂਚਨਾਵਾਂ ਗੱਲਬਾਤ ਸੈਕਸ਼ਨ ਵਿੱਚ ਹੇਠਲੇ ਪਾਸੇ ਦਿਸਦੀਆਂ ਹਨ" diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index 1cc6df23c1ac1..865821f9f2a72 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -749,7 +749,7 @@ "అలర్ట్ చేయడం" "బబుల్‌ను చూపించు" "బబుల్స్ తీసివేయి" - "హోమ్ స్క్రీన్‌కు జోడించు" + "హోమ్ స్క్రీన్‌కు జోడించండి" "%1$s %2$s" "నోటిఫికేషన్ నియంత్రణలు" "నోటిఫికేషన్ తాత్కాలిక ఆపివేత ఎంపికలు" From 15bd86ad6dfce25a4e9115da0df5bf86d0fffce3 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 27 Mar 2021 11:12:31 +0000 Subject: [PATCH 257/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ieb647bf8840a48d6590bfb8539c9088edd7e6c4a --- .../res-keyguard/values-iw/strings.xml | 66 +++++++++---------- .../res-keyguard/values-pa/strings.xml | 2 +- 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/packages/SystemUI/res-keyguard/values-iw/strings.xml b/packages/SystemUI/res-keyguard/values-iw/strings.xml index 8780dc5e3c01b..56a71d4f543cc 100644 --- a/packages/SystemUI/res-keyguard/values-iw/strings.xml +++ b/packages/SystemUI/res-keyguard/values-iw/strings.xml @@ -21,17 +21,17 @@ "מגן מקלדת" - "הזן את קוד הגישה" + "יש להזין את קוד האימות" "‏הזן את קוד ה-PUK של כרטיס ה-SIM ולאחר מכן הזן קוד גישה חדש" "‏קוד PUK של כרטיס SIM" "‏קוד גישה חדש לכרטיס ה-SIM" "גע כדי להזין את הסיסמה" "הזן סיסמה לביטול הנעילה" "הזן את קוד הגישה לביטול הנעילה" - "הזנת קוד גישה" + "צריך להזין קוד אימות" "יש להזין קו ביטול נעילה" "יש להזין סיסמה" - "קוד הגישה שגוי" + "קוד האימות שגוי" "כרטיס לא חוקי." "הסוללה טעונה" "%s • בטעינה אלחוטית" @@ -43,14 +43,14 @@ "לחץ על \'תפריט\' כדי לבטל את הנעילה." "הרשת נעולה" "‏אין כרטיס SIM" - "‏הכנס כרטיס SIM." + "‏יש להכניס כרטיס SIM." "‏כרטיס ה-SIM חסר או שלא ניתן לקרוא אותו. הכנס כרטיס SIM." "‏לא ניתן להשתמש בכרטיס SIM זה." "‏כרטיס ה-SIM שלך הושבת לצמיתות.\nפנה לספק השירות האלחוטי שלך לקבלת כרטיס SIM אחר." "‏כרטיס ה-SIM נעול." "‏כרטיס ה-SIM נעול באמצעות PUK." "‏מבטל את הנעילה של כרטיס ה-SIM…" - "אזור לקוד הגישה" + "אזור של קוד האימות" "סיסמת מכשיר" "‏אזור לקוד הגישה של כרטיס ה-SIM" "‏אזור לקוד הגישה של כרטיס ה-SIM" @@ -63,7 +63,7 @@ "שכחתי את קו ביטול הנעילה" "קו ביטול נעילה שגוי" "סיסמה שגויה" - "קוד הגישה שגוי" + "קוד האימות שגוי" אפשר יהיה לנסות שוב בעוד %d שניות. אפשר יהיה לנסות שוב בעוד %d שניות. @@ -72,28 +72,28 @@ "שרטט את קו ביטול הנעילה" "‏הזן את קוד הגישה של כרטיס ה-SIM." - "‏הזן את קוד הגישה של כרטיס ה-SIM של %1$s." + "‏יש להזין את קוד האימות של כרטיס ה-SIM של %1$s." "‏%1$s יש להשבית את כרטיס ה-eSIM כדי להשתמש במכשיר ללא שירות סלולרי." - "הזן קוד גישה" - "הזן את הסיסמה" + "יש להזין קוד אימות" + "צריך להזין את הסיסמה" "‏כרטיס ה-SIM מושבת כעת. הזן קוד PUK כדי להמשיך. פנה אל הספק לפרטים." - "‏ה-SIM של \"%1$s\" מושבת כעת. הזן קוד PUK כדי להמשיך. לפרטים, פנה אל הספק." + "‏ה-SIM של \"%1$s\" מושבת עכשיו. צריך להזין קוד PUK כדי להמשיך. לפרטים, יש לפנות אל הספק." "הזן את קוד הגישה הרצוי" - "אשר את קוד הגישה הרצוי" - "‏מבטל את הנעילה של כרטיס ה-SIM…" + "צריך לאשר את קוד האימות הרצוי" + "‏מתבצע ביטול נעילה של כרטיס ה-SIM…" "הקלד קוד גישה שאורכו 4 עד 8 ספרות." "‏קוד PUK צריך להיות בן 8 ספרות או יותר." - "‏הזן את קוד ה-PUK הנכון. ניסיונות חוזרים ישביתו את כרטיס ה-SIM לצמיתות." + "‏יש להזין את קוד ה-PUK הנכון. ניסיונות חוזרים ישביתו את כרטיס ה-SIM באופן סופי." "ניסית לשרטט את קו ביטול הנעילה יותר מדי פעמים" - "הקלדת קוד גישה שגוי %1$d פעמים. \n\nנסה שוב בעוד %2$d שניות." + "הקלדת קוד גישה שגוי %1$d פעמים. \n\nיש לנסות שוב בעוד %2$d שניות." "הקלדת סיסמה שגויה %1$d פעמים.\n\nנסה שוב בעוד %2$d שניות." "שרטטת קו ביטול נעילה שגוי %1$d פעמים. \n\nנסה שוב בעוד %2$d שניות." "‏קוד הגישה של כרטיס ה-SIM שגוי. צור קשר עם הספק כדי לבטל את נעילת המכשיר." - ‏קוד הגישה של כרטיס ה-SIM שגוי. נותרו לך עוד %d ניסיונות. - ‏קוד הגישה של כרטיס ה-SIM שגוי. נותרו לך עוד %d ניסיונות. - ‏קוד הגישה של כרטיס ה-SIM שגוי. נותרו לך עוד %d ניסיונות. - ‏קוד הגישה של כרטיס ה-SIM שגוי. נותר לך עוד ניסיון %d לפני שיהיה עליך ליצור קשר עם הספק כדי לבטל את נעילת המכשיר. + ‏קוד האימות של כרטיס ה-SIM שגוי. נותרו לך עוד %d ניסיונות. + ‏קוד האימות של כרטיס ה-SIM שגוי. נותרו לך עוד %d ניסיונות. + ‏קוד האימות של כרטיס ה-SIM שגוי. נותרו לך עוד %d ניסיונות. + ‏קוד האימות של כרטיס ה-SIM שגוי. נותר לך עוד ניסיון %d לפני שיהיה עליך ליצור קשר עם הספק כדי לבטל את נעילת המכשיר. "‏לא ניתן להשתמש בכרטיס ה-SIM. צור קשר עם הספק." @@ -103,27 +103,27 @@ ‏קוד ה-PUK של כרטיס ה-SIM שגוי. נותר לך ניסיון %d נוסף לפני שכרטיס ה-SIM יינעל לצמיתות. "‏פעולת קוד הגישה של כרטיס ה-SIM נכשלה!" - "‏פעולת קוד ה-PUK של כרטיס ה-SIM נכשלה!" + "‏הניסיון לביטול הנעילה של כרטיס ה-SIM באמצעות קוד PUK נכשל!" "הקוד התקבל!" "אין שירות." "החלפת שיטת קלט" "מצב טיסה" "יש להזין את קו ביטול הנעילה לאחר הפעלה מחדש של המכשיר" - "יש להזין קוד גישה לאחר הפעלה מחדש של המכשיר" + "צריך להזין קוד אימות לאחר הפעלה מחדש של המכשיר" "יש להזין סיסמה לאחר הפעלה מחדש של המכשיר" "יש להזין את קו ביטול הנעילה כדי להגביר את רמת האבטחה" "יש להזין קוד גישה כדי להגביר את רמת האבטחה" "יש להזין סיסמה כדי להגביר את רמת האבטחה" "יש להזין את קו ביטול הנעילה בזמן מעבר בין פרופילים" - "יש להזין את קוד הגישה בזמן מעבר בין פרופילים" + "צריך להזין את קוד האימות כשמחליפים פרופיל" "יש להזין את הסיסמה בזמן מעבר בין פרופילים" "מנהל המכשיר נעל את המכשיר" "המכשיר ננעל באופן ידני" - נעילת המכשיר לא בוטלה במשך %d שעות. הזן את קו ביטול הנעילה. - נעילת המכשיר לא בוטלה במשך %d שעות. הזן את קו ביטול הנעילה. - נעילת המכשיר לא בוטלה במשך %d שעות. הזן את קו ביטול הנעילה. - נעילת המכשיר לא בוטלה במשך %d שעה. הזן את קו ביטול הנעילה. + נעילת המכשיר לא בוטלה במשך %d שעות. יש להזין את קו ביטול הנעילה. + נעילת המכשיר לא בוטלה במשך %d שעות. יש להזין את קו ביטול הנעילה. + נעילת המכשיר לא בוטלה במשך %d שעות. יש להזין את קו ביטול הנעילה. + נעילת המכשיר לא בוטלה במשך שעה אחת (%d). יש להזין את קו ביטול הנעילה. נעילת המכשיר לא בוטלה במשך %d שעות. הזן את קוד הגישה. @@ -132,18 +132,18 @@ נעילת המכשיר לא בוטלה במשך %d שעה. הזן את קוד הגישה. - נעילת המכשיר לא בוטלה במשך %d שעות. הזן את הסיסמה. - נעילת המכשיר לא בוטלה במשך %d שעות. הזן את הסיסמה. - נעילת המכשיר לא בוטלה במשך %d שעות. הזן את הסיסמה. - נעילת המכשיר לא בוטלה במשך %d שעה. הזן את הסיסמה. + נעילת המכשיר לא בוטלה במשך %d שעות. יש להזין את הסיסמה. + נעילת המכשיר לא בוטלה במשך %d שעות. יש להזין את הסיסמה. + נעילת המכשיר לא בוטלה במשך %d שעות. יש להזין את הסיסמה. + נעילת המכשיר לא בוטלה במשך %d שעה. יש להזין את הסיסמה. "לא זוהתה" "לא זוהתה" - ‏יש להזין קוד גישה לכרטיס SIM. נותרו לך %d ניסונות נוספים. - ‏יש להזין קוד גישה לכרטיס SIM. נותרו לך %d ניסונות נוספים. - ‏יש להזין קוד גישה לכרטיס SIM. נותרו לך %d ניסונות נוספים. - ‏יש להזין קוד גישה לכרטיס SIM. נותר לך %d ניסיון נוסף לפני שיהיה צורך ליצור קשר עם הספק כדי לבטל את נעילת המכשיר. + ‏יש להזין קוד אימות של כרטיס SIM. נותרו לך %d ניסיונות נוספים. + ‏יש להזין קוד אימות של כרטיס SIM. נותרו לך %d ניסיונות נוספים. + ‏יש להזין קוד אימות של כרטיס SIM. נותרו לך %d ניסיונות נוספים. + ‏יש להזין קוד אימות של כרטיס SIM. נותר לך ניסיון נוסף (%d) לפני שיהיה צורך ליצור קשר עם הספק כדי לבטל את נעילת המכשיר. ‏כרטיס ה-SIM מושבת כעת. יש להזין קוד PUK כדי להמשיך. נותרו לך %d ניסיונות נוספים לפני שכרטיס ה-SIM ינעל לצמיתות. למידע נוסף, ניתן לפנות לספק שלך. diff --git a/packages/SystemUI/res-keyguard/values-pa/strings.xml b/packages/SystemUI/res-keyguard/values-pa/strings.xml index 04419e039b58a..47b2881e11f6f 100644 --- a/packages/SystemUI/res-keyguard/values-pa/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pa/strings.xml @@ -135,7 +135,7 @@ ਸਿਮ ਹੁਣ ਬੰਦ ਹੋ ਗਿਆ ਹੈ। ਜਾਰੀ ਰੱਖਣ ਲਈ PUK ਕੋਡ ਦਾਖਲ ਕਰੋ। ਸਿਮ ਦੇ ਪੱਕੇ ਤੌਰ \'ਤੇ ਬੇਕਾਰ ਹੋ ਜਾਣ ਤੋਂ ਪਹਿਲਾਂ ਤੁਹਾਡੇ ਕੋਲ %d ਕੋਸ਼ਿਸ਼ ਬਾਕੀ ਹੈ। ਵੇਰਵਿਆਂ ਲਈ ਕੈਰੀਅਰ ਨੂੰ ਸੰਪਰਕ ਕਰੋ। ਸਿਮ ਹੁਣ ਬੰਦ ਹੋ ਗਿਆ ਹੈ। ਜਾਰੀ ਰੱਖਣ ਲਈ PUK ਕੋਡ ਦਾਖਲ ਕਰੋ। ਸਿਮ ਦੇ ਪੱਕੇ ਤੌਰ \'ਤੇ ਬੇਕਾਰ ਹੋ ਜਾਣ ਤੋਂ ਪਹਿਲਾਂ ਤੁਹਾਡੇ ਕੋਲ %d ਕੋਸ਼ਿਸ਼ਾਂ ਬਾਕੀ ਹਨ। ਵੇਰਵਿਆਂ ਲਈ ਕੈਰੀਅਰ ਨੂੰ ਸੰਪਰਕ ਕਰੋ। - "ਪੂਰਵ-ਨਿਰਧਾਰਤ" + "ਪੂਰਵ-ਨਿਰਧਾਰਿਤ" "ਬੁਲਬੁਲਾ" "ਐਨਾਲੌਗ" From c7ff4f5174e6fc0d14da702d590500d167f02ba3 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 27 Mar 2021 11:32:02 +0000 Subject: [PATCH 258/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ib393f1993b9485bbc807e4b03eabca6279c437a2 --- packages/SystemUI/res-product/values-iw/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/SystemUI/res-product/values-iw/strings.xml b/packages/SystemUI/res-product/values-iw/strings.xml index 4ba8657a77e3e..3fc8013f78880 100644 --- a/packages/SystemUI/res-product/values-iw/strings.xml +++ b/packages/SystemUI/res-product/values-iw/strings.xml @@ -31,15 +31,15 @@ "ניסית לבטל את נעילת הטאבלט %d פעמים. הטאבלט יאופס וכל הנתונים שלו יימחקו." "ניסית לבטל את נעילת הטלפון %d פעמים. הטלפון יאופס וכל הנתונים שבו יימחקו." "ניסית לבטל את נעילת הטאבלט %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, משתמש זה יוסר וכל נתוני המשתמש יימחקו." - "ניסית לבטל את נעילת הטלפון %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, משתמש זה יוסר וכל נתוני המשתמש יימחקו." + "ניסית לבטל את נעילת הטלפון %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, המשתמש הזה יוסר וכל נתוני המשתמש יימחקו." "ניסית לבטל את נעילת הטאבלט %d פעמים באופן שגוי. משתמש זה יוסר וכל נתוני המשתמש יימחקו." - "ניסית לבטל את נעילת הטלפון %d פעמים. משתמש זה יוסר וכל נתוני המשתמש יימחקו." + "ניסית לבטל את נעילת הטלפון %d פעמים. המשתמש הזה יוסר וכל נתוני המשתמש יימחקו." "ניסית לבטל את נעילת הטאבלט %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, פרופיל העבודה יוסר וכל נתוני הפרופיל יימחקו." "ניסית לבטל את נעילת הטלפון %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, פרופיל העבודה יוסר וכל נתוני הפרופיל יימחקו." "ניסית לבטל את נעילת הטאבלט %d פעמים. פרופיל העבודה יוסר וכל נתוני הפרופיל יימחקו." "ניסית לבטל את נעילת הטלפון %d פעמים. פרופיל העבודה יוסר וכל נתוני הפרופיל יימחקו." "שרטטת קו ביטול נעילה שגוי %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, ,תישלח אליך בקשה לבטל את נעילת הטאבלט באמצעות חשבון אימייל‏.\n\n יש לנסות שוב בעוד %3$d שניות." - "שרטטת קו ביטול נעילה שגוי %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, תשילח אליך בקשה לבטל את נעילת הטלפון באמצעות חשבון אימייל‏.\n\n יש לנסות שוב בעוד %3$d שניות." + "שרטטת קו ביטול נעילה שגוי %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, תישלח אליך בקשה לבטל את נעילת הטלפון באמצעות חשבון אימייל‏.\n\n יש לנסות שוב בעוד %3$d שניות." "לאפשרויות נוספות, יש לבטל את נעילת הטלפון" "לאפשרויות נוספות, יש לבטל את נעילת הטאבלט" "לאפשרויות נוספות, יש לבטל את נעילת המכשיר" From 513ddcef340b1abed63444bce54e6abad1d0ac03 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 27 Mar 2021 10:35:38 -0700 Subject: [PATCH 259/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I22361347acc607c795468a0ffbdc6ca19eb20019 --- core/res/res/values-ca/strings.xml | 4 +- core/res/res/values-fa/strings.xml | 2 +- core/res/res/values-hr/strings.xml | 10 +- core/res/res/values-in/strings.xml | 2 +- core/res/res/values-iw/strings.xml | 598 ++++++++++++------------- core/res/res/values-ky/strings.xml | 6 +- core/res/res/values-ml/strings.xml | 6 +- core/res/res/values-ne/strings.xml | 2 +- core/res/res/values-nl/strings.xml | 30 +- core/res/res/values-ru/strings.xml | 2 +- core/res/res/values-sw/strings.xml | 2 +- core/res/res/values-vi/strings.xml | 2 +- core/res/res/values-zh-rHK/strings.xml | 6 +- 13 files changed, 336 insertions(+), 336 deletions(-) diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 2d12880bade7c..ca45c00fb8b3d 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -996,7 +996,7 @@ Darrers %d dies Darrer dia (%d) - "El mes passat" + "Darrer mes" "Més antigues" "el %s" "a les %s" @@ -2029,7 +2029,7 @@ %s i %d fitxers més %s i %d fitxer més - "No hi ha cap recomanació de persones amb qui compartir" + "No hi ha cap suggeriment de persones amb qui compartir" "Llista d\'aplicacions" "Aquesta aplicació no té permís de gravació, però pot capturar àudio a través d\'aquest dispositiu USB." "Inici" diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index e80f690f3bb3c..3dd8173ae4e1b 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -997,7 +997,7 @@ %d روز قبل "ماه گذشته" - "قدیمی تر" + "قدیمی‌تر" "در %s" "در %s" "در %s" diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index de8d4cfa9b14a..5d4905fb5680e 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -71,7 +71,7 @@ "Trostrani poziv" "Odbijanje neželjenih i neugodnih poziva" "Isporuka pozivnog broja" - "Ne ometaj" + "Ne uznemiravaj" "Zadana postavka ID-a pozivatelja ima ograničenje. Sljedeći poziv: Ograničen" "Zadana postavka ID-a pozivatelja ima ograničenje. Sljedeći poziv: Nije ograničen" "Zadana postavka ID-a pozivatelja nema ograničenje. Sljedeći poziv: Ograničen" @@ -668,8 +668,8 @@ "Omogućuje nositelju povezivanje sa sučeljem najviše razine usluge mobilnog operatera za slanje poruka. Ne bi trebalo biti potrebno za uobičajene aplikacije." "povezivanje s uslugama mobilnog operatera" "Nositelju omogućuje povezivanje s uslugama mobilnog operatera. Ne bi trebalo biti potrebno za uobičajene aplikacije." - "pristupi opciji Ne ometaj" - "Omogućuje aplikaciji čitanje i pisanje konfiguracije opcije Ne ometaj." + "pristupi opciji Ne uznemiravaj" + "Omogućuje aplikaciji čitanje i pisanje konfiguracije opcije Ne uznemiravaj." "pokrenuti upotrebu dopuštenja za pregled" "Dopušta nositelju pokretanje upotrebe dopuštenja za aplikaciju. Ne bi smjelo biti potrebno za uobičajene aplikacije." "Postavi pravila zaporke" @@ -1863,10 +1863,10 @@ "Do %1$s" "Do %1$s (sljedeći alarm)" "Dok ne isključite" - "Dok ne isključite \"Ne ometaj\"" + "Dok ne isključite \"Ne uznemiravaj\"" "%1$s/%2$s" "Sažmi" - "Ne ometaj" + "Ne uznemiravaj" "Prekid rada" "Noć radnog dana" "Vikend" diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index b72ffe219a05b..665e570bb0e50 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -318,7 +318,7 @@ "Mengambil konten jendela" "Memeriksa konten jendela tempat Anda berinteraksi." "Mengaktifkan Jelajahi dengan Sentuhan" - "Item yang diketuk akan diucapkan dengan jelas dan layar dapat dijelajahi menggunakan isyarat." + "Item yang diketuk akan diucapkan dengan jelas dan layar dapat dijelajahi menggunakan gestur." "Mengamati teks yang Anda ketik" "Meliputi data pribadi seperti nomor kartu kredit dan sandi." "Mengontrol perbesaran layar" diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index daa7cc2f74ab1..113a3304f28e9 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -34,7 +34,7 @@ "MSISDN1" "‏בעיה בחיבור או קוד MMI לא חוקי." "הפעולה מוגבלת למספרי חיוג קבועים בלבד." - "לא ניתן לשנות את הגדרות העברת השיחות מהטלפון שלך כשאתה במצב נדידה." + "לא ניתן לשנות את הגדרות העברת השיחות מהטלפון במצב נדידה." "השירות הופעל." "השירות הופעל עבור:" "השירות הושבת." @@ -45,11 +45,11 @@ "קוד הגישה הישן שהקלדת שגוי." "‏ה-PUK שהקלדת שגוי." "קודי הגישה שהקלדת לא תואמים." - "הקלד קוד גישה שאורכו 4 עד 8 ספרות." + "יש להקליד קוד אימות שאורכו 4 עד 8 ספרות." "‏הקלד PUK באורך 8 מספרים או יותר." - "‏כרטיס ה-SIM נעול באמצעות PUK. הקלד את קוד PUK כדי לבטל את נעילתו." - "‏הקלד PUK2 כדי לבטל את חסימת כרטיס ה-SIM." - "‏לא הצלחת. הפעל נעילת SIM/RUIM." + "‏כרטיס ה-SIM נעול באמצעות PUK. יש להקליד את קוד ה-PUK כדי לבטל את הנעילה." + "‏יש להקליד PUK2 כדי לבטל את חסימת כרטיס ה-SIM." + "‏לא הצלחת. יש להפעיל נעילת SIM/RUIM." ‏נותרו לך %d ניסיונות לפני נעילת כרטיס ה-SIM. ‏נותרו לך %d ניסיונות לפני נעילת כרטיס ה-SIM. @@ -70,12 +70,12 @@ "מספר מתקשר נמצא" "מספר מתקשר חסוי" "שיחה עם שלושה משתתפים" - "דחייה של שיחות מטרידות לא רצויות" - "מסירת מספר מתקשר" + "דחיית שיחות מטרידות ולא רצויות" + "שליחת מספר מתקשר" "נא לא להפריע" - "זיהוי מתקשר עובר כברירת מחדל למצב מוגבל. השיחה הבאה: מוגבלת" + "השירות \'שיחה מזוהה\' עובר כברירת מחדל למצב מוגבל. השיחה הבאה: מוגבלת" "זיהוי מתקשר עובר כברירת מחדל למצב מוגבל. השיחה הבאה: לא מוגבלת" - "זיהוי מתקשר עובר כברירת מחדל למצב לא מוגבל. השיחה הבאה: מוגבלת" + "שירות \'שיחה מזוהה\' עובר כברירת מחדל למצב לא מוגבל. השיחה הבאה: מוגבלת" "זיהוי מתקשר עובר כברירת מחדל למצב לא מוגבל. השיחה הבאה: לא מוגבלת" "השירות לא הוקצה." "אינך יכול לשנות את הגדרת זיהוי המתקשר." @@ -84,9 +84,9 @@ "אין אפשרות לבצע שיחות רגילות" "אין שירות קולי או שיחות חירום" "הושבת באופן זמני על ידי הספק" - "‏הושבת באופן זמני על ידי הספק עבור SIM %d" + "‏השירות הושבת באופן זמני על ידי הספק עבור SIM‏ %d" "לא ניתן להתחבר לרשת הסלולרית" - "יש לנסות לשנות את הרשת המועדפת. ניתן להקיש כדי לשנות." + "אפשר לנסות לשנות את הרשת המועדפת. יש להקיש כדי לשנות אותה." "שיחות חירום לא זמינות" "‏לא ניתן לבצע שיחות חירום דרך Wi-Fi" "התראות" @@ -123,10 +123,10 @@ "נדידה - פונקציונליות חלקית של שירות" "מודעת באנר נודדת מופעלת" "מודעת באנר נודדת כבויה" - "מחפש שירות" - "‏לא ניתן היה להגדיר שיחות Wi-Fi" + "המערכת מחפשת שירות" + "‏לא ניתן היה להגדיר את התכונה \'שיחות Wi-Fi\'" - "‏כדי להתקשר ולשלוח הודעות ברשת Wi-Fi, תחילה יש לבקש מהספק להגדיר את השירות. לאחר מכן, יש להפעיל שוב שיחות Wi-Fi ב\'הגדרות\'. (קוד שגיאה: %1$s)" + "‏כדי להתקשר ולשלוח הודעות ברשת Wi-Fi, תחילה יש לבקש מהספק להגדיר את השירות. לאחר מכן, צריך להפעיל שוב שיחות Wi-Fi ב\'הגדרות\'. (קוד שגיאה: %1$s)" "‏אירעה בעיה ברישום שיחות Wi-Fi אצל הספק שלך: %1$s" @@ -157,12 +157,12 @@ "בעיה בחיבור או קוד תכונה לא תקין." "אישור" "אירעה שגיאת רשת." - "לא ניתן למצוא את כתובת האתר." + "‏לא ניתן למצוא את כתובת ה-URL." "סכימת אימות האתר אינה נתמכת." "האימות נכשל." "‏האימות דרך שרת ה-Proxy נכשל." "לא ניתן להתחבר לשרת." - "לא ניתן לתקשר עם השרת. נסה שוב מאוחר יותר." + "לא ניתן לתקשר עם השרת. אפשר לנסות שוב מאוחר יותר." "חלף הזמן הקצוב של החיבור לשרת." "הדף מכיל יותר מדי כתובות אתר להפניה מחדש של השרת." "הפרוטוקול אינו נתמך." @@ -175,38 +175,38 @@ "סנכרון" "לא ניתן לסנכרן" "נעשה ניסיון למחוק יותר מדי %s." - "שטח האחסון של הטאבלט מלא. מחק קבצים כדי לפנות מקום." + "נפח האחסון של הטאבלט מלא. צריך למחוק קבצים כדי לפנות מקום." "שטח האחסון של השעון מלא. מחק כמה קבצים כדי לפנות שטח." - "‏האחסון של מכשיר ה-Android TV מלא. יש למחוק חלק מהקבצים כדי לפנות שטח." - "שטח האחסון של הטלפון מלא. מחק חלק מהקבצים כדי לפנות שטח." + "‏האחסון של מכשיר ה-Android TV מלא. יש למחוק חלק מהקבצים כדי לפנות מקום." + "מקום האחסון של הטלפון מלא. אפשר למחוק חלק מהקבצים כדי לפנות מקום." רשויות אישורים הותקנו רשויות אישורים הותקנו רשויות אישורים הותקנו רשות אישורים הותקנה - "על ידי צד שלישי לא מוכר" + "על ידי צד שלישי לא ידוע" "על ידי המנהל של פרופיל העבודה שלך" "על ידי %s" "פרופיל העבודה נמחק" "אפליקציית הניהול של פרופיל העבודה חסרה או פגומה. כתוצאה מכך, פרופיל העבודה שלך נמחק, כולל כל הנתונים הקשורים אליו. לקבלת עזרה, פנה למנהל המערכת." "פרופיל העבודה שלך אינו זמין עוד במכשיר הזה" "בוצעו ניסיונות רבים מדי להזנת סיסמה" - "מנהל המערכת ביטל את המכשיר לצורכי שימוש אישי" + "מנהל המערכת ביטל את האפשרות לשימוש במכשיר לצרכים אישיים" "המכשיר מנוהל" - "הארגון שלך מנהל מכשיר זה ועשוי לנטר את התנועה ברשת. הקש לקבלת פרטים." + "הארגון שלך מנהל את המכשיר הזה והוא עשוי לנטר את התנועה ברשת. יש להקיש לקבלת פרטים." "לאפליקציות יש הרשאת גישה למיקום שלך" "‏יש לפנות למנהל ה-IT כדי לקבל מידע נוסף" "גלאי מדינה" "שירות מיקום" "שירות להתראות מחיישנים" - "שירות דמדומים" + "Twilight Service" "תתבצע מחיקה של המכשיר" "לא ניתן להשתמש באפליקציה של מנהל המערכת.\n\nאם יש לך שאלות, יש ליצור קשר עם מנהל המערכת של הארגון." "ההדפסה הושבתה על ידי %s." "הפעלה של פרופיל העבודה שלך" "האפליקציות שלך לשימוש אישי יהיו חסומות עד להפעלת פרופיל העבודה" - "‏אפליקציות לשימוש אישי ייחסמו ב-%1$s בשעה %2$s. מנהל ה-IT לא מתיר השבתה של יותר מ-%3$d ימים של פרופיל העבודה." + "‏אפליקציות לשימוש אישי ייחסמו ב-%1$s בשעה %2$s. מנהל ה-IT לא מתיר השבתה של פרופיל העבודה ליותר מ-%3$d ימים." "הפעלה" "אני" "אפשרויות טאבלט" @@ -223,17 +223,17 @@ "‏עדכון מערכת Android" "מתכונן לעדכון…" "מעבד את חבילת העדכון…" - "מאתחל…" + "מתבצע אתחול…" "איפוס לנתוני היצרן" - "מאתחל…" - "מכבה..." - "הטאבלט שלך יכבה." + "מתבצע אתחול…" + "בתהליך כיבוי..." + "הטאבלט שלך ייכבה." "‏מכשיר ה-Android TV יכבה." "השעון יכבה." "הטלפון שלך יכובה." "האם ברצונך לבצע כיבוי?" - "אתחל למצב בטוח" - "האם ברצונך לאתחל ולעבור למצב בטוח? פעולה זו תשבית את כל יישומי צד שלישי שהתקנת. הם ישוחזרו לאחר הפעלה מחדש של המכשיר." + "אתחול למצב בטוח" + "האם לבצע אתחול ולעבור למצב בטוח? הפעולה הזו תשבית את כל האפליקציות של צד שלישי שהתקנת. הן ישוחזרו לאחר הפעלה מחדש של המכשיר." "נוצרו לאחרונה" "אין אפליקציות אחרונות" "אפשרויות טאבלט" @@ -248,9 +248,9 @@ "סיום הפעלה" "צילום מסך" "דיווח על באג" - "פעולה זו תאסוף מידע על מצב המכשיר הנוכחי שלך על מנת לשלוח אותו כהודעת אימייל. היא תימשך זמן קצר מרגע פתיחת דיווח הבאג ועד לשליחת ההודעה בפועל. אנא המתן בסבלנות." + "הפעולה הזו תאסוף מידע על מצב המכשיר הנוכחי שלך כדי לשלוח אותו כהודעת אימייל. היא תימשך זמן קצר מרגע פתיחת הדיווח על הבאג ועד לשליחת ההודעה בפועל. יש להמתין בסבלנות." "דוח אינטראקטיבי" - "השתמש באפשרות זו ברוב המקרים. היא מאפשרת לך לעקוב אחר התקדמות הדוח, להזין פרטים נוספים על הבעיה וליצור צילומי מסך. היא עשויה להשמיט כמה קטעים שנמצאים פחות בשימוש ואשר יצירת הדיווח עליהם נמשכת זמן רב." + "כדאי להשתמש באפשרות הזו ברוב המקרים. היא מאפשרת לך לעקוב אחר התקדמות הדוח, להזין פרטים נוספים על הבעיה ולצלם את המסך. היא עשויה להשמיט כמה קטעים שנמצאים פחות בשימוש ושיצירת הדיווח עליהם נמשכת זמן רב." "דוח מלא" "השתמש באפשרות זו כדי שההפרעה למערכת תהיה מזערית, כשהמכשיר אינו מגיב או איטי מדי, או כשאתה זקוק לכל קטעי הדוח. לא ניתן להזין פרטים נוספים או ליצור צילומי מסך נוספים." @@ -269,7 +269,7 @@ "מצב טיסה כבוי" "הגדרות" "סיוע" - "Voice Assist" + "האסיסטנט" "נעילה" "999+" "התראה חדשה" @@ -322,7 +322,7 @@ "חיישנים לבישים" "גישה אל נתוני חיישנים של הסימנים החיוניים שלך" "אחזור תוכן של חלון" - "בדוק את התוכן של חלון שאיתו אתה מבצע אינטראקציה." + "בדיקת התוכן של חלון שאיתו מתבצעת אינטראקציה." "הפעלה של \'גילוי באמצעות מגע\'" "פריטים שעליהם תקיש יוקראו בקול, ותוכל לנווט במסך באמצעות תנועות." "הצגת טקסט בזמן הקלדה" @@ -333,18 +333,18 @@ "יכול להקיש, להחליק, לעשות תנועת צביטה ולבצע תנועות אחרות." "תנועות של טביעות אצבעות" "אפשרות לזהות תנועות בזמן נגיעה בחיישן טביעות האצבע של המכשיר." - "שמירת צילום המסך" + "צילום המסך" "ניתן לצלם צילום מסך של התצוגה." - "השבת או שנה את שורת המצב" - "מאפשר לאפליקציה להשבית את שורת המצב או להוסיף ולהסיר סמלי מערכת." + "השבתה או שינוי של שורת הסטטוס" + "מאפשרת לאפליקציה להשבית את שורת הסטטוס או להוסיף ולהסיר סמלי מערכת." "להיות שורת הסטטוס" - "מאפשר לאפליקציה להופיע בשורת המצב." + "מאפשרת לאפליקציה להופיע בשורת הסטטוס." "הרחב/כווץ את שורת המצב" "מאפשר לאפליקציה להרחיב או לכווץ את שורת המצב." "התקן קיצורי דרך" - "מאפשר לאפליקציה להוסיף קיצורי דרך במסך דף הבית ללא התערבות המשתמש." - "להסרת התקנה של קיצורי דרך" - "מאפשר לאפליקציה להסיר קיצורי דרך במסך דף הבית ללא התערבות המשתמש." + "מאפשרת לאפליקציה להוסיף קיצורי דרך במסך דף הבית ללא התערבות המשתמש." + "הסרת התקנה של קיצורי דרך" + "מאפשרת לאפליקציה להסיר קיצורי דרך במסך דף הבית ללא התערבות המשתמש." "ניתוב מחדש של שיחות יוצאות" "מאפשרת לאפליקציה לראות את המספר המחויג במהלך ביצוע שיחה יוצאת, עם האפשרות להפנות את השיחה למספר אחר או לבטל את השיחה לחלוטין." "מענה לשיחות טלפון" @@ -352,75 +352,75 @@ "‏קבלת הודעות טקסט (SMS)" "‏מאפשר לאפליקציה לקבל ולעבד הודעות SMS. משמעות הדבר היא שהאפליקציה יכולה לעקוב אחר הודעות שנשלחו למכשיר או למחוק אותן מבלי להציג לך אותן." "‏קבלת הודעות טקסט (MMS)" - "‏מאפשר לאפליקציה לקבל ולעבד הודעות MMS. משמעות הדבר היא שהאפליקציה יכולה לעקוב אחר הודעות שנשלחו למכשיר או למחוק אותן מבלי להציג לך אותן." + "‏מאפשרת לאפליקציה לקבל ולעבד הודעות MMS. משמעות הדבר היא שהאפליקציה יכולה לעקוב אחר הודעות שנשלחו למכשיר או למחוק אותן מבלי להציג לך אותן." "העברת הודעות של שידור סלולרי" "מאפשרת לאפליקציה להתחייב למודול של השידור הסלולרי כדי להעביר הודעות של שידור סלולרי כשהן מתקבלות. התראות שידור סלולרי נשלחות במקומות מסוימים כדי להזהיר אותך מפני מצבי חירום. אפליקציות זדוניות עשויות להפריע לביצועים או לפעולה של המכשיר כאשר מתקבל שידור חירום סלולרי." "קריאת הודעות שידור סלולרי" "מאפשר לאפליקציה לקרוא הודעות שידור סלולרי שהתקבלו במכשיר שלך. התראות שידור סלולרי נשלחות במקומות מסוימים על מנת להזהיר אותך מפני מצבי חירום. אפליקציות זדוניות עשויות להפריע לביצועים או לפעולה של המכשיר שלך כאשר מתקבל שידור חירום סלולרי." - "קרא עדכוני מנויים" + "קריאת עדכוני מינויים" "מאפשר לאפליקציה לקבל פרטים על ההזנות הנוכחיות שמסונכרנות." "‏שליחה והצגה של הודעות SMS" "‏מאפשר לאפליקציה לשלוח הודעות SMS. הדבר עשוי לגרום לחיובים בלתי צפויים. אפליקציות זדוניות עלולות לגרום לעלויות על ידי שליחת הודעות ללא אישורך." "‏קריאת הודעות הטקסט שלך (SMS או MMS)" "‏אפליקציה זו יכולה לקרוא את כל הודעות הטקסט (SMS) המאוחסנות בטאבלט." - "‏אפליקציה זו יכולה לקרוא את כל הודעות הטקסט (SMS) המאוחסנות במכשיר ה-Android TV." + "‏האפליקציה הזו יכולה לקרוא את כל הודעות הטקסט (SMS) המאוחסנות במכשיר ה-Android TV." "‏אפליקציה זו יכולה לקרוא את כל הודעות הטקסט (SMS) המאוחסנות בטלפון." "‏קבלת הודעות טקסט (WAP)" - "‏מאפשר לאפליקציה לקבל ולעבד הודעות WAP. אישור זה כולל את היכולת לעקוב אחר הודעות שנשלחו אליך ולמחוק אותן מבלי להציג לך אותן." + "‏מאפשרת לאפליקציה לקבל ולעבד הודעות WAP. ההרשאה הזו כוללת את היכולת לעקוב אחר הודעות שנשלחו אליך ולמחוק אותן מבלי להציג לך אותן." "אחזור אפליקציות פעילות" - "מאפשר לאפליקציה לאחזר מידע לגבי משימות הפועלות כרגע ושפעלו לאחרונה. ייתכן שהדבר יתיר לאפליקציה לגלות מידע לגבי האפליקציות שבהן נעשה שימוש במכשיר." + "מאפשרת לאפליקציה לאחזר מידע לגבי משימות הפועלות כרגע וכאלו שפעלו לאחרונה. ייתכן שההרשאה הזו תתיר לאפליקציה לגלות מידע לגבי האפליקציות שבהן נעשה שימוש במכשיר." "ניהול בעלים של פרופיל ומכשיר" "מאפשרת לאפליקציות להגדיר את הבעלים של הפרופיל ואת בעל המכשיר." "סידור מחדש של אפליקציות פעילות" "מאפשר לאפליקציה להעביר משימות לחזית ולרקע. האפליקציה עשוי לעשות זאת ללא התערבותך." "הפוך מצב מכונית לפעיל" - "מאפשר לאפליקציה לאפשר את מצב מכונית." + "מאפשרת לאפליקציה להפעיל את מצב מכונית." "סגירת אפליקציות אחרות" "מאפשר לאפליקציה להפסיק תהליכים ברקע המבוצעים על ידי אפליקציות אחרות. הדבר עשוי לגרום להפסקת פעולתם של אפליקציות אחרות." "אפליקציה זו יכולה להופיע מעל אפליקציות אחרות." - "אפליקציה זו יכולה להופיע מעל אפליקציות אחרות או בחלקים אחרים של המסך. ייתכן שהדבר יפריע לך להשתמש באפליקציות וישנה את הופעתן." + "האפליקציה הזו יכולה להופיע מעל אפליקציות אחרות או בחלקים אחרים של המסך. ייתכן שהדבר יפריע לך להשתמש באפליקציות וישנה את האופן שבו הן מופיעות." "פעולה ברקע" - "האפליקציה הזו יכולה לפעול ברקע. ייתכן שהסוללה תתרוקן מהר יותר במצב זה." + "האפליקציה הזו יכולה לפעול ברקע. ייתכן שהסוללה תתרוקן מהר יותר במצב הזה." "שימוש בנתונים ברקע" - "האפליקציה הזו יכולה להשתמש בנתונים ברקע. ייתכן שצריכת הנתונים תעלה במצב זה." + "האפליקציה הזו יכולה להשתמש בנתונים ברקע. ייתכן שצריכת הנתונים תגדל במצב הזה." "הגדרת האפליקציה לפעול תמיד" "מאפשר לאפליקציה להפוך חלקים ממנו לקבועים בזיכרון. פעולה זו עשויה להגביל את הזיכרון הזמין לאפליקציות אחרים ולהאט את פעולת הטאבלט." "‏מאפשרת לאפליקציה לאחסן חלקים שלה בזיכרון באופן קבוע. פעולה זו עשויה להגביל את הזיכרון הזמין לאפליקציות אחרות ולהאט את הפעולה של מכשיר ה-Android TV." "מאפשר לאפליקציה להפוך חלקים ממנו לקבועים בזיכרון. פעולה זו עשויה להגביל את הזיכרון הזמין לאפליקציות אחרים ולהאט את פעולת הטלפון." "הרצת שירות קדמה" - "הרשאה זו מאפשרת לאפליקציה לעשות שימוש בשירותים בקדמה." + "ההרשאה הזו מאפשרת לאפליקציה להשתמש בשירותים שפועלים בחזית." "מדידת נפח האחסון של אפליקציות" "מאפשר לאפליקציה לאחזר את הקוד, הנתונים, וגודלי קובצי המטמון שלו" "שינוי הגדרות מערכת" - "מאפשר לאפליקציה לשנות את נתוני הגדרות המערכת. אפליקציות זדוניות עלולות לשבש את תצורת המערכת שלך." + "מאפשרת לאפליקציה לשנות את נתוני הגדרות המערכת. אפליקציות זדוניות עלולות לשבש את תצורת המערכת שלך." "הפעלה בעת אתחול" "מאפשר לאפליקציה להפעיל את עצמו מיד עם סיום תהליך האתחול של המערכת. משום כך הפעלת הטאבלט עשויה להתארך והאפליקציה עלולה להאט את הפעילות הכללית של הטאבלט, בשל פעילותה התמידית." - "‏מאפשרת לאפליקציה להפעיל את עצמה ברגע שהמערכת מסיימת את ההפעלה. פעולה זו עשויה להאריך את הזמן שדרוש כדי להפעיל את מכשיר ה-Android TV, והיא מאפשרת לאפליקציה להאט את המכשיר כולו כי האפליקציה רצה כל הזמן." + "‏מאפשרת לאפליקציה להפעיל את עצמה ברגע שהמערכת מסיימת את ההפעלה. הפעולה הזו עשויה להאריך את הזמן שדרוש כדי להפעיל את מכשיר ה-Android TV, והיא מאפשרת לאפליקציה להאט את המכשיר כולו כי האפליקציה פועלת כל הזמן." "מאפשר לאפליקציה להפעיל את עצמו מיד עם השלמת תהליך האתחול של המערכת. משום כך הפעלת הטלפון עשויה להתארך והאפליקציה עלולה להאט את הפעילות הכללית של הטלפון, בשל פעילותה התמידית." - "שלח שידור דביק" - "מאפשר לאפליקציה לשלוח שידורים דביקים, אשר נותרים לאחר סיום השידור. אפליקציות זדוניות עלולות להאט את פעילות הטאבלט או להפוך אותה לבלתי יציבה על ידי אילוץ המכשיר להשתמש ביותר מדי זיכרון." + "שליחת שידור במיקום קבוע" + "מאפשרת לאפליקציה לשלוח שידורים במיקום קבוע, אשר נותרים לאחר סיום השידור. אפליקציות זדוניות עלולות להאט את פעילות הטאבלט או להפוך אותה לבלתי יציבה על ידי אילוץ המכשיר להשתמש ביותר מדי זיכרון." "‏מאפשרת לאפליקציה לשלוח שידורים \"דביקים\" (sticky), שנותרים לאחר שהשידור מסתיים. בעקבות שימוש מופרז באפשרות זו, שיעור ניצול הזיכרון יהיה גבוה מדי ומכשיר ה-Android TV עלול לפעול בצורה איטית או בלתי יציבה." - "מאפשר לאפליקציה לשלוח שידורים דביקים, אשר נותרים לאחר סיום השידור. אפליקציות זדוניות עלולות להאט את פעילות הטלפון או להפוך אותה לבלתי יציבה על ידי אילוץ המכשיר להשתמש ביותר מדי זיכרון." + "מאפשרת לאפליקציה לשלוח שידורים במיקום קבוע, אשר נותרים לאחר סיום השידור. אפליקציות זדוניות עלולות להאט את פעילות הטלפון או להפוך אותה לבלתי יציבה על ידי אילוץ המכשיר להשתמש ביותר מדי זיכרון." "קריאת אנשי הקשר שלך" "מאפשרת לאפליקציה לקרוא נתונים על אנשי הקשר השמורים בטאבלט שלך. לאפליקציות תהיה גם גישה לחשבונות בטאבלט שיצרו אנשי קשר. פעולה זו עשויה לכלול חשבונות שנוצרו על ידי אפליקציות שהתקנת. הרשאה זו מאפשרת לאפליקציות לשמור נתונים של אנשי הקשר שלך, ואפליקציות זדוניות עלולות לשתף נתונים של אנשי קשר ללא ידיעתך." "‏מאפשרת לאפליקציה לקרוא נתונים על אנשי הקשר השמורים במכשיר ה-Android TV שלך. לאפליקציות תהיה גם גישה לחשבונות במכשיר ה-Android TV שיצרו אנשי קשר. פעולה זו עשויה לכלול חשבונות שנוצרו על ידי אפליקציות שהתקנת. הרשאה זו מאפשרת לאפליקציות לשמור נתונים של אנשי הקשר שלך, ואפליקציות זדוניות עלולות לשתף נתונים של אנשי קשר ללא ידיעתך." - "מאפשרת לאפליקציה לקרוא נתונים על אנשי הקשר השמורים בטלפון שלך. לאפליקציות תהיה גם גישה לחשבונות בטלפון שיצרו אנשי קשר. פעולה זו עשויה לכלול חשבונות שנוצרו על ידי אפליקציות שהתקנת. הרשאה זו מאפשרת לאפליקציות לשמור נתונים של אנשי הקשר שלך, ואפליקציות זדוניות עלולות לשתף נתונים של אנשי קשר ללא ידיעתך." + "מאפשרת לאפליקציה לקרוא נתונים על אנשי הקשר השמורים בטלפון שלך. לאפליקציות תהיה גם גישה לחשבונות בטלפון שדרכם נוצרו אנשי קשר. הפעולה הזו עשויה לכלול חשבונות שנוצרו על ידי אפליקציות שהתקנת. ההרשאה הזו מאפשרת לאפליקציות לשמור נתונים של אנשי הקשר שלך, ואפליקציות זדוניות עלולות לשתף נתונים של אנשי קשר ללא ידיעתך." "שינוי אנשי הקשר שלך" "מאפשרת לאפליקציה לשנות את הנתונים לגבי אנשי הקשר המאוחסנים בטאבלט שלך. הרשאה זו מאפשרת לאפליקציות למחוק נתונים של אנשי קשר." - "‏מאפשרת לאפליקציה לשנות את הנתונים לגבי אנשי הקשר המאוחסנים במכשיר ה-Android TV שלך. הרשאה זו מאפשרת לאפליקציות למחוק נתונים של אנשי קשר." + "‏מאפשרת לאפליקציה לשנות את הנתונים לגבי אנשי הקשר המאוחסנים במכשיר ה-Android TV שלך. ההרשאה הזו מאפשרת לאפליקציות למחוק נתונים של אנשי קשר." "מאפשרת לאפליקציה לשנות את הנתונים לגבי אנשי הקשר המאוחסנים בטלפון שלך. הרשאה זו מאפשרת לאפליקציות למחוק נתונים של אנשי קשר." "קריאת יומן שיחות" "אפליקציה זו יכולה לקרוא את היסטוריית השיחות שלך." "כתיבת יומן שיחות" - "מאפשר לאפליקציה לשנות את יומן השיחות של הטאבלט, כולל נתונים על שיחות נכנסות ויוצאות. אפליקציות זדוניות עלולות לעשות בכך שימוש כדי למחוק או לשנות את יומן השיחות שלך." + "מאפשרת לאפליקציה לשנות את יומן השיחות של הטאבלט, כולל נתונים על שיחות נכנסות ויוצאות. אפליקציות זדוניות עלולות לעשות בכך שימוש כדי למחוק או לשנות את יומן השיחות שלך." "‏מאפשרת לאפליקציה לשנות את יומן השיחות של מכשיר ה-Android TV, כולל נתונים על שיחות נכנסות ויוצאות. אפליקציות זדוניות עלולות להשתמש בכך כדי למחוק או לשנות את יומן השיחות." "מאפשר לאפליקציה לשנות את יומן השיחות של הטלפון, כולל נתונים על שיחות נכנסות ויוצאות. אפליקציות זדוניות עלולות לעשות בכך שימוש כדי למחוק או לשנות את יומן השיחות שלך." "גישה אל חיישני גוף (כמו מוניטורים לקצב לב)" - "מאפשר לאפליקציה לגשת אל נתוני חיישנים העוקבים אחר מצבך הגופני, כמו קצב הלב." - "קריאה של אירועי יומן ופרטיהם" - "אפליקציה זו יכולה לקרוא את כל אירועי היומן המאוחסנים בטאבלט, ולשתף או לשמור את נתוני היומן." + "מאפשרת לאפליקציה לגשת אל נתוני חיישנים העוקבים אחר מצבך הגופני, כמו קצב הלב." + "קריאה של אירועי יומן והפרטים שלהם" + "האפליקציה הזו יכולה לקרוא את כל אירועי היומן המאוחסנים בטאבלט, ולשתף או לשמור את נתוני היומן." "‏אפליקציה זו יכולה לקרוא את כל אירועי היומן המאוחסנים במכשיר ה-Android TV, ולשתף או לשמור את נתוני היומן." - "אפליקציה זו יכולה לקרוא את כל אירועי היומן המאוחסנים בטלפון, ולשתף או לשמור את נתוני היומן." + "האפליקציה הזו יכולה לקרוא את כל אירועי היומן המאוחסנים בטלפון, ולשתף או לשמור את נתוני היומן." "הוספה ושינוי של אירועי יומן ושליחת אימייל לאורחים ללא ידיעת הבעלים" "אפליקציה זו יכולה להוסיף, להסיר ולשנות אירועי יומן בטאבלט. האפליקציה יכולה לשנות אירועים בלי להודיע לבעליהם ולשלוח הודעות שעשויות להיראות כאילו נשלחו מבעלי יומנים." "‏אפליקציה זו יכולה להוסיף, להסיר ולשנות אירועי יומן במכשיר ה-Android TV. האפליקציה יכולה לשלוח הודעות שעשויות להיראות כאילו נשלחו מבעלי יומנים ולשנות אירועים בלי להודיע על כך לבעליהם." @@ -429,37 +429,37 @@ "‏מאפשרת לאפליקציה לגשת לפקודות נוספות של ספק המיקום. הרשאה זו עשויה לאפשר לאפליקציה לשבש את פעולת ה-GPS או מקורות מיקום אחרים." "קבלת גישה למיקום מדויק בחזית בלבד" "האפליקציה הזו יכולה לקבל את המיקום המדויק שלך משירותי המיקום כאשר היא בשימוש. האפליקציה תקבל את המיקום רק אם הפעלת את שירותי המיקום במכשיר. פעולה זו עלולה להגביר את השימוש בסוללה." - "קבלת גישה למיקום משוער תתבצע בחזית בלבד" + "קבלת גישה למיקום משוער לאפליקציות בחזית בלבד" "כאשר האפליקציה בשימוש היא יכולה לקבל משירותי המיקום את המיקום המשוער שלך. האפליקציה תקבל את המיקום רק אם הפעלת את שירותי המיקום במכשיר." "גישה למיקום ברקע" "לאפליקציה תמיד יש גישה למיקום, גם כשאינה בשימוש." "שנה את הגדרות האודיו שלך" "מאפשר לאפליקציה לשנות הגדרות אודיו גלובליות כמו עוצמת קול ובחירת הרמקול המשמש לפלט." "הקלט אודיו" - "אפליקציה זו יכולה להשתמש במיקרופון כדי להקליט אודיו בכל עת." + "האפליקציה תמיד יכולה להשתמש במיקרופון כדי להקליט אודיו." "‏שליחת פקודות אל ה-SIM" - "‏מאפשרת ליישום לשלוח פקודות ל-SIM. זוהי הרשאה מסוכנת מאוד." + "‏מאפשרת לאפליקציה לשלוח פקודות ל-SIM. זוהי הרשאה מסוכנת מאוד." "זיהוי הפעילות הגופנית" "האפליקציה מזהה את הפעילות הגופנית שלך." - "צלם תמונות וסרטונים" + "צילום תמונות וסרטונים" "אפליקציה זו יכולה להשתמש במצלמה כדי לצלם תמונות ולהקליט סרטונים בכל עת." "הרשאת גישה לאפליקציה או לשירות למצלמות המערכת כדי לצלם תמונות וסרטונים" - "‏אפליקציה זו בעלת ההרשאות, או אפליקציית המערכת הזו, יכולה לצלם תמונות ולהקליט סרטונים באמצעות מצלמת מערכת בכל זמן. בנוסף, לאפליקציה נדרשת ההרשאה android.permission.CAMERA" + "‏האפליקציה הזו בעלת ההרשאות, או אפליקציית המערכת הזו, יכולה לצלם תמונות ולהקליט סרטונים באמצעות מצלמת מערכת בכל זמן. בנוסף, לאפליקציה נדרשת ההרשאה android.permission.CAMERA" "‏אפליקציה או שירות יוכלו לקבל קריאות חוזרות (callback) כשמכשירי מצלמה ייפתחו או ייסגרו." "‏האפליקציה הזו יכולה לקבל קריאות חוזרות (callback) כשמכשיר מצלמה כלשהו נפתח (באמצעות אפליקציה) או נסגר." "שליטה ברטט" "מאפשר לאפליקציה לשלוט ברטט." "מאפשרת לאפליקציה לקבל גישה למצב רטט." - "התקשר ישירות למספרי טלפון" + "חיוג ישירות למספרי טלפון" "מאפשר לאפליקציה להתקשר למספרי טלפון ללא התערבותך. פעולה זו עשויה לגרום לשיחות או לחיובים לא צפויים. שים לב שהדבר לא מאפשר לאפליקציה להתקשר למספרי חירום. אפליקציות זדוניות עשויות לגרום לעלויות על ידי ביצוע שיחות ללא התערבותך." "‏גישה אל שירות שיחות IMS" "‏מאפשר לאפליקציה להשתמש בשירות ה-IMS לביצוע שיחות ללא התערבותך." "קריאת הסטטוס והזהות של הטלפון" - "מאפשר לאפליקציה לגשת לתכונות הטלפון של המכשיר. אישור זה מתיר לאפליקציה לגלות את מספר הטלפון ואת זיהויי המכשיר, האם שיחה פעילה ואת המספר המרוחק המחובר באמצעות שיחה." + "מאפשרת לאפליקציה לגשת לתכונות הטלפון של המכשיר. ההרשאה הזו מתירה לאפליקציה לגלות את מספר הטלפון ואת מזהי המכשיר, אם השיחה פעילה ואת המספר המרוחק המחובר באמצעות שיחה." "ניתוב שיחות דרך המערכת" "מאפשרת לאפליקציה לנתב את השיחות דרך המערכת כדי לשפר את חוויית השיחה." "ניתן להציג שיחות ולשלוט בהן באמצעות המערכת." - "מאפשר לאפליקציה להציג שיחות נוכחיות ולשלוט בהן במכשיר. זה כולל פרטים כמו מספרי שיחה של שיחות ומצב השיחה." + "מאפשרת לאפליקציה להציג שיחות נוכחיות ולשלוט בהן במכשיר – כולל פרטים כמו מספרי שיחה של שיחות ומצב השיחה." "פטור מהגבלות של הקלטת אודיו" "פוטרת את האפליקציה מהגבלות של הקלטת אודיו." "המשך שיחה מאפליקציה אחרת" @@ -467,7 +467,7 @@ "גישה למספרי הטלפון" "מתירה לאפליקציה גישה למספרי הטלפון במכשיר." "מסך המכונית יישאר דלוק" - "מנע מהטאבלט לעבור למצב שינה" + "מניעה מהטאבלט לעבור למצב שינה" "‏מונעת ממכשיר ה-Android TV להיכנס למצב שינה" "מניעת מעבר הטלפון למצב שינה" "מסך המכונית יישאר דלוק כשהאפליקציה פועלת." @@ -479,22 +479,22 @@ "‏מאפשרת לאפליקציה להשתמש במשדר האינפרה-אדום של מכשיר ה-Android TV." "מאפשרת לאפליקציה להשתמש במשדר האינפרא-אדום של הטלפון." "הגדרת טפט" - "מאפשר לאפליקציה להגדיר את טפט המערכת." + "מאפשרת לאפליקציה להגדיר את טפט המערכת." "התאמת גודל הטפט שלך" "מאפשר לאפליקציה להגדיר את סמני הגודל של טפט המערכת." - "הגדר אזור זמן" - "מאפשר לאפליקציה לשנות את אזור הזמן של הטאבלט." + "הגדרת אזור זמן" + "מאפשרת לאפליקציה לשנות את אזור הזמן של הטאבלט." "‏מאפשרת לאפליקציה לשנות את אזור הזמן של מכשיר ה-Android TV." - "מאפשר לאפליקציה לשנות את אזור הזמן של הטלפון." + "מאפשר, לאפליקציה לשנות את אזור הזמן של הטלפון." "חיפוש חשבונות במכשיר" - "מאפשר לאפליקציה לקבל רשימה של חשבונות המוכרים לטאבלט. הדבר עשוי לכלול חשבונות שנוצרו על ידי אפליקציות שהתקנת." + "מאפשרת לאפליקציה לקבל רשימה של חשבונות המוכרים לטאבלט. הדבר עשוי לכלול חשבונות שנוצרו על ידי אפליקציות שהתקנת." "‏מאפשרת לאפליקציה לקבל את רשימת החשבונות המוכרים למכשיר ה-Android TV. הפרטים עשויים לכלול חשבונות שנוצרו על ידי אפליקציות שהתקנת." "מאפשר לאפליקציה לקבל רשימה של חשבונות המוכרים לטלפון. הדבר עשוי לכלול חשבונות שנוצרו על ידי אפליקציות שהתקנת." - "הצג חיבורי רשת" - "מאפשר לאפליקציה להציג מידע לגבי חיבורי רשת, למשל, אילו רשתות קיימות ומחוברות." + "הצגת חיבורי רשת" + "מאפשרת לאפליקציה להציג מידע לגבי חיבורי רשת, למשל, אילו רשתות קיימות ומחוברות." "קבלת גישת רשת מלאה" - "‏מאפשר לאפליקציה ליצור Sockets ולהשתמש בפרוטוקולי רשת מותאמים אישית. הדפדפן, כמו אפליקציות אחרות, מספק אמצעים לשליחת נתונים לאינטרנט, כך שאישור זה אינו נחוץ לשליחת נתונים לאינטרנט." - "שנה את קישוריות הרשת" + "‏מאפשרת לאפליקציה ליצור Sockets ולהשתמש בפרוטוקולי רשת מותאמים אישית. הדפדפן, כמו אפליקציות אחרות, מספק אמצעים לשליחת נתונים לאינטרנט, כך שאישור זה אינו נחוץ לשליחת נתונים לאינטרנט." + "שינוי של קישוריות הרשת" "מאפשר לאפליקציה לשנות את מצב הקישוריות של הרשת." "שינוי של קישוריות קשורה" "מאפשר לאפליקציה לשנות את מצב הקישוריות של רשת קשורה." @@ -505,25 +505,25 @@ "‏אפשר קבלת שידורים מרובים ב-Wi-Fi" "‏מאפשר לאפליקציה לקבל חבילות שנשלחו לכל המכשירים ברשת Wi-Fi באמצעות כתובות שידור לקבוצה, ולא רק בטאבלט שלך. צריכת החשמל גבוהה יותר מאשר במצב שאינו שידור לקבוצה." "‏מאפשרת לאפליקציה לקבל חבילות שנשלחו לכל המכשירים ברשת Wi-Fi באמצעות כתובות מולטיקאסט, ולא רק למכשיר ה-Android TV. צריכת החשמל תהיה גבוהה יותר מאשר במצב שאינו מולטיקאסט." - "‏מאפשר לאפליקציה לקבל חבילות שנשלחו לכל המכשירים ברשת Wi-Fi באמצעות כתובות שידור לקבוצה, ולא רק בטלפון שלך. צריכת החשמל גבוהה יותר מאשר במצב שאינו שידור לקבוצה." + "‏מאפשרת לאפליקציה לקבל חבילות שנשלחו לכל המכשירים ברשת Wi-Fi באמצעות כתובות שידור לקבוצה, ולא רק בטלפון שלך. צריכת החשמל גבוהה יותר מאשר במצב שאינו שידור לקבוצה." "‏גישה להגדרות Bluetooth" "‏מאפשר לאפליקציה להגדיר את תצורתו של הטאבלט המקומי מסוג Bluetooth וכן לגלות מכשירים מרוחקים ולבצע התאמה איתם." - "‏מאפשרת לאפליקציה להגדיר Bluetooth במכשיר ה-Android TV, ולגלות מכשירים מרוחקים ולבצע התאמה איתם." + "‏מאפשרת לאפליקציה להגדיר Bluetooth במכשיר ה-Android TV, ולגלות מכשירים מרוחקים ולבצע איתם התאמה." "‏מאפשר לאפליקציה להגדיר את תצורתו של הטלפון המקומי מסוג Bluetooth וכן לגלות מכשירים מרוחקים ולבצע התאמה איתם." "‏התחברות והתנתקות מ-WiMAX" - "‏מאפשר לאפליקציה לדעת האם WiNMAX מופעל, כמו גם לקבל מידע האם רשתות WiNMAX כלשהן מחוברות." + "‏מאפשרת לאפליקציה לדעת האם WiNMAX מופעל, ולקבל מידע לגבי רשתות WiNMAX מחוברות." "‏שנה את מצב WiMAX" - "‏מאפשר לאפליקציה לחבר את הטאבלט לרשתות WiMAX ולהתנתק מהן." + "‏מאפשרת לאפליקציה לחבר את הטאבלט לרשתות WiMAX ולהתנתק מהן." "‏מאפשרת לאפליקציה לחבר את מכשיר ה-Android TV לרשתות WiMAX ולהתנתק מהן." "‏מאפשר לאפליקציה לחבר את הטלפון לרשתות WiMAX ולהתנתק מהן." "‏התאמה למכשירי Bluetooth" "‏מאפשר לאפליקציה להציג את תצורת ה-Bluetooth בטאבלט, וכן ליצור ולקבל חיבורים עם מכשירים מותאמים." "‏מאפשרת לאפליקציה להציג את הגדרת ה-Bluetooth במכשיר ה-Android TV, וליצור ולקבל חיבורים עם מכשירים מותאמים." - "‏מאפשר לאפליקציה להציג את תצורת ה-Bluetooth בטלפון, וכן ליצור ולקבל חיבורים עם מכשירים מותאמים." + "‏מאפשרת לאפליקציה להציג את תצורת ה-Bluetooth בטלפון, וכן ליצור ולקבל חיבורים עם מכשירים מותאמים." "‏פרטים על שירות תשלום מועדף ב-NFC" "‏מאפשרת לאפליקציה לקבל פרטים על שירות תשלום מועדף ב-NFC, כמו עזרים רשומים ויעד של נתיב." "‏שלוט ב-Near Field Communication" - "מאפשר לאפליקציה נהל תקשורת עם תגים, כרטיסים וקוראים מסוג \'תקשורת מטווח קצר\'." + "‏מאפשרת לאפליקציה נהל תקשורת עם תגים, כרטיסים וקוראים מסוג \'תקשורת מטווח קצר\' (NFC)." "ביטול נעילת המסך שלך" "מאפשר לאפליקציה להשבית את נעילת המקשים וכל אמצעי אבטחה משויך המבוסס על סיסמה. לדוגמה, הטלפון משבית את נעילת המקשים בעת קבלה של שיחת טלפון נכנסת, ולאחר מכן מפעיל מחדש את נעילת המקשים עם סיום השיחה." "בקשת מידע לגבי מידת המורכבות של נעילת המסך" @@ -532,8 +532,8 @@ "מאפשרת לאפליקציה להשתמש בחומרה ביומטרית לצורך אימות" "ניהול חומרה של טביעות אצבעות" "מאפשר לאפליקציה להפעיל שיטות להוספה ומחיקה של תבניות טביעות אצבעות שבהן ייעשה שימוש." - "חומרה של טביעות אצבעות" - "מאפשר לאפליקציה להשתמש בחומרה של טביעות אצבעות לצורך אימות" + "שימוש בחומרה של טביעות אצבעות" + "מאפשרת לאפליקציה להשתמש בחומרה של טביעות אצבעות לצורך אימות" "לשנות את אוסף המוזיקה שלך" "מאפשרת לאפליקציה לשנות את אוסף המוזיקה שלך." "לשנות את אוסף הסרטונים שלך" @@ -542,12 +542,12 @@ "מאפשרת לאפליקציה לשנות את אוסף התמונות שלך." "לקרוא מיקומים מאוסף המדיה שלך" "מאפשרת לאפליקציה לקרוא מיקומים מאוסף המדיה שלך." - "אימות זהותך" + "אימות הזהות שלך" "חומרה ביומטרית לא זמינה" "האימות בוטל" "לא זוהתה" "האימות בוטל" - "עוד לא הוגדרו קוד גישה, קו ביטול נעילה או סיסמה" + "עוד לא הוגדרו קוד אימות, קו ביטול נעילה או סיסמה" "זוהתה טביעת אצבע חלקית. אפשר לנסות שוב." "לא ניתן היה לעבד את טביעת האצבע. נסה שוב." "החיישן של טביעות האצבעות מלוכלך. צריך לנקות אותו ולנסות שוב." @@ -560,10 +560,10 @@ "זיהוי הפנים בוצע. יש ללחוץ על אישור" "החומרה בשביל טביעות אצבעות אינה זמינה." "לא ניתן לאחסן טביעת אצבע. יש להסיר טביעת אצבע קיימת." - "חלף הזמן הקצוב לטביעת אצבע. אפשר לנסות שוב." + "נגמר הזמן הקצוב לטביעת אצבע. אפשר לנסות שוב." "פעולת טביעת האצבע בוטלה." - "פעולת טביעת האצבע בוטלה בידי המשתמש." - "יותר מדי ניסיונות. נסה שוב מאוחר יותר." + "פעולת טביעת האצבע בוטלה על ידי המשתמש." + "יותר מדי ניסיונות. יש לנסות שוב מאוחר יותר." "יותר מדי ניסיונות. חיישן טביעות האצבע הושבת." "כדאי לנסות שוב." "לא נרשמו טביעות אצבע." @@ -577,15 +577,15 @@ "מאפשרת לאפליקציה להפעיל שיטות להוספה ומחיקה של תבניות פנים שבהן ייעשה שימוש." "שימוש בחומרה לשחרור נעילה על ידי זיהוי פנים" "מאפשרת לאפליקציה להשתמש בחומרה לשחרור נעילה על ידי זיהוי פנים לצורך אימות" - "שחרור נעילה בזיהוי פנים" - "יש לבצע רישום מחדש של הפנים שלך" + "שחרור נעילה על ידי זיהוי פנים" + "יש לבצע סריקה חוזרת של הפנים שלך" "לשיפור הזיהוי יש לבצע רישום מחדש של הפנים שלך" "לא ניתן היה לקלוט את הפנים במדויק. יש לנסות שוב." "בהיר מדי. צריך תאורה עדינה יותר." "התמונה חשוכה מדי. צריך תאורה חזקה יותר." "יש להרחיק את הטלפון." "צריך לקרב את הטלפון." - "צריך להגביה את הטלפון." + "צריך להרים את הטלפון גבוה יותר." "צריך להוריד את הטלפון." "צריך להזיז את הטלפון שמאלה." "צריך להזיז את הטלפון ימינה." @@ -604,8 +604,8 @@ "לא ניתן לאמת את הפנים. החומרה לא זמינה." "יש לנסות שוב את שחרור הנעילה על ידי זיהוי פנים." - "לא ניתן לאחסן נתוני פנים. תחילה יש למחוק פנים ישנים." - "פעולת הפנים בוטלה." + "לא ניתן לאחסן נתוני פנים חדשים. תחילה יש למחוק את הנתונים הישנים." + "הפעולה לאימות הפנים בוטלה." "שחרור הנעילה על ידי זיהוי פנים בוטל על ידי המשתמש." "יותר מדי ניסיונות. יש לנסות שוב מאוחר יותר." "יותר מדי ניסיונות. שחרור נעילה על ידי זיהוי פנים מושבת." @@ -620,39 +620,39 @@ "קרא את הגדרות הסינכרון" "מאפשר לאפליקציה לקרוא את הגדרות הסנכרון של חשבון. לדוגמה, ניתן לגלות כך האם האפליקציה \'אנשים\' מסונכרן עם חשבון כלשהו." "הפעלת וכיבוי סנכרון" - "מאפשר לאפליקציה לשנות את הגדרות הסנכרון של חשבון. לדוגמה, ניתן להשתמש בכך על מנת להפעיל סנכרון של האפליקציה \'אנשים\' עם חשבון כלשהו." - "קרא את הנתונים הסטטיסטיים של הסינכרון" - "מאפשר לאפליקציה לקרוא את סטטיסטיקת הסנכרון של חשבון, כולל היסטוריית אירועי הסנכרון וכמות הנתונים שסונכרנה." + "מאפשרת לאפליקציה לשנות את הגדרות הסנכרון של חשבונות. לדוגמה, אפשר להשתמש בהרשאה הזו כדי להפעיל סנכרון של האפליקציה \'אנשים\' עם חשבון כלשהו." + "קריאת הנתונים הסטטיסטיים של הסנכרון" + "מאפשרת לאפליקציה לקרוא את סטטיסטיקת הסנכרון של חשבון, כולל היסטוריית אירועי הסנכרון וכמות הנתונים שסונכרנה." "קריאת התוכן של האחסון המשותף שלך" "מאפשר לאפליקציה לקרוא את התוכן של האחסון המשותף." "שינוי או מחיקה של תוכן האחסון המשותף שלך" "מאפשר לאפליקציה לכתוב את התוכן של האחסון המשותף." "‏ביצוע/קבלה של שיחות SIP" "‏אפשר לאפליקציה לבצע ולקבל שיחות SIP." - "‏רשום חיבורי Telecom SIM חדשים" + "‏רישום חיבורי Telecom SIM חדשים" "‏מאפשר לאפליקציה לרשום חיבורי Telecom SIM חדשים." "‏רשום חיבורי Telecom חדשים" - "מאפשר לאפליקציה לרשום חיבורי תקשורת חדשים." + "מאפשרת לאפליקציה לרשום חיבורי תקשורת חדשים." "ניהול חיבורי תקשורת" "מאפשר לאפליקציה לנהל חיבורי תקשורת." "צור אינטראקציה עם מסך שיחה נכנסת" "מאפשר לאפליקציה לקבוע מתי ואיך המשתמש יראה את מסך השיחה הנכנסת." "צור אינטראקציה עם שירותי טלפוניה" - "מאפשר לאפליקציה ליצור אינטראקציה עם שירותי טלפוניה כדי לבצע/לקבל שיחות." - "ספק חווית משתמש של שיחה נכנסת" - "מאפשר לאפליקציה לספק חוויית משתמש של שיחה נכנסת." + "מאפשרת לאפליקציה ליצור אינטראקציה עם שירותי טלפוניה כדי לבצע ולקבל שיחות." + "סיפוק חווית שימוש של שיחה נכנסת" + "מאפשרת לאפליקציה לספק חוויית שימוש של שיחה נכנסת." "קריאת נתוני שימוש היסטוריים ברשת" "מאפשר לאפליקציה לקרוא נתוני שימוש היסטוריים ברשת עבור רשתות ואפליקציות ספציפיות." "נהל מדיניות רשת" "מאפשר לאפליקציה לנהל מדיניות הרשת להגדיר כללים ספציפיים-לאפליקציה." - "שנה ניהול חשבונות של שימוש ברשת" - "הרשאה זו מאפשרת לאפליקציה לשנות את אופן החישוב של נתוני שימוש ברשת מול כל אפליקציה. לא מיועד לשימוש באפליקציות רגילות." + "שינוי ניהול החשבונות של שימוש ברשת" + "ההרשאה הזו מאפשרת לאפליקציה לשנות את אופן החישוב של נתוני שימוש ברשת מול כל אפליקציה. לא מיועדת לשימוש באפליקציות רגילות." "גישה להתראות" "מאפשר לאפליקציה לאחזר, לבדוק ולמחוק התראות, כולל כאלה שפורסמו על ידי אפליקציות אחרות." "איגוד לשירות של מאזין להתראות" - "הרשאה זו מאפשרת למשתמש לבצע איגוד לממשק הרמה העליונה של שירות מאזין להתראות. הרשאה זו אף פעם אינה נחוצה לאפליקציות רגילים." + "מאפשרת למשתמש לבצע איגוד לממשק הרמה העליונה של שירות האזנה להתראות. ההרשאה הזו אינה נחוצה לאפליקציות רגילות." "איגוד לשירות ספק תנאי" - "מאפשרת לבעלים לאגד לממשק ברמה העליונה של שירות ספק תנאי. לעולם לא אמורה להיות נחוצה עבור אפליקציות רגילות." + "מאפשרת לבעלים לאגד לממשק ברמה העליונה של שירות ספק תנאי. לא אמורה להיות נחוצה עבור אפליקציות רגילות." "איגוד לשירות ׳חלום בהקיץ׳" "מאפשרת לבעלים לבצע איגוד לממשק הרמה העליונה של שירות ׳חלום בהקיץ׳. הרשאה זו אף פעם אינה נחוצה לאפליקציות רגילות." "הפעלה של אפליקציית תצורה שסופקה על ידי ספק" @@ -670,13 +670,13 @@ "איגוד לשירות העברת הודעות של ספק" "מאפשרת לבעלים לאגד לממשק ברמה העליונה של שירות העברת הודעות של ספק. לעולם לא אמורה להיות נחוצה עבור אפליקציות רגילות." "איגוד לשירותי ספק" - "מאפשר לבעלים לאגד לשירות ספק. לעולם לא אמור להיות נחוץ לאפליקציות רגילות." + "מאפשרת לבעלים לאגד לשירות ספק. לא נחוצה לאפליקציות רגילות בדרך כלל." "גישה אל \'נא לא להפריע\'" - "מאפשר לאפליקציה לקרוא ולכתוב את התצורה של \'נא לא להפריע\'." + "מאפשרת לאפליקציה לקרוא ולכתוב את התצורה של התכונה \'נא לא להפריע\'." "התחלת צפייה בהרשאות השימוש" "מאפשרת לבעלים להפעיל את השימוש בהרשאות עבור אפליקציה מסוימת. הרשאה זו אף פעם לא נדרשת עבור אפליקציות רגילות." "הגדר כללי סיסמה" - "קביעת האורך הנדרש והתווים המותרים בסיסמאות ובקודי הגישה של מסך הנעילה." + "קביעת האורך הנדרש והתווים המותרים בסיסמאות ובקודי האימות של מסך הנעילה." "מעקב אחר ניסיונות לביטול של נעילת המסך" "ניהול מעקב אחר מספר הסיסמאות השגויות שמוקלדות בעת ביטול נעילת המסך, וביצוע נעילה של הטאבלט, או מחיקה של כל נתוני הטאבלט, אם מוקלדות יותר מדי סיסמאות שגויות." "‏מעקב אחר מספר הסיסמאות השגויות שהוזנו בעת ביטול נעילת המסך, כמו גם נעילה של מכשיר ה-Android TV או מחיקה של כל נתוני מכשיר ה-Android TV אם הוזנו יותר מדי סיסמאות שגויות." @@ -689,23 +689,23 @@ "נעילת המסך" "שליטה באופן ובתזמון של נעילת המסך." "מחיקת כל הנתונים" - "מחק את נתוני הטאבלט ללא אזהרה על ידי ביצוע איפוס נתוני יצרן." + "מחיקה של נתוני הטאבלט ללא אזהרה, באמצעות איפוס לנתוני היצרן." "‏מחיקה ללא אזהרה של נתוני מכשיר ה-Android TV באמצעות איפוס לנתוני היצרן." - "מחיקה של נתוני הטלפון, ללא אזהרה, על ידי ביצוע איפוס נתוני יצרן." + "מחיקה של נתוני הטלפון, ללא אזהרה, על ידי ביצוע איפוס לנתוני היצרן." "מחיקת נתוני משתמש" "מחיקה ללא אזהרה של נתוני המשתמש הזה בטאבלט הזה." - "‏מחיקה ללא אזהרה של נתוני המשתמש הזה במכשיר ה-Android TV הזה." + "‏מחיקה של נתוני המשתמש הזה במכשיר ה-Android TV, ללא אזהרה." "מחיקה ללא אזהרה של נתוני המשתמש הזה בטלפון הזה." "‏הגדר את שרת ה-Proxy הכללי של המכשיר" "‏הגדרה של שרת ה-proxy הגלובלי שבו ייעשה שימוש כשהמדיניות פועלת. רק הבעלים של המכשיר יכול להגדיר את שרת ה-proxy הגלובלי." "הגדרת תפוגה לסיסמת מסך הנעילה" "שינוי התדירות לדרישת השינוי של הסיסמה, קוד הגישה או קו ביטול הנעילה של מסך הנעילה." - "הגדר הצפנת אחסון" - "דרוש שנתוני אפליקציות מאוחסנות יהיו מוצפנים." - "השבת מצלמות" + "הגדרת הצפנה של אחסון" + "נדרש שנתונים של אפליקציות מאוחסנות יהיו מוצפנים." + "השבתת מצלמות" "מנע שימוש בכל המצלמות שבמכשיר." - "השבת חלק מהתכונות של נעילת המסך" - "מנע שימוש בחלק מהתכונות של נעילת המסך." + "השבתת חלק מהתכונות של נעילת המסך" + "מניעת שימוש בחלק מהתכונות של נעילת המסך." "בית" "נייד" @@ -768,7 +768,7 @@ "TTY TDD" "נייד של העבודה" "זימונית מהעבודה" - "מסייע" + "אסיסטנט" "MMS" "מותאם אישית" "תאריך לידה" @@ -808,7 +808,7 @@ "אב" "חבר" "מנהל" - "אם" + "אמא" "הורה" "שותף" "הופנה על ידי" @@ -820,38 +820,38 @@ "עבודה" "אחר" "לא נמצאה אפליקציה להצגת התוכן הזה." - "הקלד קוד גישה" - "‏הקלד את קוד ה-PUK וקוד הגישה החדש" + "יש להקליד קוד אימות" + "‏יש להקליד את קוד ה-PUK ואת קוד האימות החדש" "‏קוד PUK" - "קוד גישה חדש" - "הקש כדי להקליד את הסיסמה" + "קוד אימות חדש" + "יש להקיש כדי להקליד את הסיסמה" "הקלד סיסמה לביטול הנעילה" - "הקלד קוד גישה לביטול הנעילה" - "קוד גישה שגוי" + "יש להקליד קוד אימות לביטול הנעילה" + "קוד אימות שגוי" "כדי לבטל את הנעילה, לחץ על \'תפריט\' ולאחר מכן על 0." "מספר חירום" "אין שירות" "המסך נעול." - "לחץ על \'תפריט\' כדי לבטל את הנעילה או כדי לבצע שיחת חירום." - "לחץ על \'תפריט\' כדי לבטל את הנעילה." - "שרטט קו לביטול נעילת המסך" + "יש ללחוץ על \'תפריט\' כדי לבטל את הנעילה או כדי לבצע שיחת חירום." + "יש ללחוץ על \'תפריט\' כדי לבטל את הנעילה." + "יש לשרטט קו לביטול נעילת המסך" "שיחת חירום" "חזרה לשיחה" "נכון!" "כדאי לנסות שוב" "כדאי לנסות שוב" "בטל את הנעילה לכל התכונות והנתונים" - "חרגת ממספר הניסיונות המרבי של זיהוי פנים" + "חרגת ממספר הניסיונות המרבי לשחרור נעילה על ידי זיהוי פנים" "‏אין כרטיס SIM" "‏אין כרטיס SIM בטאבלט." "‏אין כרטיס SIM במכשיר ה-Android TV." "‏אין כרטיס SIM בטלפון." - "‏הכנס כרטיס SIM." - "‏כרטיס ה-SIM חסר או שלא ניתן לקרוא אותו. הכנס כרטיס SIM." - "‏לא ניתן להשתמש בכרטיס SIM זה." - "‏כרטיס ה-SIM שלך הושבת לצמיתות.\nפנה לספק השירות האלחוטי שלך לקבלת כרטיס SIM אחר." + "‏יש להכניס כרטיס SIM." + "‏כרטיס ה-SIM חסר או שלא ניתן לקרוא אותו. יש להכניס כרטיס SIM." + "‏לא ניתן להשתמש בכרטיס ה-SIM הזה." + "‏כרטיס ה-SIM שלך הושבת באופן סופי.\nיש לפנות לספק השירות האלחוטי שלך לקבלת כרטיס SIM אחר." "הרצועה הקודמת" - "הרצועה הבאה" + "הטראק הבא" "השהה" "הפעלה" "הפסק" @@ -860,15 +860,15 @@ "שיחות חירום בלבד" "רשת נעולה" "‏כרטיס SIM נעול באמצעות PUK." - "עיין במדריך למשתמש או פנה לשירות הלקוחות." + "יש לעיין במדריך למשתמש או לפנות לשירות הלקוחות." "‏כרטיס ה-SIM נעול." "‏מבטל נעילה של כרטיס SIM…" - "שרטטת את קו ביטול הנעילה באופן שגוי %1$d פעמים. \n\nנסה שוב בעוד %2$d שניות." + "שרטטת את קו ביטול הנעילה באופן שגוי %1$d פעמים. \n\nיש לנסות שוב בעוד %2$d שניות." "הקלדת סיסמה שגויה %1$d פעמים.\n\nנסה שוב בעוד %2$d שניות." "הקלדת קוד גישה שגוי %1$d פעמים.\n\nנסה שוב בעוד %2$d שניות." "‏שרטטת באופן שגוי את קו ביטול הנעילה %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, תתבקש לבטל את נעילת הטאבלט באמצעות פרטי הכניסה שלך ל-Google.\n\nנסה שוב בעוד %3$d שניות." "‏שרטטת קו ביטול נעילה שגוי %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, תתבקש לבטל את הנעילה של מכשיר ה-Android TV באמצעות כניסה לחשבון Google שלך.\n\n נסה שוב בעוד %3$d שניות." - "‏שרטטת את קו ביטול הנעילה באופן שגוי %1$d פעמים. בעוד %2$d ניסיונות כושלים נוספים, תתבקש לבטל את נעילת הטלפון באמצעות פרטי הכניסה שלך ל-Google‏.\n\n נסה שוב בעוד %3$d שניות." + "‏שרטטת את קו ביטול הנעילה באופן שגוי %1$d פעמים. בעוד %2$d ניסיונות כושלים נוספים, יהיה צורך לבטל את נעילת הטלפון באמצעות פרטי הכניסה שלך ל-Google‏.\n\n יש לנסות שוב בעוד %3$d שניות." "ביצעת %1$d ניסיונות שגויים לביטול נעילת הטאבלט. לאחר %2$d ניסיונות כושלים נוספים, הטאבלט יעבור איפוס לברירת המחדל של היצרן וכל נתוני המשתמש יאבדו." "‏ניסית לבטל בצורה שגויה את הנעילה של מכשיר ה-Android TV %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, מכשיר ה-Android TV יעבור איפוס לברירת המחדל של היצרן וכל נתוני המשתמש יאבדו." "ביצעת %1$d ניסיונות שגויים לביטול נעילת הטלפון. לאחר %2$d ניסיונות כושלים נוספים, הטלפון יעבור איפוס לברירת המחדל של היצרן וכל נתוני המשתמש יאבדו." @@ -876,16 +876,16 @@ "‏ניסית לבטל בצורה שגויה את הנעילה של מכשיר ה-Android TV %d פעמים. מכשיר ה-Android TV יעבור כעת איפוס לברירת המחדל של היצרן." "ביצעת %d ניסיונות שגויים לביטול נעילת הטלפון. הטלפון יעבור כעת איפוס לברירת המחדל של היצרן." "נסה שוב בעוד %d שניות." - "שכחת את הקו?" - "ביטול נעילת חשבון" + "שכחת את קו ביטול הנעילה?" + "ביטול נעילת החשבון" "בוצעו ניסיונות רבים מדי לשרטוט קו ביטול נעילה." - "‏כדי לבטל את הנעילה, היכנס באמצעות חשבון Google שלך." + "‏כדי לבטל את הנעילה, עליך להיכנס באמצעות חשבון Google שלך." "שם משתמש (אימייל)" "סיסמה" "כניסה" "שם משתמש או סיסמה לא חוקיים." - "‏שכחת את שם המשתמש או הסיסמה?\nהיכנס לכתובת ""google.com/accounts/recovery" - "בודק..." + "‏שכחת את שם המשתמש או הסיסמה?\nאפשר להיכנס לכתובת ""google.com/accounts/recovery" + "בבדיקה..." "בטל נעילה" "קול פועל" "ללא קול" @@ -908,12 +908,12 @@ "‏סידור מחדש של Widgets התחיל." "‏סידור מחדש של Widgets הסתיים." "‏Widget ‏%1$s נמחק." - "הרחב את אזור ביטול הנעילה." + "הרחבה של אזור ביטול הנעילה." "ביטול נעילה באמצעות הסטה." "ביטול נעילה על ידי שרטוט קו." "ביטול נעילה באמצעות זיהוי פנים." "ביטול נעילה באמצעות קוד גישה." - "‏ביטול נעילה של קוד הגישה ל-SIM." + "‏ביטול הנעילה של קוד האימות ל-SIM." "‏ביטול נעילה של PUK ל-SIM." "ביטול נעילה באמצעות סיסמה." "אזור לשרטוט קו ביטול נעילה." @@ -929,12 +929,12 @@ "‏הפעולה FACTORY_TEST נתמכת רק עבור חבילות שהותקנו ב-‎/system/app." "‏לא נמצאה חבילה המספקת את הפעולה FACTORY_TEST." "אתחל מחדש" - "בדף שבכתובת \'%s\' כתוב כך:" + "בדף שבכתובת \'%s\' כתוב:" "JavaScript" "אישור ניווט" "צא מדף זה" - "הישאר בדף זה" - "%s\n\nהאם אתה בטוח שברצונך לנווט אל מחוץ לדף זה?" + "להישאר בדף הזה" + "%s\n\nבטוח שברצונך לנווט אל מחוץ לדף הזה?" "אישור" "טיפ: הקש פעמיים כדי להגדיל ולהקטין." "מילוי אוטומטי" @@ -958,19 +958,19 @@ "אמירות" "קריאת סימניות והיסטוריית האינטרנט שלך" "‏מאפשר לאפליקציה לקרוא את ההיסטוריה של כל כתובות האתרים שבהן הדפדפן ביקר, ואת כל ה-Bookmarks של הדפדפן. שים לב: דפדפני צד שלישי או אפליקציות אחרות עם יכולות לדפדוף באינטרנט אינם יכולים לאכוף אישור זה." - "כתיבת סימניות והיסטוריית אינטרנט" + "כתיבת סימניות והיסטורייה של אתרים" "‏מאפשר לאפליקציה לשנות את ההיסטוריה או ה-Bookmarks של הדפדפן המאוחסנים בטאבלט. הדבר עשוי לאפשר לאפליקציה למחוק או לשנות נתוני דפדפן. שים לב: אישור זה אינו ניתן לאכיפה על ידי דפדפני צד שלישי או אפליקציות אחרות בעלות יכולות גלישה באינטרנט." "‏מאפשרת לאפליקציה לשנות את הסימניות או את היסטוריית הדפדפן השמורות במכשיר ה-Android TV. הרשאה זו עשויה לאפשר לאפליקציה למחוק או לשנות נתוני דפדפן. הערה: ייתכן שההרשאה לא תיושם על ידי דפדפנים של צד שלישי או על ידי אפליקציות אחרות עם יכולות גלישה באינטרנט." "‏מאפשר לאפליקציה לשנות את ההיסטוריה או ה-Bookmarks של הדפדפן המאוחסנים בטלפון. הדבר עשוי לאפשר לאפליקציה למחוק או לשנות נתוני דפדפן. שים לב: אישור זה אינו ניתן לאכיפה על ידי דפדפני צד שלישי או אפליקציות אחרות בעלות יכולות גלישה באינטרנט." "הגדרת התראה" - "מאפשר לאפליקציה להגדיר התראה באפליקציה מותקנת של שעון מעורר. אפליקציות מסוימות של שעון מעורר אינן מיישמות תכונה זו." - "הוסף דואר קולי" - "מאפשר לאפליקציה להוסיף הודעות לתיבת הדואר הקולי." + "מאפשרת לאפליקציה להגדיר התראה באפליקציה מותקנת של שעון מעורר. אפליקציות מסוימות של שעון מעורר אינן מיישמות את התכונה הזו." + "הוספה של דואר קולי" + "מאפשרת לאפליקציה להוסיף הודעות לתיבת הדואר הקולי." "שינוי הרשאות המיקום הגיאוגרפי של הדפדפן" "מאפשר לאפליקציה לשנות את הרשאות המיקום הגיאוגרפי של הדפדפן. אפליקציות זדוניות עלולות להשתמש בכך כדי לאפשר משלוח של פרטי מיקום לאתרים זדוניים אחרים." "האם ברצונך שהדפדפן יזכור סיסמה זו?" - "לא כעת" - "זכור" + "לא עכשיו" + "כן, לשמור" "אף פעם" "אין לך הרשאה לפתוח דף זה." "הטקסט הועתק ללוח." @@ -990,11 +990,11 @@ "חיפוש…" "חיפוש" "שאילתת חיפוש" - "נקה שאילתה" - "שלח שאילתה" + "ניקוי שאילתה" + "שליחת שאילתה" "חיפוש קולי" - "האם להפעיל את התכונה \'חקור על ידי מגע\'?" - "%1$s רוצה להפעיל את התכונה \'חקור על ידי מגע\'. כאשר התכונה \'חקור על ידי מגע\' מופעלת, אתה יכול לשמוע או לראות תיאורים של הפריטים שעליהם אצבעך מונחת או לקיים אינטראקציה עם הטאבלט באמצעות תנועות אצבע." + "האם להפעיל את התכונה \'גילוי באמצעות מגע\'?" + "%1$s רוצה להפעיל את התכונה \'גילוי באמצעות מגע\'. כאשר התכונה הזו מופעלת, אפשר לשמוע או לראות תיאורים של הפריטים שעליהם הנחת את האצבע או לקיים אינטראקציה עם הטאבלט באמצעות תנועות." "%1$s רוצה להפעיל את התכונה \'חקור על ידי מגע\'. כאשר התכונה \'חקור על ידי מגע\' מופעלת, אתה יכול לשמוע או לראות תיאורים של הפריטים שעליהם אצבעך מונחת או לקיים אינטראקציה עם הטלפון באמצעות תנועות אצבע." "לפני חודש אחד" "לפני חודש אחד" @@ -1002,7 +1002,7 @@ %d הימים האחרונים %d הימים האחרונים %d הימים האחרונים - יום %d אחרון + היום האחרון (%d) "בחודש שעבר" "ישן יותר" @@ -1098,7 +1098,7 @@ בעוד %d דקות בעוד %d דקות בעוד %d דקות - בעוד %d דקה + בעוד דקה אחת (%d) בעוד %d שעות @@ -1119,7 +1119,7 @@ בעוד שנה %d "בעיה בווידאו" - "סרטון זה אינו חוקי להעברה כמדיה זורמת למכשיר זה." + "לא ניתן להעביר את הסרטון הזה בסטרימינג למכשיר." "לא ניתן להפעיל סרטון זה." "אישור" "%1$s, %2$s" @@ -1129,15 +1129,15 @@ "חצות" "%1$02d:%2$02d" "%1$d:%2$02d:%3$02d" - "בחר הכל" - "חתוך" - "העתק" + "בחירת הכול" + "חיתוך" + "העתקה" "ההעתקה אל הלוח נכשלה" "הדבק" - "הדבק כטקסט פשוט" - "החלף..." + "הדבקה כטקסט פשוט" + "החלפה..." "מחיקה" - "העתק כתובת אתר" + "‏העתקת כתובת URL" "בחר טקסט" "ביטול" "בצע מחדש" @@ -1147,17 +1147,17 @@ "מחיקה" "שיטת קלט" "פעולות טקסט" - "שטח האחסון אוזל" + "מקום האחסון עומד להיגמר" "ייתכן שפונקציות מערכת מסוימות לא יפעלו" - "‏אין מספיק שטח אחסון עבור המערכת. ודא שיש לך שטח פנוי בגודל 250MB התחל שוב." - "%1$s פועל" + "‏אין מספיק מקום אחסון עבור המערכת. עליך לוודא שיש לך מקום פנוי בנפח של 250MB ולהתחיל שוב." + "אפליקציית %1$s פועלת" "הקש לקבלת מידע נוסף או כדי לעצור את האפליקציה." "אישור" "ביטול" "אישור" "ביטול" "זהירות" - "טוען..." + "בטעינה..." "מופעל" "כבוי" "מסומן" @@ -1165,7 +1165,7 @@ "השלמת פעולה באמצעות" "‏להשלמת הפעולה באמצעות %1$s" "השלם פעולה" - "פתח באמצעות" + "פתיחה באמצעות" "‏פתח באמצעות %1$s" "פתח" "פתיחת קישורים של %1$s באמצעות" @@ -1173,36 +1173,36 @@ "פתיחת קישורים באמצעות %1$s" "פתיחת קישורים של %1$s באמצעות %2$s" "הענקת גישה" - "ערוך באמצעות" - "‏ערוך באמצעות %1$s" + "עריכה באמצעות" + "‏עריכה באמצעות %1$s" "עריכה" "שיתוף" - "‏שתף באמצעות %1$s" + "‏שיתוף באמצעות %1$s" "שתף" "שליחה באמצעות" "‏שליחה באמצעות %1$s" - "שלח" + "שליחה" "בחר אפליקציה שתשמש כדף הבית" "‏השתמש ב-%1$s כדף הבית" "צלם תמונה" "צלם תמונה באמצעות" "‏צילום תמונה באמצעות %1$s" "צלם תמונה" - "השתמש כברירת מחדל עבור פעולה זו." + "שימוש כברירת מחדל עבור הפעולה הזו." "השתמש באפליקציה אחרת" "‏נקה את הגדרת המחדל ב\'הגדרות מערכת\' <‏ Google Apps‏ < \'הורדות\'." "בחירת פעולה" - "‏בחר אפליקציה עבור התקן ה-USB" - "אין אפליקציות שיכולות לבצע פעולה זו." + "‏בחירת אפליקציה עבור התקן ה-USB" + "אין אפליקציות שיכולות לבצע את הפעולה הזו." "האפליקציה %1$s הפסיקה" "התהליך %1$s הפסיק" "האפליקציה %1$s נעצרת שוב ושוב" "האפליקציה %1$s נעצרת שוב ושוב" - "פתח שוב את האפליקציה" + "פתיחת האפליקציה מחדש" "שליחת משוב" "סגירה" "השתק עד הפעלה מחדש של המכשיר" - "המתן" + "להמתין" "סגור את האפליקציה" "האפליקציה %2$s אינה מגיבה" @@ -1215,10 +1215,10 @@ "הדף אינו מגיב.\n\nהאם אתה רוצה לסגור אותו?" "הפנייה מחדש של אפליקציה" "%1$s פועל כעת." - "%1$s הופעל במקור." + "אפליקציית %1$s הופעלה במקור." "שינוי קנה-מידה" - "הצג תמיד" - "‏אפשר תכונה זו מחדש ב\'הגדרות מערכת\' <‏ Google Apps‏ < \'הורדות\'." + "להציג תמיד" + "‏אפשר להפעיל מחדש את התכונה הזו ב\'הגדרות מערכת\' <‏ Google Apps‏ < \'הורדות\'." "%1$s אינו תומך בהגדרת הגודל הנוכחית של התצוגה, והתנהגותו עשויה להיות בלתי צפויה." "הצג תמיד" "‏%1$s נבנתה לגרסה לא תואמת של מערכת ההפעלה של Android ועלולה להתנהג באופן לא צפוי. ייתכן שקיימת גרסה מעודכנת של האפליקציה." @@ -1231,23 +1231,23 @@ "הפעלת המכשיר מתחילה…" "הפעלת הטלפון מתחילה…" "‏הפעלת Android מתחילה…" - "הפעלת הטאבלט מתחילה…" + "הטאבלט בתהליך הפעלה…" "הפעלת המכשיר מתחילה…" "מתבצעת אופטימיזציה של האחסון." "עדכון המערכת לקראת סיום…" "%1$s מבצעת שדרוג…" - "מבצע אופטימיזציה של אפליקציה %1$d מתוך %2$d." - "מכין את %1$s." + "מתבצעת אופטימיזציה של אפליקציה %1$d מתוך %2$d." + "המערכת מכינה את %1$s." "מפעיל אפליקציות." - "מסיים אתחול." + "תהליך האתחול בשלבי סיום." "%1$s פועל" "יש להקיש כדי לחזור למשחק" "בחירת משחק" "לקבלת ביצועים טובים יותר, רק אחד מבין המשחקים האלה יכול להיות פתוח בכל פעם." "חזרה אל %1$s" "פתיחת %1$s" - "%1$s האפליקציה תיסגר ללא שמירה" - "%1$s חורג מהגבלת הזיכרון" + "אפליקציית %1$s תיסגר ללא שמירה" + "%1$s חורג ממגבלת הזיכרון" "‏Dump של ערימה בשביל %1$s מוכן" "‏Dump של ערימה נאסף. יש להקיש כדי לשתף." "‏האם לשתף את נתוני ה-Dump של הערימה?" @@ -1264,7 +1264,7 @@ "עוצמת קול של התראה" "עוצמת הקול של ההתראות" "עוצמת קול" - "‏עוצמת קול של Bluetooth" + "‏עוצמת הקול של Bluetooth" "עוצמת קול של רינגטון" "עוצמת קול של שיחות" "עוצמת קול של מדיה" @@ -1276,20 +1276,20 @@ "צלילי התראה" "צלילי התראה" "לא ידוע" - "‏היכנס לרשת Wi-Fi" - "היכנס לרשת" + "‏כניסה לרשת Wi-Fi" + "כניסה לרשת" "ל-%1$s אין גישה לאינטרנט" - "הקש לקבלת אפשרויות" + "יש להקיש לצפייה באפשרויות" "לרשת הסלולרית אין גישה לאינטרנט" "לרשת אין גישה לאינטרנט" "‏לא ניתן לגשת לשרת DNS הפרטי" "הקישוריות של %1$s מוגבלת" - "כדי להתחבר למרות זאת יש להקיש" + "יש להקיש כדי להתחבר בכל זאת" "מעבר אל %1$s" "המכשיר משתמש ברשת %1$s כשלרשת %2$s אין גישה לאינטרנט. עשויים לחול חיובים." - "עבר מרשת %1$s לרשת %2$s" + "בוצע מעבר מרשת %1$s לרשת %2$s" "חבילת גלישה" "Wi-Fi" @@ -1298,14 +1298,14 @@ "VPN" "סוג רשת לא מזוהה" - "קבל" + "אישור" "דחה" "הוסף תו" - "‏שולח הודעות SMS" - "‏<b> %1$s </ b> שולח מספר רב של הודעות SMS. האם ברצונך לאפשר לאפליקציה זו להמשיך לשלוח הודעות?" + "‏מתבצעת שליחה של הודעות SMS" + "‏האפליקציה <b> %1$s </ b> שולחת מספר רב של הודעות SMS. האם לאפשר לאפליקציה הזו להמשיך לשלוח הודעות?" "כן, זה בסדר" "עדיף שלא" - "‏<b>%1$s</b> רוצה לשלוח הודעה אל <b>%2$s</b>." + "‏אפליקציית <b>%1$s</b> רוצה לשלוח הודעה אל <b>%2$s</b>." "הדבר ""עלול לגרום לחיובים"" בחשבון המכשיר הנייד שלך." "הדבר יגרום לחיובים בחשבון המכשיר הנייד שלך." "שלח" @@ -1315,7 +1315,7 @@ "אפשר תמיד" "לעולם אל תאפשר" "‏כרטיס ה-SIM הוסר" - "‏הרשת הסלולרית לא תהיה זמינה עד שתפעיל מחדש לאחר הכנסת כרטיס SIM חוקי." + "‏הרשת הסלולרית לא תהיה זמינה עד שתבוצע הפעלה מחדש לאחר הכנסת כרטיס SIM חוקי." "סיום" "‏כרטיס ה-SIM נוסף" "הפעל מחדש את המכשיר כדי לגשת אל הרשת הסלולרית." @@ -1323,21 +1323,21 @@ "הפעלה של השירות הסלולרי" "‏הורדה של אפליקציית הספק כדי להפעיל את כרטיס ה-SIM החדש" "‏ניתן להוריד את האפליקציה %1$s כדי להפעיל את כרטיס ה-SIM החדש" - "הורדת אפליקציה" + "להורדת האפליקציה" "‏ה-SIM החדש הוכנס" - "הקש כדי להגדיר" + "יש להקיש כדי להגדיר" "הגדרת שעה" "הגדרת תאריך" "הגדרה" "סיום" "חדש: " "מטעם %1$s." - "לא דרושים אישורים" + "לא נדרשות הרשאות" "פעולה זו עשויה לחייב אותך בכסף:" "אישור" "‏טעינת המכשיר הזה באמצעות USB" "‏טעינת המכשיר המחובר באמצעות USB" - "‏העברת קבצים ב-USB מופעלת" + "‏האפשרות להעברת קבצים ב-USB מופעלת" "‏PTP באמצעות USB מופעל" "‏שיתוף אינטרנט בין מכשירים באמצעות USB מופעל" "‏MIDI באמצעות USB מופעל" @@ -1353,7 +1353,7 @@ "יש להקיש כדי להשבית ניפוי באגים אלחוטי" "יש לבחור כדי להשבית ניפוי באגים אלחוטי." "מצב מסגרת בדיקה הופעל" - "כדי להשבית את מצב מסגרת בדיקה צריך לאפס להגדרות היצרן." + "כדי להשבית את מצב \'מסגרת בדיקה\' צריך לאפס להגדרות היצרן." "קונסולה סדרתית מופעלת" "קיימת השפעה על הביצועים. כדי להשבית, יש לבדוק את תוכנת האתחול." "‏יש נוזלים או חלקיקים ביציאת ה-USB" @@ -1363,12 +1363,12 @@ "עיבוד דוח על באג..." "האם לשתף דוח על באג?" "שיתוף דוח על באג…" - "מנהל המערכת ביקש דוח על באג כדי לסייע בפתרון בעיות במכשיר זה. ייתכן שאפליקציות ונתונים ישותפו." + "מנהל המערכת ביקש דוח על באג כדי לסייע בפתרון בעיות במכשיר הזה. ייתכן שאפליקציות ונתונים ישותפו." "שתף" "עדיף שלא" "בחר שיטת הזנה" "להשאיר במסך בזמן שהמקלדת הפיזית פעילה" - "הצג מקלדת וירטואלית" + "הצגת מקלדת וירטואלית" "הגדרת מקלדת פיזית" "הקש כדי לבחור שפה ופריסה" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" @@ -1392,7 +1392,7 @@ "ייתכן שיהיה צורך לפרמט מחדש את המכשיר. יש להקיש כדי להוציא את המדיה." "%s לא נתמך" "המדיה %s לא פועלת" - "מכשיר זה אינו תומך ב-%s זה. הקש כדי להגדיר בפורמט נתמך." + "אין תמיכה ב-%s במכשיר הזה. יש להקיש כדי לבצע הגדרה בפורמט נתמך." "%s לא נתמך במכשיר הזה. בחר כדי להגדיר בפורמט שנתמך." "ייתכן שיהיה צורך לפרמט מחדש את המכשיר" "%s הוסר באופן בלתי צפוי" @@ -1402,26 +1402,26 @@ "הוצאה של %s" "אין להסיר" "הגדרה" - "הוצא" - "גלה" + "הוצאה" + "עיון במדיה" "החלפת פלט" - "%s חסר" + "חסר: %s" "יש להכניס שוב את ההתקן" "מעביר את %s" - "מעביר נתונים" + "מתבצעת העברה של נתונים" "העברת התוכן הסתיימה" "התוכן הועבר אל %s" "לא ניתן היה להעביר תוכן" "יש לנסות שוב להעביר את התוכן" "הוסר" - "הוצא" + "בוצעה הוצאה" "בודק…" "מוכן" "לקריאה בלבד" "הוסר בצורה לא בטוחה" "פגום" "לא נתמך" - "מוציא…" + "מתבצעת הוצאה…" "מפרמט…" "לא הוכנס" "לא נמצאו פעילויות תואמות." @@ -1434,7 +1434,7 @@ "בקשה למחוק חבילות" "מתיר לאפליקציה לבקש מחיקה של חבילות." "בקשה להתעלם מאופטימיזציות של הסוללה" - "מאפשר לאפליקציה לבקש רשות להתעלם מאופטימיזציות של הסוללה לאפליקציה הזו." + "מאפשרת לאפליקציה לבקש רשות להתעלם מאופטימיזציות של הסוללה לאפליקציה הזו." "הקש פעמיים לבקרת מרחק מתצוגה" "‏לא ניתן להוסיף widget." "התחל" @@ -1444,10 +1444,10 @@ "סיום" "הקודם" "בצע" - "חייג למספר\nבאמצעות %s" + "חיוג למספר\nבאמצעות %s" "צור איש קשר\nבאמצעות %s" "האפליקציות הבאות מבקשות אישור לגשת לחשבונך, כעת ובעתיד." - "האם ברצונך לאפשר בקשה זו?" + "לאפשר את הבקשה הזו?" "בקשת גישה" "כן, זה בסדר" "עדיף שלא" @@ -1459,7 +1459,7 @@ "סנכרון" "נגישות" "טפט" - "שנה טפט" + "שינוי טפט" "מאזין להתראות" "‏VR ליסנר" "ספק תנאי" @@ -1467,7 +1467,7 @@ "‏VPN מופעל" "‏VPN מופעל על ידי %s" "הקש כדי לנהל את הרשת." - "מחובר אל %s. הקש כדי לנהל את הרשת." + "בוצע חיבור אל %s. יש להקיש כדי לנהל את הרשת." "‏ה-VPN שמופעל תמיד, מתחבר..." "‏ה-VPN שפועל תמיד, מחובר" "‏אין חיבור ל-VPN שפועל כל הזמן" @@ -1495,11 +1495,11 @@ "שתף" "מצא" "חיפוש באינטרנט" - "חפש את הבא" - "חפש את הקודם" + "מציאת ההתאמה הבאה" + "חיפוש של הקודם" "בקשת מיקום מאת %s" "בקשת מיקום" - "מבוקש על ידי %1$s (%2$s)" + "הבקשה נשלחה על ידי %1$s‏ (%2$s)" "כן" "לא" "בוצעה גישה למיקום בזמן מקרה חירום" @@ -1509,22 +1509,22 @@ "יש %1$d פריטים שנמחקו עבור %2$s , בחשבון %3$s. איזו פעולה ברצונך לבצע?" "מחק את הפריטים" "בטל את פעולות המחיקה" - "אל תעשה דבר כרגע" + "לא לבצע שום פעולה כרגע" "בחירת חשבון" "הוספת חשבון" "הוספת חשבון" "הוסף" "הפחת" "%s לחיצה ארוכה." - "הסט למעלה כדי להוסיף ולמטה כדי להפחית." + "צריך להסיט למעלה כדי להוסיף ולמטה כדי להפחית." "הוספת דקה" - "הפחת דקה" - "הוסף שעה" - "הפחת שעה" - "‏הגדר PM" - "‏הגדר AM" + "הפחתת דקה" + "הוספת שעה" + "הפחתת שעה" + "‏הגדרת PM" + "‏הגדרת AM" "הוסף חודש" - "הפחת חודש" + "הפחתת חודש" "הוסף יום" "הפחת יום" "הוסף שנה" @@ -1542,14 +1542,14 @@ "לא ניתן היה להפעיל את %s" "שתף עם" "שתף עם %s" - "ידית להחלקה. לחיצה ארוכה." + "נקודת אחיזה להחלקה. לחיצה ארוכה." "החלק לביטול נעילה." "נווט לדף הבית" - "נווט למעלה" + "ניווט למעלה" "אפשרויות נוספות" "‏%1$s‏, %2$s" "‏%1$s‏, %2$s‏, %3$s" - "אחסון שיתוף פנימי" + "אחסון פנימי משותף" "‏כרטיס SD" "‏כרטיס SD של %s" "‏כונן USB" @@ -1561,7 +1561,7 @@ "הגעת למגבלה של חבילת הגלישה" "‏הגעת למגבלת נתוני Wi-Fi" "הנתונים הושהו להמשך המחזור" - "חריגה מהמגבלה של חבילת הגלישה" + "חרגת מהמגבלה של חבילת הגלישה" "‏חריגה ממגבלת נתוני ה-Wi-Fi" "חרגת ב-%s מעבר למגבלה המוגדרת" "נתוני הרקע מוגבלים" @@ -1584,7 +1584,7 @@ "‏טביעת אצבע SHA-256:" "‏טביעת אצבע SHA-1:" "הצג הכל" - "בחר פעילות" + "בחירת פעילות" "שתף עם" "שולח…" "להפעיל את הדפדפן?" @@ -1602,14 +1602,14 @@ "מערכת" "‏אודיו Bluetooth" "צג אלחוטי" - "העבר" + "‏העברה (cast)" "התחברות למכשיר" "העברת מסך אל מכשיר" - "מחפש מכשירים…" + "המערכת מחפשת מכשירים…" "הגדרות" "נתק" "סורק..." - "מתחבר..." + "מתבצע חיבור..." "זמין" "לא זמין" "בשימוש" @@ -1635,31 +1635,31 @@ "‏כרטיס ה-SIM מושבת כעת. הזן קוד PUK כדי להמשיך. פנה אל הספק לפרטים." "הזן את קוד הגישה הרצוי" "אשר את קוד הגישה הרצוי" - "‏מבטל נעילה של כרטיס SIM…" + "‏מתבצע ביטול נעילה של כרטיס SIM…" "קוד גישה שגוי." "הקלד קוד גישה שאורכו 4 עד 8 ספרות." "‏קוד PUK צריך להיות בן 8 ספרות." - "‏הזן מחדש את קוד PUK הנכון. ניסיונות חוזרים ישביתו לצמיתות את כרטיס ה-SIM." + "‏יש להזין שוב את קוד ה-PUK הנכון. ניסיונות חוזרים ישביתו את כרטיס ה-SIM באופן סופי." "קודי הגישה אינם תואמים" "ניסיונות רבים מדי לשרטוט קו ביטול נעילה." - "‏כדי לבטל את הנעילה, היכנס באמצעות חשבון Google שלך." + "‏כדי לבטל את הנעילה, עליך להיכנס באמצעות חשבון Google שלך." "שם משתמש (אימייל)" "סיסמה" "כניסה" "שם משתמש או סיסמה לא חוקיים." "‏שכחת את שם המשתמש או הסיסמה?\nהיכנס לכתובת ""google.com/accounts/recovery" - "בודק חשבון…" + "מתבצעת בדיקה של החשבון…" "הקלדת קוד גישה שגוי %1$d פעמים. \n\nנסה שוב בעוד %2$d שניות." "הקלדת סיסמה שגויה %1$d פעמים.\n\nנסה שוב בעוד %2$d שניות." "שרטטת את קו ביטול הנעילה באופן שגוי %1$d פעמים. \n\nנסה שוב בעוד %2$d שניות." "ביצעת %1$d ניסיונות שגויים לביטול נעילת הטלפון. לאחר %2$d ניסיונות כושלים נוספים, הטאבלט יעבור איפוס לברירת המחדל של היצרן וכל נתוני המשתמש יאבדו." - "‏ניסית לבטל בצורה שגויה את הנעילה של מכשיר ה-Android TV %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, מכשיר ה-Android TV יעבור איפוס לברירת המחדל של היצרן וכל נתוני המשתמש יאבדו." + "‏ניסית לבטל בצורה שגויה את הנעילה של מכשיר ה-Android TV‏ %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, מכשיר ה-Android TV יעבור איפוס לברירת המחדל של היצרן וכל נתוני המשתמש יאבדו." "ביצעת %1$d ניסיונות שגויים לביטול נעילת הטלפון. לאחר %2$d ניסיונות כושלים נוספים, הטלפון יעבור איפוס לברירת המחדל של היצרן וכל נתוני המשתמש יאבדו." "ביצעת %d ניסיונות שגויים לביטול נעילת הטאבלט. הטאבלט יעבור כעת איפוס לברירת המחדל של היצרן." "‏ניסית לבטל בצורה שגויה את הנעילה של מכשיר ה-Android TV %d פעמים. מכשיר ה-Android TV יעבור כעת איפוס לברירת המחדל של היצרן." "ביצעת %d ניסיונות שגויים לביטול נעילת הטלפון. הטלפון יעבור כעת איפוס לברירת המחדל של היצרן." - "שרטטת את קו ביטול הנעילה באופן שגוי %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, תתבקש לבטל את נעילת הטאבלט באמצעות חשבון אימייל‏.\n\nנסה שוב בעוד %3$d שניות." - "‏שרטטת קו ביטול נעילה שגוי %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, תתבקש לבטל את הנעילה של מכשיר ה-Android TV באמצעות חשבון אימייל.\n\n נסה שוב בעוד %3$d שניות." + "שרטטת את קו ביטול הנעילה באופן שגוי %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, יהיה צורך לבטל את נעילת הטאבלט באמצעות חשבון אימייל‏.\n\nיש לנסות שוב בעוד %3$d שניות." + "‏שרטטת קו ביטול נעילה שגוי %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, יהיה צורך לבטל את הנעילה של מכשיר ה-Android TV באמצעות חשבון אימייל.\n\n יש לנסות שוב בעוד %3$d שניות." "שרטטת את קו ביטול הנעילה באופן שגוי %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, תתבקש לבטל את נעילת הטלפון באמצעות חשבון אימייל‏.\n\nנסה שוב בעוד %3$d שניות." " — " "הסרה" @@ -1670,7 +1670,7 @@ "‏לחיצה ארוכה על שני לחצני עוצמת הקול למשך מספר שניות מפעילה את תכונות הנגישות. בעקבות זאת, ייתכן שאופן הפעולה של המכשיר ישתנה.\n\nהתכונות הנוכחיות:\n%1$s\nניתן לשנות תכונות נבחרות ב\'הגדרות\' > \'נגישות\'." " • %1$s\n" "להפעיל את %1$s?" - "‏ניתן ללחוץ על שני מקשי עוצמת הקול למשך מספר שניות כדי להפעיל את %1$s, תכונת נגישות. בעקבות זאת, ייתכן שאופן הפעולה של המכשיר ישתנה.\n\nאפשר לשנות את מקשי הקיצור האלה לתכונה נוספת ב\'הגדרות\' > \'נגישות\'." + "לחיצה על שני מקשי עוצמת הקול למשך מספר שניות מפעילה את תכונת הנגישות %1$s. ייתכן שאופן הפעולה של המכשיר ישתנה בעקבות זאת.\n\nאפשר לשנות את מקשי הקיצור האלה לתכונה אחרת ב\'הגדרות\' > \'נגישות\'." "אני רוצה להפעיל" "לא להפעיל" "מופעל" @@ -1691,10 +1691,10 @@ "עריכת קיצורי הדרך" "סיום" "כבה את קיצור הדרך" - "השתמש בקיצור הדרך" + "שימוש בקיצור הדרך" "היפוך צבעים" "תיקון צבעים" - "לחצני עוצמת הקול נלחצו בלחיצה ארוכה. %1$s הופעל." + "לחצני עוצמת הקול נלחצו בלחיצה ארוכה. שירות %1$s הופעל." "לחצני עוצמת הקול נלחצו בלחיצה ארוכה. %1$s הושבת." "יש ללחוץ לחיצה ארוכה על שני לחצני עוצמת הקול למשך שלוש שניות כדי להשתמש בשירות %1$s" "יש לבחור תכונה שתופעל בעת לחיצה על לחצן הנגישות:" @@ -1710,7 +1710,7 @@ "בעלים" "שגיאה" "מנהל המערכת שלך אינו מתיר שינוי זה" - "לא נמצאה אפליקציה שתומכת בפעולה זו" + "לא נמצאה אפליקציה שתומכת בפעולה הזו" "ביטול" "ISO A0" "ISO A1" @@ -1800,23 +1800,23 @@ "לא ידוע" "שירות ההדפסה לא הופעל" "שירות %s מותקן" - "הקש כדי להפעיל" - "הזן את קוד הגישה של מנהל המכשיר" + "יש להקיש כדי להפעיל את השירות" + "יש להזין את קוד האימות של מנהל המכשיר" "הזן קוד גישה" "שגוי" "קוד גישה נוכחי" - "קוד גישה חדש" + "קוד אימות חדש" "אשר את קוד הגישה החדש" "צור קוד גישה לשינוי הגבלות" - "קודי הגישה לא תואמים. נסה שוב." + "קודי האימות לא תואמים. יש לנסות שוב." "קוד הגישה קצר מדי. חייב להיות באורך 4 ספרות לפחות." - נסה שוב בעוד %d שניות - נסה שוב בעוד %d שניות - נסה שוב בעוד %d שניות - נסה שוב בעוד שנייה אחת + יש לנסות שוב בעוד %d שניות + יש לנסות שוב בעוד %d שניות + יש לנסות שוב בעוד %d שניות + יש לנסות שוב בעוד שנייה אחת - "נסה שוב מאוחר יותר" + "יש לנסות שוב מאוחר יותר" "צפייה במסך מלא" "כדי לצאת, פשוט מחליקים אצבע מלמעלה למטה." "הבנתי" @@ -1824,22 +1824,22 @@ "מחוון שעות מעגלי" "מחוון דקות מעגלי" "בחר שעות" - "בחר דקות" + "בחירת דקות" "בחר חודש ויום" - "בחר שנה" + "בחירת שנה" "%1$s נמחק" "עבודה %1$s" "%1$s שני בעבודה" "%1$s שלישי בעבודה" "בקש קוד גישה לפני ביטול הצמדה" - "בקש קו ביטול נעילה לפני ביטול הצמדה" + "צריך לבקש קו ביטול נעילה לפני ביטול הצמדה" "בקש סיסמה לפני ביטול הצמדה" "הותקנה על ידי מנהל המערכת" "עודכנה על ידי מנהל המערכת" "נמחקה על ידי מנהל המערכת" "אישור" "‏כדי להאריך את חיי הסוללה, התכונה \'חיסכון בסוללה\':\n\n• מפעילה עיצוב כהה\n• מכבה או מגבילה פעילות ברקע, חלק מהאפקטים החזותיים ותכונות אחרות כמו Ok Google\n\n""למידע נוסף" - "‏כדי להאריך את חיי הסוללה, התכונה \'חיסכון בסוללה\':\n\n• מפעילה עיצוב כהה\n• מכבה או מגבילה פעילות ברקע, חלק מהאפקטים החזותיים ותכונות אחרות כמו Ok Google" + "‏כדי להאריך את חיי הסוללה, התכונה \'חיסכון בסוללה\':\n\n• מפעילה עיצוב כהה\n• משביתה או מגבילה פעילות ברקע, חלק מהאפקטים החזותיים ותכונות אחרות כמו Hey Google" "‏כדי לסייע בהפחתת השימוש בנתונים, חוסך הנתונים (Data Saver) מונע מאפליקציות מסוימות שליחה או קבלה של נתונים ברקע. אפליקציה שבה נעשה שימוש כרגע יכולה לגשת לנתונים, אבל בתדירות נמוכה יותר. המשמעות היא, למשל, שתמונות יוצגו רק לאחר שמקישים עליהן." "להפעיל את חוסך הנתונים?" "הפעלה" @@ -1904,7 +1904,7 @@ "אירוע" "שינה" "%1$s משתיק חלק מהצלילים" - "קיימת בעיה פנימית במכשיר שלך, וייתכן שהתפקוד שלו לא יהיה יציב עד שתבצע איפוס לנתוני היצרן." + "קיימת בעיה פנימית במכשיר שלך, וייתכן שהוא לא יתפקד כראוי עד שיבוצע איפוס לנתוני היצרן." "קיימת בעיה פנימית במכשיר שלך. לקבלת פרטים, צור קשר עם היצרן." "‏בקשת USSD שונתה לשיחה רגילה" "‏בקשת USSD שונתה לבקשת SS" @@ -1924,7 +1924,7 @@ "‏יציאת USB בציוד היקפי" "אפשרויות נוספות" "סגור את האפשרויות הנוספות" - "הגדל" + "הגדלה" "סגירה" "%1$s: %2$s" @@ -1937,7 +1937,7 @@ "עליך להגדיר את החשיבות של ההתראות האלה." "ההודעה חשובה בשל האנשים המעורבים." "התראות אפליקציה בהתאמה אישית" - "האם לאפשר לאפליקציה %1$s ליצור משתמש חדש באמצעות %2$s (כבר קיים משתמש לחשבון הזה) ?" + "האם לאפשר לאפליקציה %1$s ליצור משתמש חדש באמצעות %2$s (כבר קיים משתמש לחשבון הזה)?" "האם לאפשר לאפליקציה %1$s ליצור משתמש חדש באמצעות %2$s ?" "הוספת שפה" "העדפת אזור" @@ -1958,13 +1958,13 @@ "‏האפליקציה הזו עוצבה לגרסה ישנה יותר של Android וייתכן שלא תפעל כראוי. ניתן לבדוק אם יש עדכונים או ליצור קשר עם המפתח." "האם יש עדכון חדש?" "יש לך הודעות חדשות" - "‏פתח את אפליקציית ה-SMS כדי להציג" + "‏יש לפתוח את אפליקציית ה-SMS כדי להציג" "ייתכן שחלק מהפונקציונליות תהיה מוגבלת" "פרופיל העבודה נעול" "הקש לביטול נעילת פרופיל העבודה" - "מחובר אל %1$s" + "התבצע חיבור אל %1$s" "הקש כדי להציג קבצים" - "הצמד" + "הצמדה" "הצמדה של‏ %1$s" "בטל הצמדה" "ביטול ההצמדה של %1$s" @@ -1983,15 +1983,15 @@ "חדשות וכתבי עת" "מפות וניווט" "פרודוקטיביות" - "שטח האחסון במכשיר" + "נפח האחסון במכשיר" "‏ניקוי באגים ב-USB" "שעה" "דקה" "הגדרת שעה" - "הזן שעה חוקית" + "יש להזין שעה חוקית" "מהי השעה הנכונה" "העבר למצב קלט טקסט לצורך הזנת השעה" - "העבר למצב שעון לצורך הזנת השעה" + "מעבר למצב שעון לצורך הזנת השעה" "אפשרויות מילוי אוטומטי" "שמירה לצורך מילוי אוטומטי" "לא ניתן למלא את התוכן באופן אוטומטי" @@ -2024,11 +2024,11 @@ "כרטיס" "שם משתמש" "כתובת אימייל" - "הישאר רגוע וחפש מחסה בקרבת מקום." + "חשוב להישאר רגועים ולחפש מחסה בקרבת מקום." "יש להתפנות מיידית מאזורים הסמוכים לחופים ולנהרות למקום בטוח יותר, כגון שטח גבוה יותר." "הישאר רגוע וחפש מחסה בקרבת מקום." "בדיקה של הודעות חירום" - "השב" + "תשובה" "‏כרטיס ה-SIM לא מורשה לזיהוי קולי" "‏ניהול התצורה של כרטיס ה-SIM לא מתאים לזיהוי קולי" @@ -2036,7 +2036,7 @@ "הטלפון לא מורשה לזיהוי קולי" "‏SIM %d אינו מאושר לשימוש ברשת" "‏אין ניהול תצורה עבור SIM %d" - "‏SIM %d אינו מאושר לשימוש ברשת" + "‏SIM‏ %d אינו מאושר לשימוש ברשת" "‏SIM %d אינו מאושר לשימוש ברשת" "חלון קופץ" "+ %1$d" @@ -2046,7 +2046,7 @@ "לא ניתן היה לשחזר את קיצור הדרך" "מקש הקיצור מושבת" "הסרת התקנה" - "רוצה לפתוח בכל זאת" + "לפתוח בכל זאת" "אותרה אפליקציה מזיקה" "%1$s רוצה להציג חלקים מ-%2$s" "עריכה" @@ -2055,7 +2055,7 @@ "שינויי מערכת" "נא לא להפריע" "חדש: מצב \'נא לא להפריע\' מסתיר התראות" - "ניתן להקיש כדי לקבל מידע נוסף ולשנות." + "אפשר להקיש כדי לקבל מידע נוסף ולבצע שינויים." "ההגדרה \'נא לא להפריע\' השתנתה" "יש להקיש כדי לבדוק מה חסום." "מערכת" @@ -2082,7 +2082,7 @@ "תמונה" "תמונה בפורמט %1$s" "ארכיון" - "קובץ ארכיון %1$s" + "קובץ ארכיון מסוג %1$s" "מסמך" "מסמך %1$s" "גיליון אלקטרוני" @@ -2190,8 +2190,8 @@ "‏נשלחת בקשה לביטול נעילה של PUK…" "‏נשלחת בקשה לביטול נעילה של PUK…" "‏נשלחת בקשה לביטול נעילה של PUK…" - "‏נכשלה הבקשה לביטול הנעילה של רשת SIM." - "‏נכשלה הבקשה לביטול הנעילה של תת-קבוצה ברשת SIM." + "‏לא ניתן היה לבטל את הנעילה של רשת SIM." + "‏לא ניתן היה לבטל את הנעילה של תת-קבוצה ברשת SIM." "‏נכשלה הבקשה לביטול הנעילה של ספק שירות SIM." "‏נכשלה הבקשה לביטול הנעילה של כרטיס SIM עסקי." "‏נכשלה הבקשה לביטול נעילת SIM." @@ -2199,27 +2199,27 @@ "‏נכשלה הבקשה לביטול הנעילה של RUIM network2." "‏נכשלה הבקשה לביטול נעילה של RUIM hrpd." "‏נכשלה הבקשה לביטול הנעילה של כרטיס RUIM עסקי." - "‏נכשלה הבקשה לביטול הנעילה של ספק שירות RUIM." - "‏נכשלה הבקשה לביטול הנעילה של כרטיס RUIM." + "‏לא ניתן היה לבטל את הנעילה של ספק שירות RUIM." + "‏לא ניתן היה לבטל את הנעילה של כרטיס RUIM." "‏נכשל ביטול נעילה של PUK." "‏נכשל ביטול נעילה של PUK." - "‏נכשל ביטול נעילה של PUK." + "‏לא ניתן היה לבטל את הנעילה של PUK." "‏נכשל ביטול נעילה של PUK." - "‏נכשל ביטול נעילה של PUK." - "‏נכשל ביטול נעילה של PUK." - "‏נכשל ביטול נעילה של PUK." - "‏נכשל ביטול נעילה של PUK." - "‏נכשל ביטול נעילה של PUK." - "‏נכשל ביטול נעילה של PUK." + "‏לא ניתן היה לבטל את הנעילה של PUK." + "‏לא ניתן היה לבטל נעילה של PUK." + "‏לא ניתן היה לבטל נעילה של PUK." + "‏לא ניתן היה לבטל את הנעילה של PUK." + "‏לא ניתן היה לבטל את הנעילה של PUK." + "‏לא ניתן היה לבטל נעילה של PUK." "‏נכשל ביטול נעילה של PUK." - "‏נכשלה הבקשה לביטול נעילת SPN." - "‏נכשלה הבקשה לביטול הנעילה של PLMN לבית כשווה-ערך ל-SP." + "‏לא ניתן היה לבטל את נעילת SPN." + "‏לא ניתן היה לבטל את הנעילה של PLMN לבית כשווה-ערך ל-SP." "‏נכשלה הבקשה לביטול נעילה של ICCID." - "‏נכשלה הבקשה לביטול נעילה של IMPI." - "נכשלה הבקשה לביטול הנעילה של ספק שירות של תת-קבוצה ברשת." + "‏לא ניתן היה לבטל נעילה של IMPI." + "לא ניתן היה לבטל הנעילה של ספק שירות של תת-קבוצה ברשת." "‏ביטול הנעילה של רשת SIM בוצע בהצלחה." "‏ביטול הנעילה של תת-קבוצה ברשת SIM בוצע בהצלחה." - "‏ביטול הנעילה של ספק שירות SIM בוצע בהצלחה ." + "‏ביטול הנעילה של ספק שירות ה-SIM בוצע." "‏ביטול הנעילה של כרטיס SIM עסקי בוצע בהצלחה." "‏ביטול נעילת SIM בוצע בהצלחה." "‏ביטול הנעילה של RUIM network1 בוצע בהצלחה." @@ -2237,7 +2237,7 @@ "‏ביטול נעילה של PUK בוצע בהצלחה." "‏ביטול נעילה של PUK בוצע בהצלחה." "‏ביטול נעילה של PUK בוצע בהצלחה." - "‏ביטול נעילה של PUK בוצע בהצלחה." + "‏הנעילה של PUK בוטלה." "‏ביטול נעילה של PUK בוצע בהצלחה." "‏ביטול נעילת SPN בוצע בהצלחה." "‏בוצע בהצלחה ביטול הנעילה של PLMN לבית כשווה-ערך ל-SP." diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index ed25123ed39da..6420e45fe02e0 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -1177,12 +1177,12 @@ "%1$s азыр иштеп жатат." "Башында %1$s жүргүзүлгөн." "Шкала" - "Ар дайым көрсөтүлсүн" + "Ар дайым көрүнсүн" "Муну тутум жөндөөлөрүнөн кайра иштетүү > Колдонмолор > Жүктөлүп алынган." "%1$s колдонмосу көрүнүштүн тандалган өлчөмүн экранда көрсөтө албайт жана туура эмес иштеши мүмкүн." - "Ар дайым көрсөтүлсүн" + "Ар дайым көрүнсүн" "%1$s Android OS тутуму менен иштеген түзмөктүн шайкеш келбеген версиясы үчүн орнотулган колдонмо жана туура эмес иштеши мүмкүн. Колдонмонун жаңыртылган версиясы жеткиликтүү болушу мүмкүн." - "Ар дайым көрсөтүлсүн" + "Ар дайым көрүнсүн" "Жаңыртууну издөө" "%1$s колдонмосу (%2$s процесси) өз алдынча иштеткен StrictMode саясатын бузду." "%1$s процесси өзүнүн мажбурланган StrictMode саясатын бузуп койду." diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml index 1e431ce599629..4a62f7286e635 100644 --- a/core/res/res/values-ml/strings.xml +++ b/core/res/res/values-ml/strings.xml @@ -1211,9 +1211,9 @@ "%1$s ഹീപ്പ് ഡംപ് തയ്യാറാണ്" "ഹീപ്പ് ഡംപ് ശേഖരിച്ചു. പങ്കിടാൻ ടാപ്പ് ചെയ്യുക" "ഹീപ്പ് ഡംപ് പങ്കിടണോ?" - "%1$s പ്രോസസിന്, മെമ്മറി പരിധിയായ %2$s കവിഞ്ഞു. അതിന്റെ ഡവലപ്പറുമായി പങ്കിടാൻ ഒരു ഹീപ്പ് ഡംപ് നിങ്ങൾക്ക് ലഭ്യമാണ്. ശ്രദ്ധിക്കുക: ഈ ഹീപ്പ് ഡംപിൽ ആപ്പിന് ആക്‌സസുള്ള ഏതെങ്കിലും വ്യക്തിഗത വിവരം അടങ്ങിയിരിക്കാം." - "%1$s പ്രോസസ് അതിൻ്റെ മെമ്മറി പരിധിയായ %2$s കവിഞ്ഞു. നിങ്ങൾക്ക് പങ്കിടാൻ ഒരു ഹീപ്പ് ഡംപ് ലഭ്യമാണ്. ശ്രദ്ധിക്കുക: പ്രോസസിന് ആക്‌സസ് ചെയ്യാനാകുന്ന, സൂക്ഷ്‌മമായി കൈകാര്യം ചെയ്യേണ്ട ഏതെങ്കിലും വ്യക്തിഗത വിവരം ഈ ഹീപ്പ് ഡംപിൽ അടങ്ങിയിരിക്കാം, നിങ്ങൾ ടൈപ്പ് ചെയ്‌തിട്ടുള്ള കാര്യങ്ങൾ ഇതിൽ ഉൾപ്പെട്ടിരിക്കാം." - "നിങ്ങൾക്ക് പങ്കിടാൻ %1$s എന്നതിൻ്റെ പ്രോസസിൻ്റെ ഒരു ഹീപ്പ് ഡംപ് ലഭ്യമാണ്. ശ്രദ്ധിക്കുക: പ്രോസസിന് ആക്‌സസ് ചെയ്യാനാകുന്ന, സൂക്ഷ്‌മമായി കൈകാര്യം ചെയ്യേണ്ട ഏതെങ്കിലും വ്യക്തിഗത വിവരം ഈ ഹീപ്പ് ഡംപിൽ അടങ്ങിയിരിക്കാം, നിങ്ങൾ ടൈപ്പ് ചെയ്‌തിട്ടുള്ള കാര്യങ്ങൾ ഇതിൽ ഉൾപ്പെട്ടിരിക്കാം." + "%1$s പ്രോസസിന്, മെമ്മറി പരിധിയായ %2$s കവിഞ്ഞു. അതിന്റെ ഡവലപ്പറുമായി പങ്കിടാൻ ഒരു ഹീപ്പ് ഡംപ് നിങ്ങൾക്ക് ലഭ്യമാണ്. ശ്രദ്ധിക്കുക: ഈ ഹീപ്പ് ഡംപിൽ ആപ്പിന് ആക്‌സസുള്ള ഏതെങ്കിലും വ്യക്തിപരമായ വിവരങ്ങൾ അടങ്ങിയിരിക്കാം." + "%1$s പ്രോസസ് അതിൻ്റെ മെമ്മറി പരിധിയായ %2$s കവിഞ്ഞു. നിങ്ങൾക്ക് പങ്കിടാൻ ഒരു ഹീപ്പ് ഡംപ് ലഭ്യമാണ്. ശ്രദ്ധിക്കുക: പ്രോസസിന് ആക്‌സസ് ചെയ്യാനാകുന്ന, സൂക്ഷ്‌മമായി കൈകാര്യം ചെയ്യേണ്ട ഏതെങ്കിലും വ്യക്തിപരമായ വിവരങ്ങൾ ഈ ഹീപ്പ് ഡംപിൽ അടങ്ങിയിരിക്കാം, നിങ്ങൾ ടൈപ്പ് ചെയ്‌തിട്ടുള്ള കാര്യങ്ങൾ ഇതിൽ ഉൾപ്പെട്ടിരിക്കാം." + "നിങ്ങൾക്ക് പങ്കിടാൻ %1$s എന്നതിൻ്റെ പ്രോസസിൻ്റെ ഒരു ഹീപ്പ് ഡംപ് ലഭ്യമാണ്. ശ്രദ്ധിക്കുക: പ്രോസസിന് ആക്‌സസ് ചെയ്യാനാകുന്ന, സൂക്ഷ്‌മമായി കൈകാര്യം ചെയ്യേണ്ട ഏതെങ്കിലും വ്യക്തിപരമായ വിവരങ്ങൾ ഈ ഹീപ്പ് ഡംപിൽ അടങ്ങിയിരിക്കാം, നിങ്ങൾ ടൈപ്പ് ചെയ്‌തിട്ടുള്ള കാര്യങ്ങൾ ഇതിൽ ഉൾപ്പെട്ടിരിക്കാം." "വാചകസന്ദേശത്തിനായി ഒരു പ്രവർത്തനം തിരഞ്ഞെടുക്കുക" "റിംഗർ വോളിയം" "മീഡിയ വോളിയം" diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index 280d72481cd8a..343d0b22e4d4c 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -1091,7 +1091,7 @@ "%1$d:%2$02d:%3$02d" "सबैलाई चयन गर्नुहोस्" "काट्नुहोस्" - "प्रतिलिपि बनाउनुहोस्" + "कपी गर्नुहोस्" "क्लिपबोर्डमा प्रतिलिपि गर्न सकिएन" "टाँस्नुहोस्" "सामान्य पाठको रूपमा टाँस्नुहोस्" diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index e14ad4d3f67c5..22ab468da7c48 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -344,9 +344,9 @@ "telefoonoproepen beantwoorden" "Hiermee kan de app een inkomende telefoonoproep beantwoorden." "tekstberichten (SMS) ontvangen" - "Hiermee kan de app sms-berichten ontvangen en verwerken. Dit betekent dat de app berichten die naar je apparaat zijn verzonden, kan bijhouden of verwijderen zonder deze aan u weer te geven." + "Hiermee kan de app sms-berichten ontvangen en verwerken. Dit betekent dat de app berichten die naar je apparaat zijn verstuurd, kan bijhouden of verwijderen zonder deze te tonen." "tekstberichten (MMS) ontvangen" - "Hiermee kan de app MMS-berichten ontvangen en verwerken. Dit betekent dat de app berichten die naar je apparaat zijn verzonden, kan bijhouden of verwijderen zonder deze aan u weer te geven." + "Hiermee kan de app mms-berichten ontvangen en verwerken. Dit betekent dat de app berichten die naar je apparaat zijn verstuurd, kan bijhouden of verwijderen zonder deze te tonen." "Cell broadcast-berichten doorsturen" "Hiermee kan de app de module voor cell broadcasts binden om cell broadcast-berichten door te sturen als die worden ontvangen. Cell broadcast-waarschuwingen worden op bepaalde locaties verzonden om je te waarschuwen voor noodsituaties. Schadelijke apps kunnen de prestaties of verwerking van je apparaat verstoren als een bericht met een noodmelding wordt ontvangen." "infodienstberichten lezen" @@ -360,7 +360,7 @@ "Deze app kan alle sms-berichten lezen die zijn opgeslagen op je Android TV-apparaat." "Deze app kan alle sms-berichten lezen die zijn opgeslagen op je telefoon." "tekstberichten (WAP) ontvangen" - "Hiermee kan de app WAP-berichten ontvangen en verwerken. Dit betekent dat de app berichten die naar je apparaat zijn verzonden, kan bijhouden of verwijderen zonder deze aan u weer te geven." + "Hiermee kan de app WAP-berichten ontvangen en verwerken. Dit betekent dat de app berichten die naar je apparaat zijn verstuurd, kan bijhouden of verwijderen zonder deze te tonen." "actieve apps ophalen" "Hiermee kan de app informatie ophalen over actieve en recent uitgevoerde taken. Zo kan de app informatie vinden over welke apps op het apparaat worden gebruikt." "profiel- en apparaateigenaren beheren" @@ -484,7 +484,7 @@ "Hiermee krijgt de app toegang tot de lijst met accounts die op de tablet bekend zijn. Dit kunnen ook accounts zijn die zijn gemaakt door apps die je hebt geïnstalleerd." "Hiermee kan de app de lijst met accounts ophalen die op het Android TV-apparaat bekend zijn. Dit kunnen ook accounts zijn die zijn gemaakt door apps die je hebt geïnstalleerd." "Hiermee krijgt de app toegang tot de lijst met accounts die op de telefoon bekend zijn. Dit kunnen ook accounts zijn die zijn gemaakt door apps die je hebt geïnstalleerd." - "netwerkverbindingen weergeven" + "netwerkverbindingen bekijken" "Hiermee kan de app informatie bekijken over netwerkverbindingen, zoals welke netwerken er zijn en welke verbonden zijn." "volledige netwerktoegang" "Hiermee kan de app netwerksockets maken en aangepaste netwerkprotocollen gebruiken. De browser en andere apps bieden mogelijkheden om gegevens via internet te verzenden, dus deze rechten zijn niet vereist om gegevens via internet te verzenden." @@ -492,8 +492,8 @@ "Hiermee kan de app de status van de netwerkverbinding wijzigen." "getetherde verbinding wijzigen" "Hiermee kan de app de status van de getetherde netwerkverbinding wijzigen." - "wifi-verbindingen weergeven" - "Hiermee kan de app informatie over wifi-netwerken bekijken, zoals of wifi is ingeschakeld en de naam van apparaten waarmee via wifi verbinding is gemaakt." + "wifi-verbindingen bekijken" + "Hiermee kan de app informatie over wifi-netwerken bekijken, zoals of wifi is aangezet en de naam van apparaten waarmee via wifi verbinding is gemaakt." "Wifi-verbinding maken en verbreken" "Hiermee kan de app zich koppelen aan en ontkoppelen van wifi-toegangspunten en wijzigingen aanbrengen in de apparaatconfiguratie voor wifi-netwerken." "Wifi Multicast-ontvangst toestaan" @@ -1177,12 +1177,12 @@ "%1$s is nu actief." "%1$s was het eerst gestart." "Schaal" - "Altijd weergeven" + "Altijd tonen" "U kunt dit opnieuw inschakelen via Systeeminstellingen > Apps > Gedownload." "%1$s biedt geen ondersteuning voor de huidige instelling voor weergavegrootte en kan onverwacht gedrag vertonen." - "Altijd weergeven" + "Altijd tonen" "%1$s is gemaakt voor een niet-geschikte versie van het Android-besturingssysteem en kan onverwacht gedrag vertonen. Mogelijk is er een geüpdatete versie van de app beschikbaar." - "Altijd weergeven" + "Altijd tonen" "Controleren op update" "De app %1$s (proces %2$s) heeft het zelf afgedwongen StrictMode-beleid geschonden." "Het proces %1$s heeft het zelf afgedwongen StrictMode-beleid geschonden." @@ -1327,7 +1327,7 @@ "DELEN" "WEIGEREN" "Invoermethode selecteren" - "Dit op het scherm weergeven terwijl het fysieke toetsenbord actief is" + "Op het scherm tonen terwijl het fysieke toetsenbord actief is" "Virtueel toetsenbord tonen" "Fysiek toetsenbord instellen" "Tik om een taal en indeling te selecteren" @@ -1335,7 +1335,7 @@ " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" "Weergeven vóór andere apps" "%s wordt weergegeven over andere apps" - "%s wordt weergegeven over apps" + "%s wordt weergegeven vóór andere apps" "Als je niet wilt dat %s deze functie gebruikt, tik je om de instellingen te openen en schakel je de functie uit." "Uitschakelen" "%s controleren…" @@ -1541,7 +1541,7 @@ "Vingerafdrukken:" "SHA-256-vingerafdruk" "SHA-1-vingerafdruk:" - "Alles weergeven" + "Alles tonen" "Een activiteit kiezen" "Delen met" "Verzenden..." @@ -1771,7 +1771,7 @@ Probeer het over 1 seconde opnieuw "Probeer het later opnieuw" - "Volledig scherm wordt weergegeven" + "Volledig scherm wordt getoond" "Swipe omlaag vanaf de bovenkant van het scherm om af te sluiten." "Ik snap het" "Klaar" @@ -1794,7 +1794,7 @@ "OK" "Batterijbesparing doet het volgende om de batterijduur te verlengen:\n\n• Het donkere thema inschakelen\n• Achtergrondactiviteit, bepaalde visuele effecten en andere functies (zoals \'Hey Google\') uitschakelen of beperken\n\n""Meer informatie" "Batterijbesparing doet het volgende om de batterijduur te verlengen:\n\n• Het donkere thema inschakelen.\n• Achtergrondactiviteit, bepaalde visuele effecten en andere functies (zoals \'Hey Google\') uitschakelen of beperken." - "Databesparing beperkt het datagebruik door te voorkomen dat sommige apps gegevens verzenden of ontvangen op de achtergrond. De apps die je open hebt, kunnen nog steeds data verbruiken, maar doen dit minder vaak. Afbeeldingen worden dan bijvoorbeeld niet weergegeven totdat je erop tikt." + "Databesparing beperkt het datagebruik door te voorkomen dat sommige apps gegevens sturen of ontvangen op de achtergrond. De apps die je open hebt, kunnen nog steeds data verbruiken, maar doen dit minder vaak. Afbeeldingen worden dan bijvoorbeeld niet weergegeven totdat je erop tikt." "Databesparing aanzetten?" "Inschakelen" @@ -1982,7 +1982,7 @@ "VERWIJDEREN" "TOCH OPENEN" "Schadelijke app gevonden" - "%1$s wil segmenten van %2$s weergeven" + "%1$s wil segmenten van %2$s tonen" "Bewerken" "Trillen bij gesprekken en meldingen" "Telefoon- en meldingsgeluid wordt uitgezet" diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index 91f91fd3e6dd1..cef3f795007a3 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -224,7 +224,7 @@ "Подготовка обновлений…" "Обработка обновлений…" "Перезагрузка…" - "Сбросить к заводским настройкам" + "Сбросить настройки" "Перезагрузка…" "Выключение..." "Планшетный ПК будет отключен." diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index b129b49ba3945..8aca7d259c30f 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -968,7 +968,7 @@ "Katu" "Hauna idhini ya kufungua ukurasa huu." "Maandishi yamenakiliwa kwenye ubao wa kunakili." - "Imenakiliwa" + "Umenakili" "Zaidi" "Menyu+" "Meta+" diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 71d93ba829513..8e0cc2ead613d 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -2029,7 +2029,7 @@ %s + %d tệp %s + %d tệp - "Không có gợi ý về người để chia sẻ" + "Không có gợi ý nào về người mà bạn có thể chia sẻ" "Danh sách ứng dụng" "Ứng dụng này chưa được cấp quyền ghi âm nhưng vẫn có thể ghi âm thông qua thiết bị USB này." "Màn hình chính" diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index cb61121b64e08..9eef703670ef2 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -423,8 +423,8 @@ "允許應用程式存取額外的位置提供者指令。這項設定可能會使應用程式干擾 GPS 或其他位置來源的運作。" "只在前景存取精確位置" "使用此應用程式時,應用程式可透過定位服務獲取您的精確位置。您的裝置必須開啟定位服務,才能讓應用程式獲取位置。這可能會增加電池用量。" - "只在前景存取大概位置" - "使用此應用程式時,應用程式可透過定位服務獲取您的大概位置。您的裝置必須開啟定位服務,才能讓應用程式獲取位置。" + "只在前景存取概略位置" + "使用此應用程式時,應用程式可透過定位服務獲取您的概略位置。您的裝置必須開啟定位服務,才能讓應用程式獲取位置。" "在背景存取位置資訊" "即使您不使用此應用程式,它仍可隨時存取位置。" "更改音效設定" @@ -1901,7 +1901,7 @@ "已連線至 %1$s" "輕按即可查看檔案" "固定" - "將%1$s置頂" + "固定「%1$s」" "取消固定" "取消將%1$s置頂" "應用程式資料" From 35aa2cec17677fc0100fcdd37b4c01aa80eb10af Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 27 Mar 2021 19:21:39 -0700 Subject: [PATCH 260/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I76f6ddc48a29241179e6660090da6e62e401f9fc --- .../PrintSpooler/res/values-iw/strings.xml | 20 +++++++++---------- .../PrintSpooler/res/values-nl/strings.xml | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/PrintSpooler/res/values-iw/strings.xml b/packages/PrintSpooler/res/values-iw/strings.xml index 64db711def154..18502334610dc 100644 --- a/packages/PrintSpooler/res/values-iw/strings.xml +++ b/packages/PrintSpooler/res/values-iw/strings.xml @@ -27,24 +27,24 @@ "דו-צדדי" "כיוון" "עמודים" - "בחר מדפסת" + "בחירת מדפסת" "הכל %1$s" "טווח של %1$s" "למשל 1–5‏,8,‏11–13" "תצוגה מקדימה של הדפסה" - "‏התקן מציג PDF ליצירת תצוגה מקדימה" + "‏התקנה של PDF viewer‏ ליצירת תצוגה מקדימה" "אפליקציית ההדפסה קרסה" "יוצר עבודת הדפסה" - "‏שמור כ-PDF" + "‏שמירה כ-PDF" "כל המדפסות…" "תיבת דו שיח של מדפסת" "%1$d/%2$d" "עמוד %1$d מתוך %2$d" "סיכום, עותקים %1$s, גודל נייר %2$s" - "ידית הרחבה" + "נקודת אחיזה להרחבה" "ידית כיווץ" "הדפס" - "‏שמור כ-PDF" + "‏שמירה כ-PDF" "אפשרויות ההדפסה הורחבו" "אפשרויות ההדפסה כווצו" "חיפוש" @@ -72,7 +72,7 @@ "לא נמצאו מדפסות" "לא ניתן להוסיף מדפסות" "בחר כדי להוסיף מדפסת" - "בחר כדי להפעיל" + "צריך לבחור כדי להפעיל" "שירותים מופעלים" "שירותים מומלצים" "שירותים מושבתים" @@ -84,14 +84,14 @@ התקן כדי לגלות מדפסת %1$s "מדפיס את %1$s" - "מבטל את %1$s" + "המערכת מבטלת את %1$s" "שגיאת מדפסת ב-%1$s" "המדפסת חסמה את %1$s" "ביטול" "הפעלה מחדש" "אין חיבור למדפסת" "לא ידוע" - "האם להשתמש ב-%1$s?" + "האם להשתמש בשירות %1$s?" "ייתכן שהמסמך שלך יעבור בשרת אחד או יותר בדרכו למדפסת." "שחור ולבן" @@ -107,9 +107,9 @@ "לרוחב" "לא ניתן היה לכתוב לקובץ" - "מצטערים, אך זה לא עבד. נסה שוב." + "מצטערים, הפעולה לא בוצעה. אפשר לנסות שוב." "כדאי לנסות שוב" "המדפסת הזו אינה זמינה כעת." "לא ניתן להציג תצוגה מקדימה" - "מכין תצוגה מקדימה…" + "בתהליך יצירת תצוגה מקדימה…" diff --git a/packages/PrintSpooler/res/values-nl/strings.xml b/packages/PrintSpooler/res/values-nl/strings.xml index 6448acc36902d..2cd8d9baacdaa 100644 --- a/packages/PrintSpooler/res/values-nl/strings.xml +++ b/packages/PrintSpooler/res/values-nl/strings.xml @@ -50,7 +50,7 @@ "Zoeken" "Alle printers" "Service toevoegen" - "Zoekvak weergegeven" + "Zoekvak wordt getoond" "Zoekvak verborgen" "Printer toevoegen" "Printer selecteren" From 163fbd02a2b49c627e43a92742fde0b5779dd18b Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 27 Mar 2021 20:27:49 -0700 Subject: [PATCH 261/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ia5df6d8ecf844e2672ae57690a8046d27f87b424 --- packages/SoundPicker/res/values-pa/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/SoundPicker/res/values-pa/strings.xml b/packages/SoundPicker/res/values-pa/strings.xml index 2653c6442ae79..eb630c9002449 100644 --- a/packages/SoundPicker/res/values-pa/strings.xml +++ b/packages/SoundPicker/res/values-pa/strings.xml @@ -17,7 +17,7 @@ "ਪੂਰਵ-ਨਿਰਧਾਰਤ ਰਿੰਗਟੋਨ" - "ਪੂਰਵ-ਨਿਰਧਾਰਤ ਸੂਚਨਾ ਧੁਨੀ" + "ਪੂਰਵ-ਨਿਰਧਾਰਿਤ ਸੂਚਨਾ ਧੁਨੀ" "ਪੂਰਵ-ਨਿਰਧਾਰਤ ਅਲਾਰਮ ਧੁਨੀ" "ਰਿੰਗਟੋਨ ਸ਼ਾਮਲ ਕਰੋ" "ਅਲਾਰਮ ਸ਼ਾਮਲ ਕਰੋ" From df4dcbdef04fbc9aa1203504cc2d43d571ca2812 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 27 Mar 2021 23:13:02 -0700 Subject: [PATCH 262/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I4385898e8f31a1d053b77695962e2dbedabc9dd3 --- packages/SystemUI/res/values-iw/strings_tv.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/SystemUI/res/values-iw/strings_tv.xml b/packages/SystemUI/res/values-iw/strings_tv.xml index 1e5fc91ecff1a..f4694eac89725 100644 --- a/packages/SystemUI/res/values-iw/strings_tv.xml +++ b/packages/SystemUI/res/values-iw/strings_tv.xml @@ -21,7 +21,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "תמונה בתוך תמונה" "(תוכנית ללא כותרת)" - "‏סגור PIP" + "‏סגירת PIP" "מסך מלא" "המיקרופון פעיל" "‏%1$s קיבלה גישה למיקרופון שלך" From 19183d5f5e2a6167a719e30159491c82745b998a Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sun, 28 Mar 2021 00:18:43 -0700 Subject: [PATCH 263/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ia74e84643d003dc17312d0441ed688baadfb3188 --- packages/SystemUI/res-product/values-iw/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/SystemUI/res-product/values-iw/strings.xml b/packages/SystemUI/res-product/values-iw/strings.xml index 4ba8657a77e3e..581754b844c25 100644 --- a/packages/SystemUI/res-product/values-iw/strings.xml +++ b/packages/SystemUI/res-product/values-iw/strings.xml @@ -26,20 +26,20 @@ "‏אין כרטיס SIM בטאבלט." "‏אין כרטיס SIM בטלפון." "קודי האימות אינם תואמים" - "ניסית לבטל את נעילת הטאבלט %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, טאבלט זה יאופס וכל הנתונים שבו יימחקו." + "ניסית לבטל את נעילת הטאבלט %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, הטאבלט הזה יאופס וכל הנתונים שבו יימחקו." "ניסית לבטל את נעילת הטלפון %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, טלפון זה יאופס וכל הנתונים שבו יימחקו." "ניסית לבטל את נעילת הטאבלט %d פעמים. הטאבלט יאופס וכל הנתונים שלו יימחקו." "ניסית לבטל את נעילת הטלפון %d פעמים. הטלפון יאופס וכל הנתונים שבו יימחקו." "ניסית לבטל את נעילת הטאבלט %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, משתמש זה יוסר וכל נתוני המשתמש יימחקו." - "ניסית לבטל את נעילת הטלפון %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, משתמש זה יוסר וכל נתוני המשתמש יימחקו." + "ניסית לבטל את נעילת הטלפון %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, המשתמש הזה יוסר וכל נתוני המשתמש יימחקו." "ניסית לבטל את נעילת הטאבלט %d פעמים באופן שגוי. משתמש זה יוסר וכל נתוני המשתמש יימחקו." - "ניסית לבטל את נעילת הטלפון %d פעמים. משתמש זה יוסר וכל נתוני המשתמש יימחקו." + "ניסית לבטל את נעילת הטלפון %d פעמים. המשתמש הזה יוסר וכל נתוני המשתמש יימחקו." "ניסית לבטל את נעילת הטאבלט %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, פרופיל העבודה יוסר וכל נתוני הפרופיל יימחקו." "ניסית לבטל את נעילת הטלפון %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, פרופיל העבודה יוסר וכל נתוני הפרופיל יימחקו." "ניסית לבטל את נעילת הטאבלט %d פעמים. פרופיל העבודה יוסר וכל נתוני הפרופיל יימחקו." "ניסית לבטל את נעילת הטלפון %d פעמים. פרופיל העבודה יוסר וכל נתוני הפרופיל יימחקו." "שרטטת קו ביטול נעילה שגוי %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, ,תישלח אליך בקשה לבטל את נעילת הטאבלט באמצעות חשבון אימייל‏.\n\n יש לנסות שוב בעוד %3$d שניות." - "שרטטת קו ביטול נעילה שגוי %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, תשילח אליך בקשה לבטל את נעילת הטלפון באמצעות חשבון אימייל‏.\n\n יש לנסות שוב בעוד %3$d שניות." + "שרטטת קו ביטול נעילה שגוי %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, תישלח אליך בקשה לבטל את נעילת הטלפון באמצעות חשבון אימייל‏.\n\n יש לנסות שוב בעוד %3$d שניות." "לאפשרויות נוספות, יש לבטל את נעילת הטלפון" "לאפשרויות נוספות, יש לבטל את נעילת הטאבלט" "לאפשרויות נוספות, יש לבטל את נעילת המכשיר" From 1dcd953f6b2b56a9e7933f87c008a910b2f08303 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 29 Mar 2021 17:14:32 +0000 Subject: [PATCH 264/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ic2475c928d7d6079e7ae6e6588f011ab33f7ed98 --- .../res/values-en-rXC/strings.xml | 17 ----------------- .../CarrierDefaultApp/res/values-fa/strings.xml | 4 +--- .../CarrierDefaultApp/res/values-hu/strings.xml | 2 +- .../CarrierDefaultApp/res/values-ky/strings.xml | 2 +- .../CarrierDefaultApp/res/values-mn/strings.xml | 2 +- .../CarrierDefaultApp/res/values-ur/strings.xml | 2 +- 6 files changed, 5 insertions(+), 24 deletions(-) delete mode 100644 packages/CarrierDefaultApp/res/values-en-rXC/strings.xml diff --git a/packages/CarrierDefaultApp/res/values-en-rXC/strings.xml b/packages/CarrierDefaultApp/res/values-en-rXC/strings.xml deleted file mode 100644 index d7ae1cee29fd6..0000000000000 --- a/packages/CarrierDefaultApp/res/values-en-rXC/strings.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‎‏‏‎‏‎‏‎‎‎‎‏‎‏‏‏‏‎‎‏‎‏‏‎‏‏‏‎‏‏‏‎‎‏‏‏‏‏‎‏‎‎‏‎‎‏‎‎‏‏‎‎‎‎‎‏‎‎CarrierDefaultApp‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‎‏‏‎‏‎‎‏‏‏‎‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‏‏‎‏‎‏‏‎‏‏‎‏‎‏‏‏‏‎‏‏‎‎‎‏‏‎‏‎‎‏‎Mobile Carrier‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‏‏‎‎‎‏‎‏‎‎‏‏‏‎‎‎‏‏‎‎‎‏‎‏‎‎‏‎‏‎‏‏‎‏‏‏‏‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‎‎‎‏‎Mobile data has run out‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‏‎‏‎‎‎‏‏‎‏‎‏‎‎‎‏‎‏‏‏‎‏‏‎‎‏‎‎‏‏‎‏‎‏‏‎‎‏‎‎‏‎‏‏‎‎‏‏‏‏‏‏‏‎‎‎‏‎Your mobile data has been deactivated‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‏‏‎‏‏‏‎‎‎‎‎‏‎‎‎‏‏‎‏‏‎‏‏‎‏‎‎‏‎‏‎‎‎‏‏‏‎‏‏‏‎‎‎‎‏‏‏‎‏‎‎‏‎‎‎‏‎Tap to visit the %s website‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‏‎‎‏‏‎‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎‎‏‎‏‏‏‏‎‎‎‏‎‎‎‏‎‏‏‎‎‏‏‏‏‎‎‎‎‎‏‎‏‎‎‏‎Please contact your service provider %s‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‏‎‏‏‎‎‎‏‎‎‎‎‎‏‎‎‎‎‎‏‏‏‎‎‎‏‎‎‎‎‎‎‏‏‏‏‏‏‏‎‎‎‎‏‎‏‏‏‏‏‎‎‎‎‎‏‎‎No mobile data connection‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‏‏‏‎‎‏‎‎‎‎‎‎‏‎‏‎‎‎‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‏‎‏‎‎‎‎‎‎‎‏‏‎‎‏‎‎‎‎‏‎‎Add data or roaming plan through %s‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‏‎‎‏‎‎‏‎‏‏‏‏‎‏‏‎‎‏‎‎‏‏‎‎‏‎‏‎‏‎‎‎‎‏‏‏‎‏‏‏‎‏‎‏‏‏‏‎‎‏‏‎‏‏‎‎‎Mobile data status‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‏‏‎‎‎‏‎‏‎‎‏‎‏‏‏‏‎‏‏‏‏‎‎‏‎‎‏‏‎‏‏‎‏‎‏‏‎‎‏‏‎‏‏‏‎‏‏‎‎‏‏‎‏‏‎‎‏‎Sign in to mobile network‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‏‎‏‏‎‏‎‎‎‏‎‏‎‏‎‎‎‎‏‏‏‎‎‎‎‎‎‎‎‏‎‎‎‎‏‎‏‎‎‏‎‏‏‎‎‎‎‎‏‎‏‏‎‎‏‎‎‎The network you’re trying to join has security issues.‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‏‏‎‎‎‏‎‏‎‏‏‏‎‎‎‏‎‏‎‎‎‎‏‏‏‎‏‎‏‏‎‎‎‏‎‏‏‎‏‏‏‎‏‏‏‏‏‎‏‎‎‏‏‎‎‎For example, the login page may not belong to the organization shown.‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‏‏‏‎‎‏‏‎‎‏‏‏‎‏‏‏‏‏‏‎‎‏‎‏‏‏‎‏‏‎‎‏‏‏‏‏‎‏‏‏‏‎‏‎‎‎‏‏‏‏‏‏‎‎‎‎‎‎Continue anyway via browser‎‏‎‎‏‎" - diff --git a/packages/CarrierDefaultApp/res/values-fa/strings.xml b/packages/CarrierDefaultApp/res/values-fa/strings.xml index 37a3de87ba01a..5328a03d96460 100644 --- a/packages/CarrierDefaultApp/res/values-fa/strings.xml +++ b/packages/CarrierDefaultApp/res/values-fa/strings.xml @@ -6,9 +6,7 @@ "داده تلفن همراه تمام شده است" "داده شبکه تلفن همراه شما غیرفعال شده است" "‏برای رفتن به وب‌سایت %s، ضربه بزنید" - - - + "‏لطفاً با ارائه‌دهنده خدمات %s خود تماس بگیرید" "بدون اتصال داده دستگاه همراه" "‏افزودن طرح داده یا فراگردی ازطریق %s" "وضعیت داده تلفن همراه" diff --git a/packages/CarrierDefaultApp/res/values-hu/strings.xml b/packages/CarrierDefaultApp/res/values-hu/strings.xml index 4ae6ea67bb069..a492e47242af4 100644 --- a/packages/CarrierDefaultApp/res/values-hu/strings.xml +++ b/packages/CarrierDefaultApp/res/values-hu/strings.xml @@ -8,7 +8,7 @@ "Koppintson a(z) %s webhely meglátogatásához" "Vegye fel a kapcsolatot szolgáltatójával (%s)" "Nincs mobiladat-kapcsolat" - "Adjon hozzá előfizetést vagy barangolási csomagot a következőn keresztül: %s" + "Adjon hozzá előfizetést vagy roamingcsomagot a következőn keresztül: %s" "Mobiladat-állapot" "Bejelentkezés a mobilhálózatra" "Biztonsági problémák vannak azzal a hálózattal, amelyhez csatlakozni szeretne." diff --git a/packages/CarrierDefaultApp/res/values-ky/strings.xml b/packages/CarrierDefaultApp/res/values-ky/strings.xml index 199476f47be02..bf4c8c3238271 100644 --- a/packages/CarrierDefaultApp/res/values-ky/strings.xml +++ b/packages/CarrierDefaultApp/res/values-ky/strings.xml @@ -8,7 +8,7 @@ "%s сайтына баш багуу үчүн басыңыз" "%s Интернет провайдери менен байланышыңыз" "Мобилдик Интернет жок" - "%s аркылуу дайындарды же роуминг планын кошуу" + "%s аркылуу дайын-даректерди же роуминг планын кошуу" "Мобилдик Интернеттин абалы" "Мобилдик тармакка кирүү" "Кошулайын деген тармагыңызда коопсуздук көйгөйлөрү бар." diff --git a/packages/CarrierDefaultApp/res/values-mn/strings.xml b/packages/CarrierDefaultApp/res/values-mn/strings.xml index 1a9b72ec3b94b..4aa9fb55ff329 100644 --- a/packages/CarrierDefaultApp/res/values-mn/strings.xml +++ b/packages/CarrierDefaultApp/res/values-mn/strings.xml @@ -5,7 +5,7 @@ "Мобайл оператор компани" "Мобайл дата дууссан" "Таны мобайл датаг идэвхгүй болгосон" - "%s вэб хуудсанд зочлохын тулд товших" + "%s веб хуудсанд зочлохын тулд товших" "%s үйлчилгээ үзүүлэгчтэйгээ холбогдоно уу" "Мобайл дата холболт алга" "Дата эсвэл роуминг төлөвлөгөөг %s-р нэмнэ үү" diff --git a/packages/CarrierDefaultApp/res/values-ur/strings.xml b/packages/CarrierDefaultApp/res/values-ur/strings.xml index fc286b8a53d3f..65bd6ceba94b8 100644 --- a/packages/CarrierDefaultApp/res/values-ur/strings.xml +++ b/packages/CarrierDefaultApp/res/values-ur/strings.xml @@ -6,7 +6,7 @@ "موبائل ڈیٹا ختم ہو چکا ہے" "آپ کا موبائل ڈیٹا غیر فعال کر دیا گیا ہے" "‏‎%s ویب سائٹ ملاحظہ کرنے کیلئے تھپتھپائیں" - "‏براہ کرم اپنے خدمت کے فراہم کنندہ %s سے رابطہ کریں" + "‏براہ کرم اپنے سروس فراہم کنندہ %s سے رابطہ کریں" "کوئی موبائل ڈیٹا کنکشن نہیں ہے" "‏%s کے ذریعے ڈیٹا یا رومنگ پلان شامل کریں" "موبائل ڈیٹا کی صورت حال" From 78a9f2828223391664829b4f420b93f0c6fa3964 Mon Sep 17 00:00:00 2001 From: Louis Chang Date: Sat, 20 Feb 2021 12:49:03 +0800 Subject: [PATCH 265/288] DO NOT MERGE Reset top focused root task when task hidden The focused app was not updated when bubble minimized and causing ANR. Bug: 179676966 Bug: 171522827 Test: expand and minimize bubbles Test: 1) play video 2) adjust volume 3) get bubble, expand it, adjust volume 4) collapse bubble 5) adjust volume => Should see volume dialog; no ANR Change-Id: If04de21b954d074b045e76d7d23e02dade60cdbe (cherry picked from commit a782799b15323c9c8475e62a8dfd8f6fedb66b75) --- services/core/java/com/android/server/wm/Task.java | 10 +++++----- .../java/com/android/server/wm/TaskDisplayArea.java | 5 +++-- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index db3c74fc94af9..b19b8c1ce10b7 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -4597,11 +4597,11 @@ class Task extends WindowContainer { } final boolean wasHidden = isForceHidden(); mForceHiddenFlags = newFlags; - if (wasHidden && isFocusableAndVisible()) { - // The change in force-hidden state will change visibility without triggering a stack - // order change, so we should reset the preferred top focusable stack to ensure it's not - // used if a new activity is started from this task. - getDisplayArea().resetPreferredTopFocusableStackIfBelow(this); + if (wasHidden != isForceHidden() && isTopActivityFocusable()) { + // The change in force-hidden state will change visibility without triggering a root + // task order change, so we should reset the preferred top focusable root task to ensure + // it's not used if a new activity is started from this task. + getDisplayArea().resetPreferredTopFocusableRootTaskIfNeeded(this); } return true; } diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java index 79f3b8340b214..676d7e5071417 100644 --- a/services/core/java/com/android/server/wm/TaskDisplayArea.java +++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java @@ -773,9 +773,10 @@ final class TaskDisplayArea extends DisplayArea { onStackOrderChanged(stack); } - void resetPreferredTopFocusableStackIfBelow(Task task) { + /** Reset the mPreferredTopFocusableRootTask if it is or below the given task. */ + void resetPreferredTopFocusableRootTaskIfNeeded(Task task) { if (mPreferredTopFocusableStack != null - && mPreferredTopFocusableStack.compareTo(task) < 0) { + && mPreferredTopFocusableStack.compareTo(task) <= 0) { mPreferredTopFocusableStack = null; } } From 3cc89803f92bdf33afabed52bfa2ecb1f1635075 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 29 Mar 2021 15:08:33 -0700 Subject: [PATCH 266/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I9fe1997445a2595b372566d4f9032774a1a7307d --- .../SettingsLib/res/values-fa/strings.xml | 2 +- packages/SettingsLib/res/values-gu/arrays.xml | 2 +- .../SettingsLib/res/values-gu/strings.xml | 4 +- packages/SettingsLib/res/values-iw/arrays.xml | 8 +-- .../SettingsLib/res/values-iw/strings.xml | 50 +++++++++---------- packages/SettingsLib/res/values-ne/arrays.xml | 2 +- .../SettingsLib/res/values-ne/strings.xml | 2 +- .../SettingsLib/res/values-nl/strings.xml | 4 +- .../SettingsLib/res/values-ta/strings.xml | 2 +- 9 files changed, 38 insertions(+), 38 deletions(-) diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml index 114519c107a47..323aa65113f31 100644 --- a/packages/SettingsLib/res/values-fa/strings.xml +++ b/packages/SettingsLib/res/values-fa/strings.xml @@ -465,7 +465,7 @@ "۵۰٪" "۱۰۰٪" - "%1$s قبل" + "‫%1$s پیش" "%1$s باقی مانده است" "کوچک" "پیش‌فرض" diff --git a/packages/SettingsLib/res/values-gu/arrays.xml b/packages/SettingsLib/res/values-gu/arrays.xml index 1a3bf9859e7c0..21f97d419f819 100644 --- a/packages/SettingsLib/res/values-gu/arrays.xml +++ b/packages/SettingsLib/res/values-gu/arrays.xml @@ -252,7 +252,7 @@ "Deuteranomaly માટેના ક્ષેત્રો બતાવો" - "માનક સીમા" + "સ્ટૅન્ડર્ડ સીમા" "કોઈ બૅકગ્રાઉન્ડ પ્રક્રિયાઓ નથી" "સૌથી વધુ 1 પ્રક્રિયા" "સૌથી વધુ 2 પ્રક્રિયા" diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml index 86e39d202b492..4f1e864f6c5be 100644 --- a/packages/SettingsLib/res/values-gu/strings.xml +++ b/packages/SettingsLib/res/values-gu/strings.xml @@ -282,7 +282,7 @@ "કનેક્ટ કરી શકાયું નથી" "વાયરલેસ ડિસ્પ્લે પ્રમાણપત્ર માટેના વિકલ્પો બતાવો" "વાઇ-ફાઇ લોગિંગ સ્તર વધારો, વાઇ-ફાઇ પીકરમાં SSID RSSI દીઠ બતાવો" - "બૅટરીનો ચાર્જ ઝડપથી ઓછો થવાનું ટાળે છે અને નેટવર્કની કાર્યક્ષમતામાં સુધારો કરે છે" + "બૅટરીનો ચાર્જ ઝડપથી ઓછો થવાનું ટાળે છે અને નેટવર્કના કાર્યપ્રદર્શનમાં સુધારો કરે છે" "આ મોડ ચાલુ કરેલો હશે, ત્યારે MAC રેન્ડમાઇઝેશન ચાલુ કરેલું હોય તેવા નેટવર્ક સાથે આ ડિવાઇસ જોડાશે ત્યારે દર વખતે તેનું MAC ઍડ્રેસ બદલાય તેમ બની શકે છે." "મીટર કરેલ" "મીટર ન કરેલ" @@ -388,7 +388,7 @@ "વાઇબ્રન્ટ (ડિફોલ્ટ)" "કુદરતી" - "માનક" + "સ્ટૅન્ડર્ડ" "વધારેલ રંગો" diff --git a/packages/SettingsLib/res/values-iw/arrays.xml b/packages/SettingsLib/res/values-iw/arrays.xml index a81c29459674d..ebe3fab3fc14a 100644 --- a/packages/SettingsLib/res/values-iw/arrays.xml +++ b/packages/SettingsLib/res/values-iw/arrays.xml @@ -37,12 +37,12 @@ "מתבצעת סריקה..." - "מתחבר אל %1$s…" + "מתבצעת התחברות אל %1$s…" "מתבצע אימות מול %1$s..." "‏המערכת משיגה כתובת IP מ-%1$s…" "מחובר אל %1$s" "בהשעיה" - "מתנתק מרשת %1$s..." + "מתבצעת התנתקות מרשת %1$s…" "מנותק" "נכשל" "חסומה" @@ -56,7 +56,7 @@ "‏אני לעולם לא רוצה להשתמש בבדיקת HDCP" "‏שימוש בבדיקת HDCP עבור תוכן DRM בלבד" - "‏תמיד השתמש בבדיקת HDCP" + "‏אני רוצה להשתמש תמיד בבדיקת HDCP" "מושבת" @@ -133,7 +133,7 @@ "סטריאו" - "השתמש בבחירת המערכת (ברירת המחדל)" + "שימוש בבחירת המערכת (ברירת המחדל)" "מונו" "סטריאו" diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml index 9c851e7478a75..aebd5bda70ee6 100644 --- a/packages/SettingsLib/res/values-iw/strings.xml +++ b/packages/SettingsLib/res/values-iw/strings.xml @@ -65,9 +65,9 @@ "%1$s / %2$s" "מנותק" "מתבצעת התנתקות..." - "מתחבר ..." + "מתבצעת התחברות…" "%1$s מחובר" - "מבצע התאמה..." + "ההתאמה מתבצעת..." "מחובר (ללא טלפון)%1$s" "מחובר (ללא מדיה)%1$s" "מחובר (ללא גישה להודעות)%1$s" @@ -87,7 +87,7 @@ "מכשיר קלט" "גישה לאינטרנט" "שיתוף אנשי קשר" - "השתמש עבור שיתוף אנשי קשר" + "שימוש עבור שיתוף אנשי קשר" "שיתוף חיבור לאינטרנט" "הודעות טקסט" "‏גישה ל-SIM" @@ -124,7 +124,7 @@ "אוזניות" "טלפון" "הדמיה" - "אוזנייה" + "אוזניות" "ציוד קלט היקפי" "Bluetooth" "מתבצעת התאמה של מכשיר שמיעה שמאלי…" @@ -235,7 +235,7 @@ "‏יש להתחבר לרשת Wi-Fi" "‏adb, ניפוי באגים, פיתוח" "קיצור של דוח באגים" - "כדי ליצור דוח באגים, הצג לחצן בתפריט לניהול צריכת החשמל" + "כדי ליצור דוח באגים, יש להציג לחצן בתפריט לניהול צריכת החשמל" "שיישאר פועל" "המסך לעולם לא יהיה במצב שינה במהלך טעינה" "‏הפעלת Snoop Log של Bluetooth HCI" @@ -286,13 +286,13 @@ "‏כשמצב זה מופעל, כתובת ה-MAC של המכשיר הזה עשויה להשתנות בכל פעם שהוא מתחבר לרשת שפועלת בה רנדומיזציה של כתובות MAC." "נמדדת" "לא נמדדת" - "גדלי מאגר של יומן רישום" + "גודלי מאגר של יומן רישום" "יש לבחור גדלים של יוצר יומן לכל מאגר יומן" "האם למחוק את אחסון המתעד המתמיד?" "כשאנחנו כבר לא מבצעים מעקב באמצעות המתעד המתמיד, אנחנו נדרשים למחוק את נתוני המתעד המקומי במכשיר." "אחסון מתמיד של נתוני תיעוד במכשיר" - "בחר מאגר נתונים זמני ליומן לשם אחסון מתמיד במכשיר" - "‏בחר תצורת USB" + "בחירת מאגר נתונים זמני ליומן לשם אחסון מתמיד במכשיר" + "‏בחירה של תצורת USB" "‏יש לבחור תצורת USB" "אפשרות של מיקומים מדומים" "אפשרות של מיקומים מדומים" @@ -307,17 +307,17 @@ "האם להתיר הגדרות פיתוח?" "הגדרות אלה מיועדות לשימוש בפיתוח בלבד. הן עלולות לגרום למכשיר או לאפליקציות המותקנות בו לקרוס או לפעול באופן לא תקין." "‏אימות אפליקציות באמצעות USB" - "‏בדוק אפליקציות שהותקנו באמצעות ADB/ADT לאיתור התנהגות מזיקה." + "‏יש לבדוק אפליקציות שהותקנו באמצעות ADB/ADT לאיתור התנהגות מזיקה." "‏יוצגו מכשירי Bluetooth ללא שמות (כתובות MAC בלבד)" - "‏משבית את תכונת עוצמת הקול המוחלטת ב-Bluetooth במקרה של בעיות בעוצמת הקול במכשירים מרוחקים, כגון עוצמת קול רמה מדי או חוסר שליטה ברמת העוצמה." + "‏השבתה של תכונת עוצמת הקול המוחלטת ב-Bluetooth במקרה של בעיות בעוצמת הקול במכשירים מרוחקים, כגון עוצמת קול רמה מדי או חוסר שליטה ברמת העוצמה." "‏הפעלת מקבץ הפיצ\'רים של Bluetooth Gabeldorsche." "הפעלה של תכונת הקישוריות המשופרת." "מסוף מקומי" - "הפעל אפליקציית מסוף המציעה גישה מקומית למעטפת" + "הפעלה של אפליקציית מסוף המציעה גישה מקומית למעטפת" "‏בדיקת HDCP" - "‏הגדר אופן בדיקת HDCP" + "‏הגדרת האופן של בדיקת HDCP" "ניפוי באגים" - "בחר אפליקציה לניפוי באגים" + "בחירת אפליקציה לניפוי באגים" "לא הוגדרה אפליקציה לניפוי" "אפליקציה לניפוי: %1$s" "בחירת אפליקציה" @@ -335,25 +335,25 @@ "שכבת-על של המסך המציגה את נתוני המגע הנוכחיים" "הצגת הקשות" "הצגת משוב ויזואלי להקשות" - "הצג עדכונים על פני השטח" + "הצגת עדכונים על פני השטח" "הבזקת כל שטחי החלון כשהם מתעדכנים" "תצוגת \'הצגת עדכונים\'" - "הבזק תצוגות בתוך חלונות בעת ציור" - "הצג עדכוני שכבות חומרה" + "הבזקת תצוגות בתוך חלונות בעת ציור" + "הצגת עדכונים של שכבות חומרה" "הצגת הבהוב ירוק לשכבות חומרה כשהן מתעדכנות" "‏חריגה בניפוי באגים ב-GPU" "‏השבתת שכבות על של HW" - "‏השתמש תמיד ב-GPU להרכבת מסך" + "‏שימוש תמיד ב-GPU להרכבת מסך" "יצירת הדמיה של מרחב צבעים" - "‏הפעל מעקבי OpenGL" - "‏השבת ניתוב אודיו ב-USB" + "‏הפעלת מעקבי OpenGL" + "‏השבתת ניתוב אודיו ב-USB" "‏השבתת ניתוב אוטומטי אל התקני אודיו חיצוניים ב-USB" "הצגת גבולות הפריסה" "הצגת גבולות אזור, שוליים וכדומה" - "אלץ כיוון פריסה מימין לשמאל" + "אילוץ כיוון פריסה מימין לשמאל" "אילוץ של כיוון פריסת מסך מימין לשמאל עבור כל השפות בכל המקומות" "‏אילוץ הפעלת 4x MSAA" - "‏הפעל 4x MSAA ביישומי OpenGL ES 2.0" + "‏הפעלת 4x MSAA ביישומי OpenGL ES 2.0" "ניפוי באגים בפעולות באזור שאינו מלבני" "‏עיבוד פרופיל ב-HWUI" "‏הפעלת שכבות לניפוי באגים ב-GPU" @@ -363,7 +363,7 @@ "קנה מידה לאנימציה של חלון" "קנה מידה לאנימציית מעבר" "קנה מידה למשך זמן אנימציה" - "צור הדמיית תצוגות משניות" + "יצירת הדמיה של תצוגות משניות" "אפליקציות" "ללא שמירת פעילויות" "השמדת כל פעילות ברגע שהמשתמש עוזב אותה" @@ -380,7 +380,7 @@ "הפעלת תמיכה בתכונה הניסיונית של שינוי הגודל והמיקום של החלונות." "סיסמת גיבוי שולחן העבודה" "גיבויים מלאים בשולחן העבודה אינם מוגנים כעת" - "הקש כדי לשנות או להסיר את הסיסמה לגיבויים מלאים בשולחן העבודה" + "יש להקיש כדי לשנות או להסיר את הסיסמה לגיבויים מלאים בשולחן העבודה" "הוגדרה סיסמת גיבוי חדשה" "הסיסמה החדשה והאישור אינם תואמים" "הגדרת סיסמת גיבוי נכשלה" @@ -396,7 +396,7 @@ "צבעים מותאמים באופן אופטימלי לתוכן דיגיטלי" "אפליקציות בהמתנה" - "אפליקציה לא פעילה. הקש כדי להחליף מצב." + "אפליקציה לא פעילה. יש להקיש כדי להחליף מצב." "אפליקציה פעילה. יש להקיש כדי להחליף מצב." "אפליקציה במצב המתנה: %s" "שירותים פועלים" @@ -507,7 +507,7 @@ "בשעה %1$s" "ב-%1$s" "משך" - "שאל בכל פעם" + "יש לשאול בכל פעם" "עד הכיבוי" "הרגע" "רמקול של טלפון" diff --git a/packages/SettingsLib/res/values-ne/arrays.xml b/packages/SettingsLib/res/values-ne/arrays.xml index 5ee6353f09620..92344cf1b060c 100644 --- a/packages/SettingsLib/res/values-ne/arrays.xml +++ b/packages/SettingsLib/res/values-ne/arrays.xml @@ -252,7 +252,7 @@ "Deuteranomaly का लागि क्षेत्रहरू देखाउनुहोस्" - "मानक सीमा" + "डिफल्ट सीमा" "कुनै पृष्ठभूमि प्रक्रियाहरू छैनन्" "बढीमा १ प्रक्रिया" "बढीमा २ प्रक्रियाहरू" diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml index 721fa2dfdf5da..dd4823d3e1f35 100644 --- a/packages/SettingsLib/res/values-ne/strings.xml +++ b/packages/SettingsLib/res/values-ne/strings.xml @@ -388,7 +388,7 @@ "जोसिलो (पूर्व निर्धारित)" "प्राकृतिक" - "मानक" + "डिफल्ट" "परिष्कृत रङ्गहरू" diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml index f04afa29d4659..7016be09cf6f7 100644 --- a/packages/SettingsLib/res/values-nl/strings.xml +++ b/packages/SettingsLib/res/values-nl/strings.xml @@ -255,7 +255,7 @@ "Mobiele data altijd actief" "Hardwareversnelling voor tethering" "Bluetooth-apparaten zonder naam tonen" - "Absoluut volume uitschakelen" + "Absoluut volume uitzetten" "Gabeldorsche aanzetten" "Bluetooth-AVRCP-versie" "Bluetooth-AVRCP-versie selecteren" @@ -342,7 +342,7 @@ "Hardwarelayer-upd. tonen" "Hardwarelagen knipperen groen bij updates" "Foutopsporing GPU-overbelasting" - "HW-overlays uitschakelen" + "HW-overlays uitzetten" "GPU altijd gebruiken voor schermcompositing" "Kleurruimte simuleren" "OpenGL-sporen aanzetten" diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml index 58758bfc3ec94..f6d4a3d3150c8 100644 --- a/packages/SettingsLib/res/values-ta/strings.xml +++ b/packages/SettingsLib/res/values-ta/strings.xml @@ -388,7 +388,7 @@ "வைபிரன்ட் (இயல்பு)" "இயற்கை வண்ணம்" - "வழக்கமான வண்ணம்" + "இயல்புநிலை" "மேம்படுத்தப்பட்ட வண்ணங்கள்" From 86e9b361de4c3b6ef032f85bc307848d9ac731b4 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 30 Mar 2021 10:41:05 -0700 Subject: [PATCH 267/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Iabd81448360812ebddb368e22b190ba5c1e7bd93 --- core/res/res/values-as/strings.xml | 2 +- core/res/res/values-be/strings.xml | 6 +- core/res/res/values-bs/strings.xml | 2 +- core/res/res/values-eu/strings.xml | 4 +- core/res/res/values-gu/strings.xml | 2 +- core/res/res/values-hu/strings.xml | 2 +- core/res/res/values-in/strings.xml | 6 +- core/res/res/values-iw/strings.xml | 40 ++++++------ core/res/res/values-kk/strings.xml | 6 +- core/res/res/values-ko/strings.xml | 2 +- core/res/res/values-mk/strings.xml | 4 +- core/res/res/values-nl/strings.xml | 86 +++++++++++++------------- core/res/res/values-ru/strings.xml | 4 +- core/res/res/values-ta/strings.xml | 2 +- core/res/res/values-zh-rTW/strings.xml | 2 +- 15 files changed, 85 insertions(+), 85 deletions(-) diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml index 54b22ee3578ec..2ca98b4c5f220 100644 --- a/core/res/res/values-as/strings.xml +++ b/core/res/res/values-as/strings.xml @@ -2000,7 +2000,7 @@ "ৰুটিন ম’ডৰ তথ্য জাননী" "চ্চাৰ্জ কৰাৰ সচৰাচৰ সময়ৰ আগতেই বেটাৰি শেষ হ’ব পাৰে" "বেটাৰিৰ খৰচ কমাবলৈ বেটাৰি সঞ্চয়কাৰী অন কৰা হৈছে" - "বেটাৰি সঞ্চয়কাৰী" + "বেটাৰী সঞ্চয়কাৰী" "বেটাৰি সঞ্চয়কাৰী অফ কৰা হ’ল" "ফ\'নটোত পর্যাপ্ত পৰিমাণে চার্জ আছে। সুবিধাবোৰ আৰু সীমাবদ্ধ কৰা নাই।" "টেবলেটটোত পর্যাপ্ত পৰিমাণে চার্জ আছে। সুবিধাবোৰ আৰু সীমাবদ্ধ কৰা নাই।" diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index 0cf27aba6c30d..220c3520a1db3 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -507,9 +507,9 @@ "Дазваляе праграме атрымліваць пакеты, адпраўленыя на ўсе прылады ў сетцы Wi-Fi з дапамогай групавых адрасоў, а не толькі на вашу прыладу Android TV. Праз гэта будзе спажывацца больш энергіі, чым у рэжыме нешматадраснай перадачы." "Дазваляе прыкладанням атрымліваць пакеты, адпраўленыя на ўсе прылады з сеткi Wi-Fi з дапамогай групавых адрасоў, а не толькі на ваш тэлефон. Будзе выкарыстоўвацца больш энергіі, чым у рэжыме нешматадраснай перадачы." "атрыманне доступу да налад прылады Bluetooth" - "Дазваляе прыкладанням наладжваць лакальны планшэт Bluetooth, выяўляць і падлучаць выдаленыя прылады." + "Дазваляе праграме наладжваць лакальны планшэт Bluetooth, выяўляць і спалучаць выдаленыя прылады." "Дазваляе праграме наладжваць канфігурацыю Bluetooth на прыладзе Android TV, а таксама выяўляць аддаленыя прылады і спалучацца з імі." - "Дазваляе прыкладанням наладжваць лакальны тэлефон Bluetooth, а таксама знаходзіць выдаленыя прылады i падлучацца да ix." + "Дазваляе праграме наладжваць лакальны тэлефон Bluetooth, а таксама знаходзіць выдаленыя прылады i спалучаць ix." "падключаць да WiMAX i адключаць ад яго" "Дазваляе прыкладанню вызначаць, ці ўключаны WiMAX, і інфармацыю пра любую сетку WiMAX, якая спалучана з iншымi." "Змяніць стан WiMAX" @@ -1355,7 +1355,7 @@ "Тэставы рэжым уключаны" "Каб выключыць тэставы рэжым, скіньце налады да заводскіх значэнняў." "Паслядоўная кансоль уключана" - "Паказчык эфектыўнасці змяніўся. Каб выключыць кансоль, праверце загрузчык." + "Паказчык прадукцыйнасці змяніўся. Каб выключыць кансоль, праверце загрузчык." "Вадкасць або смецце ў порце USB" "Порт USB аўтаматычна адключаны. Каб даведацца больш, націсніце тут." "Порт USB можна выкарыстоўваць" diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml index 5c5f82208499a..7511455fc0ee6 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -1335,7 +1335,7 @@ "Omogućen način rada okvira za testiranje" "Izvršite vraćanje na fabričke postavke da onemogućite način rada okvira za testiranje." "Serijska konzola omogućena" - "Izvedba je otežana. Da onemogućite, provjerite program za učitavanje operativnog sistema." + "Performanse su smanjene. Da onemogućite, provjerite program za učitavanje operativnog sistema." "Tečnost ili nečistoće u USB priključku" "USB priključak je automatski onemogućen. Dodirnite da saznate više." "USB priključak je sada sigurno koristiti" diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index c8bd3dc686ce0..99012924a3e23 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -1203,7 +1203,7 @@ "%1$s abian da" "Sakatu jokora itzultzeko" "Aukeratu joko bat" - "Funtzionamendu hobea izateko, joko hauetako bat baino ezin da egon irekita aldi berean." + "Errendimendu hobea izateko, joko hauetako bat baino ezin da egon irekita aldi berean." "Itzuli %1$s aplikaziora" "Ireki %1$s" "Gorde gabe itxiko da %1$s" @@ -1315,7 +1315,7 @@ "Proba-materialeko modua gaitu da" "Proba-materialaren modua desgaitzeko, berrezarri jatorrizko datuak." "Serie-kontsola gaituta" - "Funtzionamenduari eragiten dio. Desgaitzeko, joan abiarazlera." + "Errendimenduari eragiten dio. Desgaitzeko, joan abiarazlera." "Likidoa edo zikinkeriak daude USB atakan" "USB ataka automatikoki desgaitu da. Informazio gehiago lortzeko, sakatu hau." "Erabiltzeko moduan dago USB ataka" diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index 087aaaf6f6e93..758b2a0146335 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -350,7 +350,7 @@ "સેલ બ્રોડકાસ્ટ સંદેશા ફૉરવર્ડ કરો" "સેલ બ્રોડકાસ્ટ સંદેશા પ્રાપ્ત થાય કે તરત ફૉરવર્ડ કરવા માટે સેલ બ્રોડકાસ્ટ મૉડ્યૂલ સાથે પ્રતિબદ્ધ થવા બાબતે ઍપને મંજૂરી આપે છે. તમને કટોકટીની પરિસ્થિતિની ચેતવણી આપવા માટે સેલ બ્રોડકાસ્ટ અલર્ટ અમુક સ્થાનોમાં ડિલિવર કરવામાં આવે છે. કટોકટી અંગેનો સેલ બ્રોડકાસ્ટ પ્રાપ્ત થાય, ત્યારે દુર્ભાવનાપૂર્ણ ઍપ તમારા ડિવાઇસના કાર્યપ્રદર્શન અથવા ઑપરેશનમાં વિક્ષેપ પાડે તેમ બની શકે છે." "સેલ બ્રોડકાસ્ટ સંદેશા વાંચો" - "એપ્લિકેશનને તમારા ઉપકરણ દ્વારા પ્રાપ્ત થયેલ સેલ બ્રોડકાસ્ટ સંદેશાને વાંચવાની મંજૂરી આપે છે. સેલ બ્રોડકાસ્ટ ચેતવણીઓ તમને કટોકટીની સ્થિતિઓ અંગે ચેતવવા માટે કેટલાક સ્થાનોમાં વિતરિત થાય છે. જ્યારે કટોકટીનો સેલ બ્રોડકાસ્ટ પ્રાપ્ત થાય ત્યારે દુર્ભાવનાપૂર્ણ ઍપ્લિકેશનો તમારા ઉપકરણના પ્રદર્શન અથવા ઓપરેશનમાં હસ્તક્ષેપ કરી શકે છે." + "ઍપ તમારા ડિવાઇસ દ્વારા પ્રાપ્ત થયેલ સેલ બ્રોડકાસ્ટ સંદેશાને વાંચવાની મંજૂરી આપે છે. સેલ બ્રોડકાસ્ટ ચેતવણીઓ તમને ઇમર્જન્સીની સ્થિતિઓ અંગે ચેતવવા માટે કેટલાક સ્થાનોમાં વિતરિત થાય છે. જ્યારે ઇમર્જન્સીનો સેલ બ્રોડકાસ્ટ પ્રાપ્ત થાય ત્યારે દુર્ભાવનાપૂર્ણ ઍપ તમારા ડિવાઇસના કાર્યપ્રદર્શન અથવા ઓપરેશનમાં હસ્તક્ષેપ કરી શકે છે." "સબ્સ્ક્રાઇબ કરેલ ફીડ્સ વાંચો" "એપ્લિકેશનને હાલમાં સમન્વયિત ફીડ્સ વિશે વિગતો મેળવવાની મંજૂરી આપે છે." "SMS સંદેશા મોકલો અને જુઓ" diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index 34e1db5ef4ce0..4492eec7d8be4 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -1785,7 +1785,7 @@ "Munkahelyi %1$s" "2. munkahelyi %1$s" "3. munkahelyi %1$s" - "PIN-kód kérése a rögzítés feloldásához" + "PIN-kód kérése a kitűzés feloldásához" "Feloldási minta kérése a rögzítés feloldásához" "Jelszó kérése a rögzítés feloldásához" "A rendszergazda által telepítve" diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index 665e570bb0e50..12d479d95e8ef 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -1900,10 +1900,10 @@ "Ketuk untuk membuka kunci profil kerja" "Terhubung ke %1$s" "Ketuk untuk melihat file" - "Pasang pin" - "Pasang pin %1$s" + "Sematkan" + "Sematkan %1$s" "Lepas pin" - "Lepas pin %1$s" + "Lepas sematan %1$s" "Info aplikasi" "−%1$s" "Memulai demo..." diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index 113a3304f28e9..757041c4d397c 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -150,7 +150,7 @@ "‏Wi-Fi בלבד" "{0}: ללא העברה" "{0}: {1}" - "{0}: {1} כעבור {2} שניות" + "{0}:‏ {1} אחרי {2} שניות" "{0}: ללא העברה" "{0}: ללא העברה" "קוד תכונה הושלם." @@ -167,7 +167,7 @@ "הדף מכיל יותר מדי כתובות אתר להפניה מחדש של השרת." "הפרוטוקול אינו נתמך." "לא ניתן ליצור חיבור מאובטח." - "אין אפשרות לפתוח את הדף מכיוון שכתובת האתר אינה חוקית." + "‏אין אפשרות לפתוח את הדף מכיוון שכתובת ה-URL אינה חוקית." "לא ניתן לגשת לקובץ." "הקובץ המבוקש לא נמצא." "בקשות רבות מדי מעובדות. נסה שוב מאוחר יותר." @@ -214,7 +214,7 @@ "אפשרויות טלפון" "מצב שקט" "הפעל חיבור אלחוטי" - "כבה אלחוטי" + "כיבוי אלחוטי" "נעילת מסך" "כיבוי" "צלצול כבוי" @@ -502,7 +502,7 @@ "‏מאפשר לאפליקציה להציג מידע על רשתות Wi-Fi, למשל, האם Wi-Fi מופעל, כמו גם שם מכשירי ה-Wi-Fi המחוברים." "‏התחברות והתנתקות מ-Wi-Fi" "‏מאפשר לאפליקציה להתחבר לנקודות גישת Wi-Fi ולהתנתק מהן, וכן לבצע שינויים בתצורת המכשיר עבור רשתות Wi-Fi." - "‏אפשר קבלת שידורים מרובים ב-Wi-Fi" + "‏מאפשרת לקבל שידורים מרובים ב-Wi-Fi" "‏מאפשר לאפליקציה לקבל חבילות שנשלחו לכל המכשירים ברשת Wi-Fi באמצעות כתובות שידור לקבוצה, ולא רק בטאבלט שלך. צריכת החשמל גבוהה יותר מאשר במצב שאינו שידור לקבוצה." "‏מאפשרת לאפליקציה לקבל חבילות שנשלחו לכל המכשירים ברשת Wi-Fi באמצעות כתובות מולטיקאסט, ולא רק למכשיר ה-Android TV. צריכת החשמל תהיה גבוהה יותר מאשר במצב שאינו מולטיקאסט." "‏מאפשרת לאפליקציה לקבל חבילות שנשלחו לכל המכשירים ברשת Wi-Fi באמצעות כתובות שידור לקבוצה, ולא רק בטלפון שלך. צריכת החשמל גבוהה יותר מאשר במצב שאינו שידור לקבוצה." @@ -566,7 +566,7 @@ "יותר מדי ניסיונות. יש לנסות שוב מאוחר יותר." "יותר מדי ניסיונות. חיישן טביעות האצבע הושבת." "כדאי לנסות שוב." - "לא נרשמו טביעות אצבע." + "לא נסרקו טביעות אצבע." "במכשיר זה אין חיישן טביעות אצבע." "החיישן מושבת באופן זמני." "אצבע %d" @@ -592,7 +592,7 @@ "יש להביט ישירות אל המכשיר." "עליך למקם את הפנים ישירות מול הטלפון." "יותר מדי תנועה. יש להחזיק את הטלפון בצורה יציבה." - "יש לרשום מחדש את הפנים." + "יש לסרוק שוב את הפנים." "כבר לא ניתן לזהות פנים. יש לנסות שוב." "דומה מדי, יש לשנות תנוחה." "עליך ליישר קצת את הראש." @@ -644,7 +644,7 @@ "קריאת נתוני שימוש היסטוריים ברשת" "מאפשר לאפליקציה לקרוא נתוני שימוש היסטוריים ברשת עבור רשתות ואפליקציות ספציפיות." "נהל מדיניות רשת" - "מאפשר לאפליקציה לנהל מדיניות הרשת להגדיר כללים ספציפיים-לאפליקציה." + "מאפשרת לאפליקציה לנהל את מדיניות הרשת ולהגדיר כללים ספציפיים-לאפליקציה." "שינוי ניהול החשבונות של שימוש ברשת" "ההרשאה הזו מאפשרת לאפליקציה לשנות את אופן החישוב של נתוני שימוש ברשת מול כל אפליקציה. לא מיועדת לשימוש באפליקציות רגילות." "גישה להתראות" @@ -770,7 +770,7 @@ "זימונית מהעבודה" "אסיסטנט" "MMS" - "מותאם אישית" + "בהתאמה אישית" "תאריך לידה" "יום השנה" "אחר" @@ -805,7 +805,7 @@ "אח" "ילד" "שותף לחיים" - "אב" + "אבא" "חבר" "מנהל" "אמא" @@ -866,7 +866,7 @@ "שרטטת את קו ביטול הנעילה באופן שגוי %1$d פעמים. \n\nיש לנסות שוב בעוד %2$d שניות." "הקלדת סיסמה שגויה %1$d פעמים.\n\nנסה שוב בעוד %2$d שניות." "הקלדת קוד גישה שגוי %1$d פעמים.\n\nנסה שוב בעוד %2$d שניות." - "‏שרטטת באופן שגוי את קו ביטול הנעילה %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, תתבקש לבטל את נעילת הטאבלט באמצעות פרטי הכניסה שלך ל-Google.\n\nנסה שוב בעוד %3$d שניות." + "‏שרטטת את קו ביטול הנעילה באופן שגוי %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, יהיה צורך לבטל את נעילת הטאבלט באמצעות פרטי הכניסה שלך ל-Google.\n\nיש לנסות שוב בעוד %3$d שניות." "‏שרטטת קו ביטול נעילה שגוי %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, תתבקש לבטל את הנעילה של מכשיר ה-Android TV באמצעות כניסה לחשבון Google שלך.\n\n נסה שוב בעוד %3$d שניות." "‏שרטטת את קו ביטול הנעילה באופן שגוי %1$d פעמים. בעוד %2$d ניסיונות כושלים נוספים, יהיה צורך לבטל את נעילת הטלפון באמצעות פרטי הכניסה שלך ל-Google‏.\n\n יש לנסות שוב בעוד %3$d שניות." "ביצעת %1$d ניסיונות שגויים לביטול נעילת הטאבלט. לאחר %2$d ניסיונות כושלים נוספים, הטאבלט יעבור איפוס לברירת המחדל של היצרן וכל נתוני המשתמש יאבדו." @@ -1044,7 +1044,7 @@ %d שנים %d שנים %d שנים - שנה %d + שנה אחת (%d‏) בעוד %d דקות @@ -1120,7 +1120,7 @@ "בעיה בווידאו" "לא ניתן להעביר את הסרטון הזה בסטרימינג למכשיר." - "לא ניתן להפעיל סרטון זה." + "לא ניתן להפעיל את הסרטון הזה." "אישור" "%1$s, %2$s" "צהריים" @@ -1167,7 +1167,7 @@ "השלם פעולה" "פתיחה באמצעות" "‏פתח באמצעות %1$s" - "פתח" + "פתיחה" "פתיחת קישורים של %1$s באמצעות" "פתיחת קישורים באמצעות" "פתיחת קישורים באמצעות %1$s" @@ -1331,7 +1331,7 @@ "הגדרה" "סיום" "חדש: " - "מטעם %1$s." + "מאת %1$s." "לא נדרשות הרשאות" "פעולה זו עשויה לחייב אותך בכסף:" "אישור" @@ -1428,7 +1428,7 @@ "ניתוב פלט מדיה" "מאפשר לאפליקציה לנתב פלט מדיה למכשירים חיצוניים אחרים." "קריאת פעילות התקנה" - "מאפשר לאפליקציה לקרוא הפעלות התקנה. הרשאה זו מאפשרת לה לראות פרטים על התקנות פעילות של חבילות." + "מאפשרת לאפליקציה לקרוא פעילויות התקנה. ההרשאה הזו מאפשרת לה לראות פרטים על התקנות פעילות של חבילות." "בקשה להתקנת חבילות" "מתיר לאפליקציה לבקש התקנה של חבילות." "בקשה למחוק חבילות" @@ -1439,14 +1439,14 @@ "‏לא ניתן להוסיף widget." "התחל" "חיפוש" - "שלח" + "שליחה" "הבא" "סיום" "הקודם" "בצע" "חיוג למספר\nבאמצעות %s" "צור איש קשר\nבאמצעות %s" - "האפליקציות הבאות מבקשות אישור לגשת לחשבונך, כעת ובעתיד." + "האפליקציות הבאות מבקשות אישור לגשת לחשבון שלך, עכשיו ובעתיד." "לאפשר את הבקשה הזו?" "בקשת גישה" "כן, זה בסדר" @@ -1541,7 +1541,7 @@ "בחר אפליקציה" "לא ניתן היה להפעיל את %s" "שתף עם" - "שתף עם %s" + "שיתוף עם %s" "נקודת אחיזה להחלקה. לחיצה ארוכה." "החלק לביטול נעילה." "נווט לדף הבית" @@ -1667,7 +1667,7 @@ "להשתמש בקיצור הדרך לתכונת הנגישות?" "כשקיצור הדרך מופעל, לחיצה על שני לחצני עוצמת הקול למשך שלוש שניות מפעילה את תכונת הנגישות." "להפעיל את תכונות הנגישות?" - "‏לחיצה ארוכה על שני לחצני עוצמת הקול למשך מספר שניות מפעילה את תכונות הנגישות. בעקבות זאת, ייתכן שאופן הפעולה של המכשיר ישתנה.\n\nהתכונות הנוכחיות:\n%1$s\nניתן לשנות תכונות נבחרות ב\'הגדרות\' > \'נגישות\'." + "לחיצה ארוכה על שני לחצני עוצמת הקול למשך מספר שניות מפעילה את תכונות הנגישות. בעקבות זאת, ייתכן שאופן הפעולה של המכשיר ישתנה.\n\nהתכונות הנוכחיות:\n%1$s\nניתן לשנות את התכונות שנבחרו ב\'הגדרות\' > \'נגישות\'." " • %1$s\n" "להפעיל את %1$s?" "לחיצה על שני מקשי עוצמת הקול למשך מספר שניות מפעילה את תכונת הנגישות %1$s. ייתכן שאופן הפעולה של המכשיר ישתנה בעקבות זאת.\n\nאפשר לשנות את מקשי הקיצור האלה לתכונה אחרת ב\'הגדרות\' > \'נגישות\'." @@ -1946,7 +1946,7 @@ "כל השפות" "כל האזורים" "חיפוש" - "האפליקציה אינה זמינה" + "האפליקציה לא זמינה" "האפליקציה %1$s לא זמינה כרגע. את הזמינות שלה אפשר לנהל באפליקציה %2$s." "מידע נוסף" "ביטול ההשהיה של האפליקציה" diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml index f225ca2ba2f15..18476482fa427 100644 --- a/core/res/res/values-kk/strings.xml +++ b/core/res/res/values-kk/strings.xml @@ -1793,7 +1793,7 @@ "Әкімші жойған" "Жарайды" "Батарея жұмысының ұзақтығын арттыру үшін Батареяны үнемдеу режимі:\n\n•қараңғы тақырыпты іске қосады;\n•фондық әрекеттерді, кейбір көрнекі әсерлерді және \"Ok Google\" сияқты басқа да функцияларды өшіреді не шектейді.\n\n""Толығырақ" - "Батарея ұзағырақ жұмыс істеуі үшін, Battery Saver:\n\n• қараңғы тақырыпты қосады;\n•фондық жұмысты, кейбір визуалды әсерлерді және \"Ok Google\" сияқты басқа функцияларды өшіреді не шектейді." + "Батарея ұзағырақ жұмыс істеуі үшін, Батареяны үнемдеу режимі:\n\n• қараңғы тақырыпты қосады;\n•фондық жұмысты, кейбір визуалды әсерлерді және \"Ok Google\" сияқты басқа функцияларды өшіреді не шектейді." "Дерек шығынын азайту үшін Трафикті үнемдеу функциясы кейбір қолданбаларға деректерді фондық режимде жіберуге және алуға жол бермейді. Ашық тұрған қолданба деректерді пайдаланады, бірақ шектеулі шамада (мысалы, кескіндер оларды түрткенге дейін көрсетілмейді)." "Трафикті үнемдеу функциясын қосу керек пе?" "Қосу" @@ -1999,9 +1999,9 @@ "экранда басқа қолданбалардың үстінен көрсету" "Режим туралы хабарландыру" "Батарея заряды азаюы мүмкін" - "Батарея ұзаққа жетуі үшін, Battery Saver іске қосылды" + "Батарея ұзаққа жетуі үшін, Батареяны үнемдеу режимі іске қосылды" "Батареяны үнемдеу режимі" - "Battery Saver өшірілді" + "Батареяны үнемдеу режимі өшірілді" "Телефонның заряды жеткілікті. Функцияларға енді шектеу қойылмайды." "Планшеттің заряды жеткілікті. Функцияларға енді шектеу қойылмайды." "Құрылғының заряды жеткілікті. Функцияларға енді шектеу қойылмайды." diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 6b365b96c2292..7dcbaa00c4764 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -1999,7 +1999,7 @@ "화면에서 다른 앱 위에 표시" "루틴 모드 정보 알림" "평소에 충전하는 시간 전에 배터리가 소진될 수 있습니다." - "배터리 수명을 연장하기 위해 배터리 세이버가 활성화되었습니다." + "배터리 수명을 연장하기 위해 절전 모드가 활성화되었습니다." "절전 모드" "절전 모드가 사용 중지되었습니다" "휴대전화의 배터리가 충분하므로 기능이 더 이상 제한되지 않습니다" diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml index 956c4b85aa116..92d8e36fbe6ba 100644 --- a/core/res/res/values-mk/strings.xml +++ b/core/res/res/values-mk/strings.xml @@ -1900,8 +1900,8 @@ "Допрете за да го отклучите" "Поврзан на %1$s" "Допрете за да ги погледнете датотеките" - "Прикачете" - "Прикачи %1$s" + "Закачи" + "Закачи %1$s" "Откачете" "Откачи %1$s" "Информации за апликација" diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 22ab468da7c48..1a8ce28e35614 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -35,8 +35,8 @@ "Verbindingsprobleem of ongeldige MMI-code." "Bewerking is beperkt tot vaste nummers." "Kan instellingen voor doorschakelen van gesprekken niet wijzigen vanaf je telefoon tijdens roaming." - "Service is ingeschakeld." - "Service is ingeschakeld voor:" + "Service staat aan." + "Service staat aan voor:" "Service is uitgeschakeld." "De registratie is voltooid." "Wissen uitgevoerd." @@ -203,16 +203,16 @@ "Schakel je werkprofiel in" "Je persoonlijke apps zijn geblokkeerd totdat je je werkprofiel inschakelt" "Apps die worden gebruikt voor persoonlijke doeleinden, worden geblokkeerd op %1$s om %2$s. Je IT-beheerder staat niet toe dat je werkprofiel langer dan %3$d dagen is uitgeschakeld." - "Inschakelen" + "Aanzetten" "Ik" "Tabletopties" "Opties voor Android TV" "Telefoonopties" "Stille modus" - "Draadloos inschakelen" - "Draadloos uitschakelen" + "Draadloos aanzetten" + "Draadloos uitzetten" "Schermvergrendeling" - "Uitschakelen" + "Uitzetten" "Belsoftware uit" "Belsoftware op trillen" "Belsoftware aan" @@ -222,7 +222,7 @@ "Opnieuw opstarten…" "Terugzetten op fabrieksinstellingen" "Opnieuw opstarten…" - "Uitschakelen..." + "Uitzetten…" "Je tablet wordt uitgeschakeld." "Je Android TV-apparaat wordt uitgeschakeld." "Je horloge wordt uitgeschakeld." @@ -236,7 +236,7 @@ "Opties voor Android TV" "Telefoonopties" "Schermvergrendeling" - "Uitschakelen" + "Uitzetten" "Aan/uit" "Opnieuw opstarten" "Noodgeval" @@ -317,7 +317,7 @@ "toegang krijgen tot sensorgegevens over je vitale functies" "Content van vensters ophalen" "De content inspecteren van een venster waarmee je interactie hebt." - "\'Verkennen via aanraking\' inschakelen" + "Verkennen via aanraking aanzetten" "Aangetikte items worden hardop benoemd en het scherm kan worden verkend via gebaren." "Tekst observeren die je typt" "Omvat persoonsgegevens zoals creditcardnummers en wachtwoorden." @@ -329,8 +329,8 @@ "Kan gebaren registreren die op de vingerafdruksensor van het apparaat worden getekend." "Screenshot maken" "Kan een screenshot van het scherm maken." - "statusbalk uitschakelen of wijzigen" - "Hiermee kan de app de statusbalk uitschakelen of systeempictogrammen toevoegen en verwijderen." + "statusbalk uitzetten of wijzigen" + "Hiermee kan de app de statusbalk uitzetten of systeemiconen toevoegen en verwijderen." "de statusbalk zijn" "Hiermee kan de app de statusbalk zijn." "statusbalk uitvouwen/samenvouwen" @@ -367,8 +367,8 @@ "Apps toestaan de profieleigenaren en apparaateigenaar in te stellen." "actieve apps opnieuw rangschikken" "Hiermee kan de app taken naar de voor- en achtergrond verplaatsen. De app kan dit doen zonder om je bevestiging te vragen." - "automodus inschakelen" - "Hiermee kan de app de automodus inschakelen." + "automodus aanzetten" + "Hiermee kan de app de automodus aanzetten." "andere apps sluiten" "Hiermee kan de app achtergrondprocessen van andere apps beëindigen. Hierdoor kunnen andere apps worden gestopt." "Deze app kan op de voorgrond vóór andere apps worden weergegeven" @@ -505,7 +505,7 @@ "Hiermee kan de app Bluetooth op je Android TV-apparaat isntellen en externe apparaten zoeken en koppelen." "Hiermee kan de app de lokale bluetooth-telefoon instellen en externe apparaten zoeken en koppelen." "WiMAX-verbinding maken en verbreken" - "Hiermee kan de app bepalen of WiMAX is ingeschakeld en informatie bekijken over alle WiMAX-netwerken waarmee verbinding is gemaakt." + "Hiermee kan de app bepalen of WiMAX aanstaat en informatie bekijken over alle WiMAX-netwerken waarmee verbinding is gemaakt." "WiMAX-status wijzigen" "Hiermee kan de app de tablet verbinden met WiMAX-netwerken en de verbinding daarmee verbreken." "Hiermee kan de app verbinding maken met je Android TV-apparaat en je Android TV-apparaat loskoppelen van WiMAX-netwerken." @@ -518,8 +518,8 @@ "Hiermee kun je zorgen dat de app informatie krijgt over de voorkeursservice voor NFC-betaling, zoals geregistreerde hulpmiddelen en routebestemmingen." "Near Field Communication regelen" "Hiermee kan de app communiceren met NFC-tags (Near Field Communication), kaarten en lezers." - "je schermvergrendeling uitschakelen" - "Hiermee kan de app de toetsenblokkering en bijbehorende wachtwoordbeveiliging uitschakelen. Zo kan de telefoon de toetsenblokkering uitschakelen wanneer je wordt gebeld en de toetsenblokkering weer inschakelen als het gesprek is beëindigd." + "je schermvergrendeling uitzetten" + "Hiermee kan de app de toetsenblokkering en bijbehorende wachtwoordbeveiliging uitzetten. Zo kan de telefoon de toetsenblokkering uitzetten als je wordt gebeld en de toetsenblokkering weer aanzetten als het gesprek is beëindigd." "complexiteit van schermvergrendeling opvragen" "Hiermee krijgt de app toestemming om het complexiteitsniveau van de schermvergrendeling te achterhalen (hoog, midden, laag of geen). Dat geeft een indicatie van het mogelijke lengtebereik en type van de schermvergrendeling. De app kan gebruikers ook voorstellen de schermvergrendeling naar een bepaald niveau te updaten, maar gebruikers kunnen dit altijd negeren en de app verlaten. De schermvergrendeling wordt niet opgeslagen als platte tekst, zodat de app het precieze wachtwoord niet weet." "biometrische hardware gebruiken" @@ -613,7 +613,7 @@ "Gezichtspictogram" "synchronisatie-instellingen lezen" "Hiermee kan de app de synchronisatie-instellingen voor een account lezen. Dit kan bijvoorbeeld bepalen of de app Personen wordt gesynchroniseerd met een account." - "synchronisatie in- en uitschakelen" + "synchronisatie aan- of uitzetten" "Hiermee kan een app de synchronisatie-instellingen aanpassen voor een account. Deze toestemming kan bijvoorbeeld worden gebruikt om synchronisatie van de app Personen in te schakelen voor een account." "synchronisatiestatistieken lezen" "Hiermee kan een app de synchronisatiestatistieken voor een account lezen, inclusief de geschiedenis van synchronisatie-activiteiten en hoeveel gegevens zijn gesynchroniseerd." @@ -696,9 +696,9 @@ "Wijzigen hoe vaak het wachtwoord, de pincode of het patroon voor schermvergrendeling moet worden gewijzigd." "Codering voor opslag instellen" "Vereisen dat opgeslagen appgegevens kunnen worden gecodeerd." - "Camera\'s uitschakelen" + "Camera\'s uitzetten" "Het gebruik van alle apparaatcamera\'s voorkomen." - "Bepaalde functies voor schermvergrendeling uitschakelen" + "Bepaalde functies voor schermvergrendeling uitzetten" "Gebruik van bepaalde functies voor schermvergrendeling voorkomen." "Thuis" @@ -988,8 +988,8 @@ "Zoekopdracht verzenden" "Gesproken zoekopdrachten" "\'Verkennen via aanraking\' aan?" - "%1$s wil \'Verkennen via aanraking\' inschakelen. Wanneer \'Verkennen via aanraking\' is ingeschakeld, kunt u beschrijvingen beluisteren of bekijken van wat er onder je vinger staat of aanraakbewerkingen uitvoeren op de tablet." - "%1$s wil \'Verkennen via aanraking\' inschakelen. Wanneer \'Verkennen via aanraking\' is ingeschakeld, kunt u beschrijvingen beluisteren of bekijken van wat er onder je vinger staat of aanraakbewerkingen uitvoeren op de telefoon." + "%1$s wil Verkennen via aanraking aanzetten. Als Verkennen via aanraking aanstaat, kun je beschrijvingen beluisteren of bekijken van wat er onder je vinger staat of aanraakbewerkingen uitvoeren op de tablet." + "%1$s wil Verkennen via aanraking aanzetten. Als Verkennen via aanraking aanstaat, kun je beschrijvingen beluisteren of bekijken van wat er onder je vinger staat of aanraakbewerkingen uitvoeren op de telefoon." "1 maand geleden" "Meer dan 1 maand geleden" @@ -1178,7 +1178,7 @@ "%1$s was het eerst gestart." "Schaal" "Altijd tonen" - "U kunt dit opnieuw inschakelen via Systeeminstellingen > Apps > Gedownload." + "Je kunt dit opnieuw aanzetten via Systeeminstellingen > Apps > Gedownload." "%1$s biedt geen ondersteuning voor de huidige instelling voor weergavegrootte en kan onverwacht gedrag vertonen." "Altijd tonen" "%1$s is gemaakt voor een niet-geschikte versie van het Android-besturingssysteem en kan onverwacht gedrag vertonen. Mogelijk is er een geüpdatete versie van de app beschikbaar." @@ -1297,10 +1297,10 @@ "OK" "Dit apparaat wordt opgeladen via USB" "Verbonden apparaat wordt opgeladen via USB" - "USB-bestandsoverdracht ingeschakeld" - "PTP via USB ingeschakeld" - "USB-tethering ingeschakeld" - "MIDI via USB ingeschakeld" + "USB-bestandsoverdracht staat aan" + "PTP via USB staat aan" + "USB-tethering staat aan" + "MIDI via USB staat aan" "USB-accessoire verbonden" "Tik voor meer opties." "Verbonden apparaat wordt opgeladen. Tik voor meer opties." @@ -1312,9 +1312,9 @@ "Draadloze foutopsporing verbonden" "Tik om draadloze foutopsporing uit te schakelen" "Selecteer deze optie om draadloze foutopsporing uit te schakelen." - "Test harness-modus is ingeschakeld" + "Test harness-modus staat aan" "Reset de fabrieksinstellingen om de test harness-modus uit te schakelen." - "Seriële console ingeschakeld" + "Seriële console staat aan" "Dit is van invloed op de prestaties. Controleer de bootloader om dit uit te schakelen." "Vloeistof of vuil in USB-poort" "USB-poort is automatisch uitgeschakeld. Tik voor meer informatie." @@ -1337,7 +1337,7 @@ "%s wordt weergegeven over andere apps" "%s wordt weergegeven vóór andere apps" "Als je niet wilt dat %s deze functie gebruikt, tik je om de instellingen te openen en schakel je de functie uit." - "Uitschakelen" + "Uitzetten" "%s controleren…" "Huidige content controleren" "Nieuwe %s" @@ -1621,14 +1621,14 @@ "Verwijderen" "Volume verhogen tot boven het aanbevolen niveau?\n\nAls je langere tijd op hoog volume naar muziek luistert, raakt je gehoor mogelijk beschadigd." "Snelkoppeling toegankelijkheid gebruiken?" - "Als de snelkoppeling is ingeschakeld, kun je drie seconden op beide volumeknoppen drukken om een toegankelijkheidsfunctie te starten." - "Toegankelijkheidsfuncties inschakelen?" + "Als de snelkoppeling aanstaat, houd je beide volumeknoppen 3 seconden ingedrukt om een toegankelijkheidsfunctie te starten." + "Toegankelijkheidsfuncties aanzetten?" "Als je beide volumetoetsen een paar seconden ingedrukt houdt, schakel je de toegankelijkheidsfuncties in. Hierdoor kan de manier veranderen waarop je apparaat werkt.\n\nHuidige functies:\n%1$s\nJe kunt de geselecteerde functies wijzigen via Instellingen > Toegankelijkheid." " • %1$s\n" - "%1$s inschakelen?" + "%1$s aanzetten?" "Als je beide volumetoetsen een paar seconden ingedrukt houdt, wordt de toegankelijkheidsfunctie %1$s ingeschakeld. Hierdoor kan de manier veranderen waarop je apparaat werkt.\n\nJe kunt deze sneltoets op een andere functie instellen via Instellingen > Toegankelijkheid." - "Inschakelen" - "Niet inschakelen" + "Aanzetten" + "Niet aanzetten" "AAN" "UIT" "Toestaan dat %1$s volledige controle over je apparaat heeft?" @@ -1646,11 +1646,11 @@ "%s is uitgeschakeld" "Snelkoppelingen bewerken" "Klaar" - "Sneltoets uitschakelen" + "Sneltoets uitzetten" "Sneltoets gebruiken" "Kleurinversie" "Kleurcorrectie" - "Volumetoetsen ingedrukt gehouden. %1$s is ingeschakeld." + "Volumetoetsen ingedrukt gehouden. %1$s staat aan." "Volumetoetsen ingedrukt gehouden. %1$s uitgeschakeld." "Houd beide volumetoetsen drie seconden ingedrukt om %1$s te gebruiken" "Kies een functie om te gebruiken als je op de knop Toegankelijkheid tikt:" @@ -1792,11 +1792,11 @@ "Geüpdatet door je beheerder" "Verwijderd door je beheerder" "OK" - "Batterijbesparing doet het volgende om de batterijduur te verlengen:\n\n• Het donkere thema inschakelen\n• Achtergrondactiviteit, bepaalde visuele effecten en andere functies (zoals \'Hey Google\') uitschakelen of beperken\n\n""Meer informatie" - "Batterijbesparing doet het volgende om de batterijduur te verlengen:\n\n• Het donkere thema inschakelen.\n• Achtergrondactiviteit, bepaalde visuele effecten en andere functies (zoals \'Hey Google\') uitschakelen of beperken." + "Batterijbesparing doet het volgende om de batterijduur te verlengen:\n\n• Donkere thema aanzetten\n• Achtergrondactiviteit, bepaalde visuele effecten en andere functies (zoals \'Hey Google\') uitzetten of beperken\n\n""Meer informatie" + "Batterijbesparing doet het volgende om de batterijduur te verlengen:\n\n• Donker thema aanzetten.\n• Achtergrondactiviteit, bepaalde visuele effecten en andere functies (zoals \'Hey Google\') uitzetten of beperken." "Databesparing beperkt het datagebruik door te voorkomen dat sommige apps gegevens sturen of ontvangen op de achtergrond. De apps die je open hebt, kunnen nog steeds data verbruiken, maar doen dit minder vaak. Afbeeldingen worden dan bijvoorbeeld niet weergegeven totdat je erop tikt." "Databesparing aanzetten?" - "Inschakelen" + "Aanzetten" %1$d minuten (tot %2$s) Eén minuut (tot %2$s) @@ -1856,7 +1856,7 @@ "Gemeld" "Uitvouwen" "Samenvouwen" - "uitvouwen in-/uitschakelen" + "uitvouwen aan- of uitzetten" "Poort voor Android-USB-randapparatuur" "Android" "Poort voor USB-randapparatuur" @@ -1886,9 +1886,9 @@ "%1$s is nu niet beschikbaar. Dit wordt beheerd door %2$s." "Meer info" "App niet meer onderbreken" - "Werkprofiel inschakelen?" + "Werkprofiel aanzetten?" "Je werk-apps, meldingen, gegevens en andere functies van je werkprofiel worden uitgeschakeld" - "Inschakelen" + "Aanzetten" "App is niet beschikbaar" "%1$s is momenteel niet beschikbaar." "Deze app is ontwikkeld voor een oudere versie van Android en werkt mogelijk niet op de juiste manier. Controleer op updates of neem contact op met de ontwikkelaar." @@ -2063,7 +2063,7 @@ "Kan deze content niet openen met persoonlijke apps" "Je IT-beheerder staat niet toe dat je deze content opent met apps in je persoonlijke profiel" "Werkprofiel is onderbroken" - "Inschakelen" + "Aanzetten" "Er zijn geen werk-apps die deze content kunnen ondersteunen" "Er zijn geen werk-apps die deze content kunnen openen" "Er zijn geen persoonlijke apps die deze content kunnen ondersteunen" diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index cef3f795007a3..20407b1319072 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -1168,10 +1168,10 @@ "Открыть с помощью приложения:" "Открыть с помощью приложения \"%1$s\"" "Открыть" - "Открывать ссылки вида %1$s с помощью:" + "Открывать ссылки %1$s с помощью:" "Открывать ссылки с помощью:" "Открывать ссылки в браузере %1$s" - "Открывать ссылки вида %1$s в браузере %2$s" + "Открывать ссылки %1$s в браузере %2$s" "Открыть доступ" "Редактировать с помощью приложения:" "Редактировать с помощью приложения \"%1$s\"" diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml index ccec19c5a8c09..2eb628c7afb04 100644 --- a/core/res/res/values-ta/strings.xml +++ b/core/res/res/values-ta/strings.xml @@ -2000,7 +2000,7 @@ "வழக்கமான பேட்டரி சேமிப்பானுக்கான விவர அறிவிப்பு" "வழக்கமாகச் சார்ஜ் செய்வதற்கு முன்பே பேட்டரி தீர்ந்துபோகக்கூடும்" "பேட்டரி நிலையை நீட்டிக்க பேட்டரி சேமிப்பான் இயக்கப்பட்டுள்ளது" - "பேட்டரி சேமிப்பான்" + "பேட்டரி சேமிப்பு" "பேட்டரி சேமிப்பான் ஆஃப் செய்யப்பட்டுள்ளது" "மொபைலில் போதுமான சார்ஜ் உள்ளது. அம்சங்கள் இனி தடையின்றி இயங்கும்." "டேப்லெட்டில் போதுமான சார்ஜ் உள்ளது. அம்சங்கள் இனி தடையின்றி இயங்கும்." diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 4d2d86ad9856f..c4f5dc8d36616 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -2000,7 +2000,7 @@ "日常安排模式資訊通知" "電池電力可能會在你平常的充電時間前耗盡" "已啟用省電模式以延長電池續航力" - "省電模式" + "節約耗電量" "省電模式已關閉" "手機電力充足,各項功能不再受到限制。" "平板電腦電力充足,各項功能不再受到限制。" From 640011569f3f96bd3ac18dda275e2e842f0e2510 Mon Sep 17 00:00:00 2001 From: Shuzhen Wang Date: Wed, 17 Mar 2021 16:46:33 -0700 Subject: [PATCH 268/288] Camera: Fix a removal-while-iterate bug The onStatusChangedLocked removes entries from the ArrayMap. Needs to iterate in the reverse order. Test: Vendor testing Bug: 182876702 Change-Id: I5891f24a25c83f096d23ca5675126889a7d2a61c --- core/java/android/hardware/camera2/CameraManager.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/java/android/hardware/camera2/CameraManager.java b/core/java/android/hardware/camera2/CameraManager.java index 7f834afd7b300..933dee3a64700 100644 --- a/core/java/android/hardware/camera2/CameraManager.java +++ b/core/java/android/hardware/camera2/CameraManager.java @@ -2024,7 +2024,9 @@ public final class CameraManager { // Tell listeners that the cameras and torch modes are unavailable and schedule a // reconnection to camera service. When camera service is reconnected, the camera // and torch statuses will be updated. - for (int i = 0; i < mDeviceStatus.size(); i++) { + // Iterate from the end to the beginning befcause onStatusChangedLocked removes + // entries from the ArrayMap. + for (int i = mDeviceStatus.size() - 1; i >= 0; i--) { String cameraId = mDeviceStatus.keyAt(i); onStatusChangedLocked(ICameraServiceListener.STATUS_NOT_PRESENT, cameraId); } From edddfb37ef05871f3d6411440f5140d23348db67 Mon Sep 17 00:00:00 2001 From: Mady Mellor Date: Mon, 29 Mar 2021 16:48:30 -0700 Subject: [PATCH 269/288] DO NOT MERGE Fix bubbles for workprofile - use getPackageManagerForUser when looking up app info - use the userId on the bubble, not the currentUserId from BubbleController when writing to XML as the currentUserId in BubbleController does not account for workprofile. Test: atest SystemUITests Test: atest BubbleControllerTest Test: - have a managed work profile - install the bubbles app *only* for the work profile - make some bubbles => Notice bubbles appear - dismiss all the bubbles - restart the device, add a bubble - open the bubble, navigate to the bubble overflow => notice the previously dismissed workprofile bubbles are in the overflow Bug: 184041127 Change-Id: Iefc4e4e80a569a4f3b4ac3b8a1268de1b475409b --- .../com/android/systemui/bubbles/Bubble.java | 4 +- .../systemui/bubbles/BubbleController.java | 6 +- .../systemui/bubbles/BubbleDataRepository.kt | 15 ++-- .../systemui/bubbles/BubbleViewInfoTask.java | 4 +- .../bubbles/BubbleControllerTest.java | 87 +++++++++++++++++++ 5 files changed, 103 insertions(+), 13 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/Bubble.java b/packages/SystemUI/src/com/android/systemui/bubbles/Bubble.java index b71e3adae8acf..ed9b904e5238d 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/Bubble.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/Bubble.java @@ -43,6 +43,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.InstanceId; import com.android.systemui.shared.system.SysUiStatsLog; import com.android.systemui.statusbar.notification.collection.NotificationEntry; +import com.android.systemui.statusbar.phone.StatusBar; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -623,7 +624,8 @@ class Bubble implements BubbleViewProvider { private int getUid(final Context context) { if (mAppUid != -1) return mAppUid; - final PackageManager pm = context.getPackageManager(); + final PackageManager pm = StatusBar.getPackageManagerForUser(context, + mUser.getIdentifier()); if (pm == null) return -1; try { final ApplicationInfo info = pm.getApplicationInfo(mShortcutInfo.getPackage(), 0); diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java index 5deae925ba30e..fb819f04e0e1f 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java @@ -1386,10 +1386,10 @@ public class BubbleController implements ConfigurationController.ConfigurationLi } } } - mDataRepository.removeBubbles(mCurrentUserId, bubblesToBeRemovedFromRepository); + mDataRepository.removeBubbles(bubblesToBeRemovedFromRepository); if (update.addedBubble != null && mStackView != null) { - mDataRepository.addBubble(mCurrentUserId, update.addedBubble); + mDataRepository.addBubble(update.addedBubble); mStackView.addBubble(update.addedBubble); } @@ -1400,7 +1400,7 @@ public class BubbleController implements ConfigurationController.ConfigurationLi // At this point, the correct bubbles are inflated in the stack. // Make sure the order in bubble data is reflected in bubble row. if (update.orderChanged && mStackView != null) { - mDataRepository.addBubbles(mCurrentUserId, update.bubbles); + mDataRepository.addBubbles(update.bubbles); mStackView.updateBubbleOrder(update.bubbles); } diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleDataRepository.kt b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleDataRepository.kt index db64a13f3df34..a363208e8f101 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleDataRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleDataRepository.kt @@ -16,7 +16,6 @@ package com.android.systemui.bubbles import android.annotation.SuppressLint -import android.annotation.UserIdInt import android.content.pm.LauncherApps import android.content.pm.LauncherApps.ShortcutQuery.FLAG_MATCH_DYNAMIC import android.content.pm.LauncherApps.ShortcutQuery.FLAG_MATCH_PINNED_BY_ANY_LAUNCHER @@ -51,31 +50,31 @@ internal class BubbleDataRepository @Inject constructor( * Adds the bubble in memory, then persists the snapshot after adding the bubble to disk * asynchronously. */ - fun addBubble(@UserIdInt userId: Int, bubble: Bubble) = addBubbles(userId, listOf(bubble)) + fun addBubble(bubble: Bubble) = addBubbles(listOf(bubble)) /** * Adds the bubble in memory, then persists the snapshot after adding the bubble to disk * asynchronously. */ - fun addBubbles(@UserIdInt userId: Int, bubbles: List) { + fun addBubbles(bubbles: List) { if (DEBUG) Log.d(TAG, "adding ${bubbles.size} bubbles") - val entities = transform(userId, bubbles).also(volatileRepository::addBubbles) + val entities = transform(bubbles).also(volatileRepository::addBubbles) if (entities.isNotEmpty()) persistToDisk() } /** * Removes the bubbles from memory, then persists the snapshot to disk asynchronously. */ - fun removeBubbles(@UserIdInt userId: Int, bubbles: List) { + fun removeBubbles(bubbles: List) { if (DEBUG) Log.d(TAG, "removing ${bubbles.size} bubbles") - val entities = transform(userId, bubbles).also(volatileRepository::removeBubbles) + val entities = transform(bubbles).also(volatileRepository::removeBubbles) if (entities.isNotEmpty()) persistToDisk() } - private fun transform(userId: Int, bubbles: List): List { + private fun transform(bubbles: List): List { return bubbles.mapNotNull { b -> BubbleEntity( - userId, + b.user.identifier, b.packageName, b.metadataShortcutId ?: return@mapNotNull null, b.key, diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleViewInfoTask.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleViewInfoTask.java index 1929fc4e9dbfe..a6cf69a0f0a9b 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleViewInfoTask.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleViewInfoTask.java @@ -48,6 +48,7 @@ import com.android.internal.graphics.ColorUtils; import com.android.launcher3.icons.BitmapInfo; import com.android.systemui.R; import com.android.systemui.statusbar.notification.collection.NotificationEntry; +import com.android.systemui.statusbar.phone.StatusBar; import java.lang.ref.WeakReference; import java.util.List; @@ -146,7 +147,8 @@ public class BubbleViewInfoTask extends AsyncTask Date: Tue, 30 Mar 2021 18:54:21 -0700 Subject: [PATCH 270/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: If4349f29193676374aeb5db8604d1487951e07d8 --- packages/PackageInstaller/res/values-iw/strings.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/PackageInstaller/res/values-iw/strings.xml b/packages/PackageInstaller/res/values-iw/strings.xml index 5b17d7411698a..e5e219559c62a 100644 --- a/packages/PackageInstaller/res/values-iw/strings.xml +++ b/packages/PackageInstaller/res/values-iw/strings.xml @@ -24,7 +24,7 @@ "מתבצעת התקנה של %1$s…" "האפליקציה הותקנה." "להתקין את האפליקציה הזו?" - "האם ברצונך להתקין עדכון עבור אפליקציה קיימת זו? הנתונים הקיימים שלך לא יאבדו." + "להתקין עדכון עבור האפליקציה הזו? הנתונים הקיימים שלך לא יאבדו." "האם ברצונך להתקין עדכון עבור אפליקציה מובנית זו? הנתונים הקיימים שלך לא יאבדו." "האפליקציה לא הותקנה." "החבילה נחסמה להתקנה." @@ -43,7 +43,7 @@ "אישור" "ניהול אפליקציות" "אין מספיק שטח" - "לא ניתן להתקין את %1$s. יש לפנות שטח ולנסות שוב." + "לא ניתן להתקין את %1$s. יש לפנות מקום אחסון ולנסות שוב." "האפליקציה לא נמצאה" "האפליקציה לא נמצאת ברשימת האפליקציות המותקנות." "לא מורשה" @@ -62,11 +62,11 @@ "התקנות בתהליכי הסרה" "הסרות התקנה שנכשלו" "בתהליך הסרת התקנה..." - "מסיר את ההתקנה של %1$s…" + "המערכת מסירה את ההתקנה של %1$s…" "הסרת ההתקנה הסתיימה." "ההתקנה של %1$s הוסרה" - "הסרת ההתקנה נכשלה." - "נכשלה הסרת ההתקנה של %1$s." + "לא ניתן היה להסיר את ההתקנה." + "לא ניתן היה להסיר את ההתקנה של %1$s." "לא ניתן להסיר את ההתקנה של אפליקציה פעילה של מנהל המכשיר" "לא ניתן להסיר את ההתקנה של אפליקציה פעילה של מנהל המכשיר של %1$s" "אפליקציה זו נדרשת לחלק מהמשתמשים או מהפרופילים והתקנתה הוסרה למשתמשים אחרים" @@ -83,7 +83,7 @@ "לצורכי אבטחה, הטאבלט שלך חסום להתקנת אפליקציות בלתי מוכרות המגיעות ממקור זה." "לצורכי אבטחה, מכשיר הטלוויזיה שלך חסום להתקנת אפליקציות בלתי מוכרות המגיעות ממקור זה." "לצורכי אבטחה, הטלפון שלך חסום להתקנת אפליקציות בלתי מוכרות המגיעות ממקור זה." - "נתוני הטלפון והנתונים האישיים שלך חשופים יותר בפני התקפות על ידי אפליקציות ממקורות לא ידועים. אם תתקין אפליקציה זו, אתה מסכים לכך שאתה האחראי הבלעדי במקרה של אובדן נתונים או אם ייגרם נזק לטלפון שלך בעקבות השימוש באפליקציה." + "נתוני הטלפון והנתונים האישיים שלך חשופים יותר בפני התקפות על ידי אפליקציות ממקורות לא ידועים. התקנת האפליקציה הזו מהווה את הסכמתך לכך שהאחריות הבלעדית היא שלך במקרה של אובדן נתונים או גרימת נזק לטלפון שלך בעקבות השימוש באפליקציה." "נתוני הטאבלט והנתונים האישיים שלך חשופים יותר בפני התקפות על ידי אפליקציות ממקורות לא ידועים. אם תתקין אפליקציה זו, אתה מסכים לכך שאתה האחראי הבלעדי במקרה של אובדן נתונים או אם ייגרם נזק לטאבלט שלך בעקבות השימוש באפליקציה." "נתוני הטלוויזיה והנתונים האישיים שלך חשופים יותר בפני התקפות על ידי אפליקציות ממקורות לא ידועים. אם תתקין אפליקציה זו, אתה מסכים לכך שאתה האחראי הבלעדי במקרה של אובדן נתונים או אם ייגרם נזק לטלוויזיה שלך בעקבות השימוש באפליקציה." "המשך" From f3fa78390ab441083797d504311b03f362fe1ddc Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 30 Mar 2021 19:27:46 -0700 Subject: [PATCH 271/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I42cf688e7cb8a76b1ef93a347c95c7bd12589bac --- packages/PrintSpooler/res/values-nl/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/PrintSpooler/res/values-nl/strings.xml b/packages/PrintSpooler/res/values-nl/strings.xml index 2cd8d9baacdaa..79cb1ae3d3ded 100644 --- a/packages/PrintSpooler/res/values-nl/strings.xml +++ b/packages/PrintSpooler/res/values-nl/strings.xml @@ -64,9 +64,9 @@ "Actieve afdruktaken" "Mislukte afdruktaken" "Kan bestand niet maken" - "Sommige afdrukservices zijn uitgeschakeld" + "Sommige afdrukservices zijn uitgezet" "Printers zoeken" - "Geen afdrukservices ingeschakeld" + "Geen afdrukservices aangezet" "Geen printers gevonden" "Kan geen printers toevoegen" "Selecteer om printer toe te voegen" From b2d67f863c947f318312aca065f41afb7b9c7710 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 30 Mar 2021 21:19:15 -0700 Subject: [PATCH 272/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I8719bdaeb02ea7be5a59e9e0878c87d1cbf91b49 --- packages/Shell/res/values-iw/strings.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/Shell/res/values-iw/strings.xml b/packages/Shell/res/values-iw/strings.xml index 76429d2972bbb..ade92dbdd545d 100644 --- a/packages/Shell/res/values-iw/strings.xml +++ b/packages/Shell/res/values-iw/strings.xml @@ -23,12 +23,12 @@ "בתהליך הוספת פרטים לדוח על הבאג" "המתן…" "הדוח על הבאג יופיע בטלפון בקרוב" - "הקש כדי לשתף את הדוח על הבאג" + "יש להקיש כדי לשתף את הדוח על הבאג" "הקש כדי לשתף את הדוח על הבאג" "החלק ימינה כדי לשתף את הדוח על הבאג ללא צילום מסך או המתן להשלמת צילום המסך" - "הקש כדי לשתף את הדוח על הבאג ללא צילום מסך, או המתן להשלמת צילום המסך" - "הקש כדי לשתף את הדוח על הבאג ללא צילום מסך, או המתן להשלמת צילום המסך" - "דוחות על באגים כוללים נתונים מקובצי היומן השונים במערכת, שעשויים לכלול נתונים הנחשבים רגישים (כגון שימוש באפליקציות ונתוני מיקום). שתף דוחות על באגים רק עם אפליקציות ואנשים שאתה סומך עליהם." + "יש להקיש כדי לשתף את הדוח על הבאג ללא צילום מסך, או להמתין להשלמת צילום המסך" + "יש להקיש כדי לשתף את הדוח על הבאג ללא צילום מסך, או להמתין להשלמת צילום המסך" + "דוחות על באגים כוללים נתונים מקובצי היומן השונים במערכת, שעשויים לכלול נתונים הנחשבים רגישים (כגון שימוש באפליקציות ונתוני מיקום). כדאי לשתף דוחות על באגים רק עם אפליקציות ואנשים מהימנים." "אל תציגו זאת שוב" "דוחות באגים" "לא ניתן היה לקרוא את קובץ הדוח על הבאג" @@ -38,7 +38,7 @@ "צילום מסך" "צילום המסך בוצע בהצלחה." "לא ניתן היה לצלם מסך." - "פרטי הדוח על הבאג #%d" + "פרטי הדוח על הבאג (#%d)" "שם קובץ" "כותרת הבאג" "סיכום הבאג" From 63bedd2542f662ee58c31dfffda45acf8a4b8797 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 30 Mar 2021 21:52:43 -0700 Subject: [PATCH 273/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I15017f0dbebf0572b34451a271993f5be7808172 --- packages/SystemUI/res/values-as/strings.xml | 2 +- packages/SystemUI/res/values-be/strings.xml | 6 +- packages/SystemUI/res/values-bs/strings.xml | 4 +- packages/SystemUI/res/values-da/strings.xml | 6 +- packages/SystemUI/res/values-gl/strings.xml | 2 +- packages/SystemUI/res/values-gu/strings.xml | 4 +- packages/SystemUI/res/values-hi/strings.xml | 4 +- packages/SystemUI/res/values-hu/strings.xml | 2 +- packages/SystemUI/res/values-hy/strings.xml | 4 +- packages/SystemUI/res/values-in/strings.xml | 20 +-- packages/SystemUI/res/values-iw/strings.xml | 76 +++++----- packages/SystemUI/res/values-kk/strings.xml | 8 +- packages/SystemUI/res/values-mn/strings.xml | 14 +- packages/SystemUI/res/values-nl/strings.xml | 132 +++++++++--------- packages/SystemUI/res/values-sl/strings.xml | 2 +- packages/SystemUI/res/values-ta/strings.xml | 6 +- .../SystemUI/res/values-zh-rTW/strings.xml | 4 +- 17 files changed, 148 insertions(+), 148 deletions(-) diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index 01879548ca855..c8e5e36754895 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -767,7 +767,7 @@ "বেটাৰিৰ ব্যৱহাৰ" "চ্চাৰ্জ কৰি থকাৰ সময়ত বেটাৰি সঞ্চয়কাৰী উপলব্ধ নহয়।" - "বেটাৰি সঞ্চয়কাৰী" + "বেটাৰী সঞ্চয়কাৰী" "কাৰ্যদক্ষতা আৰু নেপথ্য ডেটা হ্ৰাস কৰে" "%1$s বুটাম" "হ\'ম" diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index fde579b35977d..bcc534790ed48 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -28,7 +28,7 @@ "Засталося %s" "Засталося %1$s, у вас ёсць каля %2$s на аснове даных аб выкарыстанні вашай прылады" "Засталося %1$s, у вас ёсць каля %2$s" - "Засталося %s. Уключана эканомія зараду." + "Засталося %s. Уключаны рэжым эканоміі зараду." "Не ўдалося выканаць зарадку праз USB. Выкарыстоўвайце зараднае прыстасаванне з камплекта прылады." "Не ўдалося выканаць зарадку праз USB" "Выкарыстоўвайце зараднае прыстасаванне з камплекта прылады" @@ -776,7 +776,7 @@ %d хвіліны "Выкарыстанне зараду" - "Эканомія зараду акумулятара недаступная падчас зарадкі" + "Рэжым эканоміі зараду акумулятара недаступны падчас зарадкі" "Эканомія зараду" "Памяншае прадукцыйнасць і фонавую перадачу даных" "Кнопка %1$s" @@ -996,7 +996,7 @@ "Уключыце, калі зарад акумулятара заканчваецца" "Не, дзякуй" "Уключаны рэжым эканоміі зараду" - "Калі ўзровень зараду акумулятара знізіцца да %d%%, аўтаматычна ўключыцца рэжым эканоміі энергіі." + "Калі ўзровень зараду акумулятара знізіцца да %d%%, аўтаматычна ўключыцца рэжым эканоміі зараду." "Налады" "Зразумела" "Dump SysUI Heap" diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index e69d9c6c6e029..d3ef3ba9eff64 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -502,7 +502,7 @@ "Sve aplikacije i podaci ovog korisnika bit će izbrisani." "Ukloni" "Uključena je Ušteda baterije" - "Minimizira rad i prijenos podataka u pozadini" + "Smanjuje performanse i prijenos podataka u pozadini" "Isključi Uštedu baterije" "Aplikacija %s će imati pristup svim informacijama koje se prikazuju na ekranu ili koje se reproduciraju s vašeg uređaja za vrijeme snimanja ili emitiranja. To obuhvata informacije kao što su lozinke, detalji o plaćanju, fotografije, poruke i zvuk koji reproducirate." "Usluga koja pruža ovu funkciju će imati pristup svim informacijama koje se prikazuju na ekranu ili koje se reproduciraju s vašeg uređaja za vrijeme snimanja ili emitiranja. To obuhvata informacije kao što su lozinke, detalji o plaćanju, fotografije, poruke i zvuk koji reproducirate." @@ -773,7 +773,7 @@ "Potrošnja baterije" "Ušteda baterije je isključena prilikom punjenja" "Ušteda baterije" - "Ograničava rad i prijenos podataka u pozadini" + "Smanjuje performanse i prijenos podataka u pozadini" "Dugme %1$s" "Tipka za početak" "Nazad" diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index f72d9896b9a52..66885745b479d 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -1040,8 +1040,8 @@ "Hold afbryderknappen nede for at få adgang til dine betjeningselementer" "Vælg en app for at tilføje styring" - %s styringselement er tilføjet. - %s styringselementer er tilføjet. + %s styring er tilføjet. + %s styring er tilføjet. "Fjernet" "Angivet som favorit" @@ -1052,7 +1052,7 @@ "Flyt til position %d" "Betjeningselementer" "Vælg de indstillinger, der skal vises i menuen for afbryderknappen" - "Flyt rundt på styringselementer ved at holde dem nede og trække" + "Flyt et felt ved at holde det nede og trække" "Alle styringselementerne blev fjernet" "Ændringerne blev ikke gemt" "Se andre apps" diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index 56415b534ba3d..a210c33297d97 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -766,7 +766,7 @@ %d minuto "Uso de batería" - "A función de aforro da batería non está dispoñible durante a carga" + "A función de aforro de batería non está dispoñible durante a carga" "Aforro de batería" "Reduce o rendemento e os datos en segundo plano" "Botón %1$s" diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index 6cce91acfdd1f..db782167c7a4e 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -499,7 +499,7 @@ "આ વપરાશકર્તાની તમામ ઍપ્લિકેશનો અને ડેટા કાઢી નાખવામાં આવશે." "દૂર કરો" "બૅટરી સેવર ચાલુ છે" - "પ્રદર્શન અને બૅકગ્રાઉન્ડ ડેટા ઘટાડે છે" + "કાર્યપ્રદર્શન અને બૅકગ્રાઉન્ડ ડેટા ઘટાડે છે" "બૅટરી સેવર બંધ કરો" "રેકૉર્ડ અથવા કાસ્ટ કરતી વખતે, %sને તમારી સ્ક્રીન પર દેખાતી હોય અથવા તમારા ડિવાઇસ પર ચલાવવામાં આવતી હોય તેવી બધી માહિતીનો ઍક્સેસ હશે. આમાં પાસવર્ડ, ચુકવણીની વિગતો, ફોટા, સંદેશા અને તમે ચલાવો છો તે ઑડિયો જેવી માહિતીનો સમાવેશ થાય છે." "રેકૉર્ડ અથવા કાસ્ટ કરતી વખતે, આ સુવિધા આપતી સેવાને તમારી સ્ક્રીન પર દેખાતી હોય અથવા તમારા ડિવાઇસ પર ચલાવવામાં આવતી હોય તેવી બધી માહિતીનો ઍક્સેસ હશે. આમાં પાસવર્ડ, ચુકવણીની વિગતો, ફોટા, સંદેશા અને તમે ચલાવો છો તે ઑડિયો જેવી માહિતીનો સમાવેશ થાય છે." @@ -768,7 +768,7 @@ "બૅટરી વપરાશ" "ચાર્જિંગ દરમિયાન બૅટરી સેવર ઉપલબ્ધ નથી" "બૅટરી સેવર" - "પ્રદર્શન અને બૅકગ્રાઉન્ડ ડેટા ઘટાડે છે" + "કાર્યપ્રદર્શન અને બૅકગ્રાઉન્ડ ડેટા ઘટાડે છે" "બટન %1$s" "Home" "Back" diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index a0cb9b2a072b1..766a45cff5381 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -499,7 +499,7 @@ "इस उपयोगकर्ता के सभी ऐप और डेटा को हटा दिया जाएगा." "हटाएं" "बैटरी सेवर चालू है" - "निष्‍पादन और पृष्ठभूमि डेटा को कम करता है" + "परफ़ॉर्मेंस और बैकग्राउंड डेटा को कम करता है" "बैटरी सेवर बंद करें" "रिकॉर्ड या कास्ट करते समय, %s आपकी स्क्रीन पर दिख रही या आपके डिवाइस पर चलाई जा रही जानकारी ऐक्सेस कर सकता है. इसमें पासवर्ड, पैसे चुकाने का ब्यौरा, फ़ोटो, मैसेज, और चलाए गए ऑडियो जैसी जानकारी शामिल है." "रिकॉर्ड या कास्ट करते समय, वह सेवा जो यह फ़ंक्शन उपलब्ध कराती है, आपके डिवाइस पर चलाई जा रही या स्क्रीन पर दिख रही जानकारी को ऐक्सेस कर सकती है. इसमें पासवर्ड, पैसे चुकाने का ब्यौरा, फ़ोटो, मैसेज, और चलाए गए ऑडियो जैसी जानकारी शामिल है." @@ -768,7 +768,7 @@ "बैटरी उपयोग" "चार्ज किए जाने के दौरान बैटरी सेवर उपलब्ध नहीं है" "बैटरी सेवर" - "निष्‍पादन और पृष्ठभूमि डेटा को कम करता है" + "परफ़ॉर्मेंस और बैकग्राउंड डेटा को कम करता है" "बटन %1$s" "Home" "Back" diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index a6799008b669e..0a37bf8f75c53 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -420,7 +420,7 @@ "Bekapcsolás: %s" "Eddig: %s" "Sötét téma" - "Akkumulátorkímélő" + "Akkumulátorkímélő mód" "Be: napnyugta" "Napfelkeltéig" "Be: %s" diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index 2f2883e876343..cfd0c0bec4d18 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -758,11 +758,11 @@ "ՀԵՏԱՐԿԵԼ" "Հետաձգվել է %1$sով" - %d hours + %d ժամ %d ժամ - %d minutes + %d րոպե %d րոպե "Մարտկոցի օգտագործում" diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index 6c8633dae9429..85e58f387c7e6 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -591,20 +591,20 @@ "aktifkan" "nonaktifkan" "Ganti perangkat keluaran" - "Aplikasi dipasangi pin" - "Ini akan terus ditampilkan sampai Anda melepas pin. Sentuh lama tombol Kembali dan Ringkasan untuk melepas pin." - "Ini akan terus ditampilkan sampai Anda melepas pin. Sentuh lama tombol Kembali dan Beranda untuk melepas pin." - "Aplikasi akan terus ditampilkan sampai pin dilepas. Geser ke atas dan tahan untuk lepas pin." - "Ini akan terus ditampilkan sampai Anda melepas pin. Sentuh lama tombol Ringkasan untuk melepas pin." - "Ini akan terus ditampilkan sampai Anda melepas pin. Sentuh lama tombol Beranda untuk melepas pin." + "Aplikasi disematkan" + "Ini akan terus ditampilkan sampai Anda melepas sematan. Sentuh lama tombol Kembali dan Ringkasan untuk melepas sematan." + "Ini akan terus ditampilkan sampai Anda melepas sematan. Sentuh lama tombol Kembali dan Beranda untuk melepas sematan." + "Aplikasi akan terus ditampilkan sampai sematan dilepaskan. Geser ke atas dan tahan agar sematan lepas." + "Ini akan terus ditampilkan sampai Anda melepas sematan. Sentuh lama tombol Ringkasan untuk melepas sematan." + "Ini akan terus ditampilkan sampai Anda melepas sematan. Sentuh lama tombol Beranda untuk melepas sematan." "Data pribadi dapat diakses (seperti kontak dan konten email)." "Aplikasi yang disematkan dapat membuka aplikasi lain." - "Untuk melepas pin aplikasi ini, sentuh & lama tombol Kembali dan Ringkasan" - "Untuk melepas pin aplikasi ini, sentuh & lama tombol Kembali dan Layar utama" - "Untuk melepas pin aplikasi ini, geser ke atas & tahan" + "Untuk melepas sematan aplikasi ini, sentuh lama tombol Kembali dan Ringkasan" + "Untuk melepas sematan aplikasi ini, sentuh lama tombol Kembali dan Layar utama" + "Untuk melepas sematan aplikasi ini, geser ke atas & tahan" "Mengerti" "Lain kali" - "Aplikasi dipasangi pin" + "Aplikasi disematkan" "Aplikasi dilepas pinnya" "Sembunyikan %1$s?" "Ini akan muncul kembali saat Anda mengaktifkannya dalam setelan." diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index 73e6101684b6b..33a7621853db5 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -34,7 +34,7 @@ "שימוש במטען שסופק עם המכשיר" "הגדרות" "להפעיל את תכונת החיסכון בסוללה?" - "מידע על מצב החיסכון בסוללה" + "מידע על מצב \'חיסכון בסוללה\'" "הפעלה" "הפעלת תכונת החיסכון בסוללה" "הגדרות" @@ -43,20 +43,20 @@ "השתקה" "אוטומטי" "התראות" - "‏Bluetooth קשור" + "‏ה-Bluetooth שותף" "הגדר שיטות קלט" "מקלדת פיזית" "האם לתת לאפליקציה %1$s גישה אל %2$s?" "‏האם לאפשר לאפליקציה %1$s גישה אל %2$s?\nאפליקציה זו לא קיבלה הרשאה להקליט אך יכולה לתעד אודיו באמצעות מכשיר USB זה." "האם לתת לאפליקציה %1$s גישה אל %2$s?" "האם לפתוח את %1$s כדי לעבוד עם %2$s?" - "‏לפתוח את %1$s לטיפול במכשיר %2$s?\nאפליקציה זו לא קיבלה הרשאה להקליט אך יכולה לתעד אודיו באמצעות מכשיר USB זה." + "‏לפתוח את %1$s לטיפול בהתקן %2$s?\nהאפליקציה הזו לא קיבלה הרשאה להקליט אך היא יכולה לתעד אודיו באמצעות התקן ה-USB הזה." "האם לפתוח את %1$s כדי לעבוד עם %2$s?" "‏אין אפליקציות מותקנות הפועלות עם אביזר ה-USB. למידע נוסף על אביזר זה היכנס לכתובת %1$s" "‏אביזר USB" "הצג" "האפליקציה %1$s תמיד תיפתח כשהאביזר %2$s יחובר" - "האפליקציה %1$s תמיד תיפתח כשהאביזר %2$s יחובר" + "האפליקציה %1$s תמיד תיפתח כשההתקן %2$s יחובר" "‏האם לאפשר ניפוי באגים ב-USB?" "‏טביעת האצבע של מפתח ה-RSA של המחשב היא:\n%1$s" "אפשר תמיד ממחשב זה" @@ -75,7 +75,7 @@ "‏הפעלת USB" "מידע נוסף" "הגדל תצוגה כדי למלא את המסך" - "מתח כדי למלא את המסך" + "מתיחה למילוי של המסך" "צילום מסך" "נשלחה תמונה" "שומר צילום מסך..." @@ -114,7 +114,7 @@ "קבלת ההרשאות נכשלה" "שגיאה בהפעלה של הקלטת המסך" "‏אפשרויות העברת קבצים ב-USB" - "‏טען כנגן מדיה (MTP)" + "‏טעינה כנגן מדיה (MTP)" "‏טעינה כמצלמה (PTP)" "‏התקנת האפליקציה \'העברת קבצים ב-Android\' עבור Mac" "הקודם" @@ -126,7 +126,7 @@ "חיפוש" "מצלמה" "טלפון" - "מסייע קולי" + "האסיסטנט" "ביטול נעילה" "ממתין לטביעת אצבע" "בטל את הנעילה בלי להשתמש בטביעת האצבע" @@ -144,7 +144,7 @@ "המערכת מחפשת את הפנים שלך" "זיהוי הפנים בוצע" "מאושר" - "יש להקיש על \'אישור\' לסיום" + "יש להקיש על \'אישור\' לסיום התהליך" "מאומת" "שימוש בקוד אימות" "שימוש בקו ביטול נעילה" @@ -173,7 +173,7 @@ "מחפש אותך…" "סמל הפנים" "לחצן מרחק מתצוגה של תאימות." - "שנה מרחק מתצוגה של מסך קטן לגדול יותר." + "שינוי מרחק מתצוגה של מסך קטן לגדול יותר." "‏Bluetooth מחובר." "‏Bluetooth מנותק." "אין סוללה." @@ -192,7 +192,7 @@ "שני פסים של נתונים." "שלושה פסים של נתונים." "אות הנתונים מלא." - "מחובר אל %s." + "התבצע חיבור אל %s." "מחובר אל %s." "מחובר אל %s." "‏ללא WiMAX." @@ -334,7 +334,7 @@ "הגדרת התראות" "הגדרות %s" "המסך יסתובב באופן אוטומטי." - "המסך נעול כעת לרוחב." + "המסך נעול עכשיו לרוחב." "המסך נעול כעת לאורך." "המסך יסתובב עכשיו באופן אוטומטי." "המסך נעול כעת לרוחב." @@ -409,7 +409,7 @@ "התראות" "פנס" - "מצלמה בשימוש" + "המצלמה בשימוש" "חבילת גלישה" "שימוש בנתונים" "מכסת נתונים נותרת" @@ -421,7 +421,7 @@ "תאורת לילה" "התכונה מופעלת בשקיעה" "עד הזריחה" - "מופעל בשעה %s" + "תופעל בשעה %s" "עד %s" "עיצוב כהה" "חיסכון בסוללה" @@ -440,28 +440,28 @@ "יש לגרור ימינה כדי לעבור במהירות בין אפליקציות" "החלפת מצב של מסכים אחרונים" "טעון" - "טוען" + "בטעינה" "%s עד למילוי" "לא בטעינה" "ייתכן שהרשת\nמנוטרת" "חיפוש" - "הסט למעלה כדי להציג %s." - "הסט שמאלה כדי להציג %s." + "אפשר להסיט למעלה כדי לבצע %s." + "הסטה שמאלה כדי לבצע %s." "כדי לא להפריע לך, המכשיר לא ירטוט ולא ישמיע שום צליל, חוץ מהתראות, תזכורות, אירועים ושיחות ממתקשרים מסוימים לבחירתך. המצב הזה לא ישפיע על צלילים שהם חלק מתוכן שבחרת להפעיל, כמו מוזיקה, סרטונים ומשחקים." "כדי לא להפריע לך, המכשיר לא ירטוט ולא ישמיע שום צליל, חוץ מהתראות. המצב הזה לא ישפיע על צלילים שהם חלק מתוכן שבחרת להפעיל, כמו מוזיקה, סרטונים ומשחקים." "התאמה אישית" "פעולה זו מבטלת את כל הצלילים והרטט, כולל צלילים ורטט שמקורם בהתראות, מוזיקה, סרטונים ומשחקים. בכל מקרה, עדיין אפשר להתקשר." "הפעולה הזו מבטלת את כל הצלילים והרטט, כולל בהתראות, מוזיקה, סרטונים ומשחקים." "+%d" - "התראות בדחיפות נמוכה יותר בהמשך" + "התראות בדחיפות נמוכה יותר מופיעות בהמשך" "יש להקיש שוב כדי לפתוח את ההתראה" "צריך להחליק כדי לפתוח" "יש להחליק למעלה כדי לנסות שוב" "המכשיר הזה שייך לארגון שלך" "המכשיר הזה שייך לארגון %s" "החלק מהסמל כדי להפעיל את הטלפון" - "החלק מהסמל כדי להפעיל את המסייע הקולי" - "החלק מהסמל כדי להפעיל את המצלמה" + "יש להחליק מהסמל כדי להפעיל את האסיסטנט" + "צריך להחליק מהסמל כדי להפעיל את המצלמה" "שקט מוחלט. הגדרה זו תשתיק גם קוראי מסך." "שקט מוחלט" "עדיפות בלבד" @@ -547,9 +547,9 @@ "VPN" "רישום התנועה ברשת" "‏אישורי CA" - "‏השבת VPN" + "‏השבתת VPN" "‏ניתוק ה-VPN" - "הצג מדיניות" + "הצגת מדיניות" "‏המכשיר הזה שייך לארגון %1$s.\n\nמנהל ה-IT יכול לנטר ולנהל הגדרות, גישה ארגונית, אפליקציות, נתונים המשויכים למכשיר ומידע על מיקום המכשיר.\n\nלמידע נוסף, יש לפנות למנהל ה-IT." "‏המכשיר הזה שייך לארגון שלך.\n\nמנהל ה-IT יכול לנטר ולנהל הגדרות, גישה ארגונית, אפליקציות, נתונים המשויכים למכשיר ומידע על מיקום המכשיר.\n\nלמידע נוסף, יש לפנות למנהל ה-IT." "הארגון שלך התקין רשות אישורים במכשיר. ניתן לעקוב אחר התנועה ברשת המאובטחת או לשנות אותה." @@ -590,8 +590,8 @@ "כבה עכשיו" "הגדרות צליל" "הרחבה" - "כווץ" - "הוספת כתוביות אוטומטית למדיה" + "כיווץ" + "הוספת כתוביות באופן אוטומטי למדיה" "סגירת הטיפ לגבי כתוביות" "שכבת-על לכיתוב" "הפעלה" @@ -612,7 +612,7 @@ "לא, תודה" "האפליקציה הוצמדה" "הצמדת האפליקציה בוטלה" - "להסתיר%1$s?" + "להסתיר את %1$s?" "יופיע מחדש בפעם הבאה שהאפשרות הזו תופעל בהגדרות." "הסתר" "שיחה" @@ -678,9 +678,9 @@ "‏האם להסיר את System UI Tuner ולהפסיק להשתמש בכל התכונות שלו?" "האפליקציה אינה מותקנת במכשיר" "הצגת שניות בשעון" - "הצג שניות בשעון בשורת הסטטוס. פעולה זו עשויה להשפיע על אורך חיי הסוללה." + "הצגת שניות בשעון בשורת הסטטוס. פעולה זו עשויה להשפיע על זמן חיי הסוללה." "סידור מחדש של הגדרות מהירות" - "הצג בהירות בהגדרות מהירות" + "הצגת בהירות בהגדרות המהירות" "ניסיוניות" "‏האם להפעיל את ה-Bluetooth?" "‏כדי לחבר את המקלדת לטאבלט, תחילה עליך להפעיל את ה-Bluetooth." @@ -796,13 +796,13 @@ "הבא" "הקודם" "הרץ אחורה" - "הרץ קדימה" + "הרצה קדימה" "דפדוף למעלה" "דפדוף למטה" "מחיקה" "דף הבית" "סיום" - "הזן" + "הוספה" "‏מקש Num Lock" "מקלדת נומרית %1$s" "מערכת" @@ -813,7 +813,7 @@ "מקשי קיצור במקלדת" "החלפה של פריסת מקלדת" "אפליקציות" - "מסייע" + "אסיסטנט" "דפדפן" "אנשי קשר" "אימייל" @@ -823,8 +823,8 @@ "יומן" "הצג עם פקדי עוצמת הקול" "נא לא להפריע" - "מקש קיצור ללחצני עוצמת קול" - "יציאה מ\'נא לא להפריע\' בלחיצה על הלחצן להגברת עוצמת הקול" + "קיצור דרך ללחצני עוצמת קול" + "יציאה ממצב \'נא לא להפריע\' בלחיצה על הלחצן להגברת עוצמת הקול" "סוללה" "שעון" "אוזניות" @@ -871,13 +871,13 @@ "עריכה" "שעה" - "הצג שעות, דקות ושניות" + "הצגת שעות, דקות ושניות" "הצג שעות ודקות (ברירת מחדל)" "לא להציג את הסמל הזה" "הצג תמיד באחוזים" - "הצג באחוזים בזמן טעינה (ברירת מחדל)" + "הצגת אחוזים בזמן הטעינה (ברירת מחדל)" "אל תציג את הסמל הזה" "הצגת סמלי התראות בעדיפות נמוכה" @@ -922,7 +922,7 @@ "מזער" "סגירה" "הגדרות" - "גרור למטה כדי לסגור" + "יש לגרור למטה כדי לסגור" "תפריט" "%s במצב תמונה בתוך תמונה" "אם אינך רוצה שהתכונה הזו תשמש את %s, יש להקיש כדי לפתוח את ההגדרות ולהשבית את התכונה." @@ -989,7 +989,7 @@ "האם לאפשר ל-%1$s להציג חלקים מ-%2$s?" "- תהיה לה אפשרות לקרוא מידע מאפליקציית %1$s" "- תהיה לה יכולת לנקוט פעולה בתוך %1$s" - "יש לאשר ל-%1$s להראות חלקים מכל אפליציה שהיא" + "יש לאשר לאפליקציית %1$s להראות חלקים מכל אפליציה שהיא" "אני רוצה לאשר" "אני לא מרשה" "יש להקיש כדי לתזמן את מצב החיסכון בסוללה" @@ -1012,7 +1012,7 @@ "ללא שם" "צריך להקיש כדי להפעיל מחדש את האפליקציה הזו ולעבור למסך מלא." "הגדרות לבועות של %1$s" - "גלישה" + "אפשרויות נוספות" "הוספה בחזרה לערימה" "ניהול" "%1$s מהאפליקציה %2$s" @@ -1047,7 +1047,7 @@ "פקדי מכשירים" "יש להוסיף פקדים למכשירים המחוברים" "הגדרה של פקדי מכשירים" - "יש ללחוץ לחיצה ארוכה על לחצן ההפעלה כדי לגשת לבקרים" + "יש ללחוץ לחיצה ארוכה על לחצן ההפעלה כדי לגשת לפקדי המכשיר" "יש לבחור אפליקציה כדי להוסיף פקדים" נוספו %s פקדים. @@ -1077,7 +1077,7 @@ "הפקדים עודכנו" "קוד האימות מכיל אותיות או סמלים" "אימות %s" - "קוד גישה שגוי" + "קוד אימות שגוי" "בתהליך אימות…" "יש להזין קוד אימות" "יש לנסות קוד אימות אחר" diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index 685cbfcca91ae..331f25e1a616a 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -36,7 +36,7 @@ "Батареяны үнемдеу режимін қосу керек пе?" "Батареяны үнемдеу режимі туралы ақпарат" "Қосу" - "Battery saver функциясын қосу" + "Батареяны үнемдеу режимін қосу" "Параметрлер" "Wi-Fi" "Авто айналатын экран" @@ -500,7 +500,7 @@ "Жою" "Батареяны үнемдеу режимі қосулы" "Өнімділікті және фондық деректерді азайтады" - "Battery saver функциясын өшіру" + "Батареяны үнемдеу режимін өшіру" "%s жазу не трансляциялау кезінде экранда көрсетілетін немесе дыбысталатын барлық ақпаратты пайдалана алады. Бұған құпия сөздер, төлем туралы мәліметтер, суреттер, хабарлар және аудиоматериалдар кіреді." "Осы функцияны ұсынатын қызмет жазу не трансляциялау кезінде экранда көрсетілетін немесе құрылғыда дыбысталатын ақпаратты пайдалана алады. Бұған құпия сөздер, төлем туралы мәліметтер, суреттер, хабарлар және аудиоматериалдар кіреді." "Жазу немесе трансляциялау басталсын ба?" @@ -985,8 +985,8 @@ "Түймені түртіп, Батареяны үнемдеу режимін реттеңіз" "Батареяның заряды бітуге жақындағанда қосыңыз." "Жоқ, рақмет" - "Battery Saver кестесі қосылды" - "Батарея заряды %d%% деңгейінен төмендегенде, Battery Saver автоматты түрде қосылады." + "Батареяны үнемдеу кестесі қосылды" + "Батарея заряды %d%% деңгейінен төмендегенде, Батареяны үнемдеу режимі автоматты түрде қосылады." "Параметрлер" "Түсінікті" "Dump SysUI Heap" diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index 0ecfbf91614a2..4f85c057fd7b8 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -28,7 +28,7 @@ "%s үлдсэн" "%1$s үлдсэн байна. Таны хэрэглээнд тулгуурлан ойролцоогоор %2$s-н хугацаа үлдсэн" "%1$s үлдсэн байна. Ойролцоогоор %2$s-н хугацаа үлдсэн" - "%s үлдсэн. Тэжээл хэмнэгч асаалттай байна." + "%s үлдсэн. Батарей хэмнэгч асаалттай байна." "USB-р цэнэглэх боломжгүй байна. Төхөөрөмждөө дагалдаж ирсэн цэнэглэгчийг ашиглана уу." "USB-р цэнэглэх боломжгүй байна" "Төхөөрөмждөө дагалдаж ирсэн цэнэглэгчийг ашиглах" @@ -498,9 +498,9 @@ "Хэрэглэгчийг устгах уу?" "Энэ хэрэглэгчийн бүх апп болон мэдээлэл устах болно." "Арилгах" - "Тэжээл хэмнэгч асаалттай байна" + "Батарей хэмнэгч асаалттай байна" "Ажиллагаа болон далд датаг бууруулна" - "Тэжээл хэмнэгчийг унтраах" + "Батарей хэмнэгчийг унтраах" "%s нь бичлэг хийх эсвэл дамжуулах үед таны дэлгэц дээр харагдах эсвэл таны төхөөрөмжөөс тоглуулах бүх мэдээлэлд хандах боломжтой байна. Үүнд нууц үг, төлбөрийн дэлгэрэнгүй, зураг болон таны тоглуулдаг аудио зэрэг мэдээлэл багтана." "Энэ функцийг ажиллуулж байгаа үйлчилгээ нь бичлэг хийх эсвэл дамжуулах үед таны дэлгэц дээр харагдах эсвэл таны төхөөрөмжөөс тоглуулах бүх мэдээлэлд хандах боломжтой байна. Үүнд нууц үг, төлбөрийн дэлгэрэнгүй, зураг болон таны тоглуулдаг аудио зэрэг мэдээлэл багтана." "Бичлэг хийх эсвэл дамжуулахыг эхлүүлэх үү?" @@ -766,7 +766,7 @@ %d минут "Батарей ашиглалт" - "Цэнэглэх үед тэжээл хэмнэгч ажиллахгүй" + "Цэнэглэх үед батарей хэмнэгч ажиллахгүй" "Батарей хэмнэгч" "Гүйцэтгэл болон дэвсгэрийн датаг багасгадаг" "%1$s товчлуур" @@ -982,11 +982,11 @@ "%1$s-д дурын аппаас хэсэг харуулахыг зөвшөөрөх" "Зөвшөөрөх" "Татгалзах" - "Тэжээл хэмнэгч онцлогийг хуваарилахын тулд товших" + "Батарей хэмнэгч онцлогийг хуваарилахын тулд товших" "Батарей дуусах гэж байгаа үед асаана уу" "Үгүй, баярлалаа" - "Тэжээл хэмнэгч онцлогийн хуваарийг асаасан" - "Батарей %d%%-с бага болсон үед Тэжээл хэмнэгч автоматаар асна." + "Батарей хэмнэгч онцлогийн хуваарийг асаасан" + "Батарей %d%%-с бага болсон үед Батарей хэмнэгч автоматаар асна." "Тохиргоо" "Ойлголоо" "Dump SysUI Heap" diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index aa85421145288..bf2d757dd697a 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -28,15 +28,15 @@ "Nog %s" "Nog %1$s, dat is ongeveer %2$s op basis van je gebruik" "Nog %1$s, dat is ongeveer %2$s" - "Nog %s. Batterijbesparing is ingeschakeld." + "Nog %s. Batterijbesparing staat aan." "Kan niet opladen via USB. Gebruik de oplader die bij je apparaat is geleverd." "Kan niet opladen via USB" "Gebruik de oplader die bij je apparaat is geleverd" "Instellingen" "Batterijbesparing aanzetten?" "Over Batterijbesparing" - "Inschakelen" - "Batterijbesparing inschakelen" + "Aanzetten" + "Batterijbesparing aanzetten" "Instellingen" "Wifi" "Scherm automatisch draaien" @@ -62,17 +62,17 @@ "Altijd toestaan vanaf deze computer" "Toestaan" "USB-foutopsporing niet toegestaan" - "De gebruiker die momenteel is ingelogd op dit apparaat, kan USB-foutopsporing niet inschakelen. Als je deze functie wilt gebruiken, schakel je naar de primaire gebruiker." + "De gebruiker die momenteel is ingelogd op dit apparaat, kan USB-foutopsporing niet aanzetten. Als je deze functie wilt gebruiken, schakel je naar de primaire gebruiker." "Draadloze foutopsporing toestaan in dit netwerk?" "Netwerknaam (SSID)\n%1$s\n\nWifi-adres (BSSID)\n%2$s" "Altijd toestaan in dit netwerk" "Toestaan" "Draadloze foutopsporing niet toegestaan" - "De gebruiker die momenteel is ingelogd op dit apparaat, kan draadloze foutopsporing niet inschakelen. Als je deze functie wilt gebruiken, schakel je over naar de primaire gebruiker." - "USB-poort uitgeschakeld" - "De USB-poort is uitgeschakeld en detecteert geen accessoires, zodat je apparaat wordt beschermd tegen vloeistof en vuil.\n\nJe ontvangt een melding wanneer je de USB-poort weer kunt gebruiken." + "De gebruiker die momenteel is ingelogd op dit apparaat, kan draadloze foutopsporing niet aanzetten. Als je deze functie wilt gebruiken, schakel je over naar de primaire gebruiker." + "USB-poort staat uit" + "De USB-poort staat uit en detecteert geen accessoires, zodat je apparaat wordt beschermd tegen vloeistof en vuil.\n\nJe ontvangt een melding wanneer je de USB-poort weer kunt gebruiken." "USB-poort kan opladers en accessoires detecteren" - "USB inschakelen" + "USB aanzetten" "Meer informatie" "Zoom om scherm te vullen" "Rek uit v. schermvulling" @@ -209,8 +209,8 @@ "Twee streepjes." "Drie streepjes." "Signaal is op volledige sterkte." - "Ingeschakeld." - "Uitgeschakeld." + "Aan." + "Uit." "Verbonden." "Verbinden." "GPRS" @@ -234,7 +234,7 @@ "Uit" "Bluetooth-tethering." "Vliegtuigmodus." - "VPN ingeschakeld." + "VPN staat aan." "Geen simkaart." "Netwerk van provider wordt gewijzigd" "Accudetails openen" @@ -245,9 +245,9 @@ "Meldingen." "Alle meldingen bekijken" "Melding wissen" - "gps ingeschakeld." + "Gps staat aan." "Verbinding maken met gps." - "TeleTypewriter ingeschakeld." + "TeleTypewriter staat aan." "Belsoftware trilt." "Belsoftware stil." @@ -264,30 +264,30 @@ "Vergrendelscherm voor werk" "Sluiten" "%1$s." - "Wifi uitgeschakeld." - "Wifi ingeschakeld." + "Wifi staat uit." + "Wifi staat aan." "Mobiel %1$s. %2$s. %3$s." "Batterij: %s." "Vliegtuigmodus uit." "Vliegtuigmodus aan." - "Vliegtuigmodus uitgeschakeld." - "Vliegtuigmodus ingeschakeld." + "Vliegtuigmodus staat uit." + "Vliegtuigmodus staat aan." "totale stilte" "alleen wekkers" "Niet storen." - "\'Niet storen\' is uitgeschakeld." - "\'Niet storen\' is ingeschakeld." + "Niet storen staat uit." + "Niet storen staat aan." "Bluetooth." "Bluetooth uit." "Bluetooth aan." "Bluetooth-verbinding wordt gemaakt." "Bluetooth-verbinding gemaakt." - "Bluetooth uitgeschakeld." - "Bluetooth ingeschakeld." + "Bluetooth staat uit." + "Bluetooth staat aan." "Locatiemelding uit." "Locatiemelding aan." - "Locatiemelding uitgeschakeld." - "Locatiemelding ingeschakeld." + "Locatiemelding staat uit." + "Locatiemelding staat aan." "Wekker is ingesteld op %s." "Paneel sluiten." "Meer tijd." @@ -295,21 +295,21 @@ "Zaklamp uit." "Zaklamp niet beschikbaar." "Zaklamp aan." - "Zaklamp uitgeschakeld." - "Zaklamp ingeschakeld." - "Kleurinversie uitgeschakeld." - "Kleurinversie ingeschakeld." - "Mobiele hotspot uitgeschakeld." - "Mobiele hotspot ingeschakeld." + "Zaklamp staat uit." + "Zaklamp staat aan." + "Kleurinversie staat uit." + "Kleurinversie staat aan." + "Mobiele hotspot staat uit." + "Mobiele hotspot staat aan." "Casten van scherm gestopt." "Werkmodus uit." "Werkmodus aan." - "Werkmodus uitgeschakeld." - "Werkmodus ingeschakeld." - "Databesparing is uitgeschakeld." - "Databesparing is ingeschakeld." - "Sensorprivacy uitgeschakeld." - "Sensorprivacy ingeschakeld." + "Werkmodus staat uit." + "Werkmodus staat aan." + "Databesparing staat uit." + "Databesparing staat aan." + "Sensorprivacy staat uit." + "Sensorprivacy staat aan." "Helderheid van het scherm" "Opladen" "2G/3G-data zijn onderbroken" @@ -354,7 +354,7 @@ "Headset" "Invoer" "Hoortoestellen" - "Inschakelen..." + "Aanzetten…" "Helderheid" "Automatisch draaien" "Scherm automatisch draaien" @@ -379,7 +379,7 @@ "Wifi uit" "Wifi aan" "Geen wifi-netwerken beschikbaar" - "Inschakelen..." + "Aanzetten…" "Screencast" "Casten" "Naamloos apparaat" @@ -397,8 +397,8 @@ "Verbinding maken…" "Tethering" "Hotspot" - "Inschakelen..." - "Databesparing is ingeschakeld" + "Aanzetten…" + "Databesparing staat aan" %d apparaten %d apparaat @@ -426,15 +426,15 @@ "Aan om %s" "Tot %s" "NFC" - "NFC is uitgeschakeld" - "NFC is ingeschakeld" + "NFC staat uit" + "NFC staat aan" "Schermopname" "Starten" "Stoppen" "Apparaat" "Swipe omhoog om te schakelen tussen apps" "Sleep naar rechts om snel tussen apps te schakelen" - "Overzicht in-/uitschakelen" + "Overzicht aan- of uitzetten" "Opgeladen" "Opladen" "%s tot volledig opgeladen" @@ -500,7 +500,7 @@ "Verwijderen" "Batterijbesparing aan" "Vermindert de prestaties en achtergrondgegevens" - "Batterijbesparing uitschakelen" + "Batterijbesparing uitzetten" "%s krijgt toegang tot alle informatie die zichtbaar is op je scherm of die wordt afgespeeld vanaf je apparaat tijdens het opnemen of casten. Dit omvat informatie zoals wachtwoorden, betalingsgegevens, foto\'s, berichten en audio die je afspeelt." "De service die deze functie levert, krijgt toegang tot alle informatie die zichtbaar is op je scherm of die wordt afgespeeld vanaf je apparaat tijdens het opnemen of casten. Dit omvat informatie zoals wachtwoorden, betalingsgegevens, foto\'s, berichten en audio die je afspeelt." "Beginnen met opnemen of casten?" @@ -541,7 +541,7 @@ "VPN" "Netwerkregistratie" "CA-certificaten" - "VPN uitschakelen" + "VPN uitzetten" "Verbinding met VPN verbreken" "Beleid bekijken" "Dit apparaat is eigendom van %1$s.\n\nJe IT-beheerder kan instellingen, zakelijke toegang, apps, aan je apparaat gekoppelde gegevens en de locatiegegevens van je apparaat bekijken en beheren.\n\nNeem contact op met je IT-beheerder voor meer informatie." @@ -549,7 +549,7 @@ "Je organisatie heeft een certificeringsinstantie geïnstalleerd op dit apparaat. Je beveiligde netwerkverkeer kan worden bijgehouden of aangepast." "Je organisatie heeft een certificeringsinstantie geïnstalleerd in je werkprofiel. Je beveiligde netwerkverkeer kan worden bijgehouden of aangepast." "Er is een certificeringsinstantie geïnstalleerd op dit apparaat. Je beveiligde netwerkverkeer kan worden bijgehouden of aangepast." - "Je beheerder heeft netwerkregistratie ingeschakeld, waarmee het verkeer op je apparaat wordt bijgehouden." + "Je beheerder heeft de netwerkregistratie aangezet, waarmee het verkeer op je apparaat wordt gecontroleerd." "Je bent verbonden met %1$s, waarmee je netwerkactiviteit (waaronder e-mails, apps en websites) kan worden gecontroleerd." "Je bent verbonden met %1$s en %2$s, waarmee je netwerkactiviteit (waaronder e-mails, apps en websites) kan worden bijgehouden." "Je werkprofiel is verbonden met %1$s, waarmee je netwerkactiviteit (waaronder e-mails, apps en websites) kan worden bijgehouden." @@ -564,7 +564,7 @@ "VPN-instellingen openen" " " "Vertrouwde gegevens openen" - "Je beheerder heeft netwerkregistratie ingeschakeld, waarmee verkeer op je apparaat wordt bijgehouden.\n\nNeem contact op met je beheerder voor meer informatie." + "Je beheerder heeft de netwerkregistratie aangezet, waarmee verkeer op je apparaat wordt gecontroleerd.\n\nNeem contact op met je beheerder voor meer informatie." "Je hebt een app rechten gegeven voor het instellen van een VPN-verbinding.\n\nMet deze app kan je apparaat- en netwerkactiviteit worden gecontroleerd, inclusief e-mails, apps en websites." "Je werkprofiel wordt beheerd door %1$s.\n\nJe beheerder kan je netwerkactiviteit controleren, inclusief e-mails, apps en websites.\n\nNeem contact op met je beheerder voor meer informatie.\n\nJe bent ook verbonden met een VPN, waarmee je netwerkactiviteit kan worden gecontroleerd." "VPN" @@ -581,15 +581,15 @@ "Nee, bedankt" "Instellen" "%1$s. %2$s" - "Nu uitschakelen" + "Nu uitzetten" "Geluidsinstellingen" "Uitvouwen" "Samenvouwen" "Automatisch ondertitelen" "Ondertitelingstip sluiten" "Ondertitelingsoverlay" - "inschakelen" - "uitschakelen" + "aanzetten" + "uitzetten" "Naar een ander uitvoerapparaat schakelen" "App is vastgezet" "Het scherm blijft zichtbaar totdat je het losmaakt. Tik op Terug en Overzicht en houd deze vast om het scherm los te maken." @@ -648,7 +648,7 @@ "Statusbalk" "Overzicht" "Demomodus voor systeemgebruikersinterface" - "Demomodus inschakelen" + "Demomodus aanzetten" "Demomodus tonen" "Ethernet" "Wekker" @@ -676,9 +676,9 @@ "Snelle instellingen opnieuw indelen" "Helderheid tonen in Snelle instellingen" "Experimenteel" - "Bluetooth inschakelen?" - "Als je je toetsenbord wilt verbinden met je tablet, moet je eerst Bluetooth inschakelen." - "Inschakelen" + "Bluetooth aanzetten?" + "Als je je toetsenbord wilt verbinden met je tablet, moet je eerst Bluetooth aanzetten." + "Aanzetten" "Meldingen zonder geluid tonen" "Alle meldingen blokkeren" "Niet zonder geluid weergeven" @@ -705,7 +705,7 @@ "Stil blijven" "Waarschuwen" "Blijven waarschuwen" - "Meldingen uitschakelen" + "Meldingen uitzetten" "Meldingen van deze app blijven tonen?" "Stil" "Standaard" @@ -822,8 +822,8 @@ "Hoofdtelefoon aangesloten" "Headset aangesloten" "Databesparing" - "Databesparing is ingeschakeld" - "Databesparing is uitgeschakeld" + "Databesparing staat aan" + "Databesparing staat uit" "Aan" "Uit" "Niet beschikbaar" @@ -923,7 +923,7 @@ "Formaat aanpassen" "Telefoon uitgezet wegens hitte" "Je telefoon functioneert nu weer zoals gebruikelijk.\nTik voor meer informatie" - "Je telefoon was te warm en is uitgeschakeld om af te koelen. Je telefoon presteert nu weer zoals gebruikelijk.\n\nJe telefoon kan warm worden als je:\n • bronintensieve apps gebruikt (zoals game-, video-, of navigatie-apps),\n • grote bestanden up- of downloadt,\n • je telefoon gebruikt bij hoge temperaturen." + "Je telefoon was te warm en is uitgezet om af te koelen. Je telefoon presteert nu weer zoals gebruikelijk.\n\nJe telefoon kan warm worden als je:\n • bronintensieve apps gebruikt (zoals game-, video-, of navigatie-apps),\n • grote bestanden up- of downloadt,\n • je telefoon gebruikt bij hoge temperaturen." "Onderhoudsstappen bekijken" "De telefoon wordt warm" "Bepaalde functies zijn beperkt terwijl de telefoon afkoelt.\nTik voor meer informatie" @@ -961,12 +961,12 @@ "Mobiele data" "%1$s — %2$s" "%1$s, %2$s" - "Wifi is uitgeschakeld" - "Bluetooth is uitgeschakeld" - "\'Niet storen\' is uitgeschakeld" - "\'Niet storen\' is ingeschakeld door een automatische regel (%s)." - "\'Niet storen\' is ingeschakeld door een app (%s)." - "\'Niet storen\' is ingeschakeld door een automatische regel of app." + "Wifi staat uit" + "Bluetooth staat uit" + "Niet storen staat uit" + "Niet storen is aangezet door een automatische regel (%s)." + "Niet storen is aangezet door een app (%s)." + "Niet storen is aangezet door een automatische regel of app." "Tot %s" "Behouden" "Vervangen" @@ -983,10 +983,10 @@ "Toestaan" "Weigeren" "Tikken om Batterijbesparing in te schakelen" - "Inschakelen wanneer de batterij waarschijnlijk leeg raakt" + "Aanzetten als de batterij waarschijnlijk leeg raakt" "Nee" - "Batterijbesparing is ingeschakeld" - "Batterijbesparing wordt automatisch ingeschakeld wanneer de batterijstatus lager is dan %d%%." + "Batterijbesparing staat aan" + "Batterijbesparing wordt automatisch aangezet wanneer de batterijstatus lager is dan %d%%." "Instellingen" "OK" "Dump SysUI Heap" diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index 5c0318768f5cb..d5de4d3f0d307 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -424,7 +424,7 @@ "Vklop ob %s" "Do %s" "Temna tema" - "Varčevanje z baterijo" + "Varčevanje z energijo baterije" "Ob sončnem zahodu" "Do sončnega vzhoda" "Vklop ob %s" diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index 5075d8cd4e52c..e085e63d781fb 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -420,7 +420,7 @@ "%sக்கு ஆன் செய்" "%s வரை" "டார்க் தீம்" - "பேட்டரி சேமிப்பான்" + "பேட்டரி சேமிப்பு" "மாலையில் ஆன் செய்" "காலை வரை" "%sக்கு ஆன் செய்" @@ -749,7 +749,7 @@ "விழிப்பூட்டுகிறது" "குமிழைக் காட்டு" "குமிழ்களை அகற்று" - "முகப்புத் திரையில் சேர்" + "முகப்புத் திரையில் சேருங்கள்" "%1$s %2$s" "அறிவிப்புக் கட்டுப்பாடுகள்" "அறிவிப்பை உறக்கநிலையாக்கும் விருப்பங்கள்" @@ -767,7 +767,7 @@ "பேட்டரி பயன்பாடு" "சார்ஜ் செய்யும் போது பேட்டரி சேமிப்பானைப் பயன்படுத்த முடியாது" - "பேட்டரி சேமிப்பான்" + "பேட்டரி சேமிப்பு" "செயல்திறனையும் பின்புலத்தில் தரவு செயலாக்கப்படுவதையும் குறைக்கும்" "%1$s பட்டன்" "ஹோம்" diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index d54b0ae92a1cd..ed114c488fff2 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -420,7 +420,7 @@ "%s 開啟" "%s 關閉" "深色主題" - "省電模式" + "節約耗電量" "於日落時開啟" "於日出時關閉" "開啟時間:%s" @@ -767,7 +767,7 @@ "電池用量" "充電時無法使用省電模式" - "省電模式" + "節約耗電量" "降低效能並限制背景資料傳輸" "%1$s 按鈕" "Home 鍵" From 9d1b0a1932bc7903603f2f935d7e89d81b1eb55f Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 30 Mar 2021 23:31:42 -0700 Subject: [PATCH 274/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I0765f2b7325766625a8d07dfc3e092530f961273 --- packages/SystemUI/res/values-iw/strings_tv.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/SystemUI/res/values-iw/strings_tv.xml b/packages/SystemUI/res/values-iw/strings_tv.xml index f4694eac89725..67a78378b5f59 100644 --- a/packages/SystemUI/res/values-iw/strings_tv.xml +++ b/packages/SystemUI/res/values-iw/strings_tv.xml @@ -24,5 +24,5 @@ "‏סגירת PIP" "מסך מלא" "המיקרופון פעיל" - "‏%1$s קיבלה גישה למיקרופון שלך" + "‏לאפליקציה %1$s יש גישה למיקרופון שלך" From 0caa9c20c794bec1fda5f143e75dc38ecc96fcf6 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 31 Mar 2021 00:04:33 -0700 Subject: [PATCH 275/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I43fe7082262fef413adb30b3f558d880b4e9bd92 --- .../SystemUI/res-keyguard/values-hy/strings.xml | 10 +++++----- .../SystemUI/res-keyguard/values-iw/strings.xml | 16 ++++++++-------- .../SystemUI/res-keyguard/values-nl/strings.xml | 8 ++++---- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/packages/SystemUI/res-keyguard/values-hy/strings.xml b/packages/SystemUI/res-keyguard/values-hy/strings.xml index ab07ba46c14dd..43c6f2e88d0e7 100644 --- a/packages/SystemUI/res-keyguard/values-hy/strings.xml +++ b/packages/SystemUI/res-keyguard/values-hy/strings.xml @@ -88,12 +88,12 @@ "Դուք սխալ եք մուտքագրել ձեր ապակողպման նախշը %1$d անգամ: \n\nՓորձեք կրկին %2$d վայրկյանից։" "SIM PIN կոդը սխալ է։ Այժմ պետք է դիմեք ձեր օպերատորին՝ սարքն արգելահանելու համար:" - Incorrect SIM PIN code, you have %d remaining attempts. + SIM PIN կոդը սխալ է: Մնաց %d փորձ, որից հետո պետք է դիմեք ձեր օպերատորին՝ սարքն արգելահանելու համար: SIM PIN կոդը սխալ է: Մնաց %d փորձ: "SIM-ը հնարավոր չէ օգտագործել: Դիմեք ձեր օպերատորին:" - Incorrect SIM PUK code, you have %d remaining attempts before SIM becomes permanently unusable. + SIM PUK կոդը սխալ է: Մնաց %d փորձ, որից հետո SIM քարտն այլևս հնարավոր չի լինի օգտագործել: SIM PUK կոդը սխալ է: Մնաց %d փորձ, որից հետո SIM քարտն այլևս հնարավոր չի լինի օգտագործել: "SIM PIN կոդի գործողությունը ձախողվեց:" @@ -114,15 +114,15 @@ "Սարքը կողպված է ադմինիստրատորի կողմից" "Սարքը կողպվել է ձեռքով" - Device hasn\'t been unlocked for %d hours. Confirm pattern. + Սարքը չի ապակողպվել %d ժամվա ընթացքում: Հաստատեք նախշը: Սարքը չի ապակողպվել %d ժամվա ընթացքում: Հաստատեք նախշը: - Device hasn\'t been unlocked for %d hours. Confirm PIN. + Սարքը չի ապակողպվել %d ժամվա ընթացքում: Հաստատեք PIN կոդը: Սարքը չի ապակողպվել %d ժամվա ընթացքում: Հաստատեք PIN կոդը: - Device hasn\'t been unlocked for %d hours. Confirm password. + Սարքը չի ապակողպվել %d ժամվա ընթացքում: Հաստատեք գաղտնաբառը: Սարքը չի ապակողպվել %d ժամվա ընթացքում: Հաստատեք գաղտնաբառը: "Չհաջողվեց ճանաչել" diff --git a/packages/SystemUI/res-keyguard/values-iw/strings.xml b/packages/SystemUI/res-keyguard/values-iw/strings.xml index 56a71d4f543cc..773e4efae2e4d 100644 --- a/packages/SystemUI/res-keyguard/values-iw/strings.xml +++ b/packages/SystemUI/res-keyguard/values-iw/strings.xml @@ -24,7 +24,7 @@ "יש להזין את קוד האימות" "‏הזן את קוד ה-PUK של כרטיס ה-SIM ולאחר מכן הזן קוד גישה חדש" "‏קוד PUK של כרטיס SIM" - "‏קוד גישה חדש לכרטיס ה-SIM" + "‏קוד אימות חדש לכרטיס ה-SIM" "גע כדי להזין את הסיסמה" "הזן סיסמה לביטול הנעילה" "הזן את קוד הגישה לביטול הנעילה" @@ -76,7 +76,7 @@ "‏%1$s יש להשבית את כרטיס ה-eSIM כדי להשתמש במכשיר ללא שירות סלולרי." "יש להזין קוד אימות" "צריך להזין את הסיסמה" - "‏כרטיס ה-SIM מושבת כעת. הזן קוד PUK כדי להמשיך. פנה אל הספק לפרטים." + "‏כרטיס ה-SIM מושבת עכשיו. צריך להזין קוד PUK כדי להמשיך. יש לפנות אל הספק לקבלת פרטים." "‏ה-SIM של \"%1$s\" מושבת עכשיו. צריך להזין קוד PUK כדי להמשיך. לפרטים, יש לפנות אל הספק." "הזן את קוד הגישה הרצוי" "צריך לאשר את קוד האימות הרצוי" @@ -95,7 +95,7 @@ ‏קוד האימות של כרטיס ה-SIM שגוי. נותרו לך עוד %d ניסיונות. ‏קוד האימות של כרטיס ה-SIM שגוי. נותר לך עוד ניסיון %d לפני שיהיה עליך ליצור קשר עם הספק כדי לבטל את נעילת המכשיר. - "‏לא ניתן להשתמש בכרטיס ה-SIM. צור קשר עם הספק." + "‏לא ניתן להשתמש בכרטיס ה-SIM. יש ליצור קשר עם הספק." ‏קוד ה-PUK של כרטיס ה-SIM שגוי. נותרו לך עוד %d ניסיונות לפני שכרטיס ה-SIM יינעל לצמיתות. ‏קוד ה-PUK של כרטיס ה-SIM שגוי. נותרו לך עוד %d ניסיונות לפני שכרטיס ה-SIM יינעל לצמיתות. @@ -114,7 +114,7 @@ "יש להזין את קו ביטול הנעילה כדי להגביר את רמת האבטחה" "יש להזין קוד גישה כדי להגביר את רמת האבטחה" "יש להזין סיסמה כדי להגביר את רמת האבטחה" - "יש להזין את קו ביטול הנעילה בזמן מעבר בין פרופילים" + "יש להזין את קו ביטול הנעילה כשמחליפים בין פרופילים" "צריך להזין את קוד האימות כשמחליפים פרופיל" "יש להזין את הסיסמה בזמן מעבר בין פרופילים" "מנהל המכשיר נעל את המכשיר" @@ -146,10 +146,10 @@ ‏יש להזין קוד אימות של כרטיס SIM. נותר לך ניסיון נוסף (%d) לפני שיהיה צורך ליצור קשר עם הספק כדי לבטל את נעילת המכשיר. - ‏כרטיס ה-SIM מושבת כעת. יש להזין קוד PUK כדי להמשיך. נותרו לך %d ניסיונות נוספים לפני שכרטיס ה-SIM ינעל לצמיתות. למידע נוסף, ניתן לפנות לספק שלך. - ‏כרטיס ה-SIM מושבת כעת. יש להזין קוד PUK כדי להמשיך. נותרו לך %d ניסיונות נוספים לפני שכרטיס ה-SIM ינעל לצמיתות. למידע נוסף, ניתן לפנות לספק שלך. - ‏כרטיס ה-SIM מושבת כעת. יש להזין קוד PUK כדי להמשיך. נותרו לך %d ניסיונות נוספים לפני שכרטיס ה-SIM ינעל לצמיתות. למידע נוסף, ניתן לפנות לספק שלך. - ‏כרטיס ה-SIM מושבת כעת. יש להזין קוד PUK כדי להמשיך. נותר לך %d ניסיון נוסף לפני שכרטיס ה-SIM ינעל לצמיתות. למידע נוסף, ניתן לפנות לספק שלך. + ‏כרטיס ה-SIM מושבת כעת. יש להזין קוד PUK כדי להמשיך. נותרו לך %d ניסיונות נוספים לפני שכרטיס ה-SIM יינעל באופן סופי. למידע נוסף, ניתן לפנות לספק שלך. + ‏כרטיס ה-SIM מושבת כעת. יש להזין קוד PUK כדי להמשיך. נותרו לך %d ניסיונות נוספים לפני שכרטיס ה-SIM יינעל באופן סופי. למידע נוסף, ניתן לפנות לספק שלך. + ‏כרטיס ה-SIM מושבת כעת. יש להזין קוד PUK כדי להמשיך. נותרו לך %d ניסיונות נוספים לפני שכרטיס ה-SIM יינעל באופן סופי. למידע נוסף, ניתן לפנות לספק שלך. + ‏כרטיס ה-SIM מושבת כעת. יש להזין קוד PUK כדי להמשיך. נותר לך ניסיון אחד (%d) נוסף לפני שכרטיס ה-SIM יינעל באופן סופי. למידע נוסף, ניתן לפנות לספק שלך. "ברירת מחדל" "בועה" diff --git a/packages/SystemUI/res-keyguard/values-nl/strings.xml b/packages/SystemUI/res-keyguard/values-nl/strings.xml index a9fd827442e6b..32759215483a1 100644 --- a/packages/SystemUI/res-keyguard/values-nl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-nl/strings.xml @@ -56,9 +56,9 @@ "Gebied voor pukcode van simkaart" "Volgende wekker ingesteld voor %1$s" "Delete" - "Simkaart uitschakelen" - "E-simkaart kan niet worden uitgeschakeld" - "De e-simkaart kan niet worden uitgeschakeld vanwege een fout." + "E-simkaart uitzetten" + "E-simkaart kan niet worden uitgezet" + "De e-simkaart kan niet worden uitgezet vanwege een fout." "Enter" "Patroon vergeten" "Onjuist patroon" @@ -81,7 +81,7 @@ "Simkaart ontgrendelen…" "Geef een pincode van vier tot acht cijfers op." "De pukcode is minimaal acht cijfers lang." - "Geef de juiste pukcode opnieuw op. Bij herhaalde pogingen wordt de simkaart definitief uitgeschakeld." + "Geef de juiste pukcode opnieuw op. Bij herhaalde pogingen wordt de simkaart definitief uitgezet." "Te veel patroonpogingen" "Je hebt je pincode %1$d keer onjuist getypt. \n\nProbeer het over %2$d seconden opnieuw." "Je hebt je wachtwoord %1$d keer onjuist getypt. \n\nProbeer het over %2$d seconden opnieuw." From 1a180aec01eef00f1b0768bee0f35baddcab8bb9 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 31 Mar 2021 00:37:53 -0700 Subject: [PATCH 276/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I2d2fe622835a65c9adaa4ca49161fe6234e0f110 --- packages/SystemUI/res-product/values-iw/strings.xml | 2 +- packages/SystemUI/res-product/values-nl/strings.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/SystemUI/res-product/values-iw/strings.xml b/packages/SystemUI/res-product/values-iw/strings.xml index 581754b844c25..4026dac78d2d3 100644 --- a/packages/SystemUI/res-product/values-iw/strings.xml +++ b/packages/SystemUI/res-product/values-iw/strings.xml @@ -30,7 +30,7 @@ "ניסית לבטל את נעילת הטלפון %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, טלפון זה יאופס וכל הנתונים שבו יימחקו." "ניסית לבטל את נעילת הטאבלט %d פעמים. הטאבלט יאופס וכל הנתונים שלו יימחקו." "ניסית לבטל את נעילת הטלפון %d פעמים. הטלפון יאופס וכל הנתונים שבו יימחקו." - "ניסית לבטל את נעילת הטאבלט %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, משתמש זה יוסר וכל נתוני המשתמש יימחקו." + "ניסית לבטל את נעילת הטאבלט %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, המשתמש הזה יוסר וכל נתוני המשתמש יימחקו." "ניסית לבטל את נעילת הטלפון %1$d פעמים. לאחר %2$d ניסיונות כושלים נוספים, המשתמש הזה יוסר וכל נתוני המשתמש יימחקו." "ניסית לבטל את נעילת הטאבלט %d פעמים באופן שגוי. משתמש זה יוסר וכל נתוני המשתמש יימחקו." "ניסית לבטל את נעילת הטלפון %d פעמים. המשתמש הזה יוסר וכל נתוני המשתמש יימחקו." diff --git a/packages/SystemUI/res-product/values-nl/strings.xml b/packages/SystemUI/res-product/values-nl/strings.xml index 76f66b7906908..015ff3eaed95d 100644 --- a/packages/SystemUI/res-product/values-nl/strings.xml +++ b/packages/SystemUI/res-product/values-nl/strings.xml @@ -21,8 +21,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Lijn de telefoon opnieuw uit om sneller op te laden" "Lijn de telefoon opnieuw uit om draadloos op te laden" - "Het Android TV-apparaat wordt binnenkort uitgeschakeld. Druk op een knop om het ingeschakeld te houden." - "Het apparaat wordt binnenkort uitgeschakeld. Druk om het ingeschakeld te houden." + "Het Android TV-apparaat wordt binnenkort uitgezet. Druk op een knop om het aan te laten." + "Het apparaat wordt binnenkort uitgezet. Druk om het aan te laten." "Geen simkaart in tablet." "Geen simkaart in telefoon." "Pincodes komen niet overeen" From 31eeaf7e424115544db1a3ebe2e647c224054339 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 31 Mar 2021 02:16:32 -0700 Subject: [PATCH 277/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I0b9790048702286c2acfe080de5daeeb891a21dc --- packages/Tethering/res/values-mcc310-mnc004-nl/strings.xml | 4 ++-- packages/Tethering/res/values-nl/strings.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/Tethering/res/values-mcc310-mnc004-nl/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-nl/strings.xml index 1d888942f49b9..b47f0258ada4a 100644 --- a/packages/Tethering/res/values-mcc310-mnc004-nl/strings.xml +++ b/packages/Tethering/res/values-mcc310-mnc004-nl/strings.xml @@ -18,7 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Tethering heeft geen internet" "Apparaten kunnen niet worden verbonden" - "Tethering uitschakelen" - "Hotspot of tethering is ingeschakeld" + "Tethering uitzetten" + "Hotspot of tethering staat aan" "Er kunnen extra kosten voor roaming in rekening worden gebracht." diff --git a/packages/Tethering/res/values-nl/strings.xml b/packages/Tethering/res/values-nl/strings.xml index 18b2bbfc76703..82ada9d01fabb 100644 --- a/packages/Tethering/res/values-nl/strings.xml +++ b/packages/Tethering/res/values-nl/strings.xml @@ -18,7 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Tethering of hotspot actief" "Tik om in te stellen." - "Tethering is uitgeschakeld" + "Tethering staat uit" "Neem contact op met je beheerder voor meer informatie" "Status van hotspot en tethering" From 44c4a7496e813fda363e27274b9c6ba6e0d78a59 Mon Sep 17 00:00:00 2001 From: Youngjun Kwak Date: Wed, 31 Mar 2021 01:08:13 +0000 Subject: [PATCH 278/288] Revert "DO NOT MERGE Remove focus on PasswordTextView" This reverts commit 1a96556be5263ec82a3b4beef9f247ec0546e6bd. Reason for revert: Although it makes sense in terms of UX that the PasswordView need not be highlightable, this change caused CTS failures, so we decided to revert this change. Bug:183644428 Test: atest CtsWindowManagerDeviceTestCases:KeyguardLockedTests && atest CtsWindowManagerDeviceTestCases:MultiDisplayLockedKeyguardTests Change-Id: I57f3d671a7c8430dd02cd7ddb9badbaab242f150 --- .../layout-land/keyguard_pin_view.xml | 2 +- .../res-keyguard/layout/keyguard_pin_view.xml | 2 +- .../keyguard/UnfocusablePasswordTextView.java | 44 ------------------- 3 files changed, 2 insertions(+), 46 deletions(-) delete mode 100644 packages/CarSystemUI/src/com/android/systemui/car/keyguard/UnfocusablePasswordTextView.java diff --git a/packages/CarSystemUI/res-keyguard/layout-land/keyguard_pin_view.xml b/packages/CarSystemUI/res-keyguard/layout-land/keyguard_pin_view.xml index 189f33140d41b..5746102f5f275 100644 --- a/packages/CarSystemUI/res-keyguard/layout-land/keyguard_pin_view.xml +++ b/packages/CarSystemUI/res-keyguard/layout-land/keyguard_pin_view.xml @@ -55,7 +55,7 @@ android:gravity="center" android:orientation="vertical"> - - Date: Thu, 1 Apr 2021 17:57:53 +0000 Subject: [PATCH 279/288] Rebind InstallSuccess UI on resume Similar to a previous fix for the main Activity, AlertDialog doesn't work properly if the UI is set up when it's not visible. To avoid this, rebind in onResume. A future refactor should clean this up to avoid the use of AlertDialog. Bug: 182493158 Test: manual, verify fail/success of steps in linked bug Change-Id: I6547385900d4c58ed3d113d7d0162c0cb8c20cba --- .../packageinstaller/InstallSuccess.java | 99 ++++++++++++------- 1 file changed, 61 insertions(+), 38 deletions(-) diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/InstallSuccess.java b/packages/PackageInstaller/src/com/android/packageinstaller/InstallSuccess.java index 705d3f4bdf875..38c06dd48b857 100644 --- a/packages/PackageInstaller/src/com/android/packageinstaller/InstallSuccess.java +++ b/packages/PackageInstaller/src/com/android/packageinstaller/InstallSuccess.java @@ -41,6 +41,15 @@ import java.util.List; public class InstallSuccess extends AlertActivity { private static final String LOG_TAG = InstallSuccess.class.getSimpleName(); + @Nullable + private PackageUtil.AppSnippet mAppSnippet; + + @Nullable + private String mAppPackageName; + + @Nullable + private Intent mLaunchIntent; + @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -55,59 +64,73 @@ public class InstallSuccess extends AlertActivity { Intent intent = getIntent(); ApplicationInfo appInfo = intent.getParcelableExtra(PackageUtil.INTENT_ATTR_APPLICATION_INFO); + mAppPackageName = appInfo.packageName; Uri packageURI = intent.getData(); // Set header icon and title - PackageUtil.AppSnippet as; PackageManager pm = getPackageManager(); if ("package".equals(packageURI.getScheme())) { - as = new PackageUtil.AppSnippet(pm.getApplicationLabel(appInfo), + mAppSnippet = new PackageUtil.AppSnippet(pm.getApplicationLabel(appInfo), pm.getApplicationIcon(appInfo)); } else { File sourceFile = new File(packageURI.getPath()); - as = PackageUtil.getAppSnippet(this, appInfo, sourceFile); + mAppSnippet = PackageUtil.getAppSnippet(this, appInfo, sourceFile); } - mAlert.setIcon(as.icon); - mAlert.setTitle(as.label); - mAlert.setView(R.layout.install_content_view); - mAlert.setButton(DialogInterface.BUTTON_POSITIVE, getString(R.string.launch), null, - null); - mAlert.setButton(DialogInterface.BUTTON_NEGATIVE, getString(R.string.done), - (ignored, ignored2) -> { - if (appInfo.packageName != null) { - Log.i(LOG_TAG, "Finished installing " + appInfo.packageName); - } - finish(); - }, null); - setupAlert(); - requireViewById(R.id.install_success).setVisibility(View.VISIBLE); - // Enable or disable "launch" button - Intent launchIntent = getPackageManager().getLaunchIntentForPackage( - appInfo.packageName); - boolean enabled = false; - if (launchIntent != null) { - List list = getPackageManager().queryIntentActivities(launchIntent, - 0); - if (list != null && list.size() > 0) { - enabled = true; - } - } + mLaunchIntent = getPackageManager().getLaunchIntentForPackage(mAppPackageName); - Button launchButton = mAlert.getButton(DialogInterface.BUTTON_POSITIVE); - if (enabled) { - launchButton.setOnClickListener(view -> { - try { - startActivity(launchIntent); - } catch (ActivityNotFoundException | SecurityException e) { - Log.e(LOG_TAG, "Could not start activity", e); + bindUi(); + } + } + + @Override + protected void onResume() { + super.onResume(); + bindUi(); + } + + private void bindUi() { + if (mAppSnippet == null) { + return; + } + + mAlert.setIcon(mAppSnippet.icon); + mAlert.setTitle(mAppSnippet.label); + mAlert.setView(R.layout.install_content_view); + mAlert.setButton(DialogInterface.BUTTON_POSITIVE, getString(R.string.launch), null, + null); + mAlert.setButton(DialogInterface.BUTTON_NEGATIVE, getString(R.string.done), + (ignored, ignored2) -> { + if (mAppPackageName != null) { + Log.i(LOG_TAG, "Finished installing " + mAppPackageName); } finish(); - }); - } else { - launchButton.setEnabled(false); + }, null); + setupAlert(); + requireViewById(R.id.install_success).setVisibility(View.VISIBLE); + // Enable or disable "launch" button + boolean enabled = false; + if (mLaunchIntent != null) { + List list = getPackageManager().queryIntentActivities(mLaunchIntent, + 0); + if (list != null && list.size() > 0) { + enabled = true; } } + + Button launchButton = mAlert.getButton(DialogInterface.BUTTON_POSITIVE); + if (enabled) { + launchButton.setOnClickListener(view -> { + try { + startActivity(mLaunchIntent); + } catch (ActivityNotFoundException | SecurityException e) { + Log.e(LOG_TAG, "Could not start activity", e); + } + finish(); + }); + } else { + launchButton.setEnabled(false); + } } } From 001d4e68bbebc14132a13b21c38c5fb6af9034a3 Mon Sep 17 00:00:00 2001 From: Beth Thibodeau Date: Thu, 25 Mar 2021 17:19:30 -0400 Subject: [PATCH 280/288] Increase maximum allowed size for status bar icons The previous size was causing some apps to crash which otherwise worked fine. This more closely matches the hard limit in RecordingCanvas (which we need to stay below to prevent SystemUI from crashing). Fixes: 182891864 Fixes: 182232777 Bug: 169255797 Test: atest StatusBarIconViewTest Test: manual - posting notifications with different drawable sizes Change-Id: I8deacc651e05a202ec980eeb8bcdf4f92daea8eb (cherry picked from commit 5cd7976f7d2b702f803f0628f61f02491834cd41) --- .../systemui/statusbar/StatusBarIconView.java | 25 ++++++++++++++++--- .../statusbar/StatusBarIconViewTest.java | 2 +- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java index 25ae5c2dadef1..db9afd6ea799b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java @@ -33,6 +33,7 @@ import android.graphics.Color; import android.graphics.ColorMatrixColorFilter; import android.graphics.Paint; import android.graphics.Rect; +import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.Icon; import android.os.Parcelable; @@ -83,8 +84,15 @@ public class StatusBarIconView extends AnimatedImageView implements StatusIconDi public static final int STATE_DOT = 1; public static final int STATE_HIDDEN = 2; - /** Maximum allowed width or height for an icon drawable */ - private static final int MAX_IMAGE_SIZE = 500; + /** + * Maximum allowed byte count for an icon bitmap + * @see android.graphics.RecordingCanvas.MAX_BITMAP_SIZE + */ + private static final int MAX_BITMAP_SIZE = 100 * 1024 * 1024; // 100 MB + /** + * Maximum allowed width or height for an icon drawable, if we can't get byte count + */ + private static final int MAX_IMAGE_SIZE = 5000; private static final String TAG = "StatusBarIconView"; private static final Property ICON_APPEAR_AMOUNT @@ -382,9 +390,18 @@ public class StatusBarIconView extends AnimatedImageView implements StatusIconDi return false; } - if (drawable.getIntrinsicWidth() > MAX_IMAGE_SIZE + if (drawable instanceof BitmapDrawable && ((BitmapDrawable) drawable).getBitmap() != null) { + // If it's a bitmap we can check the size directly + int byteCount = ((BitmapDrawable) drawable).getBitmap().getByteCount(); + if (byteCount > MAX_BITMAP_SIZE) { + Log.w(TAG, "Drawable is too large (" + byteCount + " bytes) " + mIcon); + return false; + } + } else if (drawable.getIntrinsicWidth() > MAX_IMAGE_SIZE || drawable.getIntrinsicHeight() > MAX_IMAGE_SIZE) { - Log.w(TAG, "Drawable is too large " + mIcon); + // Otherwise, check dimensions + Log.w(TAG, "Drawable is too large (" + drawable.getIntrinsicWidth() + "x" + + drawable.getIntrinsicHeight() + ") " + mIcon); return false; } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java index daa805a8f6e6a..edafa65490275 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java @@ -127,7 +127,7 @@ public class StatusBarIconViewTest extends SysuiTestCase { @Test public void testGiantImageNotAllowed() { - Bitmap largeBitmap = Bitmap.createBitmap(1000, 1000, Bitmap.Config.ARGB_8888); + Bitmap largeBitmap = Bitmap.createBitmap(6000, 6000, Bitmap.Config.ARGB_8888); Icon icon = Icon.createWithBitmap(largeBitmap); StatusBarIcon largeIcon = new StatusBarIcon(UserHandle.ALL, "mockPackage", icon, 0, 0, ""); From bca2b3aeabd164c1cf4bdc113366665976b0c831 Mon Sep 17 00:00:00 2001 From: Beth Thibodeau Date: Thu, 25 Mar 2021 17:19:30 -0400 Subject: [PATCH 281/288] Increase maximum allowed size for status bar icons The previous size was causing some apps to crash which otherwise worked fine. This more closely matches the hard limit in RecordingCanvas (which we need to stay below to prevent SystemUI from crashing). Fixes: 182891864 Fixes: 182232777 Bug: 169255797 Test: atest StatusBarIconViewTest Test: manual - posting notifications with different drawable sizes Change-Id: I8deacc651e05a202ec980eeb8bcdf4f92daea8eb (cherry picked from commit 5cd7976f7d2b702f803f0628f61f02491834cd41) --- .../systemui/statusbar/StatusBarIconView.java | 25 ++++++++++++++++--- .../statusbar/StatusBarIconViewTest.java | 2 +- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java index 25ae5c2dadef1..db9afd6ea799b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java @@ -33,6 +33,7 @@ import android.graphics.Color; import android.graphics.ColorMatrixColorFilter; import android.graphics.Paint; import android.graphics.Rect; +import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.Icon; import android.os.Parcelable; @@ -83,8 +84,15 @@ public class StatusBarIconView extends AnimatedImageView implements StatusIconDi public static final int STATE_DOT = 1; public static final int STATE_HIDDEN = 2; - /** Maximum allowed width or height for an icon drawable */ - private static final int MAX_IMAGE_SIZE = 500; + /** + * Maximum allowed byte count for an icon bitmap + * @see android.graphics.RecordingCanvas.MAX_BITMAP_SIZE + */ + private static final int MAX_BITMAP_SIZE = 100 * 1024 * 1024; // 100 MB + /** + * Maximum allowed width or height for an icon drawable, if we can't get byte count + */ + private static final int MAX_IMAGE_SIZE = 5000; private static final String TAG = "StatusBarIconView"; private static final Property ICON_APPEAR_AMOUNT @@ -382,9 +390,18 @@ public class StatusBarIconView extends AnimatedImageView implements StatusIconDi return false; } - if (drawable.getIntrinsicWidth() > MAX_IMAGE_SIZE + if (drawable instanceof BitmapDrawable && ((BitmapDrawable) drawable).getBitmap() != null) { + // If it's a bitmap we can check the size directly + int byteCount = ((BitmapDrawable) drawable).getBitmap().getByteCount(); + if (byteCount > MAX_BITMAP_SIZE) { + Log.w(TAG, "Drawable is too large (" + byteCount + " bytes) " + mIcon); + return false; + } + } else if (drawable.getIntrinsicWidth() > MAX_IMAGE_SIZE || drawable.getIntrinsicHeight() > MAX_IMAGE_SIZE) { - Log.w(TAG, "Drawable is too large " + mIcon); + // Otherwise, check dimensions + Log.w(TAG, "Drawable is too large (" + drawable.getIntrinsicWidth() + "x" + + drawable.getIntrinsicHeight() + ") " + mIcon); return false; } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java index daa805a8f6e6a..edafa65490275 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java @@ -127,7 +127,7 @@ public class StatusBarIconViewTest extends SysuiTestCase { @Test public void testGiantImageNotAllowed() { - Bitmap largeBitmap = Bitmap.createBitmap(1000, 1000, Bitmap.Config.ARGB_8888); + Bitmap largeBitmap = Bitmap.createBitmap(6000, 6000, Bitmap.Config.ARGB_8888); Icon icon = Icon.createWithBitmap(largeBitmap); StatusBarIcon largeIcon = new StatusBarIcon(UserHandle.ALL, "mockPackage", icon, 0, 0, ""); From 172f15e5e1a6ed5eee312c078d24c94e03f03fdc Mon Sep 17 00:00:00 2001 From: Sarah Chin Date: Tue, 23 Feb 2021 12:21:24 -0800 Subject: [PATCH 282/288] Update carrier privilege check in enforceSubscriptionPlanAccess Remove isEmbedded() check, since this can be called on both PSIM and ESIM. Replace SM#canManageSubscription with TM#hasCarrierPrivileges, since it is a superset of the checks done in SM#canManageSubscription and applies to both PSIMs as well as ESIMS. Updated the documentation for the two APIs to clarify the differences. Test: atest CtsTelephonyTestCases (SubscriptionManagerTest) Fix: 180451446 Change-Id: Icb4e2c619dacaea9e74cedea31865ec1eb689dce --- .../server/net/NetworkPolicyManagerService.java | 14 +++++--------- .../java/android/telephony/SubscriptionInfo.java | 4 ++-- .../android/telephony/SubscriptionManager.java | 8 ++++++++ .../java/android/telephony/TelephonyManager.java | 6 ++++++ 4 files changed, 21 insertions(+), 11 deletions(-) diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java index ffa518e266d9b..42bd8c5128068 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java @@ -3067,23 +3067,19 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { // Verify they're not lying about package name mAppOps.checkPackage(callingUid, callingPackage); - final SubscriptionManager sm; - final SubscriptionInfo si; final PersistableBundle config; + final TelephonyManager tm; final long token = Binder.clearCallingIdentity(); try { - sm = mContext.getSystemService(SubscriptionManager.class); - si = sm.getActiveSubscriptionInfo(subId); config = mCarrierConfigManager.getConfigForSubId(subId); + tm = mContext.getSystemService(TelephonyManager.class); } finally { Binder.restoreCallingIdentity(token); } - // First check: is caller the CarrierService? - if (si != null) { - if (si.isEmbedded() && sm.canManageSubscription(si, callingPackage)) { - return; - } + // First check: does caller have carrier privilege? + if (tm != null && tm.hasCarrierPrivileges(subId)) { + return; } // Second check: has the CarrierService delegated access? diff --git a/telephony/java/android/telephony/SubscriptionInfo.java b/telephony/java/android/telephony/SubscriptionInfo.java index 11667c83bc6af..0ee6568b64307 100644 --- a/telephony/java/android/telephony/SubscriptionInfo.java +++ b/telephony/java/android/telephony/SubscriptionInfo.java @@ -148,13 +148,14 @@ public class SubscriptionInfo implements Parcelable { /** * The access rules for this subscription, if it is embedded and defines any. + * This does not include access rules for non-embedded subscriptions. */ @Nullable private UiccAccessRule[] mNativeAccessRules; /** * The carrier certificates for this subscription that are saved in carrier configs. - * The other carrier certificates are embedded on Uicc and stored as part of mNativeAccessRules. + * This does not include access rules from the Uicc, whether embedded or non-embedded. */ @Nullable private UiccAccessRule[] mCarrierConfigAccessRules; @@ -661,7 +662,6 @@ public class SubscriptionInfo implements Parcelable { * is authorized to manage this subscription. * TODO and fix it properly in R / master: either deprecate this and have 3 APIs * native + carrier + all, or have this return all by default. - * @throws UnsupportedOperationException if this subscription is not embedded. * @hide */ @SystemApi diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java index e9ee06c246baa..c8ba919aa40d3 100644 --- a/telephony/java/android/telephony/SubscriptionManager.java +++ b/telephony/java/android/telephony/SubscriptionManager.java @@ -2631,6 +2631,10 @@ public class SubscriptionManager { * Checks whether the app with the given context is authorized to manage the given subscription * according to its metadata. * + * Only supported for embedded subscriptions (if {@link SubscriptionInfo#isEmbedded} returns + * true). To check for permissions for non-embedded subscription as well, + * {@see android.telephony.TelephonyManager#hasCarrierPrivileges}. + * * @param info The subscription to check. * @return whether the app is authorized to manage this subscription per its metadata. */ @@ -2643,6 +2647,10 @@ public class SubscriptionManager { * be authorized if it is included in the {@link android.telephony.UiccAccessRule} of the * {@link android.telephony.SubscriptionInfo} with the access status. * + * Only supported for embedded subscriptions (if {@link SubscriptionInfo#isEmbedded} returns + * true). To check for permissions for non-embedded subscription as well, + * {@see android.telephony.TelephonyManager#hasCarrierPrivileges}. + * * @param info The subscription to check. * @param packageName Package name of the app to check. * @return whether the app is authorized to manage this subscription per its access rules. diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 35e2630366949..10c3e6db52051 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -8534,6 +8534,9 @@ public class TelephonyManager { * call will return true. This access is granted by the owner of the UICC * card and does not depend on the registered carrier. * + * Note that this API applies to both physical and embedded subscriptions and + * is a superset of the checks done in SubscriptionManager#canManageSubscription. + * * @return true if the app has carrier privileges. */ public boolean hasCarrierPrivileges() { @@ -8547,6 +8550,9 @@ public class TelephonyManager { * call will return true. This access is granted by the owner of the UICC * card and does not depend on the registered carrier. * + * Note that this API applies to both physical and embedded subscriptions and + * is a superset of the checks done in SubscriptionManager#canManageSubscription. + * * @param subId The subscription to use. * @return true if the app has carrier privileges. * @hide From 8ddd24d39d777659b7c6f787c21f1fb22dca6ab7 Mon Sep 17 00:00:00 2001 From: Youngjun Kwak Date: Thu, 1 Apr 2021 21:06:39 +0000 Subject: [PATCH 283/288] DO NOT MERGE Set focus to PasswordTextView by default. This ensures that password will be entered reliably programmatically in CTS. Bug:183644428 Test: atest CtsWindowManagerDeviceTestCases:KeyguardLockedTests && atest CtsWindowManagerDeviceTestCases:MultiDisplayLockedKeyguardTests Change-Id: I35fa005e4571b150995efe8b0cc07a4556e06619 --- .../CarSystemUI/res-keyguard/layout-land/keyguard_pin_view.xml | 1 + packages/CarSystemUI/res-keyguard/layout/keyguard_pin_view.xml | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/CarSystemUI/res-keyguard/layout-land/keyguard_pin_view.xml b/packages/CarSystemUI/res-keyguard/layout-land/keyguard_pin_view.xml index 5746102f5f275..f82551b45abea 100644 --- a/packages/CarSystemUI/res-keyguard/layout-land/keyguard_pin_view.xml +++ b/packages/CarSystemUI/res-keyguard/layout-land/keyguard_pin_view.xml @@ -60,6 +60,7 @@ android:layout_width="@dimen/keyguard_security_width" android:layout_height="@dimen/pin_entry_height" android:gravity="center" + android:focusedByDefault="true" app:scaledTextSize="@integer/password_text_view_scale" android:contentDescription="@string/keyguard_accessibility_pin_area" /> diff --git a/packages/CarSystemUI/res-keyguard/layout/keyguard_pin_view.xml b/packages/CarSystemUI/res-keyguard/layout/keyguard_pin_view.xml index 815e67d1e2780..424624ffe581a 100644 --- a/packages/CarSystemUI/res-keyguard/layout/keyguard_pin_view.xml +++ b/packages/CarSystemUI/res-keyguard/layout/keyguard_pin_view.xml @@ -47,6 +47,7 @@ android:layout_width="@dimen/keyguard_security_width" android:layout_height="@dimen/pin_entry_height" android:gravity="center" + android:focusedByDefault="true" app:scaledTextSize="@integer/password_text_view_scale" android:contentDescription="@string/keyguard_accessibility_pin_area" /> From 02622abbe28f05aea7ba6b510fa72bc62a7d2ee1 Mon Sep 17 00:00:00 2001 From: Jayant Chowdhary Date: Wed, 31 Mar 2021 03:14:04 -0700 Subject: [PATCH 284/288] getCameraIdListNoLazy : remove system cameras from mTorchStatus as well. Bug: 182530469 Test: Make Emulator back camera system camera; atest FlashlightTest.java Merged-In: I0a149ba3d93a740cfbfdc2d04c1235e648061156 Change-Id: I0a149ba3d93a740cfbfdc2d04c1235e648061156 Signed-off-by: Jayant Chowdhary (cherry picked from commit bedb9950c8c32e6a5c3a3215c4c886d17720bde9) --- core/java/android/hardware/camera2/CameraManager.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/java/android/hardware/camera2/CameraManager.java b/core/java/android/hardware/camera2/CameraManager.java index 933dee3a64700..609da31254857 100644 --- a/core/java/android/hardware/camera2/CameraManager.java +++ b/core/java/android/hardware/camera2/CameraManager.java @@ -1363,6 +1363,8 @@ public final class CameraManager { // devices going offline (in real world scenarios, these permissions aren't // changeable). Future calls to getCameraIdList() will reflect the changes in // the camera id list after getCameraIdListNoLazy() is called. + // We need to remove the torch ids which may have been associated with the + // devices removed as well. This is the same situation. cameraStatuses = mCameraService.addListener(testListener); mCameraService.removeListener(testListener); for (CameraStatus c : cameraStatuses) { @@ -1381,6 +1383,7 @@ public final class CameraManager { } for (String id : deviceIdsToRemove) { onStatusChangedLocked(ICameraServiceListener.STATUS_NOT_PRESENT, id); + mTorchStatus.remove(id); } } catch (ServiceSpecificException e) { // Unexpected failure From bcfcd4018ba9e7e77250d1d3e8c1261880959dec Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 5 Apr 2021 12:58:00 -0700 Subject: [PATCH 285/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ib0cd31b7f0d4267bb80a790d9720a2eee4eeb2ed --- .../SettingsLib/RestrictedLockUtils/res/values-nl/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/SettingsLib/RestrictedLockUtils/res/values-nl/strings.xml b/packages/SettingsLib/RestrictedLockUtils/res/values-nl/strings.xml index ee1000f4fab5f..a73deafbc70f7 100644 --- a/packages/SettingsLib/RestrictedLockUtils/res/values-nl/strings.xml +++ b/packages/SettingsLib/RestrictedLockUtils/res/values-nl/strings.xml @@ -17,6 +17,6 @@ - "Ingeschakeld door beheerder" - "Uitgeschakeld door beheerder" + "Aangezet door beheerder" + "Uitgezet door beheerder" From 224f68663e311fdd329a18d163bfca0fa5e1bd3f Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 5 Apr 2021 21:38:51 -0700 Subject: [PATCH 286/288] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I70e274cae24244dfd7ced1489a511888aae50751 --- .../SettingsLib/res/values-bs/strings.xml | 2 +- packages/SettingsLib/res/values-nl/arrays.xml | 6 +-- .../SettingsLib/res/values-nl/strings.xml | 48 +++++++++---------- 3 files changed, 28 insertions(+), 28 deletions(-) diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml index f1148dafca64d..d2856e236a259 100644 --- a/packages/SettingsLib/res/values-bs/strings.xml +++ b/packages/SettingsLib/res/values-bs/strings.xml @@ -369,7 +369,7 @@ "Obustavlja se svaka aktivnost čim je korisnik napusti" "Ograničenje procesa u pozadini" "Prikaži ANR-e u pozadini" - "Prikaz dijaloga \"Aplikacija ne reagira\" za aplikacije pokrenute u pozadini" + "Prikaz dijaloškog okvira \"Aplikacija ne reagira\" za aplikacije pokrenute u pozadini" "Prikaži upozorenja kanala obavještenja" "Prikaz upozorenja na ekranu kada aplikacija pošalje obavještenje bez važećeg kanala" "Nametni aplikacije na vanjskoj pohrani" diff --git a/packages/SettingsLib/res/values-nl/arrays.xml b/packages/SettingsLib/res/values-nl/arrays.xml index 7ad044dade203..733e178c2deeb 100644 --- a/packages/SettingsLib/res/values-nl/arrays.xml +++ b/packages/SettingsLib/res/values-nl/arrays.xml @@ -59,9 +59,9 @@ "HDCP-controle altijd gebruiken" - "Uitgeschakeld" - "Gefilterd ingeschakeld" - "Ingeschakeld" + "Uitgezet" + "Gefilterd staat aan" + "Aangezet" "AVRCP 1.5 (standaard)" diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml index 7016be09cf6f7..d029dbd8b1d11 100644 --- a/packages/SettingsLib/res/values-nl/strings.xml +++ b/packages/SettingsLib/res/values-nl/strings.xml @@ -24,7 +24,7 @@ "Geen" "Opgeslagen" "Verbinding verbroken" - "Uitgeschakeld" + "Uitgezet" "IP-configuratie mislukt" "Niet verbonden wegens netwerk van lage kwaliteit" "Wifi-verbinding mislukt" @@ -131,7 +131,7 @@ "Rechter hoortoestel koppelen…" "Links: batterijniveau %1$s" "Rechts: batterijniveau %1$s" - "Wifi: uitgeschakeld." + "Wifi staat uit." "Wifi-verbinding verbroken." "Wifi: één streepje." "Wifi: twee streepjes." @@ -210,7 +210,7 @@ "Foutopsporingsmodus als wifi is verbonden" "Fout" "Draadloze foutopsporing" - "Schakel draadloze foutopsporing in om beschikbare apparaten te bekijken en te gebruiken" + "Zet draadloze foutopsporing aan om beschikbare apparaten te bekijken en te gebruiken" "Apparaat koppelen met QR-code" "Nieuwe apparaten koppelen via QR-codescanner" "Apparaat koppelen met koppelingscode" @@ -239,11 +239,11 @@ "Stand-by" "Scherm gaat nooit uit tijdens het opladen" "Snoop-logbestand voor bluetooth-HCI aanzetten" - "Bluetooth-pakketten opslaan. (Schakel Bluetooth in nadat je deze instelling hebt gewijzigd)." + "Bluetooth-pakketten opslaan. (Zet Bluetooth aan nadat je deze instelling hebt gewijzigd)." "OEM-ontgrendeling" "Toestaan dat de bootloader wordt ontgrendeld" "OEM-ontgrendeling toestaan?" - "WAARSCHUWING: De apparaatbeveiligingsfuncties werken niet op dit apparaat wanneer deze instelling is ingeschakeld." + "WAARSCHUWING: De apparaatbeveiligingsfuncties werken niet op dit apparaat als deze instelling aanstaat." "App voor neplocatie selecteren" "Geen app voor neplocatie ingesteld" "App voor neplocatie: %1$s" @@ -283,7 +283,7 @@ "Opties tonen voor certificering van draadloze weergave" "Logniveau voor wifi verhogen, tonen per SSID RSSI in wifi-kiezer" "Verlaagt het batterijverbruik en verbetert de netwerkprestaties" - "Als deze modus is ingeschakeld, kan het MAC-adres van dit apparaat elke keer wijzigen als het verbinding maakt met een netwerk waarvoor MAC-herschikking is ingeschakeld." + "Als deze modus aanstaat, kan het MAC-adres van dit apparaat wijzigen telkens als het apparaat verbinding maakt met een netwerk waarvoor MAC-herschikking aanstaat." "Met datalimiet" "Gratis" "Logger-buffergrootten" @@ -309,9 +309,9 @@ "Apps verifiëren via USB" "Apps die zijn geïnstalleerd via ADB/ADT, controleren op schadelijk gedrag" "Bluetooth-apparaten zonder naam (alleen MAC-adressen) worden weergegeven" - "Hiermee wordt de functie voor absoluut volume van Bluetooth uitgeschakeld in geval van volumeproblemen met externe apparaten, zoals een onacceptabel hoog volume of geen volumeregeling." - "Hierdoor wordt de Gabeldorsche-functiestack voor bluetooth ingeschakeld." - "Hiermee wordt de functie voor verbeterde connectiviteit ingeschakeld." + "Hiermee wordt de functie voor absoluut volume van Bluetooth uitgezet in geval van volumeproblemen met externe apparaten, zoals een onacceptabel hoog volume of geen volumeregeling." + "Hierdoor wordt de Gabeldorsche-functiestack voor bluetooth aangezet." + "Hiermee wordt de functie voor verbeterde connectiviteit aangezet." "Lokale terminal" "Terminal-app aanzetten die lokale shell-toegang biedt" "HDCP-controle" @@ -329,7 +329,7 @@ "Rendering met hardwareversnelling" "Media" "Controle" - "Strikte modus ingeschakeld" + "Strikte modus staat aan" "Knipperend scherm bij lange bewerkingen door apps" "Cursorlocatie" "Schermoverlay met huidige aanraakgegevens" @@ -412,7 +412,7 @@ "Wissen en converteren…" "Kleurenmodus voor afbeeldingen" "sRGB gebruiken" - "Uitgeschakeld" + "Uitgezet" "Totale kleurenblindheid" "Deuteranomalie (rood-groen)" "Protanomalie (rood-groen)" @@ -437,12 +437,12 @@ "Nog minder dan %1$s (%2$s)" "Nog meer dan %1$s (%2$s)" "Meer dan %1$s" - "Telefoon wordt binnenkort mogelijk uitgeschakeld" - "Tablet wordt binnenkort mogelijk uitgeschakeld" - "Apparaat wordt binnenkort mogelijk uitgeschakeld" - "Telefoon wordt binnenkort mogelijk uitgeschakeld (%1$s)" - "Tablet wordt binnenkort mogelijk uitgeschakeld (%1$s)" - "Apparaat wordt binnenkort mogelijk uitgeschakeld (%1$s)" + "Telefoon wordt binnenkort mogelijk uitgezet" + "Tablet wordt binnenkort mogelijk uitgezet" + "Apparaat wordt binnenkort mogelijk uitgezet" + "Telefoon wordt binnenkort mogelijk uitgezet (%1$s)" + "Tablet wordt binnenkort mogelijk uitgezet (%1$s)" + "Apparaat wordt binnenkort mogelijk uitgezet (%1$s)" "%1$s - %2$s" "Nog %1$s tot opgeladen" "%1$s - %2$s tot opgeladen" @@ -455,7 +455,7 @@ "Aangesloten, kan nu niet opladen" "Volledig" "Ingesteld door beheerder" - "Uitgeschakeld" + "Uitgezet" "Toegestaan" "Niet toegestaan" "Onbekende apps installeren" @@ -496,20 +496,20 @@ "Annuleren" "OK" "Aanzetten" - "Schakel Niet storen in." + "Zet Niet storen aan." "Nooit" "Alleen prioriteit" "%1$s. %2$s" - "Je hoort je volgende wekker niet %1$s tenzij je dit vóór die tijd uitschakelt" + "Je hoort je volgende wekker niet %1$s tenzij je dit vóór die tijd uitzet" "Je hoort je volgende wekker niet %1$s" "om %1$s" "op %1$s" "Duur" "Altijd vragen" - "Totdat je uitschakelt" + "Totdat je uitzet" "Zojuist" "Telefoonspeaker" - "Probleem bij verbinding maken. Schakel het apparaat uit en weer in." + "Probleem bij verbinding maken. Zet het apparaat uit en weer aan." "Bedraad audioapparaat" "Hulp en feedback" "Opslag" @@ -550,8 +550,8 @@ "Gast verwijderen" "Gast" "Apparaatstandaard" - "Uitgeschakeld" - "Ingeschakeld" + "Uitgezet" + "Aangezet" "Je apparaat moet opnieuw worden opgestart om deze wijziging toe te passen. Start nu opnieuw op of annuleer de wijziging." "Bedrade hoofdtelefoon" From 1c08e32233fef339af2cfdcd1b801af42bd49615 Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Mon, 5 Apr 2021 16:58:17 -0400 Subject: [PATCH 287/288] Restrict alarm broadcast To android only Test: NotificationManagerTest, NotificationManagerServiceTest Bug: 175614289 Change-Id: I4f8e56729d90f8f5288d08881129b1c45d5790e7 Merged-In: I4f8e56729d90f8f5288d08881129b1c45d5790e7 (cherry picked from commit abf15b731af248f512b7cc31ea99019436841af4) --- .../NotificationManagerService.java | 1 + .../NotificationManagerServiceTest.java | 26 +++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 40d09d4b42287..d058e6c4f2ece 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -6846,6 +6846,7 @@ public class NotificationManagerService extends SystemService { final PendingIntent pi = PendingIntent.getBroadcast(getContext(), REQUEST_CODE_TIMEOUT, new Intent(ACTION_NOTIFICATION_TIMEOUT) + .setPackage(PackageManagerService.PLATFORM_PACKAGE_NAME) .setData(new Uri.Builder().scheme(SCHEME_TIMEOUT) .appendPath(record.getKey()).build()) .addFlags(Intent.FLAG_RECEIVER_FOREGROUND) diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java index 1d783532374b0..302764e67289e 100755 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -84,6 +84,7 @@ import static org.mockito.Mockito.when; import android.app.ActivityManager; import android.app.ActivityManagerInternal; +import android.app.AlarmManager; import android.app.AppOpsManager; import android.app.AutomaticZenRule; import android.app.IActivityManager; @@ -172,6 +173,7 @@ import com.android.server.lights.LightsManager; import com.android.server.lights.LogicalLight; import com.android.server.notification.NotificationManagerService.NotificationAssistants; import com.android.server.notification.NotificationManagerService.NotificationListeners; +import com.android.server.pm.PackageManagerService; import com.android.server.statusbar.StatusBarManagerInternal; import com.android.server.uri.UriGrantsManagerInternal; import com.android.server.wm.ActivityTaskManagerInternal; @@ -285,6 +287,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { NotificationHistoryManager mHistoryManager; @Mock StatsManager mStatsManager; + @Mock + AlarmManager mAlarmManager; NotificationRecordLoggerFake mNotificationRecordLogger = new NotificationRecordLoggerFake(); private InstanceIdSequence mNotificationInstanceIdSequence = new InstanceIdSequenceFake( 1 << 30); @@ -426,6 +430,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { LocalServices.addService(DeviceIdleInternal.class, deviceIdleInternal); LocalServices.removeServiceForTest(ActivityManagerInternal.class); LocalServices.addService(ActivityManagerInternal.class, activityManagerInternal); + mContext.addMockSystemService(Context.ALARM_SERVICE, mAlarmManager); + doNothing().when(mContext).sendBroadcastAsUser(any(), any(), any()); @@ -833,6 +839,26 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { return nrSummary; } + @Test + public void testLimitTimeOutBroadcast() { + NotificationChannel channel = new NotificationChannel("id", "name", + NotificationManager.IMPORTANCE_HIGH); + Notification.Builder nb = new Notification.Builder(mContext, channel.getId()) + .setContentTitle("foo") + .setSmallIcon(android.R.drawable.sym_def_app_icon) + .setTimeoutAfter(1); + + StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0, + nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0); + NotificationRecord r = new NotificationRecord(mContext, sbn, channel); + + mService.scheduleTimeoutLocked(r); + ArgumentCaptor captor = ArgumentCaptor.forClass(PendingIntent.class); + verify(mAlarmManager).setExactAndAllowWhileIdle(anyInt(), anyLong(), captor.capture()); + assertEquals(PackageManagerService.PLATFORM_PACKAGE_NAME, + captor.getValue().getIntent().getPackage()); + } + @Test public void testDefaultAssistant_overrideDefault() { final int userId = 0; From 90be1b5d2c44dfe03b83cfaaf3b8d9085df838d1 Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Fri, 2 Oct 2020 15:36:50 -0400 Subject: [PATCH 288/288] Mark intents as immutable Test: manual Fixes: 169792886 Fixes: 169793537 Fixes: 169793764 Change-Id: I8ae9efe732b468b8e13e264b0af8f81c596e2e89 (cherry picked from commit 11f2e288466476127e3417e36357154dceb0af8e) --- .../android/server/notification/EventConditionProvider.java | 2 +- .../server/notification/NotificationManagerService.java | 5 +++-- .../server/notification/ScheduleConditionProvider.java | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/notification/EventConditionProvider.java b/services/core/java/com/android/server/notification/EventConditionProvider.java index a4a94c29abfa9..25ad9280fa99b 100644 --- a/services/core/java/com/android/server/notification/EventConditionProvider.java +++ b/services/core/java/com/android/server/notification/EventConditionProvider.java @@ -271,7 +271,7 @@ public class EventConditionProvider extends SystemConditionProviderService { new Intent(ACTION_EVALUATE) .addFlags(Intent.FLAG_RECEIVER_FOREGROUND) .putExtra(EXTRA_TIME, time), - PendingIntent.FLAG_UPDATE_CURRENT); + PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); alarms.cancel(pendingIntent); if (time == 0 || time < now) { if (DEBUG) Slog.d(TAG, "Not scheduling evaluate: " + (time == 0 ? "no time specified" diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 81983c0ba80c0..97dc3b2b89fda 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -5260,7 +5260,8 @@ public class NotificationManagerService extends SystemService { Intent appIntent = getContext().getPackageManager().getLaunchIntentForPackage(pkg); if (appIntent != null) { summaryNotification.contentIntent = PendingIntent.getActivityAsUser( - getContext(), 0, appIntent, 0, null, UserHandle.of(userId)); + getContext(), 0, appIntent, PendingIntent.FLAG_IMMUTABLE, null, + UserHandle.of(userId)); } final StatusBarNotification summarySbn = new StatusBarNotification(adjustedSbn.getPackageName(), @@ -6880,7 +6881,7 @@ public class NotificationManagerService extends SystemService { .appendPath(record.getKey()).build()) .addFlags(Intent.FLAG_RECEIVER_FOREGROUND) .putExtra(EXTRA_KEY, record.getKey()), - PendingIntent.FLAG_UPDATE_CURRENT); + PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); mAlarmManager.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP, mSystemClock.elapsedRealtime() + record.getNotification().getTimeoutAfter(), pi); diff --git a/services/core/java/com/android/server/notification/ScheduleConditionProvider.java b/services/core/java/com/android/server/notification/ScheduleConditionProvider.java index 961d3db867e97..35170332a077b 100644 --- a/services/core/java/com/android/server/notification/ScheduleConditionProvider.java +++ b/services/core/java/com/android/server/notification/ScheduleConditionProvider.java @@ -223,7 +223,7 @@ public class ScheduleConditionProvider extends SystemConditionProviderService { new Intent(ACTION_EVALUATE) .addFlags(Intent.FLAG_RECEIVER_FOREGROUND) .putExtra(EXTRA_TIME, time), - PendingIntent.FLAG_UPDATE_CURRENT); + PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); alarms.cancel(pendingIntent); if (time > now) { if (DEBUG) Slog.d(TAG, String.format("Scheduling evaluate for %s, in %s, now=%s",