From 7bf30cb92ab213c07241ad22def6816ae201dbab Mon Sep 17 00:00:00 2001 From: Jayant Chowdhary Date: Wed, 9 Jun 2021 14:34:54 -0700 Subject: camera2: Fix exception swallowing in params classes createFromParcel Do not catch exceptions when we attempt to create the following classes from a parcel - OutputConfiguration - VendorTagDescriptor - VendorTagDescriptorCache - SessionConfiguration This could cause subsequent parcel information to be read incorrectly. Bug: 188675581 Test: Sample app which tries to write invalid data into an OutputConfiguration parcel to send in an intent via Broadcast. When read by the receiving app, gets an exception (not swallowed). Merged-In: I745ca49daa6ca36b1020d518e9f346b52684f2b1 Change-Id: I745ca49daa6ca36b1020d518e9f346b52684f2b1 Signed-off-by: Jayant Chowdhary (cherry picked from commit 6b0bcd60c81003e6a193aeccf44ee03f188e3984) --- .../java/android/hardware/camera2/params/OutputConfiguration.java | 8 +------- .../android/hardware/camera2/params/SessionConfiguration.java | 8 +------- .../java/android/hardware/camera2/params/VendorTagDescriptor.java | 8 +------- .../android/hardware/camera2/params/VendorTagDescriptorCache.java | 8 +------- 4 files changed, 4 insertions(+), 28 deletions(-) diff --git a/core/java/android/hardware/camera2/params/OutputConfiguration.java b/core/java/android/hardware/camera2/params/OutputConfiguration.java index 226b8e549a9e..c062f8c13d75 100644 --- a/core/java/android/hardware/camera2/params/OutputConfiguration.java +++ b/core/java/android/hardware/camera2/params/OutputConfiguration.java @@ -631,13 +631,7 @@ public final class OutputConfiguration implements Parcelable { new Parcelable.Creator() { @Override public OutputConfiguration createFromParcel(Parcel source) { - try { - OutputConfiguration outputConfiguration = new OutputConfiguration(source); - return outputConfiguration; - } catch (Exception e) { - Log.e(TAG, "Exception creating OutputConfiguration from parcel", e); - return null; - } + return new OutputConfiguration(source); } @Override diff --git a/core/java/android/hardware/camera2/params/SessionConfiguration.java b/core/java/android/hardware/camera2/params/SessionConfiguration.java index 555ff9aff184..001110ac8b84 100644 --- a/core/java/android/hardware/camera2/params/SessionConfiguration.java +++ b/core/java/android/hardware/camera2/params/SessionConfiguration.java @@ -138,13 +138,7 @@ public final class SessionConfiguration implements Parcelable { new Parcelable.Creator () { @Override public SessionConfiguration createFromParcel(Parcel source) { - try { - SessionConfiguration sessionConfiguration = new SessionConfiguration(source); - return sessionConfiguration; - } catch (Exception e) { - Log.e(TAG, "Exception creating SessionConfiguration from parcel", e); - return null; - } + return new SessionConfiguration(source); } @Override diff --git a/core/java/android/hardware/camera2/params/VendorTagDescriptor.java b/core/java/android/hardware/camera2/params/VendorTagDescriptor.java index 4845ec3e3bd8..c62f6da012c1 100644 --- a/core/java/android/hardware/camera2/params/VendorTagDescriptor.java +++ b/core/java/android/hardware/camera2/params/VendorTagDescriptor.java @@ -36,13 +36,7 @@ public final class VendorTagDescriptor implements Parcelable { new Parcelable.Creator() { @Override public VendorTagDescriptor createFromParcel(Parcel source) { - try { - VendorTagDescriptor vendorDescriptor = new VendorTagDescriptor(source); - return vendorDescriptor; - } catch (Exception e) { - Log.e(TAG, "Exception creating VendorTagDescriptor from parcel", e); - return null; - } + return new VendorTagDescriptor(source); } @Override diff --git a/core/java/android/hardware/camera2/params/VendorTagDescriptorCache.java b/core/java/android/hardware/camera2/params/VendorTagDescriptorCache.java index 450b70bcdcdc..8d7615c98662 100644 --- a/core/java/android/hardware/camera2/params/VendorTagDescriptorCache.java +++ b/core/java/android/hardware/camera2/params/VendorTagDescriptorCache.java @@ -36,13 +36,7 @@ public final class VendorTagDescriptorCache implements Parcelable { new Parcelable.Creator() { @Override public VendorTagDescriptorCache createFromParcel(Parcel source) { - try { - VendorTagDescriptorCache vendorDescriptorCache = new VendorTagDescriptorCache(source); - return vendorDescriptorCache; - } catch (Exception e) { - Log.e(TAG, "Exception creating VendorTagDescriptorCache from parcel", e); - return null; - } + return new VendorTagDescriptorCache(source); } @Override -- cgit v1.2.3 From 8a11538146d894264420d5baa554e3968496b020 Mon Sep 17 00:00:00 2001 From: Jayant Chowdhary Date: Wed, 9 Jun 2021 14:34:54 -0700 Subject: camera2: Fix exception swallowing in params classes createFromParcel Do not catch exceptions when we attempt to create the following classes from a parcel - OutputConfiguration - VendorTagDescriptor - VendorTagDescriptorCache - SessionConfiguration This could cause subsequent parcel information to be read incorrectly. Bug: 188675581 Test: Sample app which tries to write invalid data into an OutputConfiguration parcel to send in an intent via Broadcast. When read by the receiving app, gets an exception (not swallowed). Merged-In: I745ca49daa6ca36b1020d518e9f346b52684f2b1 Change-Id: I745ca49daa6ca36b1020d518e9f346b52684f2b1 Signed-off-by: Jayant Chowdhary (cherry picked from commit 6b0bcd60c81003e6a193aeccf44ee03f188e3984) --- .../java/android/hardware/camera2/params/OutputConfiguration.java | 8 +------- .../java/android/hardware/camera2/params/VendorTagDescriptor.java | 8 +------- .../android/hardware/camera2/params/VendorTagDescriptorCache.java | 8 +------- 3 files changed, 3 insertions(+), 21 deletions(-) diff --git a/core/java/android/hardware/camera2/params/OutputConfiguration.java b/core/java/android/hardware/camera2/params/OutputConfiguration.java index 05c4dc378890..2b6eb8080fd4 100644 --- a/core/java/android/hardware/camera2/params/OutputConfiguration.java +++ b/core/java/android/hardware/camera2/params/OutputConfiguration.java @@ -501,13 +501,7 @@ public final class OutputConfiguration implements Parcelable { new Parcelable.Creator() { @Override public OutputConfiguration createFromParcel(Parcel source) { - try { - OutputConfiguration outputConfiguration = new OutputConfiguration(source); - return outputConfiguration; - } catch (Exception e) { - Log.e(TAG, "Exception creating OutputConfiguration from parcel", e); - return null; - } + return new OutputConfiguration(source); } @Override diff --git a/core/java/android/hardware/camera2/params/VendorTagDescriptor.java b/core/java/android/hardware/camera2/params/VendorTagDescriptor.java index ea424e594081..893bde1e1430 100644 --- a/core/java/android/hardware/camera2/params/VendorTagDescriptor.java +++ b/core/java/android/hardware/camera2/params/VendorTagDescriptor.java @@ -36,13 +36,7 @@ public final class VendorTagDescriptor implements Parcelable { new Parcelable.Creator() { @Override public VendorTagDescriptor createFromParcel(Parcel source) { - try { - VendorTagDescriptor vendorDescriptor = new VendorTagDescriptor(source); - return vendorDescriptor; - } catch (Exception e) { - Log.e(TAG, "Exception creating VendorTagDescriptor from parcel", e); - return null; - } + return new VendorTagDescriptor(source); } @Override diff --git a/core/java/android/hardware/camera2/params/VendorTagDescriptorCache.java b/core/java/android/hardware/camera2/params/VendorTagDescriptorCache.java index 1f92f6d9ebf1..423020870869 100644 --- a/core/java/android/hardware/camera2/params/VendorTagDescriptorCache.java +++ b/core/java/android/hardware/camera2/params/VendorTagDescriptorCache.java @@ -36,13 +36,7 @@ public final class VendorTagDescriptorCache implements Parcelable { new Parcelable.Creator() { @Override public VendorTagDescriptorCache createFromParcel(Parcel source) { - try { - VendorTagDescriptorCache vendorDescriptorCache = new VendorTagDescriptorCache(source); - return vendorDescriptorCache; - } catch (Exception e) { - Log.e(TAG, "Exception creating VendorTagDescriptorCache from parcel", e); - return null; - } + return new VendorTagDescriptorCache(source); } @Override -- cgit v1.2.3 From 346be3887c91d4f90af3e98b39f750318770017e Mon Sep 17 00:00:00 2001 From: Jeff DeCew Date: Tue, 20 Jul 2021 15:34:30 -0400 Subject: Fix hidden EmptyShadeView Fixes: 193897657 Test: validate that HUNs show Test: validate that "no notifications" text shows Change-Id: I2fcd5b2712a5f4a28a8913cd8d0e29f635530e96 --- .../statusbar/notification/stack/StackScrollAlgorithm.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java index 23e3742c2bdf..af9d162c3a9d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java @@ -157,15 +157,13 @@ public class StackScrollAlgorithm { // After the shelf has updated its yTranslation, explicitly set alpha=0 for view below shelf // to skip rendering them in the hardware layer. We do not set them invisible because that // runs invalidate & onDraw when these views return onscreen, which is more expensive. + if (shelf.getViewState().hidden) { + // When the shelf is hidden, it won't clip views, so we don't hide rows + return; + } final float shelfTop = shelf.getViewState().yTranslation; for (ExpandableView view : algorithmState.visibleChildren) { - if (view instanceof ExpandableNotificationRow) { - ExpandableNotificationRow row = (ExpandableNotificationRow) view; - if (row.isHeadsUp() || row.isHeadsUpAnimatingAway()) { - continue; - } - } final float viewTop = view.getViewState().yTranslation; if (viewTop >= shelfTop) { view.getViewState().alpha = 0; -- cgit v1.2.3 From c279a42a3f2b4dd067074010fd5308d6ec1853f6 Mon Sep 17 00:00:00 2001 From: Dave Mankoff Date: Wed, 21 Jul 2021 10:08:04 -0400 Subject: Guard DISABLE_PLUGIN with PLUGIN permission. Fixes a p0 security bug. We already have the plugin permission defined in our manifest. Ensure that senders of the DISABLE_PLUGIN broadcast have that permission. Bug: 193444889 Test: manual Change-Id: Iebaba435c17c5644c5357c0683858447f5ffb897 Merged-In: Iebaba435c17c5644c5357c0683858447f5ffb897 --- .../SystemUI/src/com/android/systemui/plugins/PluginManagerImpl.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/plugins/PluginManagerImpl.java b/packages/SystemUI/src/com/android/systemui/plugins/PluginManagerImpl.java index 2a17e35f00dd..d9fd0a659605 100644 --- a/packages/SystemUI/src/com/android/systemui/plugins/PluginManagerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/plugins/PluginManagerImpl.java @@ -183,10 +183,12 @@ public class PluginManagerImpl extends BroadcastReceiver implements PluginManage IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED); filter.addAction(Intent.ACTION_PACKAGE_CHANGED); filter.addAction(Intent.ACTION_PACKAGE_REMOVED); + filter.addDataScheme("package"); + mContext.registerReceiver(this, filter); filter.addAction(PLUGIN_CHANGED); filter.addAction(DISABLE_PLUGIN); filter.addDataScheme("package"); - mContext.registerReceiver(this, filter); + mContext.registerReceiver(this, filter, PluginInstanceManager.PLUGIN_PERMISSION, null); filter = new IntentFilter(Intent.ACTION_USER_UNLOCKED); mContext.registerReceiver(this, filter); } -- cgit v1.2.3 From 55cd8952c051cf8aaac144c914e8f5997ae80363 Mon Sep 17 00:00:00 2001 From: Dave Mankoff Date: Wed, 21 Jul 2021 10:08:04 -0400 Subject: Guard DISABLE_PLUGIN with PLUGIN permission. Fixes a p0 security bug. We already have the plugin permission defined in our manifest. Ensure that senders of the DISABLE_PLUGIN broadcast have that permission. Bug: 193444889 Test: manual Change-Id: Iebaba435c17c5644c5357c0683858447f5ffb897 Merged-In: Iebaba435c17c5644c5357c0683858447f5ffb897 --- .../src/com/android/systemui/shared/plugins/PluginManagerImpl.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginManagerImpl.java b/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginManagerImpl.java index 53403aa4dbf1..fb109d2bda5b 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginManagerImpl.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginManagerImpl.java @@ -190,9 +190,12 @@ public class PluginManagerImpl extends BroadcastReceiver implements PluginManage filter.addAction(Intent.ACTION_PACKAGE_CHANGED); filter.addAction(Intent.ACTION_PACKAGE_REPLACED); filter.addAction(Intent.ACTION_PACKAGE_REMOVED); + filter.addDataScheme("package"); + mContext.registerReceiver(this, filter); filter.addAction(PLUGIN_CHANGED); filter.addAction(DISABLE_PLUGIN); filter.addDataScheme("package"); + mContext.registerReceiver(this, filter, PluginInstanceManager.PLUGIN_PERMISSION, null); mContext.registerReceiver(this, filter); filter = new IntentFilter(Intent.ACTION_USER_UNLOCKED); mContext.registerReceiver(this, filter); -- cgit v1.2.3 From 90824714b5f065bbe5671f9808b986194290ae8e Mon Sep 17 00:00:00 2001 From: Dave Mankoff Date: Wed, 21 Jul 2021 10:08:04 -0400 Subject: Guard DISABLE_PLUGIN with PLUGIN permission. Fixes a p0 security bug. We already have the plugin permission defined in our manifest. Ensure that senders of the DISABLE_PLUGIN broadcast have that permission. Bug: 193444889 Test: manual Change-Id: Iebaba435c17c5644c5357c0683858447f5ffb897 Merged-In: Iebaba435c17c5644c5357c0683858447f5ffb897 --- .../src/com/android/systemui/shared/plugins/PluginManagerImpl.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginManagerImpl.java b/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginManagerImpl.java index 4d1fb38329e9..a687bb89fd75 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginManagerImpl.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginManagerImpl.java @@ -195,9 +195,12 @@ public class PluginManagerImpl extends BroadcastReceiver implements PluginManage filter.addAction(Intent.ACTION_PACKAGE_CHANGED); filter.addAction(Intent.ACTION_PACKAGE_REPLACED); filter.addAction(Intent.ACTION_PACKAGE_REMOVED); + filter.addDataScheme("package"); + mContext.registerReceiver(this, filter); filter.addAction(PLUGIN_CHANGED); filter.addAction(DISABLE_PLUGIN); filter.addDataScheme("package"); + mContext.registerReceiver(this, filter, PluginInstanceManager.PLUGIN_PERMISSION, null); mContext.registerReceiver(this, filter); filter = new IntentFilter(Intent.ACTION_USER_UNLOCKED); mContext.registerReceiver(this, filter); -- cgit v1.2.3 From c2c2fa79ffae28d40d0d8bfb29f25b6ede6bd55b Mon Sep 17 00:00:00 2001 From: Dave Mankoff Date: Wed, 21 Jul 2021 10:08:04 -0400 Subject: Guard DISABLE_PLUGIN with PLUGIN permission. Fixes a p0 security bug. We already have the plugin permission defined in our manifest. Ensure that senders of the DISABLE_PLUGIN broadcast have that permission. Bug: 193444889 Test: manual Change-Id: Iebaba435c17c5644c5357c0683858447f5ffb897 Merged-In: Iebaba435c17c5644c5357c0683858447f5ffb897 --- .../src/com/android/systemui/shared/plugins/PluginManagerImpl.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginManagerImpl.java b/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginManagerImpl.java index 4d1fb38329e9..a687bb89fd75 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginManagerImpl.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginManagerImpl.java @@ -195,9 +195,12 @@ public class PluginManagerImpl extends BroadcastReceiver implements PluginManage filter.addAction(Intent.ACTION_PACKAGE_CHANGED); filter.addAction(Intent.ACTION_PACKAGE_REPLACED); filter.addAction(Intent.ACTION_PACKAGE_REMOVED); + filter.addDataScheme("package"); + mContext.registerReceiver(this, filter); filter.addAction(PLUGIN_CHANGED); filter.addAction(DISABLE_PLUGIN); filter.addDataScheme("package"); + mContext.registerReceiver(this, filter, PluginInstanceManager.PLUGIN_PERMISSION, null); mContext.registerReceiver(this, filter); filter = new IntentFilter(Intent.ACTION_USER_UNLOCKED); mContext.registerReceiver(this, filter); -- cgit v1.2.3 From 73e1e266a1db8232b6c7cc249f1f7f5ee83bf71d Mon Sep 17 00:00:00 2001 From: Peter Wang Date: Thu, 4 Mar 2021 17:53:52 -0800 Subject: Add switchSubscription and delete_subscription to protected broadcast Bug: 179949381 Test: Local Change-Id: I5e4edfe2250914cc2ce1a03e466bec128460b779 --- core/res/AndroidManifest.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 4dec0ffccb5e..3410a067cb4d 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -550,6 +550,8 @@ + + -- cgit v1.2.3 From 591e345fbc0ccb6815e27ccff1a0ae9d02002a90 Mon Sep 17 00:00:00 2001 From: lucaslin Date: Thu, 29 Jul 2021 09:37:48 +0800 Subject: Make sure that only the owner can call [stop|start]VpnProfile() In stopVpnProfile() & startVpnProfile, it doesn't check if the caller's package name is the same as the given one, so any app has chance to stop/start the VPN profile of other apps. Bug: 191382886 Test: atest FrameworksNetTests CtsNetTestCases \ CtsHostsideNetworkTests:HostsideVpnTests Change-Id: Ib0a6e9ed191ff8c8bd55ce9902d894b6a339ace2 --- .../java/com/android/server/VpnManagerService.java | 30 ++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/VpnManagerService.java b/services/core/java/com/android/server/VpnManagerService.java index d483f1863258..a03425c0bb75 100644 --- a/services/core/java/com/android/server/VpnManagerService.java +++ b/services/core/java/com/android/server/VpnManagerService.java @@ -26,6 +26,8 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; import android.net.ConnectivityManager; import android.net.INetd; import android.net.IVpnManager; @@ -312,6 +314,26 @@ public class VpnManagerService extends IVpnManager.Stub { } } + // TODO : Move to a static lib to factorize with Vpn.java + private int getAppUid(final String app, final int userId) { + final PackageManager pm = mContext.getPackageManager(); + final long token = Binder.clearCallingIdentity(); + try { + return pm.getPackageUidAsUser(app, userId); + } catch (NameNotFoundException e) { + return -1; + } finally { + Binder.restoreCallingIdentity(token); + } + } + + private void verifyCallingUidAndPackage(String packageName, int callingUid) { + final int userId = UserHandle.getUserId(callingUid); + if (getAppUid(packageName, userId) != callingUid) { + throw new SecurityException(packageName + " does not belong to uid " + callingUid); + } + } + /** * Starts the VPN based on the stored profile for the given package * @@ -323,7 +345,9 @@ public class VpnManagerService extends IVpnManager.Stub { */ @Override public void startVpnProfile(@NonNull String packageName) { - final int user = UserHandle.getUserId(mDeps.getCallingUid()); + final int callingUid = Binder.getCallingUid(); + verifyCallingUidAndPackage(packageName, callingUid); + final int user = UserHandle.getUserId(callingUid); synchronized (mVpns) { throwIfLockdownEnabled(); mVpns.get(user).startVpnProfile(packageName); @@ -340,7 +364,9 @@ public class VpnManagerService extends IVpnManager.Stub { */ @Override public void stopVpnProfile(@NonNull String packageName) { - final int user = UserHandle.getUserId(mDeps.getCallingUid()); + final int callingUid = Binder.getCallingUid(); + verifyCallingUidAndPackage(packageName, callingUid); + final int user = UserHandle.getUserId(callingUid); synchronized (mVpns) { mVpns.get(user).stopVpnProfile(packageName); } -- cgit v1.2.3 From 56a5f521314a80b0a6baab02159818f44c392c70 Mon Sep 17 00:00:00 2001 From: Josh Tsuji Date: Thu, 29 Jul 2021 16:47:37 -0400 Subject: Disable unlocked screen off if the display needs blanking. If the display needs blanking we can't even control the normal screen off, let alone the unlocked screen off (per the DozeParameters constructor). Bug: 193479273 Test: atest android.server.wm.KeyguardTests Change-Id: Idaa827fee826497d00ad908b10ad2142b922b780 --- .../src/com/android/systemui/statusbar/phone/DozeParameters.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java index 68024726c5de..5a6db213d87f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java @@ -231,7 +231,9 @@ public class DozeParameters implements TunerService.Tunable, * possible if AOD isn't even enabled or if the flag is disabled. */ public boolean canControlUnlockedScreenOff() { - return getAlwaysOn() && mFeatureFlags.useNewLockscreenAnimations(); + return getAlwaysOn() + && mFeatureFlags.useNewLockscreenAnimations() + && !getDisplayNeedsBlanking(); } private boolean getBoolean(String propName, int resId) { -- cgit v1.2.3 From 73aada346046c09e8eed513bd1fc1e0b5585af01 Mon Sep 17 00:00:00 2001 From: lbill Date: Fri, 30 Jul 2021 06:39:00 +0000 Subject: Fix Multi user avater View overlap privacy dot Move system_icons_super_container_margin_start to parent ViewGroup to ensure both multi_user_avatar system_icons_container can share the padding Test: make and check visual, enable multi user and check keyguard Bug: 194324044 Change-Id: Iab2803dfb2b609b98eb8053e3b81bd6731857a2b --- packages/SystemUI/res/layout/keyguard_status_bar.xml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/SystemUI/res/layout/keyguard_status_bar.xml b/packages/SystemUI/res/layout/keyguard_status_bar.xml index 2789ed125b09..eb7638233efd 100644 --- a/packages/SystemUI/res/layout/keyguard_status_bar.xml +++ b/packages/SystemUI/res/layout/keyguard_status_bar.xml @@ -30,6 +30,7 @@ android:id="@+id/status_icon_area" android:layout_width="wrap_content" android:layout_height="match_parent" + android:paddingEnd="@dimen/system_icons_keyguard_padding_end" android:paddingTop="@dimen/status_bar_padding_top" android:layout_alignParentEnd="true" android:gravity="center_vertical|end" > @@ -38,12 +39,10 @@ android:layout_height="match_parent" android:layout_weight="1" android:layout_marginStart="@dimen/system_icons_super_container_margin_start" - android:gravity="center_vertical|end" - android:paddingEnd="@dimen/system_icons_keyguard_padding_end" > + android:gravity="center_vertical|end"> - Date: Fri, 30 Jul 2021 19:19:03 +0000 Subject: Revert "Only dump necessary info when specifying a package" This reverts commit 9b34cca80f728c2d2600726d8b521c883437b8c3. Reason for revert: restore info for S to not break tooling, can re-consider for T Bug: 191386282 Change-Id: I3e6919c5ce8073f22c860e1be59264668643d910 --- .../android/server/pm/PackageManagerService.java | 136 ++++++++------------- 1 file changed, 48 insertions(+), 88 deletions(-) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 14a7fc00fa0c..8921a14024fe 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -23967,11 +23967,11 @@ public class PackageManagerService extends IPackageManager.Stub pw.println("vers,1"); } - if (!checkin - && dumpState.isDumping(DumpState.DUMP_VERSION) - && packageName == null) { - // dump version information for all volumes with installed packages - dump(DumpState.DUMP_VERSION, fd, pw, dumpState); + // reader + if (dumpState.isDumping(DumpState.DUMP_VERSION) && packageName == null) { + if (!checkin) { + dump(DumpState.DUMP_VERSION, fd, pw, dumpState); + } } if (!checkin @@ -24002,8 +24002,7 @@ public class PackageManagerService extends IPackageManager.Stub ipw.decreaseIndent(); } - if (dumpState.isDumping(DumpState.DUMP_VERIFIERS) - && packageName == null) { + if (dumpState.isDumping(DumpState.DUMP_VERIFIERS) && packageName == null) { final String requiredVerifierPackage = mRequiredVerifierPackage; if (!checkin) { if (dumpState.onTitlePrinted()) { @@ -24024,8 +24023,7 @@ public class PackageManagerService extends IPackageManager.Stub } } - if (dumpState.isDumping(DumpState.DUMP_DOMAIN_VERIFIER) - && packageName == null) { + if (dumpState.isDumping(DumpState.DUMP_DOMAIN_VERIFIER) && packageName == null) { final DomainVerificationProxy proxy = mDomainVerificationManager.getProxy(); final ComponentName verifierComponent = proxy.getComponentName(); if (verifierComponent != null) { @@ -24052,13 +24050,11 @@ public class PackageManagerService extends IPackageManager.Stub } } - if (dumpState.isDumping(DumpState.DUMP_LIBS) - && packageName == null) { + if (dumpState.isDumping(DumpState.DUMP_LIBS) && packageName == null) { dump(DumpState.DUMP_LIBS, fd, pw, dumpState); } - if (dumpState.isDumping(DumpState.DUMP_FEATURES) - && packageName == null) { + if (dumpState.isDumping(DumpState.DUMP_FEATURES) && packageName == null) { if (dumpState.onTitlePrinted()) { pw.println(); } @@ -24068,7 +24064,12 @@ public class PackageManagerService extends IPackageManager.Stub synchronized (mAvailableFeatures) { for (FeatureInfo feat : mAvailableFeatures.values()) { - if (!checkin) { + if (checkin) { + pw.print("feat,"); + pw.print(feat.name); + pw.print(","); + pw.println(feat.version); + } else { pw.print(" "); pw.print(feat.name); if (feat.version > 0) { @@ -24076,73 +24077,55 @@ public class PackageManagerService extends IPackageManager.Stub pw.print(feat.version); } pw.println(); - } else { - pw.print("feat,"); - pw.print(feat.name); - pw.print(","); - pw.println(feat.version); } } } } - if (!checkin - && dumpState.isDumping(DumpState.DUMP_ACTIVITY_RESOLVERS)) { + if (!checkin && dumpState.isDumping(DumpState.DUMP_ACTIVITY_RESOLVERS)) { synchronized (mLock) { mComponentResolver.dumpActivityResolvers(pw, dumpState, packageName); } } - if (!checkin - && dumpState.isDumping(DumpState.DUMP_RECEIVER_RESOLVERS)) { + if (!checkin && dumpState.isDumping(DumpState.DUMP_RECEIVER_RESOLVERS)) { synchronized (mLock) { mComponentResolver.dumpReceiverResolvers(pw, dumpState, packageName); } } - if (!checkin - && dumpState.isDumping(DumpState.DUMP_SERVICE_RESOLVERS)) { + if (!checkin && dumpState.isDumping(DumpState.DUMP_SERVICE_RESOLVERS)) { synchronized (mLock) { mComponentResolver.dumpServiceResolvers(pw, dumpState, packageName); } } - if (!checkin - && dumpState.isDumping(DumpState.DUMP_CONTENT_RESOLVERS)) { + if (!checkin && dumpState.isDumping(DumpState.DUMP_CONTENT_RESOLVERS)) { synchronized (mLock) { mComponentResolver.dumpProviderResolvers(pw, dumpState, packageName); } } - if (!checkin - && dumpState.isDumping(DumpState.DUMP_PREFERRED) - && packageName == null) { + if (!checkin && dumpState.isDumping(DumpState.DUMP_PREFERRED)) { dump(DumpState.DUMP_PREFERRED, fd, pw, dumpState); } - if (!checkin - && dumpState.isDumping(DumpState.DUMP_PREFERRED_XML) - && packageName == null) { + if (!checkin && dumpState.isDumping(DumpState.DUMP_PREFERRED_XML)) { dump(DumpState.DUMP_PREFERRED_XML, fd, pw, dumpState); } - if (!checkin - && dumpState.isDumping(DumpState.DUMP_DOMAIN_PREFERRED) - && packageName == null) { + if (!checkin && dumpState.isDumping(DumpState.DUMP_DOMAIN_PREFERRED)) { dump(DumpState.DUMP_DOMAIN_PREFERRED, fd, pw, dumpState); } - if (!checkin - && dumpState.isDumping(DumpState.DUMP_PERMISSIONS)) { + if (!checkin && dumpState.isDumping(DumpState.DUMP_PERMISSIONS)) { mSettings.dumpPermissions(pw, packageName, permissionNames, dumpState); } - if (!checkin - && dumpState.isDumping(DumpState.DUMP_PROVIDERS)) { + if (!checkin && dumpState.isDumping(DumpState.DUMP_PROVIDERS)) { synchronized (mLock) { mComponentResolver.dumpContentProviders(pw, dumpState, packageName); } } - if (!checkin - && dumpState.isDumping(DumpState.DUMP_KEYSETS)) { + if (!checkin && dumpState.isDumping(DumpState.DUMP_KEYSETS)) { synchronized (mLock) { mSettings.getKeySetManagerService().dumpLPr(pw, packageName, dumpState); } @@ -24157,15 +24140,11 @@ public class PackageManagerService extends IPackageManager.Stub } } - if (!checkin - && dumpState.isDumping(DumpState.DUMP_QUERIES) - && packageName == null) { + if (dumpState.isDumping(DumpState.DUMP_QUERIES)) { dump(DumpState.DUMP_QUERIES, fd, pw, dumpState); } - if (!checkin - && dumpState.isDumping(DumpState.DUMP_SHARED_USERS) - && packageName == null) { + if (dumpState.isDumping(DumpState.DUMP_SHARED_USERS)) { // This cannot be moved to ComputerEngine since the set of packages in the // SharedUserSetting do not have a copy. synchronized (mLock) { @@ -24173,9 +24152,7 @@ public class PackageManagerService extends IPackageManager.Stub } } - if (!checkin - && dumpState.isDumping(DumpState.DUMP_CHANGES) - && packageName == null) { + if (dumpState.isDumping(DumpState.DUMP_CHANGES)) { if (dumpState.onTitlePrinted()) pw.println(); pw.println("Package Changes:"); synchronized (mLock) { @@ -24202,9 +24179,7 @@ public class PackageManagerService extends IPackageManager.Stub } } - if (!checkin - && dumpState.isDumping(DumpState.DUMP_FROZEN) - && packageName == null) { + if (!checkin && dumpState.isDumping(DumpState.DUMP_FROZEN) && packageName == null) { // XXX should handle packageName != null by dumping only install data that // the given package is involved with. if (dumpState.onTitlePrinted()) pw.println(); @@ -24225,9 +24200,7 @@ public class PackageManagerService extends IPackageManager.Stub ipw.decreaseIndent(); } - if (!checkin - && dumpState.isDumping(DumpState.DUMP_VOLUMES) - && packageName == null) { + if (!checkin && dumpState.isDumping(DumpState.DUMP_VOLUMES) && packageName == null) { if (dumpState.onTitlePrinted()) pw.println(); final IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ", 120); @@ -24246,61 +24219,50 @@ public class PackageManagerService extends IPackageManager.Stub ipw.decreaseIndent(); } - if (!checkin - && dumpState.isDumping(DumpState.DUMP_SERVICE_PERMISSIONS) + if (!checkin && dumpState.isDumping(DumpState.DUMP_SERVICE_PERMISSIONS) && packageName == null) { synchronized (mLock) { mComponentResolver.dumpServicePermissions(pw, dumpState); } } - if (!checkin - && dumpState.isDumping(DumpState.DUMP_DEXOPT) - && packageName == null) { + if (!checkin && dumpState.isDumping(DumpState.DUMP_DEXOPT)) { if (dumpState.onTitlePrinted()) pw.println(); dump(DumpState.DUMP_DEXOPT, fd, pw, dumpState); } - if (!checkin - && dumpState.isDumping(DumpState.DUMP_COMPILER_STATS) - && packageName == null) { + if (!checkin && dumpState.isDumping(DumpState.DUMP_COMPILER_STATS)) { if (dumpState.onTitlePrinted()) pw.println(); dump(DumpState.DUMP_COMPILER_STATS, fd, pw, dumpState); } - if (dumpState.isDumping(DumpState.DUMP_MESSAGES) - && packageName == null) { - if (!checkin) { - if (dumpState.onTitlePrinted()) pw.println(); - synchronized (mLock) { - mSettings.dumpReadMessagesLPr(pw, dumpState); - } - pw.println(); - pw.println("Package warning messages:"); - dumpCriticalInfo(pw, null); - } else { - dumpCriticalInfo(pw, "msg,"); + if (!checkin && dumpState.isDumping(DumpState.DUMP_MESSAGES) && packageName == null) { + if (dumpState.onTitlePrinted()) pw.println(); + synchronized (mLock) { + mSettings.dumpReadMessagesLPr(pw, dumpState); } + pw.println(); + pw.println("Package warning messages:"); + dumpCriticalInfo(pw, null); + } + + if (checkin && dumpState.isDumping(DumpState.DUMP_MESSAGES)) { + dumpCriticalInfo(pw, "msg,"); } // PackageInstaller should be called outside of mPackages lock - if (!checkin - && dumpState.isDumping(DumpState.DUMP_INSTALLS) - && packageName == null) { + if (!checkin && dumpState.isDumping(DumpState.DUMP_INSTALLS) && packageName == null) { // XXX should handle packageName != null by dumping only install data that // the given package is involved with. if (dumpState.onTitlePrinted()) pw.println(); mInstallerService.dump(new IndentingPrintWriter(pw, " ", 120)); } - if (!checkin - && dumpState.isDumping(DumpState.DUMP_APEX) - && packageName == null) { + if (!checkin && dumpState.isDumping(DumpState.DUMP_APEX)) { mApexManager.dump(pw, packageName); } - if (!checkin - && dumpState.isDumping(DumpState.DUMP_PER_UID_READ_TIMEOUTS) + if (!checkin && dumpState.isDumping(DumpState.DUMP_PER_UID_READ_TIMEOUTS) && packageName == null) { pw.println(); pw.println("Per UID read timeouts:"); @@ -24319,9 +24281,7 @@ public class PackageManagerService extends IPackageManager.Stub } } - if (!checkin - && dumpState.isDumping(DumpState.DUMP_SNAPSHOT_STATISTICS) - && packageName == null) { + if (!checkin && dumpState.isDumping(DumpState.DUMP_SNAPSHOT_STATISTICS)) { pw.println("Snapshot statistics"); if (!mSnapshotEnabled) { pw.println(" Snapshots disabled"); -- cgit v1.2.3 From f13eac9f7e0231f3cfe52dafd4bb3e96893e9f9c Mon Sep 17 00:00:00 2001 From: Vishnu Nair Date: Fri, 30 Jul 2021 16:07:47 -0700 Subject: SurfaceView: Synchronize destframe updates with SurfaceView size changes This CL fixes one of the issues with SurfaceView parent frame and content syncing. With BLAST, we have two surface controls each setting a scale. The parent surface control sets a scale based on the requested surface size and the SurfaceView layout size. The BlastBufferQueue surface control scales the buffer to the requested buffer size if the buffer has the appropriate scale mode. The destination frame controls the second scaling and it must be applied with the parent surface scale changes. This cl fixes flickers where the requested fixed surface size changes without any view size changes. This cl allows the caller to pass in a transaction to BLASTBufferQueue#update which is updated with the destination frame changes. This transaction can then be applied with the parent surface changes. This also fixes an issue where destination Frame was being set on every buffer update and when we updated the BlastBufferQueue size. Since buffer transactions can be queued up on the server side, a stale value maybe applied for a few frames causing flickers. Fixes: 194458377 Test: bug repro steps Test: atest SurfaceViewSyncTest#testSurfaceViewSetFixedSize Change-Id: I118bd1c3942b389e3951c3fd7389403895fc7b31 --- core/java/android/view/SurfaceView.java | 2 +- core/jni/android_graphics_BLASTBufferQueue.cpp | 8 +++++--- graphics/java/android/graphics/BLASTBufferQueue.java | 10 ++++++++-- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index f21d855ddcf9..6c2d6a1c3f2e 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -1242,7 +1242,7 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall mBlastSurfaceControl.setTransformHint(mTransformHint); if (mBlastBufferQueue != null) { mBlastBufferQueue.update(mBlastSurfaceControl, mSurfaceWidth, mSurfaceHeight, - mFormat); + mFormat, transaction); } } else { transaction.setBufferSize(mSurfaceControl, mSurfaceWidth, mSurfaceHeight); diff --git a/core/jni/android_graphics_BLASTBufferQueue.cpp b/core/jni/android_graphics_BLASTBufferQueue.cpp index b46b5a23e3fb..d4ae6d769cf7 100644 --- a/core/jni/android_graphics_BLASTBufferQueue.cpp +++ b/core/jni/android_graphics_BLASTBufferQueue.cpp @@ -105,9 +105,11 @@ static void nativeSetNextTransaction(JNIEnv* env, jclass clazz, jlong ptr, jlong } static void nativeUpdate(JNIEnv* env, jclass clazz, jlong ptr, jlong surfaceControl, jlong width, - jlong height, jint format) { + jlong height, jint format, jlong transactionPtr) { sp queue = reinterpret_cast(ptr); - queue->update(reinterpret_cast(surfaceControl), width, height, format); + auto transaction = reinterpret_cast(transactionPtr); + queue->update(reinterpret_cast(surfaceControl), width, height, format, + transaction); } static void nativeFlushShadowQueue(JNIEnv* env, jclass clazz, jlong ptr) { @@ -144,7 +146,7 @@ static const JNINativeMethod gMethods[] = { {"nativeGetSurface", "(JZ)Landroid/view/Surface;", (void*)nativeGetSurface}, {"nativeDestroy", "(J)V", (void*)nativeDestroy}, {"nativeSetNextTransaction", "(JJ)V", (void*)nativeSetNextTransaction}, - {"nativeUpdate", "(JJJJI)V", (void*)nativeUpdate}, + {"nativeUpdate", "(JJJJIJ)V", (void*)nativeUpdate}, {"nativeFlushShadowQueue", "(J)V", (void*)nativeFlushShadowQueue}, {"nativeMergeWithNextTransaction", "(JJJ)V", (void*)nativeMergeWithNextTransaction}, {"nativeSetTransactionCompleteCallback", diff --git a/graphics/java/android/graphics/BLASTBufferQueue.java b/graphics/java/android/graphics/BLASTBufferQueue.java index 6c1c2ee1ee57..36215ecc1403 100644 --- a/graphics/java/android/graphics/BLASTBufferQueue.java +++ b/graphics/java/android/graphics/BLASTBufferQueue.java @@ -33,7 +33,7 @@ public final class BLASTBufferQueue { private static native Surface nativeGetSurface(long ptr, boolean includeSurfaceControlHandle); private static native void nativeSetNextTransaction(long ptr, long transactionPtr); private static native void nativeUpdate(long ptr, long surfaceControl, long width, long height, - int format); + int format, long transactionPtr); private static native void nativeFlushShadowQueue(long ptr); private static native void nativeMergeWithNextTransaction(long ptr, long transactionPtr, long frameNumber); @@ -92,9 +92,15 @@ public final class BLASTBufferQueue { * @param width The new width for the buffer. * @param height The new height for the buffer. * @param format The new format for the buffer. + * @param t Adds destination frame changes to the passed in transaction. */ + public void update(SurfaceControl sc, int width, int height, @PixelFormat.Format int format, + SurfaceControl.Transaction t) { + nativeUpdate(mNativeObject, sc.mNativeObject, width, height, format, t.mNativeObject); + } + public void update(SurfaceControl sc, int width, int height, @PixelFormat.Format int format) { - nativeUpdate(mNativeObject, sc.mNativeObject, width, height, format); + nativeUpdate(mNativeObject, sc.mNativeObject, width, height, format, 0); } /** -- cgit v1.2.3 From b055139948fe2a2071c03a6da33b8531223dcf73 Mon Sep 17 00:00:00 2001 From: Kevin Chyn Date: Fri, 30 Jul 2021 15:16:48 -0700 Subject: Ensure authentication lifecycle ends for callers Bug: 194970282 Bug: 193089985 In coex, we introduced the capability to temporarily store face auth results if fingerprint auth was still in progress. However, upon successful fingerprint auth, we forgot to notify the caller that fingerprint lifecycle is ended. Since the purpose of coex is to distill auth callbacks for keyguard, we should send ERROR_CANCELED for face, since fingerprint sends auth success. Test: atest CoexCoordinatorTest Test: manual, see new "Removing from queue, canceling, and finishing" log. Keyguard face auth is no longer wedged Change-Id: If809a9338f7a96bb1f039626bff8efacbcec509e --- .../biometrics/sensors/AuthenticationClient.java | 28 +++++++++++++++++++++- .../server/biometrics/sensors/CoexCoordinator.java | 17 +++++++++++-- .../biometrics/sensors/CoexCoordinatorTest.java | 23 +++++++++++------- 3 files changed, 56 insertions(+), 12 deletions(-) diff --git a/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java index f4327e8a104d..705b3aa12391 100644 --- a/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java @@ -180,7 +180,8 @@ public abstract class AuthenticationClient extends AcquisitionClient + ", isBP: " + isBiometricPrompt() + ", listener: " + listener + ", requireConfirmation: " + mRequireConfirmation - + ", user: " + getTargetUserId()); + + ", user: " + getTargetUserId() + + ", clientMonitor: " + toString()); final PerformanceTracker pm = PerformanceTracker.getInstanceForSensorId(getSensorId()); if (isCryptoOperation()) { @@ -304,6 +305,11 @@ public abstract class AuthenticationClient extends AcquisitionClient public void handleLifecycleAfterAuth() { AuthenticationClient.this.handleLifecycleAfterAuth(true /* authenticated */); } + + @Override + public void sendAuthenticationCanceled() { + sendCancelOnly(listener); + } }); } else { // Allow system-defined limit of number of attempts before giving up @@ -338,10 +344,30 @@ public abstract class AuthenticationClient extends AcquisitionClient public void handleLifecycleAfterAuth() { AuthenticationClient.this.handleLifecycleAfterAuth(false /* authenticated */); } + + @Override + public void sendAuthenticationCanceled() { + sendCancelOnly(listener); + } }); } } + private void sendCancelOnly(@Nullable ClientMonitorCallbackConverter listener) { + if (listener == null) { + Slog.e(TAG, "Unable to sendAuthenticationCanceled, listener null"); + return; + } + try { + listener.onError(getSensorId(), + getCookie(), + BiometricConstants.BIOMETRIC_ERROR_CANCELED, + 0 /* vendorCode */); + } catch (RemoteException e) { + Slog.e(TAG, "Remote exception", e); + } + } + @Override public void onAcquired(int acquiredInfo, int vendorCode) { super.onAcquired(acquiredInfo, vendorCode); diff --git a/services/core/java/com/android/server/biometrics/sensors/CoexCoordinator.java b/services/core/java/com/android/server/biometrics/sensors/CoexCoordinator.java index a15ecada3cae..6d32fdebe582 100644 --- a/services/core/java/com/android/server/biometrics/sensors/CoexCoordinator.java +++ b/services/core/java/com/android/server/biometrics/sensors/CoexCoordinator.java @@ -73,6 +73,11 @@ public class CoexCoordinator { * from scheduler if auth was successful). */ void handleLifecycleAfterAuth(); + + /** + * Requests the owner to notify the caller that authentication was canceled. + */ + void sendAuthenticationCanceled(); } private static CoexCoordinator sInstance; @@ -356,7 +361,11 @@ public class CoexCoordinator { private SuccessfulAuth popSuccessfulFaceAuthIfExists(long currentTimeMillis) { for (SuccessfulAuth auth : mSuccessfulAuths) { if (currentTimeMillis - auth.mAuthTimestamp >= SUCCESSFUL_AUTH_VALID_DURATION_MS) { - Slog.d(TAG, "Removing stale auth: " + auth); + // TODO(b/193089985): This removes the auth but does not notify the client with + // an appropriate lifecycle event (such as ERROR_CANCELED), and violates the + // API contract. However, this might be OK for now since the validity duration + // is way longer than the time it takes to auth with fingerprint. + Slog.e(TAG, "Removing stale auth: " + auth); mSuccessfulAuths.remove(auth); } else if (auth.mSensorType == SENSOR_TYPE_FACE) { mSuccessfulAuths.remove(auth); @@ -367,9 +376,13 @@ public class CoexCoordinator { } private void removeAndFinishAllFaceFromQueue() { + // Note that these auth are all successful, but have never notified the client (e.g. + // keyguard). To comply with the authentication lifecycle, we must notify the client that + // auth is "done". The safest thing to do is to send ERROR_CANCELED. for (SuccessfulAuth auth : mSuccessfulAuths) { if (auth.mSensorType == SENSOR_TYPE_FACE) { - Slog.d(TAG, "Removing from queue and finishing: " + auth); + Slog.d(TAG, "Removing from queue, canceling, and finishing: " + auth); + auth.mCallback.sendAuthenticationCanceled(); auth.mCallback.handleLifecycleAfterAuth(); mSuccessfulAuths.remove(auth); } diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/CoexCoordinatorTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/CoexCoordinatorTest.java index 7f5f3c2df077..1263f7b84db1 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/CoexCoordinatorTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/CoexCoordinatorTest.java @@ -255,13 +255,16 @@ public class CoexCoordinatorTest { mCoexCoordinator.addAuthenticationClient(SENSOR_TYPE_FACE, faceClient); mCoexCoordinator.addAuthenticationClient(SENSOR_TYPE_UDFPS, udfpsClient); + // For easier reading + final CoexCoordinator.Callback faceCallback = mCallback; + mCoexCoordinator.onAuthenticationSucceeded(0 /* currentTimeMillis */, faceClient, - mCallback); - verify(mCallback, never()).sendHapticFeedback(); - verify(mCallback, never()).sendAuthenticationResult(anyBoolean()); + faceCallback); + verify(faceCallback, never()).sendHapticFeedback(); + verify(faceCallback, never()).sendAuthenticationResult(anyBoolean()); // CoexCoordinator requests the system to hold onto this AuthenticationClient until // UDFPS result is known - verify(mCallback, never()).handleLifecycleAfterAuth(); + verify(faceCallback, never()).handleLifecycleAfterAuth(); // Reset the mock CoexCoordinator.Callback udfpsCallback = mock(CoexCoordinator.Callback.class); @@ -274,6 +277,8 @@ public class CoexCoordinatorTest { verify(udfpsCallback).sendAuthenticationResult(true /* addAuthTokenIfStrong */); verify(udfpsCallback).handleLifecycleAfterAuth(); + verify(faceCallback).sendAuthenticationCanceled(); + assertTrue(mCoexCoordinator.mSuccessfulAuths.isEmpty()); } else { mCoexCoordinator.onAuthenticationRejected(udfpsRejectedAfterMs, udfpsClient, @@ -281,16 +286,16 @@ public class CoexCoordinatorTest { if (udfpsRejectedAfterMs <= CoexCoordinator.SUCCESSFUL_AUTH_VALID_DURATION_MS) { verify(udfpsCallback, never()).sendHapticFeedback(); - verify(mCallback).sendHapticFeedback(); - verify(mCallback).sendAuthenticationResult(eq(true) /* addAuthTokenIfStrong */); - verify(mCallback).handleLifecycleAfterAuth(); + verify(faceCallback).sendHapticFeedback(); + verify(faceCallback).sendAuthenticationResult(eq(true) /* addAuthTokenIfStrong */); + verify(faceCallback).handleLifecycleAfterAuth(); assertTrue(mCoexCoordinator.mSuccessfulAuths.isEmpty()); } else { assertTrue(mCoexCoordinator.mSuccessfulAuths.isEmpty()); - verify(mCallback, never()).sendHapticFeedback(); - verify(mCallback, never()).sendAuthenticationResult(anyBoolean()); + verify(faceCallback, never()).sendHapticFeedback(); + verify(faceCallback, never()).sendAuthenticationResult(anyBoolean()); verify(udfpsCallback).sendHapticFeedback(); verify(udfpsCallback) -- cgit v1.2.3 From b55d314f4685fb459307deff88ddfc704ecc4faa Mon Sep 17 00:00:00 2001 From: Rhed Jao Date: Fri, 30 Jul 2021 15:52:05 +0800 Subject: DO NOT MERGE Apply a maximum char count to the load label api The system is overwhelmed by an enormous label string returned by the load label api. This cl truncates the label string if it exceeds the maximum safe length. Also update the max safe label length to 1000 characters, which is enough. Bug: 67013844 Test: atest PackageManagerTest Change-Id: Ia4d768cc93a47cfb8b6f7c4b6dc73abd801809bd Merged-in: Ia4d768cc93a47cfb8b6f7c4b6dc73abd801809bd --- core/java/android/content/pm/PackageItemInfo.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core/java/android/content/pm/PackageItemInfo.java b/core/java/android/content/pm/PackageItemInfo.java index 52e28a4b4b9b..d676cde9005d 100644 --- a/core/java/android/content/pm/PackageItemInfo.java +++ b/core/java/android/content/pm/PackageItemInfo.java @@ -93,7 +93,7 @@ public class PackageItemInfo { private static final float MAX_LABEL_SIZE_PX = 500f; /** The maximum length of a safe label, in characters */ - private static final int MAX_SAFE_LABEL_LENGTH = 50000; + private static final int MAX_SAFE_LABEL_LENGTH = 1000; private static volatile boolean sForceSafeLabels = false; @@ -191,7 +191,9 @@ public class PackageItemInfo { if (sForceSafeLabels) { return loadSafeLabel(pm); } else { - return loadUnsafeLabel(pm); + // Trims the label string to the MAX_SAFE_LABEL_LENGTH. This is to prevent that the + // system is overwhelmed by an enormous string returned by the application. + return TextUtils.trimToSize(loadUnsafeLabel(pm), MAX_SAFE_LABEL_LENGTH); } } -- cgit v1.2.3 From f4f68a3eb273ee2cdd9dd6102b01d045c927af8d Mon Sep 17 00:00:00 2001 From: Ming-Shin Lu Date: Fri, 30 Jul 2021 14:51:27 +0800 Subject: Fix Stay on 'SELECT INPUT METHOD' page after choosing input method CL[1] aims to fix a potential ANR issue happen when the IME focused app popup IME picker dialog and then switching another task through status bar settings button or notifications, system will filter the IME selection dialog window to not be the focused window when finding the next focus during switching to the next task. However, that filtering rule mistakes to ignore the IME picker dialog as focus window when Gboard 'SELECT INPUT METHOD' page popup IME picker dialog by using IMM#showInputMethodPicker (i.e. Gboard page still keeps focused), so that after choosed input method from picker, Gboard page will not receive onWindowFocusChanged callback to update the IME selection status, because the page has already focused. To fix this window focus issue of IME picker dialog and CL[1] issue scenerio , use WindowState#isAnimating() to check if the app window with IME picker dialog is under app transitioning, if so, then we can say it's safe to ignore IME picker focus. [1]: Iae3dd713b1e980067d28debea4e0a03707aa7938 Bug: 195073688 Bug: 194214768 Test: atest InputMethodManagerTest#testShowInputMethodPicker Test: atest atest DisplayContentTests#\ testImeMenuDialogFocusWhenImeLayeringTargetChanges Test: manual as issue steps: 0. Current input method is not Gboard (Canary). 1. Tap Gboard (Canary) icon on App list. 2. Tap 'SELECT INPUT METHOD' icon and select Gboard (Canary). 3. Verify the IME status should updated after dismissed IME picker dialog. Change-Id: I771d9817cd6dfcb1bf0d576d94bea9d1b9adc80e --- .../core/java/com/android/server/wm/DisplayContent.java | 16 ++++++++-------- .../src/com/android/server/wm/DisplayContentTests.java | 3 +++ 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 4c1142257218..1b799dfbdaab 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -733,15 +733,15 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp // dismissing during the task switching to keep the window focus because IME window has // higher window hierarchy, we don't give it focus if the next IME layering target // doesn't request IME visible. - if (w.mIsImWindow && (mImeLayeringTarget == null + if (w.mIsImWindow && w.isChildWindow() && (mImeLayeringTarget == null || !mImeLayeringTarget.getRequestedVisibility(ITYPE_IME))) { - if (w.mAttrs.type == TYPE_INPUT_METHOD_DIALOG) { - return false; - } - - if (w.isChildWindow()) { - return false; - } + return false; + } + if (w.mAttrs.type == TYPE_INPUT_METHOD_DIALOG && mImeLayeringTarget != null + && !mImeLayeringTarget.getRequestedVisibility(ITYPE_IME) + && mImeLayeringTarget.isAnimating(PARENTS | TRANSITION, + ANIMATION_TYPE_APP_TRANSITION)) { + return false; } final ActivityRecord activity = w.mActivityRecord; 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 c60b8dcf67cf..12fc2f4ea1f4 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java @@ -2223,6 +2223,9 @@ public class DisplayContentTests extends WindowTestsBase { // request IME visible. final WindowState nextImeAppTarget = createWindow(null, TYPE_BASE_APPLICATION, mDisplayContent, "nextImeAppTarget"); + spyOn(nextImeAppTarget); + doReturn(true).when(nextImeAppTarget).isAnimating(PARENTS | TRANSITION, + ANIMATION_TYPE_APP_TRANSITION); mDisplayContent.setImeLayeringTarget(nextImeAppTarget); assertNotEquals(imeMenuDialog, mDisplayContent.findFocusedWindow()); } -- cgit v1.2.3 From 7309d543f7c3e50271c5179ccfccaf91db3c7332 Mon Sep 17 00:00:00 2001 From: Makoto Onuki Date: Mon, 2 Aug 2021 09:31:18 -0700 Subject: Make FGS_BG_START_RESTRICTION_CHANGE_ID @Overridable Bug: 194694732 Test: Build Change-Id: I34fa09edcc627222ae6b98c79fd3f37cfab13aa4 --- services/core/java/com/android/server/am/ActiveServices.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index 795d3d6c3461..eeb08e69c255 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -102,6 +102,7 @@ import android.app.usage.UsageEvents; import android.appwidget.AppWidgetManagerInternal; import android.compat.annotation.ChangeId; import android.compat.annotation.EnabledSince; +import android.compat.annotation.Overridable; import android.content.ComponentName; import android.content.ComponentName.WithComponentName; import android.content.Context; @@ -307,6 +308,7 @@ public final class ActiveServices { */ @ChangeId @EnabledSince(targetSdkVersion = android.os.Build.VERSION_CODES.S) + @Overridable static final long FGS_BG_START_RESTRICTION_CHANGE_ID = 170668199L; /** -- cgit v1.2.3 From 8bb9d293d6481294eb2c6149f4cba627a6b61fe5 Mon Sep 17 00:00:00 2001 From: Lee Shombert Date: Thu, 22 Jul 2021 11:58:26 -0700 Subject: PackageSetting now owns its PackageUserState Bug: 194349419 The PackageSetting snapshot now clones the PackageUserState rather than simply copying the reference. Test: atest * CtsContentTestCases:IntentFilterTest * CtsDynamicMimeHostTestCases * CtsRoleTestCases * FrameworksServicesTests:UserSystemPackageInstallerTest * FrameworksServicesTests:PackageManagerSettingsTests * FrameworksServicesTests:PackageManagerServiceTest * FrameworksServicesTests:AppsFilterTest * FrameworksServicesTests:PackageInstallerSessionTest * FrameworksServicesTests:ScanTests * UserLifecycleTests#startUser * UserLifecycleTests#stopUser * UserLifecycleTests#switchUser * FrameworksServicesTests:WatcherTest * android.appsecurity.cts.EphemeralTest * android.appsecurity.cts.InstantAppUserTest Change-Id: I27d26e0a34e445bf2e67139199d8ec7fb1b73583 --- .../com/android/server/pm/PackageSettingBase.java | 48 ++++++++++++++++++++-- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/pm/PackageSettingBase.java b/services/core/java/com/android/server/pm/PackageSettingBase.java index bf82bd8b09d5..88dd03333262 100644 --- a/services/core/java/com/android/server/pm/PackageSettingBase.java +++ b/services/core/java/com/android/server/pm/PackageSettingBase.java @@ -176,6 +176,10 @@ public abstract class PackageSettingBase extends SettingBase { name = orig.name; realName = orig.realName; doCopy(orig); + // Clone the user states. + for (int i = 0; i < mUserState.size(); i++) { + mUserState.put(mUserState.keyAt(i), new PackageUserState(mUserState.valueAt(i))); + } } public void setInstallerPackageName(String packageName) { @@ -314,6 +318,7 @@ public abstract class PackageSettingBase extends SettingBase { void setInstalled(boolean inst, int userId) { modifyUserState(userId).installed = inst; + onChanged(); } boolean getInstalled(int userId) { @@ -326,6 +331,7 @@ public abstract class PackageSettingBase extends SettingBase { void setInstallReason(int installReason, int userId) { modifyUserState(userId).installReason = installReason; + onChanged(); } int getUninstallReason(int userId) { @@ -334,10 +340,13 @@ public abstract class PackageSettingBase extends SettingBase { void setUninstallReason(@UninstallReason int uninstallReason, int userId) { modifyUserState(userId).uninstallReason = uninstallReason; + onChanged(); } boolean setOverlayPaths(OverlayPaths overlayPaths, int userId) { - return modifyUserState(userId).setOverlayPaths(overlayPaths); + boolean returnValue = modifyUserState(userId).setOverlayPaths(overlayPaths); + onChanged(); + return returnValue; } OverlayPaths getOverlayPaths(int userId) { @@ -346,7 +355,10 @@ public abstract class PackageSettingBase extends SettingBase { boolean setOverlayPathsForLibrary(String libName, OverlayPaths overlayPaths, int userId) { - return modifyUserState(userId).setSharedLibraryOverlayPaths(libName, overlayPaths); + boolean returnValue = modifyUserState(userId) + .setSharedLibraryOverlayPaths(libName, overlayPaths); + onChanged(); + return returnValue; } Map getOverlayPathsForLibrary(int userId) { @@ -395,6 +407,7 @@ public abstract class PackageSettingBase extends SettingBase { void setCeDataInode(long ceDataInode, int userId) { modifyUserState(userId).ceDataInode = ceDataInode; + onChanged(); } boolean getStopped(int userId) { @@ -403,6 +416,7 @@ public abstract class PackageSettingBase extends SettingBase { void setStopped(boolean stop, int userId) { modifyUserState(userId).stopped = stop; + onChanged(); } boolean getNotLaunched(int userId) { @@ -411,6 +425,7 @@ public abstract class PackageSettingBase extends SettingBase { void setNotLaunched(boolean stop, int userId) { modifyUserState(userId).notLaunched = stop; + onChanged(); } boolean getHidden(int userId) { @@ -419,6 +434,7 @@ public abstract class PackageSettingBase extends SettingBase { void setHidden(boolean hidden, int userId) { modifyUserState(userId).hidden = hidden; + onChanged(); } int getDistractionFlags(int userId) { @@ -427,6 +443,7 @@ public abstract class PackageSettingBase extends SettingBase { void setDistractionFlags(int distractionFlags, int userId) { modifyUserState(userId).distractionFlags = distractionFlags; + onChanged(); } boolean getSuspended(int userId) { @@ -487,6 +504,7 @@ public abstract class PackageSettingBase extends SettingBase { void setInstantApp(boolean instantApp, int userId) { modifyUserState(userId).instantApp = instantApp; + onChanged(); } boolean getVirtulalPreload(int userId) { @@ -495,6 +513,7 @@ public abstract class PackageSettingBase extends SettingBase { void setVirtualPreload(boolean virtualPreload, int userId) { modifyUserState(userId).virtualPreload = virtualPreload; + onChanged(); } void setUserState(int userId, long ceDataInode, int enabled, boolean installed, boolean stopped, @@ -547,20 +566,24 @@ public abstract class PackageSettingBase extends SettingBase { void setEnabledComponents(ArraySet components, int userId) { modifyUserState(userId).enabledComponents = components; + onChanged(); } void setDisabledComponents(ArraySet components, int userId) { modifyUserState(userId).disabledComponents = components; + onChanged(); } void setEnabledComponentsCopy(ArraySet components, int userId) { modifyUserState(userId).enabledComponents = components != null ? new ArraySet(components) : null; + onChanged(); } void setDisabledComponentsCopy(ArraySet components, int userId) { modifyUserState(userId).disabledComponents = components != null ? new ArraySet(components) : null; + onChanged(); } PackageUserState modifyUserStateComponents(int userId, boolean disabled, boolean enabled) { @@ -582,10 +605,12 @@ public abstract class PackageSettingBase extends SettingBase { void addDisabledComponent(String componentClassName, int userId) { modifyUserStateComponents(userId, true, false).disabledComponents.add(componentClassName); + onChanged(); } void addEnabledComponent(String componentClassName, int userId) { modifyUserStateComponents(userId, false, true).enabledComponents.add(componentClassName); + onChanged(); } boolean enableComponentLPw(String componentClassName, int userId) { @@ -593,6 +618,9 @@ public abstract class PackageSettingBase extends SettingBase { boolean changed = state.disabledComponents != null ? state.disabledComponents.remove(componentClassName) : false; changed |= state.enabledComponents.add(componentClassName); + if (changed) { + onChanged(); + } return changed; } @@ -601,6 +629,9 @@ public abstract class PackageSettingBase extends SettingBase { boolean changed = state.enabledComponents != null ? state.enabledComponents.remove(componentClassName) : false; changed |= state.disabledComponents.add(componentClassName); + if (changed) { + onChanged(); + } return changed; } @@ -610,6 +641,9 @@ public abstract class PackageSettingBase extends SettingBase { ? state.disabledComponents.remove(componentClassName) : false; changed |= state.enabledComponents != null ? state.enabledComponents.remove(componentClassName) : false; + if (changed) { + onChanged(); + } return changed; } @@ -701,6 +735,7 @@ public abstract class PackageSettingBase extends SettingBase { PackageSettingBase setPath(@NonNull File path) { this.mPath = path; this.mPathString = path.toString(); + onChanged(); return this; } @@ -722,7 +757,9 @@ public abstract class PackageSettingBase extends SettingBase { @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) public boolean overrideNonLocalizedLabelAndIcon(@NonNull ComponentName component, @Nullable String label, @Nullable Integer icon, @UserIdInt int userId) { - return modifyUserState(userId).overrideLabelAndIcon(component, label, icon); + boolean returnValue = modifyUserState(userId).overrideLabelAndIcon(component, label, icon); + onChanged(); + return returnValue; } /** @@ -732,6 +769,7 @@ public abstract class PackageSettingBase extends SettingBase { */ public void resetOverrideComponentLabelIcon(@UserIdInt int userId) { modifyUserState(userId).resetOverrideComponentLabelIcon(); + onChanged(); } /** @@ -741,6 +779,7 @@ public abstract class PackageSettingBase extends SettingBase { */ public void setSplashScreenTheme(@UserIdInt int userId, @Nullable String themeName) { modifyUserState(userId).splashScreenTheme = themeName; + onChanged(); } /** @@ -776,6 +815,7 @@ public abstract class PackageSettingBase extends SettingBase { */ public void setStatesOnCommit() { incrementalStates.onCommit(IncrementalManager.isIncrementalPath(getPathString())); + onChanged(); } /** @@ -783,6 +823,7 @@ public abstract class PackageSettingBase extends SettingBase { */ public void setIncrementalStatesCallback(IncrementalStates.Callback callback) { incrementalStates.setCallback(callback); + onChanged(); } /** @@ -791,6 +832,7 @@ public abstract class PackageSettingBase extends SettingBase { */ public void setLoadingProgress(float progress) { incrementalStates.setProgress(progress); + onChanged(); } public long getFirstInstallTime() { -- cgit v1.2.3 From 86c337659ab682401d3bbc0fdd71404d15e3d89d Mon Sep 17 00:00:00 2001 From: Nate Myren Date: Thu, 29 Jul 2021 16:10:34 -0700 Subject: Revert sync app op chain changes These changes cause some noted app ops to be swallowed due to one-way app ops. Fixes: 187721493 Test: atest AppOpsLoggingTest Change-Id: I3b761b65b2e06138fc1d130bf80587f8885bb1d5 --- core/java/android/app/AppOpsManager.java | 203 +++++++++++---------- core/java/android/app/SyncNotedAppOp.java | 3 +- core/java/android/os/BinderProxy.java | 5 + .../com/android/server/appop/AppOpsService.java | 2 +- 4 files changed, 111 insertions(+), 102 deletions(-) diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index 4ddb546a351e..bb7cdfa1a1ea 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -2849,14 +2849,14 @@ public class AppOpsManager { private static final ThreadLocal sBinderThreadCallingUid = new ThreadLocal<>(); /** - * If a thread is currently executing a two-way binder transaction, this stores the - * ops that were noted blaming any app (the caller, the caller of the caller, etc). + * If a thread is currently executing a two-way binder transaction, this stores the op-codes of + * the app-ops that were noted during this transaction. * * @see #getNotedOpCollectionMode * @see #collectNotedOpSync */ - private static final ThreadLocal>> - sAppOpsNotedInThisBinderTransaction = new ThreadLocal<>(); + private static final ThreadLocal> sAppOpsNotedInThisBinderTransaction = + new ThreadLocal<>(); /** Whether noting for an appop should be collected */ private static final @ShouldCollectNoteOp byte[] sAppOpsToNote = new byte[_NUM_OP]; @@ -9051,6 +9051,66 @@ public class AppOpsManager { sBinderThreadCallingUid.set(callingUid); } + /** + * State of a temporarily paused noted app-ops collection. + * + * @see #pauseNotedAppOpsCollection() + * + * @hide + */ + public static class PausedNotedAppOpsCollection { + final int mUid; + final @Nullable ArrayMap mCollectedNotedAppOps; + + PausedNotedAppOpsCollection(int uid, @Nullable ArrayMap collectedNotedAppOps) { + mUid = uid; + mCollectedNotedAppOps = collectedNotedAppOps; + } + } + + /** + * Temporarily suspend collection of noted app-ops when binder-thread calls into the other + * process. During such a call there might be call-backs coming back on the same thread which + * should not be accounted to the current collection. + * + * @return a state needed to resume the collection + * + * @hide + */ + public static @Nullable PausedNotedAppOpsCollection pauseNotedAppOpsCollection() { + Integer previousUid = sBinderThreadCallingUid.get(); + if (previousUid != null) { + ArrayMap previousCollectedNotedAppOps = + sAppOpsNotedInThisBinderTransaction.get(); + + sBinderThreadCallingUid.remove(); + sAppOpsNotedInThisBinderTransaction.remove(); + + return new PausedNotedAppOpsCollection(previousUid, previousCollectedNotedAppOps); + } + + return null; + } + + /** + * Resume a collection paused via {@link #pauseNotedAppOpsCollection}. + * + * @param prevCollection The state of the previous collection + * + * @hide + */ + public static void resumeNotedAppOpsCollection( + @Nullable PausedNotedAppOpsCollection prevCollection) { + if (prevCollection != null) { + sBinderThreadCallingUid.set(prevCollection.mUid); + + if (prevCollection.mCollectedNotedAppOps != null) { + sAppOpsNotedInThisBinderTransaction.set(prevCollection.mCollectedNotedAppOps); + } + } + } + /** * Finish collection of noted appops on this thread. * @@ -9091,47 +9151,26 @@ public class AppOpsManager { */ @TestApi public static void collectNotedOpSync(@NonNull SyncNotedAppOp syncOp) { - collectNotedOpSync(sOpStrToOp.get(syncOp.getOp()), syncOp.getAttributionTag(), - syncOp.getPackageName()); - } - - /** - * Collect a noted op when inside of a two-way binder call. - * - *

Delivered to caller via {@link #prefixParcelWithAppOpsIfNeeded} - * - * @param code the op code to note for - * @param attributionTag the attribution tag to note for - * @param packageName the package to note for - */ - private static void collectNotedOpSync(int code, @Nullable String attributionTag, - @NonNull String packageName) { // If this is inside of a two-way binder call: // We are inside of a two-way binder call. Delivered to caller via // {@link #prefixParcelWithAppOpsIfNeeded} - ArrayMap> appOpsNoted = - sAppOpsNotedInThisBinderTransaction.get(); + int op = sOpStrToOp.get(syncOp.getOp()); + ArrayMap appOpsNoted = sAppOpsNotedInThisBinderTransaction.get(); if (appOpsNoted == null) { appOpsNoted = new ArrayMap<>(1); sAppOpsNotedInThisBinderTransaction.set(appOpsNoted); } - ArrayMap packageAppOpsNotedForAttribution = appOpsNoted.get(packageName); - if (packageAppOpsNotedForAttribution == null) { - packageAppOpsNotedForAttribution = new ArrayMap<>(1); - appOpsNoted.put(packageName, packageAppOpsNotedForAttribution); - } - - long[] appOpsNotedForAttribution = packageAppOpsNotedForAttribution.get(attributionTag); + long[] appOpsNotedForAttribution = appOpsNoted.get(syncOp.getAttributionTag()); if (appOpsNotedForAttribution == null) { appOpsNotedForAttribution = new long[2]; - packageAppOpsNotedForAttribution.put(attributionTag, appOpsNotedForAttribution); + appOpsNoted.put(syncOp.getAttributionTag(), appOpsNotedForAttribution); } - if (code < 64) { - appOpsNotedForAttribution[0] |= 1L << code; + if (op < 64) { + appOpsNotedForAttribution[0] |= 1L << op; } else { - appOpsNotedForAttribution[1] |= 1L << (code - 64); + appOpsNotedForAttribution[1] |= 1L << (op - 64); } } @@ -9185,7 +9224,9 @@ public class AppOpsManager { } } - if (isListeningForOpNotedInBinderTransaction()) { + Integer binderUid = sBinderThreadCallingUid.get(); + + if (binderUid != null && binderUid == uid) { return COLLECT_SYNC; } else { return COLLECT_ASYNC; @@ -9204,32 +9245,20 @@ public class AppOpsManager { */ // TODO (b/186872903) Refactor how sync noted ops are propagated. public static void prefixParcelWithAppOpsIfNeeded(@NonNull Parcel p) { - if (!isListeningForOpNotedInBinderTransaction()) { - return; - } - final ArrayMap> notedAppOps = - sAppOpsNotedInThisBinderTransaction.get(); + ArrayMap notedAppOps = sAppOpsNotedInThisBinderTransaction.get(); if (notedAppOps == null) { return; } p.writeInt(Parcel.EX_HAS_NOTED_APPOPS_REPLY_HEADER); - final int packageCount = notedAppOps.size(); - p.writeInt(packageCount); + int numAttributionWithNotesAppOps = notedAppOps.size(); + p.writeInt(numAttributionWithNotesAppOps); - for (int i = 0; i < packageCount; i++) { + for (int i = 0; i < numAttributionWithNotesAppOps; i++) { p.writeString(notedAppOps.keyAt(i)); - - final ArrayMap notedTagAppOps = notedAppOps.valueAt(i); - final int tagCount = notedTagAppOps.size(); - p.writeInt(tagCount); - - for (int j = 0; j < tagCount; j++) { - p.writeString(notedTagAppOps.keyAt(j)); - p.writeLong(notedTagAppOps.valueAt(j)[0]); - p.writeLong(notedTagAppOps.valueAt(j)[1]); - } + p.writeLong(notedAppOps.valueAt(i)[0]); + p.writeLong(notedAppOps.valueAt(i)[1]); } } @@ -9244,55 +9273,37 @@ public class AppOpsManager { * @hide */ public static void readAndLogNotedAppops(@NonNull Parcel p) { - final int packageCount = p.readInt(); - if (packageCount <= 0) { - return; - } + int numAttributionsWithNotedAppOps = p.readInt(); - final String myPackageName = ActivityThread.currentPackageName(); + for (int i = 0; i < numAttributionsWithNotedAppOps; i++) { + String attributionTag = p.readString(); + long[] rawNotedAppOps = new long[2]; + rawNotedAppOps[0] = p.readLong(); + rawNotedAppOps[1] = p.readLong(); - synchronized (sLock) { - for (int i = 0; i < packageCount; i++) { - final String packageName = p.readString(); - - final int tagCount = p.readInt(); - for (int j = 0; j < tagCount; j++) { - final String attributionTag = p.readString(); - final long[] rawNotedAppOps = new long[2]; - rawNotedAppOps[0] = p.readLong(); - rawNotedAppOps[1] = p.readLong(); - - if (rawNotedAppOps[0] == 0 && rawNotedAppOps[1] == 0) { - continue; - } + if (rawNotedAppOps[0] != 0 || rawNotedAppOps[1] != 0) { + BitSet notedAppOps = BitSet.valueOf(rawNotedAppOps); - final BitSet notedAppOps = BitSet.valueOf(rawNotedAppOps); + synchronized (sLock) { for (int code = notedAppOps.nextSetBit(0); code != -1; code = notedAppOps.nextSetBit(code + 1)) { - if (Objects.equals(myPackageName, packageName)) { - if (sOnOpNotedCallback != null) { - sOnOpNotedCallback.onNoted(new SyncNotedAppOp(code, - attributionTag, packageName)); - } else { - String message = getFormattedStackTrace(); - sUnforwardedOps.add(new AsyncNotedAppOp(code, Process.myUid(), - attributionTag, message, System.currentTimeMillis())); - if (sUnforwardedOps.size() > MAX_UNFORWARDED_OPS) { - sUnforwardedOps.remove(0); - } + if (sOnOpNotedCallback != null) { + sOnOpNotedCallback.onNoted(new SyncNotedAppOp(code, attributionTag)); + } else { + String message = getFormattedStackTrace(); + sUnforwardedOps.add( + new AsyncNotedAppOp(code, Process.myUid(), attributionTag, + message, System.currentTimeMillis())); + if (sUnforwardedOps.size() > MAX_UNFORWARDED_OPS) { + sUnforwardedOps.remove(0); } - } else if (isListeningForOpNotedInBinderTransaction()) { - collectNotedOpSync(code, attributionTag, packageName); - } - } - for (int code = notedAppOps.nextSetBit(0); code != -1; - code = notedAppOps.nextSetBit(code + 1)) { - if (Objects.equals(myPackageName, packageName)) { - sMessageCollector.onNoted(new SyncNotedAppOp(code, - attributionTag, packageName)); } } } + for (int code = notedAppOps.nextSetBit(0); code != -1; + code = notedAppOps.nextSetBit(code + 1)) { + sMessageCollector.onNoted(new SyncNotedAppOp(code, attributionTag)); + } } } } @@ -9398,15 +9409,7 @@ public class AppOpsManager { * @hide */ public static boolean isListeningForOpNoted() { - return sOnOpNotedCallback != null || isListeningForOpNotedInBinderTransaction() - || isCollectingStackTraces(); - } - - /** - * @return whether we are in a binder transaction and collecting appops. - */ - private static boolean isListeningForOpNotedInBinderTransaction() { - return sBinderThreadCallingUid.get() != null; + return sOnOpNotedCallback != null || isCollectingStackTraces(); } /** diff --git a/core/java/android/app/SyncNotedAppOp.java b/core/java/android/app/SyncNotedAppOp.java index 32d889e81cb0..7c0c08a7fc35 100644 --- a/core/java/android/app/SyncNotedAppOp.java +++ b/core/java/android/app/SyncNotedAppOp.java @@ -21,7 +21,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.TestApi; import android.os.Parcelable; -import android.os.Process; import com.android.internal.annotations.Immutable; import com.android.internal.util.DataClass; @@ -29,6 +28,8 @@ import com.android.internal.util.DataClass; /** * Description of an app-op that was noted for the current process. * + * Note: package name is currently unused in the system. + * *

This is either delivered after a * {@link AppOpsManager.OnOpNotedCallback#onNoted(SyncNotedAppOp) two way binder call} or * when the app diff --git a/core/java/android/os/BinderProxy.java b/core/java/android/os/BinderProxy.java index d44b016cb5d0..3d466a0bf007 100644 --- a/core/java/android/os/BinderProxy.java +++ b/core/java/android/os/BinderProxy.java @@ -560,6 +560,9 @@ public final class BinderProxy implements IBinder { } } + final AppOpsManager.PausedNotedAppOpsCollection prevCollection = + AppOpsManager.pauseNotedAppOpsCollection(); + if ((flags & FLAG_ONEWAY) == 0 && AppOpsManager.isListeningForOpNoted()) { flags |= FLAG_COLLECT_NOTED_APP_OPS; } @@ -567,6 +570,8 @@ public final class BinderProxy implements IBinder { try { return transactNative(code, data, reply, flags); } finally { + AppOpsManager.resumeNotedAppOpsCollection(prevCollection); + if (transactListener != null) { transactListener.onTransactEnded(session); } diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java index a9905dcf8904..6d7966f1eb7c 100644 --- a/services/core/java/com/android/server/appop/AppOpsService.java +++ b/services/core/java/com/android/server/appop/AppOpsService.java @@ -3438,7 +3438,7 @@ public class AppOpsService extends IAppOpsService.Stub { + " package " + packageName + "flags: " + AppOpsManager.flagsToString(flags)); return new SyncNotedAppOp(AppOpsManager.MODE_ERRORED, code, attributionTag, - packageName + " flags: " + AppOpsManager.flagsToString(flags)); + packageName); } final Op op = getOpLocked(ops, code, uid, true); final AttributedOp attributedOp = op.getOrCreateAttribution(op, attributionTag); -- cgit v1.2.3 From 984e09a17917ccd35e5172c578c9a655847916b1 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 2 Aug 2021 23:07:53 +0000 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I986d98864f062b019498ea13b3ac2468bec5f4f9 --- core/res/res/values-ur/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml index 3f9cee11da36..2936a080723b 100644 --- a/core/res/res/values-ur/strings.xml +++ b/core/res/res/values-ur/strings.xml @@ -1949,7 +1949,7 @@ "بڑا کریں" "بند کریں" "%1$s: %2$s" - "جواب" + "جواب دیں" "ویڈیو" "مسترد کریں" "منقطع کر دیں" -- cgit v1.2.3 From 2bf6a0e06ce58b2edc3f306829d8ec9daeaffaef Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 3 Aug 2021 02:43:40 +0000 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I760f028a35c3b74b79dd6ec1595a83931a6d996c --- packages/SystemUI/res/values-ja/strings.xml | 2 +- packages/SystemUI/res/values-ky/strings.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index 800b7f46b201..91e9e15ec722 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -766,7 +766,7 @@ %d分 %d分 - "電池の使用状況" + "バッテリーの使用状況" "充電中はバッテリー セーバーは利用できません" "バッテリー セーバー" "パフォーマンスとバックグラウンド データを制限します" diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index 9728cf632af5..b4b906ab82e4 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -687,11 +687,11 @@ "Эскертмелерди башкаруу каражаттары" "Күйүк" "Өчүк" - "Бул функциянын жардамы менен, ар бир колдонмо үчүн билдирменин маанилүүлүгүн 0дон 5ке чейин бааласаңыз болот. \n\n""5-деңгээл"" \n- Билдирмелер тизмесинин өйдө жагында көрсөтүлөт \n- Билдирмелер толук экранда көрсөтүлөт \n- Калкып чыгуучу билдирмелерге уруксат берилет \n\n""4-деңгээл"" \n- Билдирмелер толук экранда көрүнбөйт \n- Калкып чыгуучу билдирмелерге уруксат берилет \n\n""3-деңгээл"" \n- Билдирмелер толук экранда көрүнбөйт \n- Калкып чыгуучу билдирмелерге тыюу салынат \n\n""2-деңгээл"" \n- Билдирмелер толук экранда көрүнбөйт \n- Калкып чыгуучу билдирмелерге тыюу салынат \n- Эч качан үн чыкпайт же дирилдебейт \n\n""1-деңгээл"" \n- Билдирмелер толук экранда көрүнбөйт \n- Калкып чыгуучу билдирмелерге тыюу салынат \n- Эч качан үн чыкпайт же дирилдебейт \n- Кулпуланган экрандан жана абал тилкесинен жашырылат \n- Билдирмелер тизмесинин ылдый жагында көрсөтүлөт \n\n""0-деңгээл"" \n- Колдонмодон алынган бардык билдирмелер бөгөттөлөт" + "Бул функциянын жардамы менен, ар бир колдонмо үчүн билдирменин маанилүүлүгүн 0дон 5ке чейин бааласаңыз болот. \n\n""5-деңгээл"" \n- Билдирмелер тизмесинин өйдө жагында көрүнөт \n- Билдирмелер толук экранда көрүнөт \n- Калкып чыгуучу билдирмелерге уруксат берилет \n\n""4-деңгээл"" \n- Билдирмелер толук экранда көрүнбөйт \n- Калкып чыгуучу билдирмелерге уруксат берилет \n\n""3-деңгээл"" \n- Билдирмелер толук экранда көрүнбөйт \n- Калкып чыгуучу билдирмелерге тыюу салынат \n\n""2-деңгээл"" \n- Билдирмелер толук экранда көрүнбөйт \n- Калкып чыгуучу билдирмелерге тыюу салынат \n- Эч качан үн чыкпайт же дирилдебейт \n\n""1-деңгээл"" \n- Билдирмелер толук экранда көрүнбөйт \n- Калкып чыгуучу билдирмелерге тыюу салынат \n- Эч качан үн чыкпайт же дирилдебейт \n- Кулпуланган экрандан жана абал тилкесинен жашырылат \n- Билдирмелер тизмесинин ылдый жагында көрүнөт \n\n""0-деңгээл"" \n- Колдонмодон алынган бардык билдирмелер бөгөттөлөт" "Билдирмелер" "Мындан ары бул билдирмелер сизге көрүнбөйт" "Бул билдирмелер кичирейтилет" - "Бул билдирмелер үнсүз көрсөтүлөт" + "Бул билдирмелер үнсүз көрүнөт" "Бул билдирмелер тууралуу кабарлап турабыз" "Адатта мындай билдирмелерди өткөрүп жибересиз. \nАлар көрүнө берсинби?" "Бүттү" -- cgit v1.2.3 From 9f10e214d5f6eedb3cbacbc00dde6299ae0b1691 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 3 Aug 2021 03:05:37 +0000 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I297308cbfbd3b44adcbd100db63d173b2ff106fa --- packages/SystemUI/res/values-ja/strings.xml | 2 +- packages/SystemUI/res/values-ky/strings.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index f4ec58501913..db1cc4e15c18 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -765,7 +765,7 @@ %d分 %d分 - "電池の使用状況" + "バッテリーの使用状況" "充電中はバッテリー セーバーは利用できません" "バッテリー セーバー" "パフォーマンスとバックグラウンド データを制限します" diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index f9efdab01104..8726f200a597 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -686,11 +686,11 @@ "Эскертмелерди башкаруу каражаттары" "Күйүк" "Өчүк" - "Бул функциянын жардамы менен, ар бир колдонмо үчүн билдирменин маанилүүлүгүн 0дон 5ке чейин бааласаңыз болот. \n\n""5-деңгээл"" \n- Билдирмелер тизмесинин өйдө жагында көрсөтүлөт \n- Билдирмелер толук экранда көрсөтүлөт \n- Калкып чыгуучу билдирмелерге уруксат берилет \n\n""4-деңгээл"" \n- Билдирмелер толук экранда көрүнбөйт \n- Калкып чыгуучу билдирмелерге уруксат берилет \n\n""3-деңгээл"" \n- Билдирмелер толук экранда көрүнбөйт \n- Калкып чыгуучу билдирмелерге тыюу салынат \n\n""2-деңгээл"" \n- Билдирмелер толук экранда көрүнбөйт \n- Калкып чыгуучу билдирмелерге тыюу салынат \n- Эч качан үн чыкпайт же дирилдебейт \n\n""1-деңгээл"" \n- Билдирмелер толук экранда көрүнбөйт \n- Калкып чыгуучу билдирмелерге тыюу салынат \n- Эч качан үн чыкпайт же дирилдебейт \n- Кулпуланган экрандан жана абал тилкесинен жашырылат \n- Билдирмелер тизмесинин ылдый жагында көрсөтүлөт \n\n""0-деңгээл"" \n- Колдонмодон алынган бардык билдирмелер бөгөттөлөт" + "Бул функциянын жардамы менен, ар бир колдонмо үчүн билдирменин маанилүүлүгүн 0дон 5ке чейин бааласаңыз болот. \n\n""5-деңгээл"" \n- Билдирмелер тизмесинин өйдө жагында көрүнөт \n- Билдирмелер толук экранда көрүнөт \n- Калкып чыгуучу билдирмелерге уруксат берилет \n\n""4-деңгээл"" \n- Билдирмелер толук экранда көрүнбөйт \n- Калкып чыгуучу билдирмелерге уруксат берилет \n\n""3-деңгээл"" \n- Билдирмелер толук экранда көрүнбөйт \n- Калкып чыгуучу билдирмелерге тыюу салынат \n\n""2-деңгээл"" \n- Билдирмелер толук экранда көрүнбөйт \n- Калкып чыгуучу билдирмелерге тыюу салынат \n- Эч качан үн чыкпайт же дирилдебейт \n\n""1-деңгээл"" \n- Билдирмелер толук экранда көрүнбөйт \n- Калкып чыгуучу билдирмелерге тыюу салынат \n- Эч качан үн чыкпайт же дирилдебейт \n- Кулпуланган экрандан жана абал тилкесинен жашырылат \n- Билдирмелер тизмесинин ылдый жагында көрүнөт \n\n""0-деңгээл"" \n- Колдонмодон алынган бардык билдирмелер бөгөттөлөт" "Билдирмелер" "Мындан ары бул билдирмелер сизге көрүнбөйт" "Бул билдирмелер кичирейтилет" - "Бул билдирмелер үнсүз көрсөтүлөт" + "Бул билдирмелер үнсүз көрүнөт" "Бул билдирмелер тууралуу кабарлап турабыз" "Адатта мындай билдирмелерди өткөрүп жибересиз. \nАлар көрүнө берсинби?" "Бүттү" -- cgit v1.2.3 From 1cd73a062d6d4200c3f7996882154f3032121bbf Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 3 Aug 2021 03:16:27 +0000 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ib14972fb3047cb1ef362e603d4141f8d20e522bf --- packages/SystemUI/res/values-ja/strings.xml | 2 +- packages/SystemUI/res/values-ky/strings.xml | 4 ++-- packages/SystemUI/res/values-ne/strings.xml | 3 +-- packages/SystemUI/res/values-sq/strings.xml | 3 +-- 4 files changed, 5 insertions(+), 7 deletions(-) diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index 7d00c5be4d44..e17f032e961f 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -799,7 +799,7 @@ %d分 %d分 - "電池の使用状況" + "バッテリーの使用状況" "充電中はバッテリー セーバーは利用できません" "バッテリー セーバー" "パフォーマンスとバックグラウンド データを制限します" diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index f62d9dac7984..8a26ed364e15 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -707,11 +707,11 @@ "Эскертмелерди башкаруу каражаттары" "Күйүк" "Өчүк" - "Бул функциянын жардамы менен, ар бир колдонмо үчүн билдирменин маанилүүлүгүн 0дон 5ке чейин бааласаңыз болот. \n\n""5-деңгээл"" \n- Билдирмелер тизмесинин өйдө жагында көрсөтүлөт \n- Билдирмелер толук экранда көрсөтүлөт \n- Калкып чыгуучу билдирмелерге уруксат берилет \n\n""4-деңгээл"" \n- Билдирмелер толук экранда көрүнбөйт \n- Калкып чыгуучу билдирмелерге уруксат берилет \n\n""3-деңгээл"" \n- Билдирмелер толук экранда көрүнбөйт \n- Калкып чыгуучу билдирмелерге тыюу салынат \n\n""2-деңгээл"" \n- Билдирмелер толук экранда көрүнбөйт \n- Калкып чыгуучу билдирмелерге тыюу салынат \n- Эч качан үн чыкпайт же дирилдебейт \n\n""1-деңгээл"" \n- Билдирмелер толук экранда көрүнбөйт \n- Калкып чыгуучу билдирмелерге тыюу салынат \n- Эч качан үн чыкпайт же дирилдебейт \n- Кулпуланган экрандан жана абал тилкесинен жашырылат \n- Билдирмелер тизмесинин ылдый жагында көрсөтүлөт \n\n""0-деңгээл"" \n- Колдонмодон алынган бардык билдирмелер бөгөттөлөт" + "Бул функциянын жардамы менен, ар бир колдонмо үчүн билдирменин маанилүүлүгүн 0дон 5ке чейин бааласаңыз болот. \n\n""5-деңгээл"" \n- Билдирмелер тизмесинин өйдө жагында көрүнөт \n- Билдирмелер толук экранда көрүнөт \n- Калкып чыгуучу билдирмелерге уруксат берилет \n\n""4-деңгээл"" \n- Билдирмелер толук экранда көрүнбөйт \n- Калкып чыгуучу билдирмелерге уруксат берилет \n\n""3-деңгээл"" \n- Билдирмелер толук экранда көрүнбөйт \n- Калкып чыгуучу билдирмелерге тыюу салынат \n\n""2-деңгээл"" \n- Билдирмелер толук экранда көрүнбөйт \n- Калкып чыгуучу билдирмелерге тыюу салынат \n- Эч качан үн чыкпайт же дирилдебейт \n\n""1-деңгээл"" \n- Билдирмелер толук экранда көрүнбөйт \n- Калкып чыгуучу билдирмелерге тыюу салынат \n- Эч качан үн чыкпайт же дирилдебейт \n- Кулпуланган экрандан жана абал тилкесинен жашырылат \n- Билдирмелер тизмесинин ылдый жагында көрүнөт \n\n""0-деңгээл"" \n- Колдонмодон алынган бардык билдирмелер бөгөттөлөт" "Билдирмелер" "Мындан ары бул билдирмелер сизге көрүнбөйт" "Бул билдирмелер кичирейтилет" - "Бул билдирмелер үнсүз көрсөтүлөт" + "Бул билдирмелер үнсүз көрүнөт" "Бул билдирмелер тууралуу кабарлап турабыз" "Адатта мындай билдирмелерди өткөрүп жибересиз. \nАлар көрүнө берсинби?" "Бүттү" diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index c503ebdb368e..40ceb59e7169 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -452,8 +452,7 @@ "खोल्न पुनः ट्याप गर्नुहोस्" "फेरि ट्याप गर्नुहोस्" "खोल्न माथितिर स्वाइप गर्नुहोस्" - - + "अनलक गर्न प्रेस गर्नुहोस्" "फेरि प्रयास गर्न माथितिर स्वाइप गर्नुहोस्" "NFC प्रयोग गर्न स्क्रिन अनलक गर्नुहोस्" "यो डिभाइस तपाईंको सङ्गठनको स्वामित्वमा छ" diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index 6845b5b5877d..a948fae6de6b 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -452,8 +452,7 @@ "Trokit përsëri për ta hapur" "Trokit sërish" "Rrëshqit lart për ta hapur" - - + "Shtyp për të hapur" "Rrëshqit lart për të provuar përsëri" "Shkyçe për të përdorur NFC-në" "Kjo pajisje i përket organizatës sate" -- cgit v1.2.3 From 34562bcf33f29b2a117e63689429351586bb53ee Mon Sep 17 00:00:00 2001 From: Bill Lin Date: Wed, 21 Jul 2021 12:58:42 +0800 Subject: Fix QSTileViewImpl label set ellipsize performance issue health/microbench/systemui/systemui-latency-suite regress wake & unlock time : +50ms Root cuase: TextView.setEllipsize() overhead is high, and the overhead x QSTileView numbers would obviously affect the test latency time. Solution: By default we left tileView as Marquee but not setSelected(), then we setSelected on tile views when QQS expanding until proposedTranslation meet 1f(showing truncated at End with '...' visualization) Adding 3 major factors to achieve below state machine 1. Selected(T) : expansion == 1f or proposedTranslation < 0f 2. NoAction in transitioning : expansion > 0f or expansion < 1f 3. Signal when mLastHeaderTranslation != headerTranslation The expansion state will be: - init Collapsed : setSelected(true) - Header expanding QQS : setSelected(false) - QQS expanded : NoAction - QQS -> Expanding QS : NoAction - QS expanded : setSelected(true) - QS Collapsing -> QQS : setSelected(true) or QS full collapsing : setSelected(true) - QS collapsed in QQS : setSelected(false) - Back to init state : setSelected(true) Test: health/microbench/systemui/systemui-latency-suite Test: Manual check QS/QQS long label tile QQS : ellipsize at end QS: Marquee Test: SystemUITests Bug: 192680464 Change-Id: Iebf1e84043501916dd90378973a6736135c9f653 --- .../com/android/systemui/qs/PagedTileLayout.java | 2 +- .../src/com/android/systemui/qs/QSFragment.java | 12 +++++----- .../src/com/android/systemui/qs/QSPanel.java | 9 +++++--- .../src/com/android/systemui/qs/QuickQSPanel.java | 26 ++++++++++++++++++++++ .../android/systemui/qs/tileimpl/QSTileViewImpl.kt | 3 --- 5 files changed, 40 insertions(+), 12 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java index ce1066ee41c2..1bd36644bbc5 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java +++ b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java @@ -268,7 +268,7 @@ public class PagedTileLayout extends ViewPager implements QSTileLayout { } @Override - public void setExpansion(float expansion) { + public void setExpansion(float expansion, float proposedTranslation) { mLastExpansion = expansion; updateSelected(); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java index 04f692dcc1e6..ae3b884e3ab7 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java @@ -491,11 +491,13 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca : headerTranslation); } int currentHeight = getView().getHeight(); - mLastHeaderTranslation = headerTranslation; - if (expansion == mLastQSExpansion && mLastKeyguardAndExpanded == onKeyguardAndExpanded - && mLastViewHeight == currentHeight) { + if (expansion == mLastQSExpansion + && mLastKeyguardAndExpanded == onKeyguardAndExpanded + && mLastViewHeight == currentHeight + && mLastHeaderTranslation == headerTranslation) { return; } + mLastHeaderTranslation = headerTranslation; mLastQSExpansion = expansion; mLastKeyguardAndExpanded = onKeyguardAndExpanded; mLastViewHeight = currentHeight; @@ -515,8 +517,8 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca } mFooter.setExpansion(onKeyguardAndExpanded ? 1 : expansion); mQSPanelController.setRevealExpansion(expansion); - mQSPanelController.getTileLayout().setExpansion(expansion); - mQuickQSPanelController.getTileLayout().setExpansion(expansion); + mQSPanelController.getTileLayout().setExpansion(expansion, proposedTranslation); + mQuickQSPanelController.getTileLayout().setExpansion(expansion, proposedTranslation); mQSPanelScrollView.setTranslationY(translationScaleY * heightDiff); if (fullyCollapsed) { mQSPanelScrollView.setScrollY(0); diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java index 425bdc24fe1b..09d520dd556b 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java @@ -740,7 +740,7 @@ public class QSPanel extends LinearLayout implements Tunable { void setListening(boolean listening, UiEventLogger uiEventLogger); /** - * Set the minimum number of rows to show + * Sets the minimum number of rows to show * * @param minRows the minimum. */ @@ -749,7 +749,7 @@ public class QSPanel extends LinearLayout implements Tunable { } /** - * Set the max number of columns to show + * Sets the max number of columns to show * * @param maxColumns the maximum * @@ -759,7 +759,10 @@ public class QSPanel extends LinearLayout implements Tunable { return false; } - default void setExpansion(float expansion) {} + /** + * Sets the expansion value and proposedTranslation to panel. + */ + default void setExpansion(float expansion, float proposedTranslation) {} int getNumVisibleTiles(); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java index 985943bc8b05..c5bfe97403e7 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java @@ -177,6 +177,8 @@ public class QuickQSPanel extends QSPanel { static class QQSSideLabelTileLayout extends SideLabelTileLayout { + private boolean mLastSelected; + QQSSideLabelTileLayout(Context context) { super(context, null); setClipChildren(false); @@ -222,5 +224,29 @@ public class QuickQSPanel extends QSPanel { } } } + + @Override + public void setExpansion(float expansion, float proposedTranslation) { + if (expansion > 0f && expansion < 1f) { + return; + } + // The cases we must set select for marquee when QQS/QS collapsed, and QS full expanded. + // Expansion == 0f is when QQS is fully showing (as opposed to 1f, which is QS). At this + // point we want them to be selected so the tiles will marquee (but not at other points + // of expansion. + boolean selected = (expansion == 1f || proposedTranslation < 0f); + if (mLastSelected == selected) { + return; + } + // We set it as not important while we change this, so setting each tile as selected + // will not cause them to announce themselves until the user has actually selected the + // item. + setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS); + for (int i = 0; i < getChildCount(); i++) { + getChildAt(i).setSelected(selected); + } + setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_AUTO); + mLastSelected = selected; + } } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt index 70685a68e182..222539d49526 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt @@ -195,9 +195,6 @@ open class QSTileViewImpl @JvmOverloads constructor( // sibling methods to have special behavior for labelContainer. labelContainer.forceUnspecifiedMeasure = true secondaryLabel.alpha = 0f - // Do not marque in QQS - label.ellipsize = TextUtils.TruncateAt.END - secondaryLabel.ellipsize = TextUtils.TruncateAt.END } setLabelColor(getLabelColorForState(QSTile.State.DEFAULT_STATE)) setSecondaryLabelColor(getSecondaryLabelColorForState(QSTile.State.DEFAULT_STATE)) -- cgit v1.2.3 From cd8558a2533d08107e761596686c2b24839b3e36 Mon Sep 17 00:00:00 2001 From: Rhed Jao Date: Fri, 30 Jul 2021 15:52:05 +0800 Subject: DO NOT MERGE Apply a maximum char count to the load label api The system is overwhelmed by an enormous label string returned by the load label api. This cl truncates the label string if it exceeds the maximum safe length. Bug: 67013844 Test: atest PackageManagerTest Change-Id: Ia4d768cc93a47cfb8b6f7c4b6dc73abd801809bd Merged-in: Ia4d768cc93a47cfb8b6f7c4b6dc73abd801809bd --- core/java/android/content/pm/PackageItemInfo.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/java/android/content/pm/PackageItemInfo.java b/core/java/android/content/pm/PackageItemInfo.java index dd2080b60b37..2bac066ed186 100644 --- a/core/java/android/content/pm/PackageItemInfo.java +++ b/core/java/android/content/pm/PackageItemInfo.java @@ -207,7 +207,9 @@ public class PackageItemInfo { return loadSafeLabel(pm, DEFAULT_MAX_LABEL_SIZE_PX, SAFE_STRING_FLAG_TRIM | SAFE_STRING_FLAG_FIRST_LINE); } else { - return loadUnsafeLabel(pm); + // Trims the label string to the MAX_SAFE_LABEL_LENGTH. This is to prevent that the + // system is overwhelmed by an enormous string returned by the application. + return TextUtils.trimToSize(loadUnsafeLabel(pm), MAX_SAFE_LABEL_LENGTH); } } -- cgit v1.2.3 From 7380c153b97bfa38a0dfa9cccc71062f6d6bd6f4 Mon Sep 17 00:00:00 2001 From: Rhed Jao Date: Fri, 30 Jul 2021 15:52:05 +0800 Subject: DO NOT MERGE Apply a maximum char count to the load label api The system is overwhelmed by an enormous label string returned by the load label api. This cl truncates the label string if it exceeds the maximum safe length. Also update the max safe label length to 1000 characters, which is enough. Bug: 67013844 Test: atest PackageManagerTest Change-Id: Ia4d768cc93a47cfb8b6f7c4b6dc73abd801809bd Merged-in: Ia4d768cc93a47cfb8b6f7c4b6dc73abd801809bd --- core/java/android/content/pm/PackageItemInfo.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/core/java/android/content/pm/PackageItemInfo.java b/core/java/android/content/pm/PackageItemInfo.java index 84b779466dbf..63a158b0bf40 100644 --- a/core/java/android/content/pm/PackageItemInfo.java +++ b/core/java/android/content/pm/PackageItemInfo.java @@ -43,7 +43,7 @@ import java.util.Comparator; public class PackageItemInfo { private static final float MAX_LABEL_SIZE_PX = 500f; /** The maximum length of a safe label, in characters */ - private static final int MAX_SAFE_LABEL_LENGTH = 50000; + private static final int MAX_SAFE_LABEL_LENGTH = 1000; /** * Public name of this item. From the "android:name" attribute. @@ -131,6 +131,12 @@ public class PackageItemInfo { * item does not have a label, its name is returned. */ public CharSequence loadLabel(PackageManager pm) { + // Trims the label string to the MAX_SAFE_LABEL_LENGTH. This is to prevent that the + // system is overwhelmed by an enormous string returned by the application. + return trimToSize(loadUnsafeLabel(pm), MAX_SAFE_LABEL_LENGTH); + } + + private CharSequence loadUnsafeLabel(PackageManager pm) { if (nonLocalizedLabel != null) { return nonLocalizedLabel; } @@ -146,6 +152,15 @@ public class PackageItemInfo { return packageName; } + private CharSequence trimToSize(CharSequence label, int size) { + if (TextUtils.isEmpty(label) || label.length() <= size) return label; + if (Character.isHighSurrogate(label.charAt(size - 1)) + && Character.isLowSurrogate(label.charAt(size))) { + size = size - 1; + } + return label.subSequence(0, size); + } + /** * Same as {@link #loadLabel(PackageManager)} with the addition that * the returned label is safe for being presented in the UI since it -- cgit v1.2.3 From 223060d6f4bdf0847032a9bea8a12276494ff657 Mon Sep 17 00:00:00 2001 From: Joanne Chung Date: Thu, 8 Jul 2021 21:53:34 +0800 Subject: Bug fix: fix System crash due to NullPointerException. If the voice interaction doesn't set RecognitionService, it may cause NPE when it tries to get recognizer name. We don't need recognizer name since Android 12, we delete it directly. To avoid the app does not set RecognitionService then updating the app to earlier platform that may cause boot loop. We add a warning log and set empty service for voiceinteraction to let app aware the problem. Also logging and unset the voiceinteraction service if the app try to update the app without recognition service. Bug: 170742278 Test: Use sample VoiceInteractionService without a RecognitionService The system doesn't crash when choosing the sample app as the default assistant app from Settings. And make sure the VoiceInteractionService is unset. Test: Install sample VoiceInteractionService with a RecognitionService and then update it without a RecognitionService. Make sure the voice interaction service is unset. Change-Id: I79ab3d6449984ead0be28a94adaad57ab24d1fb9 --- .../VoiceInteractionManagerService.java | 43 +++++++++++++++++++--- 1 file changed, 38 insertions(+), 5 deletions(-) diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java index 71541ad729d5..9ea2b7b12ad0 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java @@ -1896,17 +1896,19 @@ public class VoiceInteractionManagerService extends SystemService { String serviceComponentName = serviceInfo.getComponentName() .flattenToShortString(); - - String serviceRecognizerName = new ComponentName(pkg, - voiceInteractionServiceInfo.getRecognitionService()) - .flattenToShortString(); + if (voiceInteractionServiceInfo.getRecognitionService() == null) { + Slog.e(TAG, "The RecognitionService must be set to avoid boot " + + "loop on earlier platform version. Also make sure that this " + + "is a valid RecognitionService when running on Android 11 " + + "or earlier."); + serviceComponentName = ""; + } Settings.Secure.putStringForUser(getContext().getContentResolver(), Settings.Secure.ASSISTANT, serviceComponentName, userId); Settings.Secure.putStringForUser(getContext().getContentResolver(), Settings.Secure.VOICE_INTERACTION_SERVICE, serviceComponentName, userId); - return; } @@ -1947,6 +1949,29 @@ public class VoiceInteractionManagerService extends SystemService { } } + private void resetServicesIfNoRecognitionService(ComponentName serviceComponent, + int userHandle) { + for (ResolveInfo resolveInfo : queryInteractorServices(userHandle, + serviceComponent.getPackageName())) { + VoiceInteractionServiceInfo serviceInfo = + new VoiceInteractionServiceInfo( + mContext.getPackageManager(), + resolveInfo.serviceInfo); + if (!serviceInfo.getSupportsAssist()) { + continue; + } + if (serviceInfo.getRecognitionService() == null) { + Slog.e(TAG, "The RecognitionService must be set to " + + "avoid boot loop on earlier platform version. " + + "Also make sure that this is a valid " + + "RecognitionService when running on Android 11 " + + "or earlier."); + setCurInteractor(null, userHandle); + resetCurAssistant(userHandle); + } + } + } + PackageMonitor mPackageMonitor = new PackageMonitor() { @Override public boolean onHandleForceStop(Intent intent, String[] packages, int uid, boolean doit) { @@ -2090,6 +2115,7 @@ public class VoiceInteractionManagerService extends SystemService { change = isPackageAppearing(curInteractor.getPackageName()); if (change != PACKAGE_UNCHANGED) { + resetServicesIfNoRecognitionService(curInteractor, userHandle); // If current interactor is now appearing, for any reason, then // restart our connection with it. if (mImpl != null && curInteractor.getPackageName().equals( @@ -2112,6 +2138,13 @@ public class VoiceInteractionManagerService extends SystemService { initForUser(userHandle); return; } + change = isPackageAppearing(curAssistant.getPackageName()); + if (change != PACKAGE_UNCHANGED) { + // It is possible to update Assistant without a voice interactor to one + // with a voice-interactor. We should make sure the recognition service + // is set to avoid boot loop. + resetServicesIfNoRecognitionService(curAssistant, userHandle); + } } // There is no interactor, so just deal with a simple recognizer. -- cgit v1.2.3 From 06d07d54dbc0b67cccf986281e2c7c19f0ae64ca Mon Sep 17 00:00:00 2001 From: Nate Myren Date: Mon, 2 Aug 2021 11:16:14 -0700 Subject: Add attribution info to start callbacks Add attribution flags and chain IDs to start callbacks, and have the PermissionUsageHelper listen for starts. This ensures that, if another start happens while an op is already running, and has chain information, then this chain information will be recorded. Test: manual Bug: 194198234 Change-Id: I0ab1aa0969b70e18001f4a814ea5689f9329a019 --- core/java/android/app/AppOpsManager.java | 60 +++++++++++++++- .../android/permission/PermissionUsageHelper.java | 84 ++++++++++++++++++---- .../internal/app/IAppOpsStartedCallback.aidl | 3 +- .../com/android/server/appop/AppOpsService.java | 31 +++++--- .../server/appop/AppOpsStartedWatcherTest.java | 12 +++- 5 files changed, 163 insertions(+), 27 deletions(-) diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index 4ddb546a351e..d1b0b9b83ace 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -7205,6 +7205,34 @@ public class AppOpsManager { * @hide */ public interface OnOpStartedListener { + + /** + * Represents a start operation that was unsuccessful + * @hide + */ + public int START_TYPE_FAILED = 0; + + /** + * Represents a successful start operation + * @hide + */ + public int START_TYPE_STARTED = 1; + + /** + * Represents an operation where a restricted operation became unrestricted, and resumed. + * @hide + */ + public int START_TYPE_RESUMED = 2; + + /** @hide */ + @Retention(RetentionPolicy.SOURCE) + @IntDef(flag = true, prefix = { "TYPE_" }, value = { + START_TYPE_FAILED, + START_TYPE_STARTED, + START_TYPE_RESUMED + }) + public @interface StartedType {} + /** * Called when an op was started. * @@ -7213,11 +7241,35 @@ public class AppOpsManager { * @param uid The UID performing the operation. * @param packageName The package performing the operation. * @param attributionTag The attribution tag performing the operation. - * @param flags The flags of this op + * @param flags The flags of this op. * @param result The result of the start. */ void onOpStarted(int op, int uid, String packageName, String attributionTag, @OpFlags int flags, @Mode int result); + + /** + * Called when an op was started. + * + * Note: This is only for op starts. It is not called when an op is noted or stopped. + * By default, unless this method is overridden, no code will be executed for resume + * events. + * @param op The op code. + * @param uid The UID performing the operation. + * @param packageName The package performing the operation. + * @param attributionTag The attribution tag performing the operation. + * @param flags The flags of this op. + * @param result The result of the start. + * @param startType The start type of this start event. Either failed, resumed, or started. + * @param attributionFlags The location of this started op in an attribution chain. + * @param attributionChainId The ID of the attribution chain of this op, if it is in one. + */ + default void onOpStarted(int op, int uid, String packageName, String attributionTag, + @OpFlags int flags, @Mode int result, @StartedType int startType, + @AttributionFlags int attributionFlags, int attributionChainId) { + if (startType != START_TYPE_RESUMED) { + onOpStarted(op, uid, packageName, attributionTag, flags, result); + } + } } AppOpsManager(Context context, IAppOpsService service) { @@ -7858,8 +7910,10 @@ public class AppOpsManager { cb = new IAppOpsStartedCallback.Stub() { @Override public void opStarted(int op, int uid, String packageName, String attributionTag, - int flags, int mode) { - callback.onOpStarted(op, uid, packageName, attributionTag, flags, mode); + int flags, int mode, int startType, int attributionFlags, + int attributionChainId) { + callback.onOpStarted(op, uid, packageName, attributionTag, flags, mode, + startType, attributionFlags, attributionChainId); } }; mStartedWatchers.put(callback, cb); diff --git a/core/java/android/permission/PermissionUsageHelper.java b/core/java/android/permission/PermissionUsageHelper.java index 03f94c549512..19f204b377c8 100644 --- a/core/java/android/permission/PermissionUsageHelper.java +++ b/core/java/android/permission/PermissionUsageHelper.java @@ -31,7 +31,9 @@ import static android.app.AppOpsManager.OPSTR_FINE_LOCATION; import static android.app.AppOpsManager.OPSTR_PHONE_CALL_CAMERA; import static android.app.AppOpsManager.OPSTR_PHONE_CALL_MICROPHONE; import static android.app.AppOpsManager.OPSTR_RECORD_AUDIO; +import static android.app.AppOpsManager.OP_CAMERA; import static android.app.AppOpsManager.OP_FLAGS_ALL_TRUSTED; +import static android.app.AppOpsManager.OP_RECORD_AUDIO; import static android.media.AudioSystem.MODE_IN_COMMUNICATION; import static android.telephony.TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS; @@ -63,7 +65,8 @@ import java.util.Objects; * * @hide */ -public class PermissionUsageHelper implements AppOpsManager.OnOpActiveChangedListener { +public class PermissionUsageHelper implements AppOpsManager.OnOpActiveChangedListener, + AppOpsManager.OnOpStartedListener { /** Whether to show the mic and camera icons. */ private static final String PROPERTY_CAMERA_MIC_ICONS_ENABLED = "camera_mic_icons_enabled"; @@ -160,9 +163,10 @@ public class PermissionUsageHelper implements AppOpsManager.OnOpActiveChangedLis mUserContexts = new ArrayMap<>(); mUserContexts.put(Process.myUserHandle(), mContext); // TODO ntmyren: make this listen for flag enable/disable changes - String[] ops = { OPSTR_CAMERA, OPSTR_RECORD_AUDIO }; - mContext.getSystemService(AppOpsManager.class).startWatchingActive(ops, - context.getMainExecutor(), this); + String[] opStrs = { OPSTR_CAMERA, OPSTR_RECORD_AUDIO }; + mAppOpsManager.startWatchingActive(opStrs, context.getMainExecutor(), this); + int[] ops = { OP_CAMERA, OP_RECORD_AUDIO }; + mAppOpsManager.startWatchingStarted(ops, this); } private Context getUserContext(UserHandle user) { @@ -182,25 +186,65 @@ public class PermissionUsageHelper implements AppOpsManager.OnOpActiveChangedLis public void onOpActiveChanged(@NonNull String op, int uid, @NonNull String packageName, @Nullable String attributionTag, boolean active, @AttributionFlags int attributionFlags, int attributionChainId) { - if (attributionChainId == ATTRIBUTION_CHAIN_ID_NONE - || attributionFlags == ATTRIBUTION_FLAGS_NONE - || (attributionFlags & ATTRIBUTION_FLAG_TRUSTED) == 0) { - // If this is not a chain, or it is untrusted, return + if (active) { + // Started callback handles these return; } - if (!active) { - // if any link in the chain is finished, remove the chain. - // TODO ntmyren: be smarter about this - mAttributionChains.remove(attributionChainId); + // if any link in the chain is finished, remove the chain. Then, find any other chains that + // contain this op/package/uid/tag combination, and remove them, as well. + // TODO ntmyren: be smarter about this + mAttributionChains.remove(attributionChainId); + int numChains = mAttributionChains.size(); + ArrayList toRemove = new ArrayList<>(); + for (int i = 0; i < numChains; i++) { + int chainId = mAttributionChains.keyAt(i); + ArrayList chain = mAttributionChains.valueAt(i); + int chainSize = chain.size(); + for (int j = 0; j < chainSize; j++) { + AccessChainLink link = chain.get(j); + if (link.packageAndOpEquals(op, packageName, attributionTag, uid)) { + toRemove.add(chainId); + break; + } + } + } + mAttributionChains.removeAll(toRemove); + } + + @Override + public void onOpStarted(int op, int uid, String packageName, String attributionTag, + @AppOpsManager.OpFlags int flags, @AppOpsManager.Mode int result) { + // not part of an attribution chain. Do nothing + } + + @Override + public void onOpStarted(int op, int uid, String packageName, String attributionTag, + @AppOpsManager.OpFlags int flags, @AppOpsManager.Mode int result, + @StartedType int startedType, @AttributionFlags int attributionFlags, + int attributionChainId) { + if (startedType == START_TYPE_FAILED || attributionChainId == ATTRIBUTION_CHAIN_ID_NONE + || attributionFlags == ATTRIBUTION_FLAGS_NONE + || (attributionFlags & ATTRIBUTION_FLAG_TRUSTED) == 0) { + // If this is not a successful start, or it is not a chain, or it is untrusted, return return; } + addLinkToChainIfNotPresent(AppOpsManager.opToPublicName(op), packageName, uid, + attributionTag, attributionFlags, attributionChainId); + } + + private void addLinkToChainIfNotPresent(String op, String packageName, int uid, + String attributionTag, int attributionFlags, int attributionChainId) { ArrayList currentChain = mAttributionChains.computeIfAbsent( attributionChainId, k -> new ArrayList<>()); AccessChainLink link = new AccessChainLink(op, packageName, attributionTag, uid, attributionFlags); + if (currentChain.contains(link)) { + return; + } + int currSize = currentChain.size(); if (currSize == 0 || link.isEnd() || !currentChain.get(currSize - 1).isEnd()) { // if the list is empty, this link is the end, or the last link in the current chain @@ -613,5 +657,21 @@ public class PermissionUsageHelper implements AppOpsManager.OnOpActiveChangedLis public boolean isStart() { return (flags & ATTRIBUTION_FLAG_RECEIVER) != 0; } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof AccessChainLink)) { + return false; + } + AccessChainLink other = (AccessChainLink) obj; + return other.flags == flags && packageAndOpEquals(other.usage.op, + other.usage.packageName, other.usage.attributionTag, other.usage.uid); + } + + public boolean packageAndOpEquals(String op, String packageName, String attributionTag, + int uid) { + return Objects.equals(op, usage.op) && Objects.equals(packageName, usage.packageName) + && Objects.equals(attributionTag, usage.attributionTag) && uid == usage.uid; + } } } diff --git a/core/java/com/android/internal/app/IAppOpsStartedCallback.aidl b/core/java/com/android/internal/app/IAppOpsStartedCallback.aidl index 3a108e7e1d94..06640cb4ee06 100644 --- a/core/java/com/android/internal/app/IAppOpsStartedCallback.aidl +++ b/core/java/com/android/internal/app/IAppOpsStartedCallback.aidl @@ -18,5 +18,6 @@ package com.android.internal.app; // Iterface to observe op starts oneway interface IAppOpsStartedCallback { - void opStarted(int op, int uid, String packageName, String attributionTag, int flags, int mode); + void opStarted(int op, int uid, String packageName, String attributionTag, int flags, int mode, + int startedType, int attributionFlags, int attributionChainId); } diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java index a9905dcf8904..b5cda56ef123 100644 --- a/services/core/java/com/android/server/appop/AppOpsService.java +++ b/services/core/java/com/android/server/appop/AppOpsService.java @@ -45,6 +45,9 @@ import static android.app.AppOpsManager.OP_NONE; import static android.app.AppOpsManager.OP_PLAY_AUDIO; import static android.app.AppOpsManager.OP_RECORD_AUDIO; import static android.app.AppOpsManager.OP_RECORD_AUDIO_HOTWORD; +import static android.app.AppOpsManager.OnOpStartedListener.START_TYPE_FAILED; +import static android.app.AppOpsManager.OnOpStartedListener.START_TYPE_RESUMED; +import static android.app.AppOpsManager.OnOpStartedListener.START_TYPE_STARTED; import static android.app.AppOpsManager.OpEventProxyInfo; import static android.app.AppOpsManager.RestrictionBypass; import static android.app.AppOpsManager.SAMPLING_STRATEGY_BOOT_TIME_SAMPLING; @@ -1238,6 +1241,11 @@ public class AppOpsService extends IAppOpsService.Stub { scheduleOpActiveChangedIfNeededLocked(parent.op, parent.uid, parent.packageName, tag, true, event.getAttributionFlags(), event.getAttributionChainId()); } + // Note: this always sends MODE_ALLOWED, even if the mode is FOREGROUND + // TODO ntmyren: figure out how to get the real mode. + scheduleOpStartedIfNeededLocked(parent.op, parent.uid, parent.packageName, + tag, event.getFlags(), MODE_ALLOWED, START_TYPE_RESUMED, + event.getAttributionFlags(), event.getAttributionChainId()); } mPausedInProgressEvents = null; } @@ -3945,13 +3953,15 @@ public class AppOpsService extends IAppOpsService.Stub { } boolean isRestricted = false; + int startType = START_TYPE_FAILED; synchronized (this) { final Ops ops = getOpsLocked(uid, packageName, attributionTag, pvr.isAttributionTagValid, pvr.bypass, /* edit */ true); if (ops == null) { if (!dryRun) { scheduleOpStartedIfNeededLocked(code, uid, packageName, attributionTag, - flags, AppOpsManager.MODE_IGNORED); + flags, AppOpsManager.MODE_IGNORED, startType, attributionFlags, + attributionChainId); } if (DEBUG) Slog.d(TAG, "startOperation: no op for code " + code + " uid " + uid + " package " + packageName + " flags: " @@ -3977,7 +3987,7 @@ public class AppOpsService extends IAppOpsService.Stub { if (!dryRun) { attributedOp.rejected(uidState.state, flags); scheduleOpStartedIfNeededLocked(code, uid, packageName, attributionTag, - flags, uidMode); + flags, uidMode, startType, attributionFlags, attributionChainId); } return new SyncNotedAppOp(uidMode, code, attributionTag, packageName); } @@ -3993,7 +4003,7 @@ public class AppOpsService extends IAppOpsService.Stub { if (!dryRun) { attributedOp.rejected(uidState.state, flags); scheduleOpStartedIfNeededLocked(code, uid, packageName, attributionTag, - flags, mode); + flags, mode, startType, attributionFlags, attributionChainId); } return new SyncNotedAppOp(mode, code, attributionTag, packageName); } @@ -4011,12 +4021,14 @@ public class AppOpsService extends IAppOpsService.Stub { attributedOp.started(clientId, proxyUid, proxyPackageName, proxyAttributionTag, uidState.state, flags, attributionFlags, attributionChainId); + startType = START_TYPE_STARTED; } } catch (RemoteException e) { throw new RuntimeException(e); } scheduleOpStartedIfNeededLocked(code, uid, packageName, attributionTag, flags, - isRestricted ? MODE_IGNORED : MODE_ALLOWED); + isRestricted ? MODE_IGNORED : MODE_ALLOWED, startType, attributionFlags, + attributionChainId); } } @@ -4187,7 +4199,9 @@ public class AppOpsService extends IAppOpsService.Stub { } private void scheduleOpStartedIfNeededLocked(int code, int uid, String pkgName, - String attributionTag, @OpFlags int flags, @Mode int result) { + String attributionTag, @OpFlags int flags, @Mode int result, + @AppOpsManager.OnOpStartedListener.StartedType int startedType, + @AttributionFlags int attributionFlags, int attributionChainId) { ArraySet dispatchedCallbacks = null; final int callbackListCount = mStartedWatchers.size(); for (int i = 0; i < callbackListCount; i++) { @@ -4213,12 +4227,13 @@ public class AppOpsService extends IAppOpsService.Stub { mHandler.sendMessage(PooledLambda.obtainMessage( AppOpsService::notifyOpStarted, this, dispatchedCallbacks, code, uid, pkgName, attributionTag, flags, - result)); + result, startedType, attributionFlags, attributionChainId)); } private void notifyOpStarted(ArraySet callbacks, int code, int uid, String packageName, String attributionTag, @OpFlags int flags, - @Mode int result) { + @Mode int result, @AppOpsManager.OnOpStartedListener.StartedType int startedType, + @AttributionFlags int attributionFlags, int attributionChainId) { final long identity = Binder.clearCallingIdentity(); try { final int callbackCount = callbacks.size(); @@ -4226,7 +4241,7 @@ public class AppOpsService extends IAppOpsService.Stub { final StartedCallback callback = callbacks.valueAt(i); try { callback.mCallback.opStarted(code, uid, packageName, attributionTag, flags, - result); + result, startedType, attributionFlags, attributionChainId); } catch (RemoteException e) { /* do nothing */ } diff --git a/services/tests/servicestests/src/com/android/server/appop/AppOpsStartedWatcherTest.java b/services/tests/servicestests/src/com/android/server/appop/AppOpsStartedWatcherTest.java index c12eb32a9143..e98a4dded99b 100644 --- a/services/tests/servicestests/src/com/android/server/appop/AppOpsStartedWatcherTest.java +++ b/services/tests/servicestests/src/com/android/server/appop/AppOpsStartedWatcherTest.java @@ -64,12 +64,16 @@ public class AppOpsStartedWatcherTest { .times(1)).onOpStarted(eq(AppOpsManager.OP_FINE_LOCATION), eq(Process.myUid()), eq(getContext().getPackageName()), eq(getContext().getAttributionTag()), eq(AppOpsManager.OP_FLAG_SELF), - eq(AppOpsManager.MODE_ALLOWED)); + eq(AppOpsManager.MODE_ALLOWED), eq(OnOpStartedListener.START_TYPE_STARTED), + eq(AppOpsManager.ATTRIBUTION_FLAGS_NONE), + eq(AppOpsManager.ATTRIBUTION_CHAIN_ID_NONE)); inOrder.verify(listener, timeout(NOTIFICATION_TIMEOUT_MILLIS) .times(1)).onOpStarted(eq(AppOpsManager.OP_CAMERA), eq(Process.myUid()), eq(getContext().getPackageName()), eq(getContext().getAttributionTag()), eq(AppOpsManager.OP_FLAG_SELF), - eq(AppOpsManager.MODE_ALLOWED)); + eq(AppOpsManager.MODE_ALLOWED), eq(OnOpStartedListener.START_TYPE_STARTED), + eq(AppOpsManager.ATTRIBUTION_FLAGS_NONE), + eq(AppOpsManager.ATTRIBUTION_CHAIN_ID_NONE)); // Stop watching appOpsManager.stopWatchingStarted(listener); @@ -94,7 +98,9 @@ public class AppOpsStartedWatcherTest { .times(2)).onOpStarted(eq(AppOpsManager.OP_CAMERA), eq(Process.myUid()), eq(getContext().getPackageName()), eq(getContext().getAttributionTag()), eq(AppOpsManager.OP_FLAG_SELF), - eq(AppOpsManager.MODE_ALLOWED)); + eq(AppOpsManager.MODE_ALLOWED), eq(OnOpStartedListener.START_TYPE_STARTED), + eq(AppOpsManager.ATTRIBUTION_FLAGS_NONE), + eq(AppOpsManager.ATTRIBUTION_CHAIN_ID_NONE)); verifyNoMoreInteractions(listener); // Finish up -- cgit v1.2.3 From 874b7164208c6033a9423aae78230b1e0a557f11 Mon Sep 17 00:00:00 2001 From: Jayachandran C Date: Tue, 3 Aug 2021 10:13:34 -0700 Subject: Update telephony OWNERS file Bug: 195421431 Test: Build Change-Id: I285eefd9abe2d8bef86ce189b6c19ee273b9e924 --- telephony/OWNERS | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/telephony/OWNERS b/telephony/OWNERS index 628c48070314..4df8a4bc6413 100644 --- a/telephony/OWNERS +++ b/telephony/OWNERS @@ -4,13 +4,14 @@ amitmahajan@google.com breadley@google.com fionaxu@google.com jackyu@google.com -hallliu@google.com rgreenwalt@google.com tgunn@google.com jminjie@google.com shuoq@google.com -refuhoo@google.com nazaninb@google.com sarahchin@google.com -dbright@google.com xiaotonj@google.com +huiwang@google.com +jayachandranc@google.com +chinmayd@google.com +amruthr@google.com -- cgit v1.2.3 From feef48ebff6e5427cb02f484a955ad24ae8319ca Mon Sep 17 00:00:00 2001 From: Jayachandran C Date: Tue, 3 Aug 2021 10:20:11 -0700 Subject: Update telephony OWNERS file Bug: 195421431 Test: Build Change-Id: I7b0c70ff193c64ff7a569c899107441c8de867cd --- mms/OWNERS | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/mms/OWNERS b/mms/OWNERS index befc320b949c..7f05a2a24d6e 100644 --- a/mms/OWNERS +++ b/mms/OWNERS @@ -2,7 +2,6 @@ set noparent tgunn@google.com breadley@google.com -hallliu@google.com rgreenwalt@google.com amitmahajan@google.com fionaxu@google.com @@ -10,7 +9,10 @@ jackyu@google.com jminjie@google.com satk@google.com shuoq@google.com -refuhoo@google.com nazaninb@google.com sarahchin@google.com -dbright@google.com \ No newline at end of file +xiaotonj@google.com +huiwang@google.com +jayachandranc@google.com +chinmayd@google.com +amruthr@google.com -- cgit v1.2.3 From 32e10a7238b72537f6f9a57c94742f228ce4eb35 Mon Sep 17 00:00:00 2001 From: Ady Abraham Date: Fri, 23 Jul 2021 17:01:26 -0700 Subject: DisplayModeDirector: proximity should not vote on doze Bug: 192699858 Test: atest DisplayModeDirectorTest Change-Id: If21a036807f0602fb5ac8a024544ddfaf1fb46ed --- .../server/display/DisplayModeDirector.java | 81 +++++++++++++++++++--- .../server/display/DisplayModeDirectorTest.java | 48 +++++++++++-- 2 files changed, 113 insertions(+), 16 deletions(-) diff --git a/services/core/java/com/android/server/display/DisplayModeDirector.java b/services/core/java/com/android/server/display/DisplayModeDirector.java index f23ae6e2340c..186986e17c14 100644 --- a/services/core/java/com/android/server/display/DisplayModeDirector.java +++ b/services/core/java/com/android/server/display/DisplayModeDirector.java @@ -153,7 +153,7 @@ public class DisplayModeDirector { updateVoteLocked(displayId, priority, vote); } }; - mSensorObserver = new SensorObserver(context, ballotBox); + mSensorObserver = new SensorObserver(context, ballotBox, injector); mHbmObserver = new HbmObserver(injector, ballotBox, BackgroundThread.getHandler()); mDeviceConfigDisplaySettings = new DeviceConfigDisplaySettings(); mDeviceConfig = injector.getDeviceConfig(); @@ -2127,27 +2127,34 @@ public class DisplayModeDirector { } } - private static class SensorObserver implements ProximityActiveListener { - private static final String PROXIMITY_SENSOR_NAME = null; - private static final String PROXIMITY_SENSOR_TYPE = Sensor.STRING_TYPE_PROXIMITY; + private final class SensorObserver implements ProximityActiveListener, + DisplayManager.DisplayListener { + private final String mProximitySensorName = null; + private final String mProximitySensorType = Sensor.STRING_TYPE_PROXIMITY; private final BallotBox mBallotBox; private final Context mContext; + private final Injector mInjector; private DisplayManager mDisplayManager; private DisplayManagerInternal mDisplayManagerInternal; private boolean mIsProxActive = false; + private final SparseBooleanArray mDozeStateByDisplay; - SensorObserver(Context context, BallotBox ballotBox) { + SensorObserver(Context context, BallotBox ballotBox, Injector injector) { mContext = context; mBallotBox = ballotBox; + mInjector = injector; + mDozeStateByDisplay = new SparseBooleanArray(); } @Override public void onProximityActive(boolean isActive) { - if (mIsProxActive != isActive) { - mIsProxActive = isActive; - recalculateVotes(); + synchronized (mLock) { + if (mIsProxActive != isActive) { + mIsProxActive = isActive; + recalculateVotesLocked(); + } } } @@ -2158,17 +2165,27 @@ public class DisplayModeDirector { final SensorManagerInternal sensorManager = LocalServices.getService(SensorManagerInternal.class); sensorManager.addProximityActiveListener(BackgroundThread.getExecutor(), this); + + synchronized (mLock) { + for (Display d : mDisplayManager.getDisplays()) { + mDozeStateByDisplay.put(d.getDisplayId(), mInjector.isDozeState(d)); + } + } + mInjector.registerDisplayListener(this, BackgroundThread.getHandler(), + DisplayManager.EVENT_FLAG_DISPLAY_ADDED + | DisplayManager.EVENT_FLAG_DISPLAY_CHANGED + | DisplayManager.EVENT_FLAG_DISPLAY_REMOVED); } - private void recalculateVotes() { + private void recalculateVotesLocked() { final Display[] displays = mDisplayManager.getDisplays(); for (Display d : displays) { int displayId = d.getDisplayId(); Vote vote = null; - if (mIsProxActive) { + if (mIsProxActive && !mDozeStateByDisplay.get(displayId)) { final RefreshRateRange rate = mDisplayManagerInternal.getRefreshRateForDisplayAndSensor( - displayId, PROXIMITY_SENSOR_NAME, PROXIMITY_SENSOR_TYPE); + displayId, mProximitySensorName, mProximitySensorType); if (rate != null) { vote = Vote.forRefreshRates(rate.min, rate.max); } @@ -2180,6 +2197,41 @@ public class DisplayModeDirector { void dumpLocked(PrintWriter pw) { pw.println(" SensorObserver"); pw.println(" mIsProxActive=" + mIsProxActive); + pw.println(" mDozeStateByDisplay:"); + for (int i = 0; i < mDozeStateByDisplay.size(); i++) { + final int id = mDozeStateByDisplay.keyAt(i); + final boolean dozed = mDozeStateByDisplay.valueAt(i); + pw.println(" " + id + " -> " + dozed); + } + } + + @Override + public void onDisplayAdded(int displayId) { + boolean isDozeState = mInjector.isDozeState(mDisplayManager.getDisplay(displayId)); + synchronized (mLock) { + mDozeStateByDisplay.put(displayId, isDozeState); + recalculateVotesLocked(); + } + } + + @Override + public void onDisplayChanged(int displayId) { + boolean wasDozeState = mDozeStateByDisplay.get(displayId); + synchronized (mLock) { + mDozeStateByDisplay.put(displayId, + mInjector.isDozeState(mDisplayManager.getDisplay(displayId))); + if (wasDozeState != mDozeStateByDisplay.get(displayId)) { + recalculateVotesLocked(); + } + } + } + + @Override + public void onDisplayRemoved(int displayId) { + synchronized (mLock) { + mDozeStateByDisplay.delete(displayId); + recalculateVotesLocked(); + } } } @@ -2411,6 +2463,8 @@ public class DisplayModeDirector { Handler handler, long flags); BrightnessInfo getBrightnessInfo(int displayId); + + boolean isDozeState(Display d); } @VisibleForTesting @@ -2463,6 +2517,11 @@ public class DisplayModeDirector { return null; } + @Override + public boolean isDozeState(Display d) { + return Display.isDozeState(d.getState()); + } + private DisplayManager getDisplayManager() { if (mDisplayManager == null) { mDisplayManager = mContext.getSystemService(DisplayManager.class); 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 a205a1d167fe..1ac28abb4c2f 100644 --- a/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java +++ b/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java @@ -1340,11 +1340,19 @@ public class DisplayModeDirectorTest { createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0); director.start(createMockSensorManager()); - ArgumentCaptor captor = + ArgumentCaptor ProximityCaptor = ArgumentCaptor.forClass(ProximityActiveListener.class); verify(mSensorManagerInternalMock).addProximityActiveListener(any(Executor.class), - captor.capture()); - ProximityActiveListener listener = captor.getValue(); + ProximityCaptor.capture()); + ProximityActiveListener proximityListener = ProximityCaptor.getValue(); + + ArgumentCaptor DisplayCaptor = + ArgumentCaptor.forClass(DisplayListener.class); + verify(mInjector).registerDisplayListener(DisplayCaptor.capture(), any(Handler.class), + eq(DisplayManager.EVENT_FLAG_DISPLAY_ADDED + | DisplayManager.EVENT_FLAG_DISPLAY_CHANGED + | DisplayManager.EVENT_FLAG_DISPLAY_REMOVED)); + DisplayListener displayListener = DisplayCaptor.getValue(); // Verify that there is no proximity vote initially Vote vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_PROXIMITY); @@ -1353,13 +1361,38 @@ public class DisplayModeDirectorTest { when(mDisplayManagerInternalMock.getRefreshRateForDisplayAndSensor(eq(DISPLAY_ID), eq(null), eq(Sensor.STRING_TYPE_PROXIMITY))).thenReturn(new RefreshRateRange(60, 60)); + when(mInjector.isDozeState(any(Display.class))).thenReturn(false); + // Set the proximity to active and verify that we added a vote. - listener.onProximityActive(true); + proximityListener.onProximityActive(true); + vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_PROXIMITY); + assertVoteForRefreshRate(vote, 60.f); + + // Set the display state to doze and verify that the vote is gone + when(mInjector.isDozeState(any(Display.class))).thenReturn(true); + displayListener.onDisplayAdded(DISPLAY_ID); + vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_PROXIMITY); + assertNull(vote); + + // Set the display state to on and verify that we added the vote back. + when(mInjector.isDozeState(any(Display.class))).thenReturn(false); + displayListener.onDisplayChanged(DISPLAY_ID); + vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_PROXIMITY); + assertVoteForRefreshRate(vote, 60.f); + + // Set the display state to doze and verify that the vote is gone + when(mInjector.isDozeState(any(Display.class))).thenReturn(true); + displayListener.onDisplayAdded(DISPLAY_ID); + vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_PROXIMITY); + assertNull(vote); + + // Remove the display to cause the doze state to be removed + displayListener.onDisplayRemoved(DISPLAY_ID); vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_PROXIMITY); assertVoteForRefreshRate(vote, 60.f); // Turn prox off and verify vote is gone. - listener.onProximityActive(false); + proximityListener.onProximityActive(false); vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_PROXIMITY); assertNull(vote); } @@ -1710,6 +1743,11 @@ public class DisplayModeDirectorTest { return null; } + @Override + public boolean isDozeState(Display d) { + return false; + } + void notifyPeakRefreshRateChanged() { if (mPeakRefreshRateObserver != null) { mPeakRefreshRateObserver.dispatchChange(false /*selfChange*/, -- cgit v1.2.3 From aea00a1d59d06677aa6090d93a977417b7d6e67e Mon Sep 17 00:00:00 2001 From: Jayachandran C Date: Tue, 3 Aug 2021 10:32:49 -0700 Subject: Update telephony OWNERS file Bug: 195421431 Test: Build Change-Id: I60065d54f8248497ad02fc8034530416b9eceec8 --- packages/CarrierDefaultApp/OWNERS | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/CarrierDefaultApp/OWNERS b/packages/CarrierDefaultApp/OWNERS index 56688409bf78..0d23f053499c 100644 --- a/packages/CarrierDefaultApp/OWNERS +++ b/packages/CarrierDefaultApp/OWNERS @@ -1,7 +1,6 @@ set noparent tgunn@google.com breadley@google.com -hallliu@google.com rgreenwalt@google.com amitmahajan@google.com fionaxu@google.com @@ -9,9 +8,11 @@ jackyu@google.com jminjie@google.com satk@google.com shuoq@google.com -refuhoo@google.com nazaninb@google.com sarahchin@google.com -dbright@google.com xiaotonj@google.com +huiwang@google.com +jayachandranc@google.com +chinmayd@google.com +amruthr@google.com -- cgit v1.2.3 From d3c86632f8a740f6cecd9092b82ecdbee21b5883 Mon Sep 17 00:00:00 2001 From: Jayant Chowdhary Date: Tue, 3 Aug 2021 02:07:23 -0700 Subject: camera2: Fix backward compatibility breakage for setting metering regions. With the new entries in sSetCommandMap, the private functions for setting metering regions cast the input value to MeteringRegion[], which can break some existing clients which pass in Object[] to CameraMetadata.set(). We revert to the old behavior of letting Marshaler handle conversion from Object[] -> MeteringRectangle[] internally. Bug: 195095702 Test: GCA with different zoom (basic validity) Test: ITS scene1_1 Test: Camera CTS Change-Id: Iea372adf76d1c6f81f1c63ff2bd3553ab39f30e4 Signed-off-by: Jayant Chowdhary --- .../hardware/camera2/impl/CameraMetadataNative.java | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/core/java/android/hardware/camera2/impl/CameraMetadataNative.java b/core/java/android/hardware/camera2/impl/CameraMetadataNative.java index 8fd9a6abf7b6..196134b397cb 100644 --- a/core/java/android/hardware/camera2/impl/CameraMetadataNative.java +++ b/core/java/android/hardware/camera2/impl/CameraMetadataNative.java @@ -1720,21 +1720,21 @@ public class CameraMetadataNative implements Parcelable { new SetCommand() { @Override public void setValue(CameraMetadataNative metadata, T value) { - metadata.setAWBRegions((MeteringRectangle[]) value); + metadata.setAWBRegions(value); } }); sSetCommandMap.put(CaptureRequest.CONTROL_AF_REGIONS.getNativeKey(), new SetCommand() { @Override public void setValue(CameraMetadataNative metadata, T value) { - metadata.setAFRegions((MeteringRectangle[]) value); + metadata.setAFRegions(value); } }); sSetCommandMap.put(CaptureRequest.CONTROL_AE_REGIONS.getNativeKey(), new SetCommand() { @Override public void setValue(CameraMetadataNative metadata, T value) { - metadata.setAERegions((MeteringRectangle[]) value); + metadata.setAERegions(value); } }); } @@ -1815,30 +1815,33 @@ public class CameraMetadataNative implements Parcelable { return true; } - private boolean setAFRegions(MeteringRectangle[] afRegions) { + private boolean setAFRegions(T afRegions) { if (afRegions == null) { return false; } setBase(CaptureRequest.CONTROL_AF_REGIONS_SET, true); - setBase(CaptureRequest.CONTROL_AF_REGIONS, afRegions); + // The cast to CaptureRequest.Key is needed since java does not support template + // specialization and we need to route this method to + // setBase(CaptureRequest.Key key, T value) + setBase((CaptureRequest.Key)CaptureRequest.CONTROL_AF_REGIONS, afRegions); return true; } - private boolean setAERegions(MeteringRectangle[] aeRegions) { + private boolean setAERegions(T aeRegions) { if (aeRegions == null) { return false; } setBase(CaptureRequest.CONTROL_AE_REGIONS_SET, true); - setBase(CaptureRequest.CONTROL_AE_REGIONS, aeRegions); + setBase((CaptureRequest.Key)CaptureRequest.CONTROL_AE_REGIONS, aeRegions); return true; } - private boolean setAWBRegions(MeteringRectangle[] awbRegions) { + private boolean setAWBRegions(T awbRegions) { if (awbRegions == null) { return false; } setBase(CaptureRequest.CONTROL_AWB_REGIONS_SET, true); - setBase(CaptureRequest.CONTROL_AWB_REGIONS, awbRegions); + setBase((CaptureRequest.Key)CaptureRequest.CONTROL_AWB_REGIONS, awbRegions); return true; } -- cgit v1.2.3 From a72b3e92e9054e9e410f75a78314b9ff5f23657e Mon Sep 17 00:00:00 2001 From: Emilian Peev Date: Tue, 3 Aug 2021 13:04:59 -0700 Subject: Camera: Don't override extension surface native format Avoid overriding the native extension surface format when retrieving the surface parameters. The native surface format can later be used to configure the device extension so the original value must be known. Bug: 195366395 Test: atest -c cts/tests/camera/src/android/hardware/camera2/cts/CameraExtensionSessionTest.java Change-Id: I52d091fd782dc9ca2af60ba42ec1c5bbe080c1ca --- .../hardware/camera2/impl/CameraExtensionUtils.java | 2 +- .../android/hardware/camera2/utils/SurfaceUtils.java | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/core/java/android/hardware/camera2/impl/CameraExtensionUtils.java b/core/java/android/hardware/camera2/impl/CameraExtensionUtils.java index 9acf9bf0c803..afefcbe80bf1 100644 --- a/core/java/android/hardware/camera2/impl/CameraExtensionUtils.java +++ b/core/java/android/hardware/camera2/impl/CameraExtensionUtils.java @@ -75,7 +75,7 @@ public final class CameraExtensionUtils { ImageWriter writer = null; Image img = null; SurfaceInfo surfaceInfo = new SurfaceInfo(); - int nativeFormat = SurfaceUtils.getSurfaceFormat(s); + int nativeFormat = SurfaceUtils.detectSurfaceFormat(s); int dataspace = SurfaceUtils.getSurfaceDataspace(s); Size surfaceSize = SurfaceUtils.getSurfaceSize(s); surfaceInfo.mFormat = nativeFormat; diff --git a/core/java/android/hardware/camera2/utils/SurfaceUtils.java b/core/java/android/hardware/camera2/utils/SurfaceUtils.java index 57d8ded79e8e..fd1a33161740 100644 --- a/core/java/android/hardware/camera2/utils/SurfaceUtils.java +++ b/core/java/android/hardware/camera2/utils/SurfaceUtils.java @@ -159,6 +159,23 @@ public class SurfaceUtils { return surfaceType; } + /** + * Detect and retrieve the Surface format without any + * additional overrides. + * + * @param surface The surface to be queried for format. + * @return format of the surface. + * + * @throws IllegalArgumentException if the surface is already abandoned. + */ + public static int detectSurfaceFormat(Surface surface) { + checkNotNull(surface); + int surfaceType = nativeDetectSurfaceType(surface); + if (surfaceType == BAD_VALUE) throw new IllegalArgumentException("Surface was abandoned"); + + return surfaceType; + } + /** * Get the Surface dataspace. * -- cgit v1.2.3 From 4e51482aaf7ea8b7961a23726283096ed7db4d09 Mon Sep 17 00:00:00 2001 From: Brad Ebinger Date: Mon, 2 Aug 2021 18:35:53 -0700 Subject: Remove SipDelegates in ImsService if Phone process crashes If the phone process crashes, have the ImsService detect this condition and destroy all SipDelegates. This allows the AM app to properly recover when telephony comes back up Bug: 195148134 Test: manually crash phone process and then send RCS message Test: atest FrameworksTelephonyTests:SipTransportImplBaseTest Change-Id: I7866273d801df4d2b20e58f5d5ad50fd0ac4303d --- .../telephony/ims/aidl/SipDelegateAidlWrapper.java | 4 ++ .../telephony/ims/stub/SipTransportImplBase.java | 46 +++++++++++++++++++--- 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/telephony/java/android/telephony/ims/aidl/SipDelegateAidlWrapper.java b/telephony/java/android/telephony/ims/aidl/SipDelegateAidlWrapper.java index c18ab33eb2c9..f0048248a5cc 100644 --- a/telephony/java/android/telephony/ims/aidl/SipDelegateAidlWrapper.java +++ b/telephony/java/android/telephony/ims/aidl/SipDelegateAidlWrapper.java @@ -193,6 +193,10 @@ public class SipDelegateAidlWrapper implements DelegateStateCallback, DelegateMe return mDelegateBinder; } + public ISipDelegateStateCallback getStateCallbackBinder() { + return mStateBinder; + } + private void notifyLocalMessageFailedToBeReceived(SipMessage m, int reason) { String transactionId = m.getViaBranchParameter(); SipDelegate d = mDelegate; diff --git a/telephony/java/android/telephony/ims/stub/SipTransportImplBase.java b/telephony/java/android/telephony/ims/stub/SipTransportImplBase.java index 1f74c09af0f6..13ea99735ab4 100644 --- a/telephony/java/android/telephony/ims/stub/SipTransportImplBase.java +++ b/telephony/java/android/telephony/ims/stub/SipTransportImplBase.java @@ -21,6 +21,7 @@ import android.annotation.SuppressLint; import android.annotation.SystemApi; import android.os.Binder; import android.os.IBinder; +import android.os.RemoteException; import android.telephony.ims.DelegateMessageCallback; import android.telephony.ims.DelegateRequest; import android.telephony.ims.DelegateStateCallback; @@ -33,6 +34,7 @@ import android.telephony.ims.aidl.SipDelegateAidlWrapper; import android.util.Log; import java.util.ArrayList; +import java.util.NoSuchElementException; import java.util.Objects; import java.util.concurrent.Executor; @@ -49,10 +51,15 @@ import java.util.concurrent.Executor; public class SipTransportImplBase { private static final String LOG_TAG = "SipTransportIB"; - private IBinder.DeathRecipient mDeathRecipient = new IBinder.DeathRecipient() { + private final IBinder.DeathRecipient mDeathRecipient = new IBinder.DeathRecipient() { @Override public void binderDied() { - mBinderExecutor.execute(() -> binderDiedInternal()); + // Clean up all binders in this case. + mBinderExecutor.execute(() -> binderDiedInternal(null)); + } + @Override + public void binderDied(IBinder who) { + mBinderExecutor.execute(() -> binderDiedInternal(who)); } }; @@ -142,6 +149,7 @@ public class SipTransportImplBase { ISipDelegateStateCallback cb, ISipDelegateMessageCallback mc) { SipDelegateAidlWrapper wrapper = new SipDelegateAidlWrapper(mBinderExecutor, cb, mc); mDelegates.add(wrapper); + linkDeathRecipient(wrapper); createSipDelegate(subId, r, wrapper, wrapper); } @@ -155,6 +163,7 @@ public class SipTransportImplBase { } if (result != null) { + unlinkDeathRecipient(result); mDelegates.remove(result); destroySipDelegate(result.getDelegate(), reason); } else { @@ -163,12 +172,37 @@ public class SipTransportImplBase { } } - private void binderDiedInternal() { + private void linkDeathRecipient(SipDelegateAidlWrapper w) { + try { + w.getStateCallbackBinder().asBinder().linkToDeath(mDeathRecipient, 0); + } catch (RemoteException e) { + Log.w(LOG_TAG, "linkDeathRecipient, remote process already died, cleaning up."); + mDeathRecipient.binderDied(w.getStateCallbackBinder().asBinder()); + } + } + + private void unlinkDeathRecipient(SipDelegateAidlWrapper w) { + try { + w.getStateCallbackBinder().asBinder().unlinkToDeath(mDeathRecipient, 0); + } catch (NoSuchElementException e) { + // Ignore this case. + } + } + + private void binderDiedInternal(IBinder who) { for (SipDelegateAidlWrapper w : mDelegates) { - destroySipDelegate(w.getDelegate(), - SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_SERVICE_DEAD); + // If the binder itself was not given from the platform, just clean up all binders. + if (who == null || w.getStateCallbackBinder().asBinder().equals(who)) { + Log.w(LOG_TAG, "Binder death detected for " + w + ", calling destroy and " + + "removing."); + mDelegates.remove(w); + destroySipDelegate(w.getDelegate(), + SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_SERVICE_DEAD); + return; + } } - mDelegates.clear(); + Log.w(LOG_TAG, "Binder death detected for IBinder " + who + ", but couldn't find matching " + + "SipDelegate"); } /** -- cgit v1.2.3 From 9fb4c3090bb137a3d74c2eb15c604ab46c826f8b Mon Sep 17 00:00:00 2001 From: Kevin Chyn Date: Tue, 3 Aug 2021 13:09:56 -0700 Subject: Update error haptics for coex Fixes: 193089985 Test: atest com.android.server.biometrics Change-Id: I9daecabd1b5609261584146dd3ecb8f175312813 --- .../biometrics/sensors/AuthenticationClient.java | 16 ++++- .../server/biometrics/sensors/CoexCoordinator.java | 68 +++++++++++++++++- .../face/aidl/FaceAuthenticationClient.java | 26 ++----- .../face/hidl/FaceAuthenticationClient.java | 23 +----- .../aidl/FingerprintAuthenticationClient.java | 6 ++ .../hidl/FingerprintAuthenticationClient.java | 6 ++ .../biometrics/sensors/BiometricSchedulerTest.java | 10 +++ .../biometrics/sensors/CoexCoordinatorTest.java | 81 ++++++++++++++++++++++ 8 files changed, 192 insertions(+), 44 deletions(-) diff --git a/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java index 705b3aa12391..6f38ed04cd96 100644 --- a/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java @@ -82,7 +82,7 @@ public abstract class AuthenticationClient extends AcquisitionClient private long mStartTimeMs; - protected boolean mAuthAttempted; + private boolean mAuthAttempted; // TODO: This is currently hard to maintain, as each AuthenticationClient subclass must update // the state. We should think of a way to improve this in the future. @@ -98,6 +98,12 @@ public abstract class AuthenticationClient extends AcquisitionClient */ protected abstract void handleLifecycleAfterAuth(boolean authenticated); + /** + * @return true if a user was detected (i.e. face was found, fingerprint sensor was touched. + * etc) + */ + public abstract boolean wasUserDetected(); + public AuthenticationClient(@NonNull Context context, @NonNull LazyDaemon lazyDaemon, @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, int targetUserId, long operationId, boolean restricted, @NonNull String owner, @@ -381,9 +387,11 @@ public abstract class AuthenticationClient extends AcquisitionClient } @Override - public void onError(int errorCode, int vendorCode) { + public void onError(@BiometricConstants.Errors int errorCode, int vendorCode) { super.onError(errorCode, vendorCode); mState = STATE_STOPPED; + + CoexCoordinator.getInstance().onAuthenticationError(this, errorCode, this::vibrateError); } /** @@ -445,4 +453,8 @@ public abstract class AuthenticationClient extends AcquisitionClient public boolean interruptsPrecedingClients() { return true; } + + public boolean wasAuthAttempted() { + return mAuthAttempted; + } } diff --git a/services/core/java/com/android/server/biometrics/sensors/CoexCoordinator.java b/services/core/java/com/android/server/biometrics/sensors/CoexCoordinator.java index 6d32fdebe582..25d4a38cd475 100644 --- a/services/core/java/com/android/server/biometrics/sensors/CoexCoordinator.java +++ b/services/core/java/com/android/server/biometrics/sensors/CoexCoordinator.java @@ -22,6 +22,7 @@ import static com.android.server.biometrics.sensors.BiometricScheduler.sensorTyp import android.annotation.NonNull; import android.annotation.Nullable; +import android.hardware.biometrics.BiometricConstants; import android.os.Handler; import android.os.Looper; import android.util.Slog; @@ -54,7 +55,7 @@ public class CoexCoordinator { /** * Callback interface notifying the owner of "results" from the CoexCoordinator's business - * logic. + * logic for accept and reject. */ interface Callback { /** @@ -80,6 +81,17 @@ public class CoexCoordinator { void sendAuthenticationCanceled(); } + /** + * Callback interface notifying the owner of "results" from the CoexCoordinator's business + * logic for errors. + */ + interface ErrorCallback { + /** + * Requests the owner to initiate a vibration for this event. + */ + void sendHapticFeedback(); + } + private static CoexCoordinator sInstance; @VisibleForTesting @@ -203,6 +215,9 @@ public class CoexCoordinator { mClientMap.remove(sensorType); } + /** + * Notify the coordinator that authentication succeeded (accepted) + */ public void onAuthenticationSucceeded(long currentTimeMillis, @NonNull AuthenticationClient client, @NonNull Callback callback) { @@ -273,6 +288,9 @@ public class CoexCoordinator { } } + /** + * Notify the coordinator that a rejection has occurred. + */ public void onAuthenticationRejected(long currentTimeMillis, @NonNull AuthenticationClient client, @LockoutTracker.LockoutMode int lockoutMode, @@ -357,6 +375,54 @@ public class CoexCoordinator { } } + /** + * Notify the coordinator that an error has occurred. + */ + public void onAuthenticationError(@NonNull AuthenticationClient client, + @BiometricConstants.Errors int error, @NonNull ErrorCallback callback) { + // Figure out non-coex state + final boolean shouldUsuallyVibrate; + if (isCurrentFaceAuth(client)) { + final boolean notDetectedOnKeyguard = client.isKeyguard() && !client.wasUserDetected(); + final boolean authAttempted = client.wasAuthAttempted(); + + switch (error) { + case BiometricConstants.BIOMETRIC_ERROR_TIMEOUT: + case BiometricConstants.BIOMETRIC_ERROR_LOCKOUT: + case BiometricConstants.BIOMETRIC_ERROR_LOCKOUT_PERMANENT: + shouldUsuallyVibrate = authAttempted && !notDetectedOnKeyguard; + break; + default: + shouldUsuallyVibrate = false; + break; + } + } else { + shouldUsuallyVibrate = false; + } + + // Figure out coex state + final boolean keyguardAdvancedLogic = mAdvancedLogicEnabled && client.isKeyguard(); + final boolean hapticSuppressedByCoex; + + if (keyguardAdvancedLogic) { + if (isSingleAuthOnly(client)) { + hapticSuppressedByCoex = false; + } else { + hapticSuppressedByCoex = isCurrentFaceAuth(client) + && !client.isKeyguardBypassEnabled(); + } + } else { + hapticSuppressedByCoex = false; + } + + // Combine and send feedback if appropriate + Slog.d(TAG, "shouldUsuallyVibrate: " + shouldUsuallyVibrate + + ", hapticSuppressedByCoex: " + hapticSuppressedByCoex); + if (shouldUsuallyVibrate && !hapticSuppressedByCoex) { + callback.sendHapticFeedback(); + } + } + @Nullable private SuccessfulAuth popSuccessfulFaceAuthIfExists(long currentTimeMillis) { for (SuccessfulAuth auth : mSuccessfulAuths) { diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java index f7fd8d0972f6..d66a27920f49 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java @@ -127,7 +127,8 @@ class FaceAuthenticationClient extends AuthenticationClient implements } } - private boolean wasUserDetected() { + @Override + public boolean wasUserDetected() { // Do not provide haptic feedback if the user was not detected, and an error (usually // ERROR_TIMEOUT) is received. return mLastAcquire != FaceManager.FACE_ACQUIRED_NOT_DETECTED @@ -160,7 +161,7 @@ class FaceAuthenticationClient extends AuthenticationClient implements } @Override - public void onError(int error, int vendorCode) { + public void onError(@BiometricConstants.Errors int error, int vendorCode) { mUsageStats.addEvent(new UsageStats.AuthenticationEvent( getStartTimeMs(), System.currentTimeMillis() - getStartTimeMs() /* latency */, @@ -169,25 +170,8 @@ class FaceAuthenticationClient extends AuthenticationClient implements vendorCode, getTargetUserId())); - switch (error) { - case BiometricConstants.BIOMETRIC_ERROR_TIMEOUT: - if (!wasUserDetected() && !isBiometricPrompt()) { - // No vibration if user was not detected on keyguard - break; - } - case BiometricConstants.BIOMETRIC_ERROR_LOCKOUT: - case BiometricConstants.BIOMETRIC_ERROR_LOCKOUT_PERMANENT: - if (mAuthAttempted) { - // Only vibrate if auth was attempted. If the user was already locked out prior - // to starting authentication, do not vibrate. - vibrateError(); - } - break; - case BiometricConstants.BIOMETRIC_ERROR_RE_ENROLL: - BiometricNotificationUtils.showReEnrollmentNotification(getContext()); - break; - default: - break; + if (error == BiometricConstants.BIOMETRIC_ERROR_RE_ENROLL) { + BiometricNotificationUtils.showReEnrollmentNotification(getContext()); } super.onError(error, vendorCode); diff --git a/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceAuthenticationClient.java index c33b957223a4..33950af2216f 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceAuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceAuthenticationClient.java @@ -115,7 +115,8 @@ class FaceAuthenticationClient extends AuthenticationClient { } } - private boolean wasUserDetected() { + @Override + public boolean wasUserDetected() { // Do not provide haptic feedback if the user was not detected, and an error (usually // ERROR_TIMEOUT) is received. return mLastAcquire != FaceManager.FACE_ACQUIRED_NOT_DETECTED @@ -147,7 +148,7 @@ class FaceAuthenticationClient extends AuthenticationClient { } @Override - public void onError(int error, int vendorCode) { + public void onError(@BiometricConstants.Errors int error, int vendorCode) { mUsageStats.addEvent(new UsageStats.AuthenticationEvent( getStartTimeMs(), System.currentTimeMillis() - getStartTimeMs() /* latency */, @@ -156,24 +157,6 @@ class FaceAuthenticationClient extends AuthenticationClient { vendorCode, getTargetUserId())); - switch (error) { - case BiometricConstants.BIOMETRIC_ERROR_TIMEOUT: - if (!wasUserDetected() && !isBiometricPrompt()) { - // No vibration if user was not detected on keyguard - break; - } - case BiometricConstants.BIOMETRIC_ERROR_LOCKOUT: - case BiometricConstants.BIOMETRIC_ERROR_LOCKOUT_PERMANENT: - if (mAuthAttempted) { - // Only vibrate if auth was attempted. If the user was already locked out prior - // to starting authentication, do not vibrate. - vibrateError(); - } - break; - default: - break; - } - super.onError(error, vendorCode); } diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java index 8835c1e02610..37ee76adeece 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java @@ -105,6 +105,12 @@ class FingerprintAuthenticationClient extends AuthenticationClient imp } } + @Override + public boolean wasUserDetected() { + // TODO: Update if it needs to be used for fingerprint, i.e. success/reject, error_timeout + return false; + } + @Override public void onAuthenticated(BiometricAuthenticator.Identifier identifier, boolean authenticated, ArrayList token) { diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintAuthenticationClient.java index 83f1480f4611..5060744bb33e 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintAuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintAuthenticationClient.java @@ -152,6 +152,12 @@ class FingerprintAuthenticationClient extends AuthenticationClient { @@ -407,6 +412,11 @@ public class BiometricSchedulerTest { protected void handleLifecycleAfterAuth(boolean authenticated) { } + + @Override + public boolean wasUserDetected() { + return false; + } } private static class TestClientMonitor2 extends TestClientMonitor { diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/CoexCoordinatorTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/CoexCoordinatorTest.java index 1263f7b84db1..bfb0be760f85 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/CoexCoordinatorTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/CoexCoordinatorTest.java @@ -32,6 +32,7 @@ import static org.mockito.Mockito.when; import static org.mockito.Mockito.withSettings; import android.content.Context; +import android.hardware.biometrics.BiometricConstants; import android.os.Handler; import android.os.Looper; import android.platform.test.annotations.Presubmit; @@ -61,6 +62,8 @@ public class CoexCoordinatorTest { private Context mContext; @Mock private CoexCoordinator.Callback mCallback; + @Mock + private CoexCoordinator.ErrorCallback mErrorCallback; @Before public void setUp() { @@ -490,4 +493,82 @@ public class CoexCoordinatorTest { verify(callback).handleLifecycleAfterAuth(); verify(successfulAuths).remove(eq(auth)); } + + @Test + public void testBiometricPrompt_FaceError() { + mCoexCoordinator.reset(); + + AuthenticationClient client = mock(AuthenticationClient.class); + when(client.isBiometricPrompt()).thenReturn(true); + when(client.wasAuthAttempted()).thenReturn(true); + + mCoexCoordinator.addAuthenticationClient(SENSOR_TYPE_FACE, client); + + mCoexCoordinator.onAuthenticationError(client, BiometricConstants.BIOMETRIC_ERROR_TIMEOUT, + mErrorCallback); + verify(mErrorCallback).sendHapticFeedback(); + } + + @Test + public void testKeyguard_faceAuthOnly_errorWhenBypassEnabled() { + testKeyguard_faceAuthOnly(true /* bypassEnabled */); + } + + @Test + public void testKeyguard_faceAuthOnly_errorWhenBypassDisabled() { + testKeyguard_faceAuthOnly(false /* bypassEnabled */); + } + + private void testKeyguard_faceAuthOnly(boolean bypassEnabled) { + mCoexCoordinator.reset(); + + AuthenticationClient client = mock(AuthenticationClient.class); + when(client.isKeyguard()).thenReturn(true); + when(client.isKeyguardBypassEnabled()).thenReturn(bypassEnabled); + when(client.wasAuthAttempted()).thenReturn(true); + when(client.wasUserDetected()).thenReturn(true); + + mCoexCoordinator.addAuthenticationClient(SENSOR_TYPE_FACE, client); + + mCoexCoordinator.onAuthenticationError(client, BiometricConstants.BIOMETRIC_ERROR_TIMEOUT, + mErrorCallback); + verify(mErrorCallback).sendHapticFeedback(); + } + + @Test + public void testKeyguard_coex_faceErrorWhenBypassEnabled() { + testKeyguard_coex_faceError(true /* bypassEnabled */); + } + + @Test + public void testKeyguard_coex_faceErrorWhenBypassDisabled() { + testKeyguard_coex_faceError(false /* bypassEnabled */); + } + + private void testKeyguard_coex_faceError(boolean bypassEnabled) { + mCoexCoordinator.reset(); + + AuthenticationClient faceClient = mock(AuthenticationClient.class); + when(faceClient.isKeyguard()).thenReturn(true); + when(faceClient.isKeyguardBypassEnabled()).thenReturn(bypassEnabled); + when(faceClient.wasAuthAttempted()).thenReturn(true); + when(faceClient.wasUserDetected()).thenReturn(true); + + AuthenticationClient udfpsClient = mock(AuthenticationClient.class, + withSettings().extraInterfaces(Udfps.class)); + when(udfpsClient.isKeyguard()).thenReturn(true); + when(((Udfps) udfpsClient).isPointerDown()).thenReturn(false); + + mCoexCoordinator.addAuthenticationClient(SENSOR_TYPE_FACE, faceClient); + mCoexCoordinator.addAuthenticationClient(SENSOR_TYPE_UDFPS, udfpsClient); + + mCoexCoordinator.onAuthenticationError(faceClient, + BiometricConstants.BIOMETRIC_ERROR_TIMEOUT, mErrorCallback); + + if (bypassEnabled) { + verify(mErrorCallback).sendHapticFeedback(); + } else { + verify(mErrorCallback, never()).sendHapticFeedback(); + } + } } -- cgit v1.2.3 From f1de4ee934f89e03002a93155f442addcfc4e267 Mon Sep 17 00:00:00 2001 From: Evan Severson Date: Tue, 3 Aug 2021 16:58:40 -0700 Subject: Don't show sensor use dialog for system uid If the system uid is being noted for mic or camera op, it will have to be explicitely accounted for to show the user any sort of UI to unmute the mic or camera. Test: Add some logcat statements to verify the correct code paths are being hit when placing and answering phone calls and when trying to trigger hotword. Bug: 195122900 Change-Id: I601458ea2dd7557e4a557eab32c2da15828ae4a7 --- .../android/hardware/ISensorPrivacyManager.aidl | 2 ++ .../android/hardware/SensorPrivacyManager.java | 22 +++++++++++++++++++++ .../com/android/server/SensorPrivacyService.java | 23 +++++++++++++++++----- 3 files changed, 42 insertions(+), 5 deletions(-) diff --git a/core/java/android/hardware/ISensorPrivacyManager.aidl b/core/java/android/hardware/ISensorPrivacyManager.aidl index d69a9e14b4bf..55711654231e 100644 --- a/core/java/android/hardware/ISensorPrivacyManager.aidl +++ b/core/java/android/hardware/ISensorPrivacyManager.aidl @@ -52,4 +52,6 @@ interface ISensorPrivacyManager { void addUserGlobalIndividualSensorPrivacyListener(int sensor, in ISensorPrivacyListener listener); void removeUserGlobalIndividualSensorPrivacyListener(int sensor, in ISensorPrivacyListener listener); + + void showSensorUseDialog(int sensor); } \ No newline at end of file diff --git a/core/java/android/hardware/SensorPrivacyManager.java b/core/java/android/hardware/SensorPrivacyManager.java index fa7ce11c5414..3c524b2052f7 100644 --- a/core/java/android/hardware/SensorPrivacyManager.java +++ b/core/java/android/hardware/SensorPrivacyManager.java @@ -33,6 +33,7 @@ import android.os.UserHandle; import android.service.SensorPrivacyIndividualEnabledSensorProto; import android.service.SensorPrivacyToggleSourceProto; import android.util.ArrayMap; +import android.util.Log; import android.util.Pair; import android.util.SparseArray; @@ -48,6 +49,8 @@ import java.util.concurrent.Executor; @SystemService(Context.SENSOR_PRIVACY_SERVICE) public final class SensorPrivacyManager { + private static final String LOG_TAG = SensorPrivacyManager.class.getSimpleName(); + /** * Unique Id of this manager to identify to the service * @hide @@ -504,6 +507,25 @@ public final class SensorPrivacyManager { } } + /** + * If sensor privacy for the provided sensor is enabled then this call will show the user the + * dialog which is shown when an application attempts to use that sensor. If privacy isn't + * enabled then this does nothing. + * + * This call can only be made by the system uid. + * + * @throws SecurityException when called by someone other than system uid. + * + * @hide + */ + public void showSensorUseDialog(int sensor) { + try { + mService.showSensorUseDialog(sensor); + } catch (RemoteException e) { + Log.e(LOG_TAG, "Received exception while trying to show sensor use dialog", e); + } + } + /** * A class implementing this interface can register with the {@link * android.hardware.SensorPrivacyManager} to receive notification when the all-sensor privacy diff --git a/services/core/java/com/android/server/SensorPrivacyService.java b/services/core/java/com/android/server/SensorPrivacyService.java index 40e63dac72ea..422e8ae14862 100644 --- a/services/core/java/com/android/server/SensorPrivacyService.java +++ b/services/core/java/com/android/server/SensorPrivacyService.java @@ -413,6 +413,12 @@ public final class SensorPrivacyService extends SystemService { return; } + if (uid == Process.SYSTEM_UID) { + // If the system uid is being blamed for sensor access, the ui must be shown + // explicitly using SensorPrivacyManager#showSensorUseDialog + return; + } + synchronized (mLock) { if (mSuppressReminders.containsKey(new Pair<>(sensor, user))) { Log.d(TAG, @@ -421,11 +427,6 @@ public final class SensorPrivacyService extends SystemService { } } - if (uid == Process.SYSTEM_UID) { - enqueueSensorUseReminderDialogAsync(-1, user, packageName, sensor); - return; - } - // TODO: Handle reminders with multiple sensors // - If we have a likely activity that triggered the sensor use overlay a dialog over @@ -1241,6 +1242,18 @@ public final class SensorPrivacyService extends SystemService { } } + @Override + public void showSensorUseDialog(int sensor) { + if (Binder.getCallingUid() != Process.SYSTEM_UID) { + throw new SecurityException("Can only be called by the system uid"); + } + if (!isIndividualSensorPrivacyEnabled(mCurrentUser, sensor)) { + return; + } + enqueueSensorUseReminderDialogAsync( + -1, UserHandle.of(mCurrentUser), "android", sensor); + } + private void userSwitching(int from, int to) { boolean micState; boolean camState; -- cgit v1.2.3 From 6c675a3a48260077dedfd23679f55d833f3ea526 Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Wed, 4 Aug 2021 10:13:13 +0800 Subject: Fix NPE when calling recreate in onCreate ActivityClientRecord#activity is assigned after calling Activity#onCreate. A use case is that the app uses support library to set night mode in onCreate. Bug: 195418295 Test: Invoke Activity#recreate() in Activity#onCreate. Change-Id: I6319cd6ee94fc2603979da47303963d04168db04 --- core/java/android/app/ActivityThread.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index dbaf2757a9e2..0c64c86daf3e 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -5654,8 +5654,8 @@ public final class ActivityThread extends ClientTransactionHandler */ private void scheduleRelaunchActivityIfPossible(@NonNull ActivityClientRecord r, boolean preserveWindow) { - if (r.activity.mFinished || r.token instanceof Binder) { - // Do not schedule relaunch if the activity is finishing or not a local object (e.g. + if ((r.activity != null && r.activity.mFinished) || r.token instanceof Binder) { + // Do not schedule relaunch if the activity is finishing or is a local object (e.g. // created by ActivtiyGroup that server side doesn't recognize it). return; } -- cgit v1.2.3 From 41b167dba7c7a9dde48448fd945f535fb9be722e Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 4 Aug 2021 09:13:13 +0000 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I8c629a3267c2f371664d03b552941f5e3cc73666 --- core/res/res/values-de/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 199e82f9d170..865f02663299 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -1937,7 +1937,7 @@ "Phishing-Warnung" "Arbeitsprofil" "Gewarnt" - "Bestätigt" + "Verifiziert" "Maximieren" "Minimieren" "Maximierung ein-/auschalten" -- cgit v1.2.3 From ee8f81d6b4def9d469dd02d4e60602b656f0a96e Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 4 Aug 2021 10:09:24 +0000 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I682d240e086e7ea706c7a513b84e6e0e872b2365 --- libs/WindowManager/Shell/res/values-te/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/WindowManager/Shell/res/values-te/strings.xml b/libs/WindowManager/Shell/res/values-te/strings.xml index 624b8b37a1ee..c2b6ffbd1048 100644 --- a/libs/WindowManager/Shell/res/values-te/strings.xml +++ b/libs/WindowManager/Shell/res/values-te/strings.xml @@ -31,7 +31,7 @@ "స్టాచ్" "ఆన్‌స్టాచ్" "స్క్రీన్ విభజనతో యాప్‌ పని చేయకపోవచ్చు." - "అనువర్తనంలో స్క్రీన్ విభజనకు మద్దతు లేదు." + "యాప్‌లో స్క్రీన్ విభజనకు మద్దతు లేదు." "ప్రత్యామ్నాయ డిస్‌ప్లేలో యాప్ పని చేయకపోవచ్చు." "ప్రత్యామ్నాయ డిస్‌ప్లేల్లో ప్రారంభానికి యాప్ మద్దతు లేదు." "విభజన స్క్రీన్ విభాగిని" -- cgit v1.2.3 From 4a4ab854b96a9aaed4993685ac3533e0c5b43c74 Mon Sep 17 00:00:00 2001 From: Vadim Caen Date: Wed, 4 Aug 2021 13:38:47 +0200 Subject: Fix background bleeding in splash scren image view Re-add the @null background on the splash screen icon image view to ensure we don't display the windowBackground in the image view Test: Manually tested with faulty apps (SwiftKey, Whatsapp, Splitwise) Bug: 195433420 Change-Id: I4e489b203ff30385112dbc4aa60c4b6aceb4d6b0 --- core/res/res/layout/splash_screen_view.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/core/res/res/layout/splash_screen_view.xml b/core/res/res/layout/splash_screen_view.xml index aa050f3a364d..2b9f95227f08 100644 --- a/core/res/res/layout/splash_screen_view.xml +++ b/core/res/res/layout/splash_screen_view.xml @@ -26,6 +26,7 @@ android:layout_width="wrap_content" android:layout_gravity="center" android:padding="0dp" + android:background="@null" android:contentDescription="@string/splash_screen_view_icon_description"/> Date: Wed, 4 Aug 2021 12:48:29 +0000 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Id5b1dae5a646cc2213b8ba410d45a999d72547f5 --- packages/SystemUI/res/values-te/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index 485fb82ae750..6a97b9391ebc 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -893,7 +893,7 @@ "శీఘ్ర సెట్టింగ్‌ల ఎడిటర్." "%1$s నోటిఫికేషన్: %2$s" "స్క్రీన్ విభజనతో యాప్‌ పని చేయకపోవచ్చు." - "అనువర్తనంలో స్క్రీన్ విభజనకు మద్దతు లేదు." + "యాప్‌లో స్క్రీన్ విభజనకు మద్దతు లేదు." "ప్రత్యామ్నాయ డిస్‌ప్లేలో యాప్ పని చేయకపోవచ్చు." "ప్రత్యామ్నాయ డిస్‌ప్లేల్లో ప్రారంభానికి యాప్ మద్దతు లేదు." "సెట్టింగ్‌లను తెరవండి." -- cgit v1.2.3 From 2e720148f34277dd4fdff33908638a46ab23ebe2 Mon Sep 17 00:00:00 2001 From: Beverly Date: Wed, 4 Aug 2021 09:19:13 -0400 Subject: Update device entry intent on keyguard vis change So that the device doesn't unintentionally bypass from a stale deviceEntryIntent=true. Test: manual 1. Enroll udfps 2. Auth with fp on LS 3. Enroll face w/o bypass 4. Auth with face on LS Expected: no bypass Fixes: 194921838 Change-Id: Ief2eb3c6f6883f467252ebf9785fcc95565b7cc3 --- .../SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index 23d6ebc46030..9bfbe325fc03 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -2842,6 +2842,11 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab mSecureCameraLaunched = false; } + if (mKeyguardBypassController != null) { + // LS visibility has changed, so reset deviceEntryIntent + mKeyguardBypassController.setUserHasDeviceEntryIntent(false); + } + for (int i = 0; i < mCallbacks.size(); i++) { KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); if (cb != null) { -- cgit v1.2.3 From 21a847380d2b337769a1667b9ad5e4c1c0731f98 Mon Sep 17 00:00:00 2001 From: Jackal Guo Date: Mon, 7 Jun 2021 16:40:31 +0800 Subject: Re-order early return when targetPkg is null It's possible that the target package is on removable stroage or uninstalled with keep data. The caller should be able to get the related info of the target with flag MATCH_UNINSTALLED_PACKAGES. However, the caller wouldn't be able to get the valid info if we directly filter out when targetPkg is null early. Bug: 193864540 Fix: 187650819 Test: atest AppEnumerationTests PackageVisibilityTest Change-Id: I7c6b2dcdb77c543e0826e5dff0ddc9f66e489033 Merged-In: I7c6b2dcdb77c543e0826e5dff0ddc9f66e489033 (cherry picked from commit a135e23fe97c5618ed04ff26d06e2a31a2d34004) --- .../java/com/android/server/pm/AppsFilter.java | 30 ++++++++++++---------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/services/core/java/com/android/server/pm/AppsFilter.java b/services/core/java/com/android/server/pm/AppsFilter.java index 06ff69176bb7..ed9b539c05df 100644 --- a/services/core/java/com/android/server/pm/AppsFilter.java +++ b/services/core/java/com/android/server/pm/AppsFilter.java @@ -1287,20 +1287,6 @@ public class AppsFilter implements Watchable, Snappable { } } - // This package isn't technically installed and won't be written to settings, so we can - // treat it as filtered until it's available again. - final AndroidPackage targetPkg = targetPkgSetting.pkg; - if (targetPkg == null) { - if (DEBUG_LOGGING) { - Slog.wtf(TAG, "shouldFilterApplication: " + "targetPkg is null"); - } - return true; - } - if (targetPkg.isStaticSharedLibrary()) { - // not an app, this filtering takes place at a higher level - return false; - } - final String targetName = targetPkg.getPackageName(); if (DEBUG_TRACING) { Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "getAppId"); } @@ -1343,6 +1329,21 @@ public class AppsFilter implements Watchable, Snappable { Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER); } } + + // This package isn't technically installed and won't be written to settings, so we can + // treat it as filtered until it's available again. + final AndroidPackage targetPkg = targetPkgSetting.pkg; + if (targetPkg == null) { + if (DEBUG_LOGGING) { + Slog.wtf(TAG, "shouldFilterApplication: " + "targetPkg is null"); + } + return true; + } + if (targetPkg.isStaticSharedLibrary()) { + // not an app, this filtering takes place at a higher level + return false; + } + try { if (DEBUG_TRACING) { Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "mForceQueryable"); @@ -1415,6 +1416,7 @@ public class AppsFilter implements Watchable, Snappable { if (DEBUG_TRACING) { Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "mOverlayReferenceMapper"); } + final String targetName = targetPkg.getPackageName(); if (callingSharedPkgSettings != null) { int size = callingSharedPkgSettings.size(); for (int index = 0; index < size; index++) { -- cgit v1.2.3 From 405e89be71f5f9b1a568b5e887dc8c1eaa21926e Mon Sep 17 00:00:00 2001 From: Dave Mankoff Date: Tue, 3 Aug 2021 14:47:19 -0400 Subject: Force an initial event to be sent to ProximitySensor. When registering a proximity sensor, if the sensor is a "dual" sensor, and the device starts uncovered, we need to alert sensor listeners. Prior to this change, we left the ProximitySensor in an "unknown" state, even though we knew the device was uncovered. Add tag to DozeSensor's ProximitySensor Bug: 194974904 Test: manual && atest SystemUITests Change-Id: I430cd0d63de9c8f0914d5b0d0ff0d86fc38c0190 --- .../src/com/android/systemui/doze/DozeSensors.java | 1 + .../systemui/util/sensors/ProximitySensor.java | 7 ++- .../util/sensors/ProximitySensorDualTest.java | 65 +++++++++++++++++++++- 3 files changed, 69 insertions(+), 4 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java index 23c44131ab60..b2db86f16104 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java @@ -115,6 +115,7 @@ public class DozeSensors { mSecureSettings = secureSettings; mCallback = callback; mProximitySensor = proximitySensor; + mProximitySensor.setTag(TAG); mSelectivelyRegisterProxSensors = dozeParameters.getSelectivelyRegisterSensorsUsingProx(); mListeningProxSensors = !mSelectivelyRegisterProxSensors; mScreenOffUdfpsEnabled = diff --git a/packages/SystemUI/src/com/android/systemui/util/sensors/ProximitySensor.java b/packages/SystemUI/src/com/android/systemui/util/sensors/ProximitySensor.java index b38fc77fd131..90e022a52d7a 100644 --- a/packages/SystemUI/src/com/android/systemui/util/sensors/ProximitySensor.java +++ b/packages/SystemUI/src/com/android/systemui/util/sensors/ProximitySensor.java @@ -290,15 +290,18 @@ public class ProximitySensor implements ThresholdSensor { return; } - if (!mSecondaryThresholdSensor.isLoaded()) { + + if (!mSecondaryThresholdSensor.isLoaded()) { // No secondary logDebug("Primary sensor event: " + event.getBelow() + ". No secondary."); onSensorEvent(event); - } else if (event.getBelow()) { + } else if (event.getBelow()) { // Covered? Check secondary. logDebug("Primary sensor event: " + event.getBelow() + ". Checking secondary."); if (mCancelSecondaryRunnable != null) { mCancelSecondaryRunnable.run(); } mSecondaryThresholdSensor.resume(); + } else { // Uncovered. Report immediately. + onSensorEvent(event); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/sensors/ProximitySensorDualTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/sensors/ProximitySensorDualTest.java index cc2afe2f7b8a..a34c5986f36c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/util/sensors/ProximitySensorDualTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/util/sensors/ProximitySensorDualTest.java @@ -18,6 +18,7 @@ package com.android.systemui.util.sensors; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; @@ -60,7 +61,8 @@ public class ProximitySensorDualTest extends SysuiTestCase { } @Test - public void testPrimaryBelowDoesNotInvokeSecondary() { + public void testInitiallyAbovePrimary() { + TestableListener listener = new TestableListener(); mProximitySensor.register(listener); @@ -70,12 +72,71 @@ public class ProximitySensorDualTest extends SysuiTestCase { assertNull(listener.mLastEvent); assertEquals(0, listener.mCallCount); - // Trigger primary sensor. Our secondary sensor is not registered. mThresholdSensorPrimary.triggerEvent(false, 0); + assertNotNull(listener.mLastEvent); + assertFalse(listener.mLastEvent.getBelow()); + assertEquals(1, listener.mCallCount); + } + + @Test + public void testInitiallyBelowPrimaryAboveSecondary() { + + TestableListener listener = new TestableListener(); + + mProximitySensor.register(listener); + assertTrue(mProximitySensor.isRegistered()); assertFalse(mThresholdSensorPrimary.isPaused()); assertTrue(mThresholdSensorSecondary.isPaused()); assertNull(listener.mLastEvent); assertEquals(0, listener.mCallCount); + + mThresholdSensorPrimary.triggerEvent(true, 0); + assertNull(listener.mLastEvent); + assertEquals(0, listener.mCallCount); + + mThresholdSensorSecondary.triggerEvent(false, 1); + assertNotNull(listener.mLastEvent); + assertFalse(listener.mLastEvent.getBelow()); + assertEquals(1, listener.mCallCount); + } + + @Test + public void testInitiallyBelowPrimaryAndSecondary() { + + TestableListener listener = new TestableListener(); + + mProximitySensor.register(listener); + assertTrue(mProximitySensor.isRegistered()); + assertFalse(mThresholdSensorPrimary.isPaused()); + assertTrue(mThresholdSensorSecondary.isPaused()); + assertNull(listener.mLastEvent); + assertEquals(0, listener.mCallCount); + + mThresholdSensorPrimary.triggerEvent(true, 0); + assertNull(listener.mLastEvent); + assertEquals(0, listener.mCallCount); + + mThresholdSensorSecondary.triggerEvent(true, 1); + assertNotNull(listener.mLastEvent); + assertTrue(listener.mLastEvent.getBelow()); + assertEquals(1, listener.mCallCount); + } + + @Test + public void testPrimaryBelowDoesNotInvokeSecondary() { + TestableListener listener = new TestableListener(); + + mProximitySensor.register(listener); + assertTrue(mProximitySensor.isRegistered()); + assertFalse(mThresholdSensorPrimary.isPaused()); + assertTrue(mThresholdSensorSecondary.isPaused()); + assertNull(listener.mLastEvent); + assertEquals(0, listener.mCallCount); + + // Trigger primary sensor. Our secondary sensor is not registered. + mThresholdSensorPrimary.triggerEvent(false, 0); + assertFalse(mThresholdSensorPrimary.isPaused()); + assertTrue(mThresholdSensorSecondary.isPaused()); } @Test -- cgit v1.2.3 From 1379438362ac3b517b0b4949e893f1f7c69683e2 Mon Sep 17 00:00:00 2001 From: Lee Shombert Date: Wed, 4 Aug 2021 10:49:37 -0700 Subject: Correct locking in PackageManagerService Bug: 194206793 PackageManagerService.mPackages was used as a lock exactly once. This meant there were two locks guarding LegacyPermissionState (and possibly other state, as well): mLock and mPackages. This change replaces mPackages with mLock as the guard. Two formatting errors were fixed. An instrumented image was used to find other paths that might change LegacyPermissionState outside of mLock; no such paths were found after this fix. Test: atest * android.car.apitest.CarUserManagerTest (requires cf_x86_auto-userdebug) * CtsContentTestCases:IntentFilterTest * CtsDynamicMimeHostTestCases * CtsRoleTestCases * FrameworksServicesTests:UserSystemPackageInstallerTest * FrameworksServicesTests:PackageManagerSettingsTests * FrameworksServicesTests:PackageManagerServiceTest * FrameworksServicesTests:AppsFilterTest * FrameworksServicesTests:PackageInstallerSessionTest * FrameworksServicesTests:ScanTests * UserLifecycleTests#startUser * UserLifecycleTests#stopUser * UserLifecycleTests#switchUser * FrameworksServicesTests:WatcherTest * android.appsecurity.cts.EphemeralTest * android.appsecurity.cts.InstantAppUserTest Change-Id: If2914258c0a020fac124142cb292bafcee5e8a2a --- services/core/java/com/android/server/pm/PackageManagerService.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index ee44c10edbf3..7d055ff43f37 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -26533,7 +26533,7 @@ public class PackageManagerService extends IPackageManager.Stub } boolean readPermissionStateForUser(@UserIdInt int userId) { - synchronized (mPackages) { + synchronized (mLock) { mPermissionManager.writeLegacyPermissionStateTEMP(); mSettings.readPermissionStateForUserSyncLPr(userId); mPermissionManager.readLegacyPermissionStateTEMP(); @@ -26609,7 +26609,7 @@ public class PackageManagerService extends IPackageManager.Stub if (packageName == null || alias == null) { return null; } - synchronized(mLock) { + synchronized (mLock) { final AndroidPackage pkg = mPackages.get(packageName); if (pkg == null || shouldFilterApplicationLocked(getPackageSetting(pkg.getPackageName()), @@ -26656,7 +26656,7 @@ public class PackageManagerService extends IPackageManager.Stub if (packageName == null || ks == null) { return false; } - synchronized(mLock) { + synchronized (mLock) { final AndroidPackage pkg = mPackages.get(packageName); if (pkg == null || shouldFilterApplicationLocked(getPackageSetting(pkg.getPackageName()), -- cgit v1.2.3 From a355e904a26f2d863d49bec3e4c2176b8047a48e Mon Sep 17 00:00:00 2001 From: John Reck Date: Wed, 4 Aug 2021 11:18:32 -0400 Subject: Have RippleDrawable ignore non-attached RenderNodes Don't try to do a RenderNodeAnimation if the RenderNode isn't attached. Although this isn't strictly speaking a valid state to be in, it's also easy for RippleDrawable to just ignore it. Bug: 186864959 Test: ripples still show up, are still RT accelerated normally Change-Id: I8127f1419508157eb83ac9bb1562745ac53d2ced --- .../android/graphics/drawable/RippleAnimationSession.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/graphics/java/android/graphics/drawable/RippleAnimationSession.java b/graphics/java/android/graphics/drawable/RippleAnimationSession.java index 492520910afd..872331c82603 100644 --- a/graphics/java/android/graphics/drawable/RippleAnimationSession.java +++ b/graphics/java/android/graphics/drawable/RippleAnimationSession.java @@ -67,7 +67,7 @@ public final class RippleAnimationSession { @NonNull RippleAnimationSession enter(Canvas canvas) { mStartTime = AnimationUtils.currentAnimationTimeMillis(); - if (isHwAccelerated(canvas)) { + if (useRTAnimations(canvas)) { enterHardware((RecordingCanvas) canvas); } else { enterSoftware(); @@ -82,7 +82,7 @@ public final class RippleAnimationSession { } @NonNull RippleAnimationSession exit(Canvas canvas) { - if (isHwAccelerated(canvas)) exitHardware((RecordingCanvas) canvas); + if (useRTAnimations(canvas)) exitHardware((RecordingCanvas) canvas); else exitSoftware(); return this; } @@ -102,8 +102,12 @@ public final class RippleAnimationSession { return this; } - private boolean isHwAccelerated(Canvas canvas) { - return canvas.isHardwareAccelerated() && !mForceSoftware; + private boolean useRTAnimations(Canvas canvas) { + if (mForceSoftware) return false; + if (!canvas.isHardwareAccelerated()) return false; + RecordingCanvas hwCanvas = (RecordingCanvas) canvas; + if (hwCanvas.mNode == null || !hwCanvas.mNode.isAttached()) return false; + return true; } private void exitSoftware() { -- cgit v1.2.3 From befbb69cf5251bd96e264971dbbe2ffc8f6895c3 Mon Sep 17 00:00:00 2001 From: Vishnu Nair Date: Wed, 4 Aug 2021 08:31:19 -0700 Subject: SurfaceView: Synchronize position updates with fixed size changes This cl solves a couple of issues: 1. Render thread workers and UI thread share the surface size. They work on different frames (UI thread sets up the next frame while render thread is working on the current frame. Accessing the surface size is unsafe and can result in flickers. 2. UI thread is changing the geometry on size change which might conflict with render thread causing flickers. This is because of unsafe accesses as the one mentioned above and the UI thread may not have the up-to-date position of the view. This cl fixes the issues by only applying geometry changes in the UI thread when creating the surface, otherwise the render thread workers are responsible for updating the geometry. The RenderNode position update listeners are updated whenever the surface size changes in order to capture the new size and accompanying changes which must be applied with the new geometry changes. Note: updating the position update listeners will trigger a position update callback so we are guaranteed to apply the changes in scenarios where the fixed size changes but the view size does not change. Test: atest SurfaceViewSyncTest#testSurfaceViewChangeFixedSize Test: atest SurfaceViewSyncTest#testSurfaceViewChangeFixedSizeWithViewSizeChanges Test: go/wm-smoke Test: repro steps from b/190449942 Fixes: 190449942 Change-Id: I076321c853f9a0f6cbf169637e3f3ede60361d60 --- core/java/android/view/SurfaceView.java | 151 ++++++++++++++++++++------------ 1 file changed, 95 insertions(+), 56 deletions(-) diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index 6c2d6a1c3f2e..c1956e45653b 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -33,6 +33,7 @@ import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.PixelFormat; +import android.graphics.Point; import android.graphics.Rect; import android.graphics.Region; import android.graphics.RenderNode; @@ -236,15 +237,6 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall private final SurfaceControl.Transaction mFrameCallbackTransaction = new SurfaceControl.Transaction(); - /** - * Transaction that should be used for - * {@link RenderNode.PositionUpdateListener#positionChanged(long, int, int, int, int)} - * The callback is invoked from a thread pool so it's not thread safe with other render thread - * transactions. Keep the transactions for position changed callbacks on its own transaction. - */ - private final SurfaceControl.Transaction mPositionChangedTransaction = - new SurfaceControl.Transaction(); - /** * A temporary transaction holder that should only be used when applying right away. There * should be no assumption about thread safety for this transaction. @@ -295,7 +287,6 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall int defStyleRes, boolean disableBackgroundLayer) { super(context, attrs, defStyleAttr, defStyleRes); mUseBlastAdapter = useBlastAdapter(context); - mRenderNode.addPositionUpdateListener(mPositionListener); setWillNotDraw(true); mDisableBackgroundLayer = disableBackgroundLayer; @@ -943,6 +934,24 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall } } + + // The position update listener is used to safely share the surface size between render thread + // workers and the UI thread. Both threads need to know the surface size to determine the scale. + // The parent layer scales the surface size to view size. The child (BBQ) layer scales + // the buffer to the surface size. Both scales along with the window crop must be applied + // synchronously otherwise we may see flickers. + // When the listener is updated, we will get at least a single position update call so we can + // guarantee any changes we post will be applied. + private void replacePositionUpdateListener(int surfaceWidth, int surfaceHeight, + @Nullable Transaction geometryTransaction) { + if (mPositionListener != null) { + mRenderNode.removePositionUpdateListener(mPositionListener); + } + mPositionListener = new SurfaceViewPositionUpdateListener(surfaceWidth, surfaceHeight, + geometryTransaction); + mRenderNode.addPositionUpdateListener(mPositionListener); + } + private boolean performSurfaceTransaction(ViewRootImpl viewRoot, Translator translator, boolean creating, boolean sizeChanged, boolean hintChanged) { boolean realSizeChanged = false; @@ -985,13 +994,13 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall // While creating the surface, we will set it's initial // geometry. Outside of that though, we should generally // leave it to the RenderThread. - // - // There is one more case when the buffer size changes we aren't yet - // prepared to sync (as even following the transaction applying - // we still need to latch a buffer). - // b/28866173 - if (sizeChanged || creating || !mRtHandlingPositionUpdates) { - onSetSurfacePositionAndScaleRT(mTmpTransaction, mSurfaceControl, + Transaction geometryTransaction = new Transaction(); + geometryTransaction.setCornerRadius(mSurfaceControl, mCornerRadius); + if ((sizeChanged || hintChanged) && !creating) { + setBufferSize(geometryTransaction); + } + if (sizeChanged || creating || !isHardwareAccelerated()) { + onSetSurfacePositionAndScaleRT(geometryTransaction, mSurfaceControl, mScreenRect.left, /*positionLeft*/ mScreenRect.top /*positionTop*/ , mScreenRect.width() / (float) mSurfaceWidth /*postScaleX*/, @@ -1002,17 +1011,31 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall // use SCALING_MODE_SCALE and submit a larger size than the surface // size. if (mClipSurfaceToBounds && mClipBounds != null) { - mTmpTransaction.setWindowCrop(mSurfaceControl, mClipBounds); + geometryTransaction.setWindowCrop(mSurfaceControl, mClipBounds); } else { - mTmpTransaction.setWindowCrop(mSurfaceControl, mSurfaceWidth, + geometryTransaction.setWindowCrop(mSurfaceControl, mSurfaceWidth, mSurfaceHeight); } - } - mTmpTransaction.setCornerRadius(mSurfaceControl, mCornerRadius); - if ((sizeChanged || hintChanged) && !creating) { - setBufferSize(mTmpTransaction); - } + boolean applyChangesOnRenderThread = + sizeChanged && !creating && isHardwareAccelerated(); + if (isHardwareAccelerated()) { + // This will consume the passed in transaction and the transaction will be + // applied on a render worker thread. + replacePositionUpdateListener(mSurfaceWidth, mSurfaceHeight, + applyChangesOnRenderThread ? geometryTransaction : null); + } + if (DEBUG_POSITION) { + Log.d(TAG, String.format( + "%d updateSurfacePosition %s" + + "position = [%d, %d, %d, %d] surfaceSize = %dx%d", + System.identityHashCode(this), + applyChangesOnRenderThread ? "RenderWorker" : "UiThread", + mScreenRect.left, mScreenRect.top, mScreenRect.right, + mScreenRect.bottom, mSurfaceWidth, mSurfaceHeight)); + } + } + mTmpTransaction.merge(geometryTransaction); mTmpTransaction.apply(); updateEmbeddedAccessibilityMatrix(); @@ -1399,19 +1422,6 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall mTmpTransaction.apply(); } - private void applySurfaceTransforms(SurfaceControl surface, SurfaceControl.Transaction t, - Rect position) { - onSetSurfacePositionAndScaleRT(t, surface, - position.left /*positionLeft*/, - position.top /*positionTop*/, - position.width() / (float) mSurfaceWidth /*postScaleX*/, - position.height() / (float) mSurfaceHeight /*postScaleY*/); - - if (mViewVisibility) { - t.show(surface); - } - } - /** * @return The last render position of the backing surface or an empty rect. * @@ -1421,13 +1431,6 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall return mRTLastReportedPosition; } - private void setParentSpaceRectangle(Rect position, long frameNumber, Transaction t) { - final ViewRootImpl viewRoot = getViewRootImpl(); - applySurfaceTransforms(mSurfaceControl, t, position); - applyChildSurfaceTransaction_renderWorker(t, viewRoot.mSurface, frameNumber); - applyOrMergeTransaction(t, frameNumber); - } - private void applyOrMergeTransaction(Transaction t, long frameNumber) { final ViewRootImpl viewRoot = getViewRootImpl(); boolean useBLAST = viewRoot != null && useBLASTSync(viewRoot); @@ -1440,9 +1443,24 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall } private Rect mRTLastReportedPosition = new Rect(); - - private RenderNode.PositionUpdateListener mPositionListener = - new RenderNode.PositionUpdateListener() { + private Point mRTLastReportedSurfaceSize = new Point(); + + private class SurfaceViewPositionUpdateListener implements RenderNode.PositionUpdateListener { + int mRtSurfaceWidth = -1; + int mRtSurfaceHeight = -1; + private final SurfaceControl.Transaction mPositionChangedTransaction = + new SurfaceControl.Transaction(); + boolean mPendingTransaction = false; + + SurfaceViewPositionUpdateListener(int surfaceWidth, int surfaceHeight, + @Nullable Transaction t) { + mRtSurfaceWidth = surfaceWidth; + mRtSurfaceHeight = surfaceHeight; + if (t != null) { + mPositionChangedTransaction.merge(t); + mPendingTransaction = true; + } + } @Override public void positionChanged(long frameNumber, int left, int top, int right, int bottom) { @@ -1464,21 +1482,34 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall if (mRTLastReportedPosition.left == left && mRTLastReportedPosition.top == top && mRTLastReportedPosition.right == right - && mRTLastReportedPosition.bottom == bottom) { + && mRTLastReportedPosition.bottom == bottom + && mRTLastReportedSurfaceSize.x == mRtSurfaceWidth + && mRTLastReportedSurfaceSize.y == mRtSurfaceHeight + && !mPendingTransaction) { return; } try { if (DEBUG_POSITION) { Log.d(TAG, String.format( "%d updateSurfacePosition RenderWorker, frameNr = %d, " - + "position = [%d, %d, %d, %d]", - System.identityHashCode(this), frameNumber, - left, top, right, bottom)); + + "position = [%d, %d, %d, %d] surfaceSize = %dx%d", + System.identityHashCode(SurfaceView.this), frameNumber, + left, top, right, bottom, mRtSurfaceWidth, mRtSurfaceHeight)); } mRTLastReportedPosition.set(left, top, right, bottom); - setParentSpaceRectangle(mRTLastReportedPosition, frameNumber, - mPositionChangedTransaction); - // Now overwrite mRTLastReportedPosition with our values + mRTLastReportedSurfaceSize.set(mRtSurfaceWidth, mRtSurfaceHeight); + onSetSurfacePositionAndScaleRT(mPositionChangedTransaction, mSurfaceControl, + mRTLastReportedPosition.left /*positionLeft*/, + mRTLastReportedPosition.top /*positionTop*/, + mRTLastReportedPosition.width() / (float) mRtSurfaceWidth /*postScaleX*/, + mRTLastReportedPosition.height() / (float) mRtSurfaceHeight /*postScaleY*/); + if (mViewVisibility) { + mPositionChangedTransaction.show(mSurfaceControl); + } + applyChildSurfaceTransaction_renderWorker(mPositionChangedTransaction, + getViewRootImpl().mSurface, frameNumber); + applyOrMergeTransaction(mPositionChangedTransaction, frameNumber); + mPendingTransaction = false; } catch (Exception ex) { Log.e(TAG, "Exception from repositionChild", ex); } @@ -1502,7 +1533,13 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall System.identityHashCode(this), frameNumber)); } mRTLastReportedPosition.setEmpty(); - + mRTLastReportedSurfaceSize.set(-1, -1); + if (mPendingTransaction) { + Log.w(TAG, System.identityHashCode(SurfaceView.this) + + "Pending transaction cleared."); + mPositionChangedTransaction.clear(); + mPendingTransaction = false; + } if (mSurfaceControl == null) { return; } @@ -1521,7 +1558,9 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall mRtHandlingPositionUpdates = false; } } - }; + } + + private SurfaceViewPositionUpdateListener mPositionListener = null; private SurfaceHolder.Callback[] getSurfaceCallbacks() { SurfaceHolder.Callback[] callbacks; -- cgit v1.2.3 From 4d31f244244b4d0b256d9d75c7a5e6f634db6415 Mon Sep 17 00:00:00 2001 From: Beverly Date: Wed, 4 Aug 2021 15:23:13 -0400 Subject: Co-ex: when face fails use error string Use string "Can't recognize face. Use fingerprint instead" Only used if the user hasn't touch udfps yet Test: manual, atest KeyguardIndicationControllerTest Fixes: 195161046 Change-Id: I8206d3acbaf9e20702570c700beb6248d86a858e --- packages/SystemUI/res/values/strings.xml | 2 ++ .../android/systemui/statusbar/KeyguardIndicationController.java | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 04e5dd15c5c5..a67021611812 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -438,6 +438,8 @@ Use your fingerprint to continue Can\u2019t recognize fingerprint. Use screen lock instead. + + @string/fingerprint_dialog_use_fingerprint_instead Looking for you\u2026 diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java index 3890c1aa4e4f..503b5c0ee4b0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java @@ -825,7 +825,11 @@ public class KeyguardIndicationController { if (mKeyguardUpdateMonitor.isUdfpsAvailable()) { // if udfps available, there will always be a tappable affordance to unlock // For example, the lock icon - showTransientIndication(R.string.keyguard_unlock_press); + if (mKeyguardBypassController.getUserHasDeviceEntryIntent()) { + showTransientIndication(R.string.keyguard_unlock_press); + } else { + showTransientIndication(R.string.keyguard_face_failed_use_fp); + } } else { showTransientIndication(R.string.keyguard_try_fingerprint); } -- cgit v1.2.3 From c259917d01997147f5bd7b4c7fd6e423526f8df3 Mon Sep 17 00:00:00 2001 From: Beverly Date: Wed, 4 Aug 2021 15:47:38 -0400 Subject: Remove UDFPS hint animation Used to be called when face auth failed or after a timeout. Fixes: 195565894 Test: manual Change-Id: I0075153d9c1df1ba2dc57c5a1ba5d0c08dd6b643 --- .../systemui/biometrics/UdfpsKeyguardView.java | 14 ---- .../biometrics/UdfpsKeyguardViewController.java | 85 ---------------------- 2 files changed, 99 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java index d122610c395d..d46426a03621 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java @@ -23,7 +23,6 @@ import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; -import android.animation.ValueAnimator; import android.content.Context; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; @@ -68,8 +67,6 @@ public class UdfpsKeyguardView extends UdfpsAnimationView { private float mBurnInProgress; private float mInterpolatedDarkAmount; - private ValueAnimator mHintAnimator; - public UdfpsKeyguardView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); mFingerprintDrawable = new UdfpsFpDrawable(context); @@ -94,9 +91,6 @@ public class UdfpsKeyguardView extends UdfpsAnimationView { new KeyPath("**"), LottieProperty.COLOR_FILTER, frameInfo -> new PorterDuffColorFilter(mTextColorPrimary, PorterDuff.Mode.SRC_ATOP) ); - - mHintAnimator = ObjectAnimator.ofFloat(mLockScreenFp, "progress", 1f, 0f, 1f); - mHintAnimator.setDuration(4000); } @Override @@ -183,19 +177,11 @@ public class UdfpsKeyguardView extends UdfpsAnimationView { } void onDozeAmountChanged(float linear, float eased) { - mHintAnimator.cancel(); mInterpolatedDarkAmount = eased; updateAlpha(); updateBurnInOffsets(); } - void animateHint() { - if (!isShadeLocked() && !mUdfpsRequested && mAlpha == 255 - && mLockScreenFp.isVisibleToUser()) { - mHintAnimator.start(); - } - } - /** * Animates in the bg protection circle behind the fp icon to highlight the icon. */ diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java index 58f1254da563..4896305daa2e 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java @@ -20,14 +20,10 @@ import static com.android.systemui.statusbar.StatusBarState.KEYGUARD; import android.annotation.NonNull; import android.content.res.Configuration; -import android.hardware.biometrics.BiometricSourceType; import android.util.MathUtils; import android.view.MotionEvent; -import androidx.annotation.Nullable; - import com.android.keyguard.KeyguardUpdateMonitor; -import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.systemui.R; import com.android.systemui.dump.DumpManager; import com.android.systemui.keyguard.KeyguardViewMediator; @@ -46,14 +42,8 @@ import java.io.PrintWriter; /** * Class that coordinates non-HBM animations during keyguard authentication. - * - * Highlights the udfps icon when: - * - Face authentication has failed - * - Face authentication has been run for > 2 seconds */ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController { - private static final long AFTER_FACE_AUTH_HINT_DELAY = 2000; - @NonNull private final StatusBarKeyguardViewManager mKeyguardViewManager; @NonNull private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; @NonNull private final DelayableExecutor mExecutor; @@ -62,12 +52,10 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController showHint(false), - AFTER_FACE_AUTH_HINT_DELAY); - } - - mFaceDetectRunning = running; - } - - private void showHint(boolean forceShow) { - cancelDelayedHint(); - if (!mHintShown || forceShow) { - mHintShown = true; - mView.animateHint(); - } - } - /** * Set the progress we're currently transitioning to the full shade. 0.0f means we're not * transitioning yet, while 1.0f means we've fully dragged down. @@ -318,39 +266,6 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController Date: Wed, 4 Aug 2021 20:05:36 +0000 Subject: Revert "Apply overlay updates to widget provider info" This reverts commit 0bf76b6296e7095ab98ea175452e5697e9afcc66. Bug: 193866093 Fixes: 195267626 Reason for revert: b/195267626 Change-Id: I598a99f761e66d8bedbb0745d488ccc35fff9201 --- .../appwidget/AppWidgetManagerInternal.java | 14 ----- core/java/android/widget/RemoteViews.java | 19 ------- .../server/appwidget/AppWidgetServiceImpl.java | 60 ---------------------- .../android/server/am/ActivityManagerService.java | 8 --- 4 files changed, 101 deletions(-) diff --git a/core/java/android/appwidget/AppWidgetManagerInternal.java b/core/java/android/appwidget/AppWidgetManagerInternal.java index 266e33af0e22..5694ca860453 100644 --- a/core/java/android/appwidget/AppWidgetManagerInternal.java +++ b/core/java/android/appwidget/AppWidgetManagerInternal.java @@ -19,8 +19,6 @@ package android.appwidget; import android.annotation.Nullable; import android.util.ArraySet; -import java.util.Set; - /** * App widget manager local system service interface. * @@ -44,16 +42,4 @@ public abstract class AppWidgetManagerInternal { * @param userId The user that is being unlocked. */ public abstract void unlockUser(int userId); - - /** - * Updates all widgets, applying changes to Runtime Resource Overlay affecting the specified - * target packages. - * - * @param packageNames The names of all target packages for which an overlay was modified - * @param userId The user for which overlay modifications occurred. - * @param updateFrameworkRes Whether or not an overlay affected the values of framework - * resources. - */ - public abstract void applyResourceOverlaysToWidgets(Set packageNames, int userId, - boolean updateFrameworkRes); } diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java index 91fc5a56d979..e827f0a31bfd 100644 --- a/core/java/android/widget/RemoteViews.java +++ b/core/java/android/widget/RemoteViews.java @@ -5824,25 +5824,6 @@ public class RemoteViews implements Parcelable, Filter { return false; } - /** @hide */ - public void updateAppInfo(@NonNull ApplicationInfo info) { - if (mApplication != null && mApplication.sourceDir.equals(info.sourceDir)) { - // Overlay paths are generated against a particular version of an application. - // The overlays paths of a newly upgraded application are incompatible with the - // old version of the application. - mApplication = info; - } - if (hasSizedRemoteViews()) { - for (RemoteViews layout : mSizedRemoteViews) { - layout.updateAppInfo(info); - } - } - if (hasLandscapeAndPortraitLayouts()) { - mLandscape.updateAppInfo(info); - mPortrait.updateAppInfo(info); - } - } - private Context getContextForResources(Context context) { if (mApplication != null) { if (context.getUserId() == UserHandle.getUserId(mApplication.uid) diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java index a56b1db1494c..5aec6aa99c12 100644 --- a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java +++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java @@ -3285,57 +3285,6 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku } } - private void applyResourceOverlaysToWidgetsLocked(Set packageNames, int userId, - boolean updateFrameworkRes) { - for (int i = 0, N = mProviders.size(); i < N; i++) { - Provider provider = mProviders.get(i); - if (provider.getUserId() != userId) { - continue; - } - - final String packageName = provider.id.componentName.getPackageName(); - if (!updateFrameworkRes && !packageNames.contains(packageName)) { - continue; - } - - ApplicationInfo newAppInfo = null; - try { - newAppInfo = mPackageManager.getApplicationInfo(packageName, - PackageManager.GET_SHARED_LIBRARY_FILES, userId); - } catch (RemoteException e) { - Slog.w(TAG, "Failed to retrieve app info for " + packageName - + " userId=" + userId, e); - } - if (newAppInfo == null) { - continue; - } - ApplicationInfo oldAppInfo = provider.info.providerInfo.applicationInfo; - if (!newAppInfo.sourceDir.equals(oldAppInfo.sourceDir)) { - // Overlay paths are generated against a particular version of an application. - // The overlays paths of a newly upgraded application are incompatible with the - // old version of the application. - continue; - } - - // Isolate the changes relating to RROs. The app info must be copied to prevent - // affecting other parts of system server that may have cached this app info. - oldAppInfo = new ApplicationInfo(oldAppInfo); - oldAppInfo.overlayPaths = newAppInfo.overlayPaths.clone(); - oldAppInfo.resourceDirs = newAppInfo.resourceDirs.clone(); - provider.info.providerInfo.applicationInfo = oldAppInfo; - - for (int j = 0, M = provider.widgets.size(); j < M; j++) { - Widget widget = provider.widgets.get(j); - if (widget.views != null) { - widget.views.updateAppInfo(oldAppInfo); - } - if (widget.maskedViews != null) { - widget.maskedViews.updateAppInfo(oldAppInfo); - } - } - } - } - /** * Updates all providers with the specified package names, and records any providers that were * pruned. @@ -4926,14 +4875,5 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku public void unlockUser(int userId) { handleUserUnlocked(userId); } - - @Override - public void applyResourceOverlaysToWidgets(Set packageNames, int userId, - boolean updateFrameworkRes) { - synchronized (mLock) { - applyResourceOverlaysToWidgetsLocked(new HashSet<>(packageNames), userId, - updateFrameworkRes); - } - } } } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index a03d147df9ec..0d35bb180514 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -193,7 +193,6 @@ import android.app.usage.UsageEvents.Event; import android.app.usage.UsageStatsManager; import android.app.usage.UsageStatsManagerInternal; import android.appwidget.AppWidgetManager; -import android.appwidget.AppWidgetManagerInternal; import android.content.AttributionSource; import android.content.AutofillOptions; import android.content.BroadcastReceiver; @@ -16589,13 +16588,6 @@ public class ActivityManagerService extends IActivityManager.Stub if (updateFrameworkRes) { ParsingPackageUtils.readConfigUseRoundIcon(null); } - - AppWidgetManagerInternal widgets = LocalServices.getService(AppWidgetManagerInternal.class); - if (widgets != null) { - widgets.applyResourceOverlaysToWidgets(new HashSet<>(packagesToUpdate), userId, - updateFrameworkRes); - } - mProcessList.updateApplicationInfoLOSP(packagesToUpdate, userId, updateFrameworkRes); if (updateFrameworkRes) { -- cgit v1.2.3 From e758539f0266aa24c535e9da17b845b10b00c4f7 Mon Sep 17 00:00:00 2001 From: Nate Myren Date: Wed, 4 Aug 2021 13:22:06 -0700 Subject: Remove calling UID check from ContentProvider AttributionSource checks calling UID on unparcel (so the check is not necessary), and some ContentProviders may clear calling identity. Test: Manual Fixes: 188755312 Change-Id: If629eea3ba8c1a57fd4b7aff0fec2c0acb5f69be --- core/java/android/content/ContentProvider.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/core/java/android/content/ContentProvider.java b/core/java/android/content/ContentProvider.java index a741f9649b4c..c714f507242e 100644 --- a/core/java/android/content/ContentProvider.java +++ b/core/java/android/content/ContentProvider.java @@ -745,9 +745,6 @@ public abstract class ContentProvider implements ContentInterface, ComponentCall if (Binder.getCallingPid() == Process.myPid()) { return PermissionChecker.PERMISSION_GRANTED; } - if (!attributionSource.checkCallingUid()) { - return PermissionChecker.PERMISSION_HARD_DENIED; - } return PermissionChecker.checkPermissionForDataDeliveryFromDataSource(getContext(), permission, -1, new AttributionSource(getContext().getAttributionSource(), attributionSource), /*message*/ null); -- cgit v1.2.3 From 91db1773ddb0180502addd3ac85a7033cd9ccd4e Mon Sep 17 00:00:00 2001 From: Shuzhen Wang Date: Fri, 23 Apr 2021 09:34:06 -0700 Subject: Camera: Fix typos in API doc Test: Build Bug: 195574631 Change-Id: Idf1e6f4390146055cdb7df41d63ab010df5ad1a1 --- .../android/hardware/camera2/MultiResolutionImageReader.java | 2 +- .../android/hardware/camera2/params/InputConfiguration.java | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/core/java/android/hardware/camera2/MultiResolutionImageReader.java b/core/java/android/hardware/camera2/MultiResolutionImageReader.java index 3af1b5b03d35..0dbf29de5253 100644 --- a/core/java/android/hardware/camera2/MultiResolutionImageReader.java +++ b/core/java/android/hardware/camera2/MultiResolutionImageReader.java @@ -91,7 +91,7 @@ public class MultiResolutionImageReader implements AutoCloseable { *

*

* The {@code maxImages} parameter determines the maximum number of - * {@link Image} objects that can be be acquired from each of the {@code ImageReader} + * {@link Image} objects that can be acquired from each of the {@code ImageReader} * within the {@code MultiResolutionImageReader}. However, requesting more buffers will * use up more memory, so it is important to use only the minimum number necessary. The * application is strongly recommended to acquire no more than {@code maxImages} images diff --git a/core/java/android/hardware/camera2/params/InputConfiguration.java b/core/java/android/hardware/camera2/params/InputConfiguration.java index 8dfc0a7b41ca..70c85a1fb26c 100644 --- a/core/java/android/hardware/camera2/params/InputConfiguration.java +++ b/core/java/android/hardware/camera2/params/InputConfiguration.java @@ -42,7 +42,7 @@ public final class InputConfiguration { private final boolean mIsMultiResolution; /** - * Create an input configration with the width, height, and user-defined format. + * Create an input configuration with the width, height, and user-defined format. * *

Images of a user-defined format are accessible by applications. Use * {@link android.hardware.camera2.CameraCharacteristics#SCALER_STREAM_CONFIGURATION_MAP} @@ -64,7 +64,7 @@ public final class InputConfiguration { } /** - * Create an input configration with the format and a list of multi-resolution input stream + * Create an input configuration with the format and a list of multi-resolution input stream * info. * *

Use {@link @@ -108,7 +108,7 @@ public final class InputConfiguration { } /** - * Get the width of this input configration. + * Get the width of this input configuration. * * @return width of this input configuration. */ @@ -117,7 +117,7 @@ public final class InputConfiguration { } /** - * Get the height of this input configration. + * Get the height of this input configuration. * * @return height of this input configuration. */ @@ -126,7 +126,7 @@ public final class InputConfiguration { } /** - * Get the format of this input configration. + * Get the format of this input configuration. * * @return format of this input configuration. */ -- cgit v1.2.3 From 2543bb488b2e6726b32b4a9bae0c988cc0c21ee0 Mon Sep 17 00:00:00 2001 From: Emilian Peev Date: Wed, 4 Aug 2021 15:38:25 -0700 Subject: Camera: Release extension resources after closing handler thread To avoid possible concurrency issues, always quit the handler thread before releasing any extension resources. In case camera is still running, camera callbacks can still be handled during release which can result in concurrency exceptions. Bug: 195595369 Test: atest -c cts/tests/camera/src/android/hardware/camera2/cts/CameraExtensionSessionTest.java Change-Id: I473a4cb04e5ea27b5c8f8221a2390219a7915e73 --- .../impl/CameraAdvancedExtensionSessionImpl.java | 35 +++++++++++----------- .../hardware/camera2/impl/CameraDeviceImpl.java | 8 ++--- .../camera2/impl/CameraExtensionSessionImpl.java | 34 ++++++++++----------- 3 files changed, 37 insertions(+), 40 deletions(-) diff --git a/core/java/android/hardware/camera2/impl/CameraAdvancedExtensionSessionImpl.java b/core/java/android/hardware/camera2/impl/CameraAdvancedExtensionSessionImpl.java index d5a35bc31e68..02245e49e611 100644 --- a/core/java/android/hardware/camera2/impl/CameraAdvancedExtensionSessionImpl.java +++ b/core/java/android/hardware/camera2/impl/CameraAdvancedExtensionSessionImpl.java @@ -446,16 +446,12 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes } } - @Override - protected void finalize() throws Throwable { - if (mHandlerThread != null) { - mHandlerThread.quitSafely(); - } - super.finalize(); - } + public void release(boolean skipCloseNotification) { + boolean notifyClose = false; - public void release() { synchronized (mInterfaceLock) { + mHandlerThread.quitSafely(); + if (mSessionProcessor != null) { try { mSessionProcessor.deInitSession(); @@ -469,6 +465,7 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes if (mExtensionClientId >= 0) { CameraExtensionCharacteristics.unregisterClient(mExtensionClientId); if (mInitialized) { + notifyClose = true; CameraExtensionCharacteristics.releaseSession(); } } @@ -482,6 +479,16 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes mClientRepeatingRequestSurface = null; mClientCaptureSurface = null; } + + if (notifyClose && !skipCloseNotification) { + final long ident = Binder.clearCallingIdentity(); + try { + mExecutor.execute(() -> mCallbacks.onClosed( + CameraAdvancedExtensionSessionImpl.this)); + } finally { + Binder.restoreCallingIdentity(ident); + } + } } private void notifyConfigurationFailure() { @@ -491,7 +498,7 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes } } - release(); + release(true /*skipCloseNotification*/); final long ident = Binder.clearCallingIdentity(); try { @@ -507,15 +514,7 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes android.hardware.camera2.CameraCaptureSession.StateCallback { @Override public void onClosed(@NonNull CameraCaptureSession session) { - release(); - - final long ident = Binder.clearCallingIdentity(); - try { - mExecutor.execute(() -> mCallbacks.onClosed( - CameraAdvancedExtensionSessionImpl.this)); - } finally { - Binder.restoreCallingIdentity(ident); - } + release(false /*skipCloseNotification*/); } @Override diff --git a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java index 0bf812e03984..fc728a22ed5a 100644 --- a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java +++ b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java @@ -697,12 +697,12 @@ public class CameraDeviceImpl extends CameraDevice } if (mCurrentExtensionSession != null) { - mCurrentExtensionSession.release(); + mCurrentExtensionSession.release(false /*skipCloseNotification*/); mCurrentExtensionSession = null; } if (mCurrentAdvancedExtensionSession != null) { - mCurrentAdvancedExtensionSession.release(); + mCurrentAdvancedExtensionSession.release(false /*skipCloseNotification*/); mCurrentAdvancedExtensionSession = null; } @@ -1352,12 +1352,12 @@ public class CameraDeviceImpl extends CameraDevice } if (mCurrentExtensionSession != null) { - mCurrentExtensionSession.release(); + mCurrentExtensionSession.release(true /*skipCloseNotification*/); mCurrentExtensionSession = null; } if (mCurrentAdvancedExtensionSession != null) { - mCurrentAdvancedExtensionSession.release(); + mCurrentAdvancedExtensionSession.release(true /*skipCloseNotification*/); mCurrentAdvancedExtensionSession = null; } diff --git a/core/java/android/hardware/camera2/impl/CameraExtensionSessionImpl.java b/core/java/android/hardware/camera2/impl/CameraExtensionSessionImpl.java index 7d29a7d275cf..ecd24914c566 100644 --- a/core/java/android/hardware/camera2/impl/CameraExtensionSessionImpl.java +++ b/core/java/android/hardware/camera2/impl/CameraExtensionSessionImpl.java @@ -630,18 +630,13 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession { new CameraExtensionUtils.HandlerExecutor(mHandler), requestHandler); } - @Override - protected void finalize() throws Throwable { - if (mHandlerThread != null) { - mHandlerThread.quitSafely(); - } - super.finalize(); - } - /** @hide */ - public void release() { + public void release(boolean skipCloseNotification) { + boolean notifyClose = false; + synchronized (mInterfaceLock) { mInternalRepeatingRequestEnabled = false; + mHandlerThread.quitSafely(); try { mPreviewExtender.onDeInit(); @@ -654,6 +649,7 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession { if (mExtensionClientId >= 0) { CameraExtensionCharacteristics.unregisterClient(mExtensionClientId); if (mInitialized) { + notifyClose = true; CameraExtensionCharacteristics.releaseSession(); } } @@ -704,6 +700,15 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession { mCameraRepeatingSurface = mClientRepeatingRequestSurface = null; mCameraBurstSurface = mClientCaptureSurface = null; } + + if (notifyClose && !skipCloseNotification) { + final long ident = Binder.clearCallingIdentity(); + try { + mExecutor.execute(() -> mCallbacks.onClosed(CameraExtensionSessionImpl.this)); + } finally { + Binder.restoreCallingIdentity(ident); + } + } } private void notifyConfigurationFailure() { @@ -713,7 +718,7 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession { } } - release(); + release(true /*skipCloseNotification*/); final long ident = Binder.clearCallingIdentity(); try { @@ -745,14 +750,7 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession { android.hardware.camera2.CameraCaptureSession.StateCallback { @Override public void onClosed(@NonNull CameraCaptureSession session) { - release(); - - final long ident = Binder.clearCallingIdentity(); - try { - mExecutor.execute(() -> mCallbacks.onClosed(CameraExtensionSessionImpl.this)); - } finally { - Binder.restoreCallingIdentity(ident); - } + release(false /*skipCloseNotification*/); } @Override -- cgit v1.2.3 From 632af07faa06b0d8268a0e91e0e7e170183374fd Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 5 Aug 2021 01:33:35 +0000 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ie8377139fd2fccb16c49861b8cce63c37fd39b45 --- packages/SettingsLib/res/values-te/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml index 3131d3f4848f..26d12e03db59 100644 --- a/packages/SettingsLib/res/values-te/strings.xml +++ b/packages/SettingsLib/res/values-te/strings.xml @@ -480,7 +480,7 @@ "సక్రియ ఇన్‌పుట్ పద్ధతులు" "సిస్టమ్ భాషలను ఉపయోగించు" "%1$s యొక్క సెట్టింగ్‌లను తెరవడం విఫలమైంది" - "ఈ ఇన్‌పుట్ పద్ధతి మీరు టైప్ చేసే మొత్తం వచనాన్ని అలాగే పాస్‌వర్డ్‌లు మరియు క్రెడిట్ కార్డు నంబర్‌ల వంటి వ్యక్తిగత డేటాను సేకరించగలదు. ఇది %1$s అనువర్తనంలో అందించబడుతుంది. ఈ ఇన్‌పుట్ పద్ధతిని ఉపయోగించాలా?" + "ఈ ఇన్‌పుట్ పద్ధతి మీరు టైప్ చేసే మొత్తం వచనాన్ని అలాగే పాస్‌వర్డ్‌లు మరియు క్రెడిట్ కార్డు నంబర్‌ల వంటి వ్యక్తిగత డేటాను సేకరించగలదు. ఇది %1$s యాప్‌లో అందించబడుతుంది. ఈ ఇన్‌పుట్ పద్ధతిని ఉపయోగించాలా?" "గమనిక: రీబూట్ చేసాక, మీరు మీ ఫోన్‌ను అన్‌లాక్ చేసే వరకు ఈ యాప్ ప్రారంభం కాదు" "IMS నమోదు స్థితి" "నమోదు చేయబడింది" -- cgit v1.2.3 From 721c6039c004821de6f506e326ceda791b1a2e14 Mon Sep 17 00:00:00 2001 From: Patrick Baumann Date: Wed, 4 Aug 2021 20:05:36 +0000 Subject: Revert "Apply overlay updates to widget provider info" This reverts commit 0bf76b6296e7095ab98ea175452e5697e9afcc66. Bug: 193866093 Fixes: 195267626 Reason for revert: b/195267626 Change-Id: I598a99f761e66d8bedbb0745d488ccc35fff9201 (cherry picked from commit 471720cccf848d896639322644314e16264f8af8) --- .../appwidget/AppWidgetManagerInternal.java | 14 ----- core/java/android/widget/RemoteViews.java | 19 ------- .../server/appwidget/AppWidgetServiceImpl.java | 60 ---------------------- .../android/server/am/ActivityManagerService.java | 8 --- 4 files changed, 101 deletions(-) diff --git a/core/java/android/appwidget/AppWidgetManagerInternal.java b/core/java/android/appwidget/AppWidgetManagerInternal.java index 266e33af0e22..5694ca860453 100644 --- a/core/java/android/appwidget/AppWidgetManagerInternal.java +++ b/core/java/android/appwidget/AppWidgetManagerInternal.java @@ -19,8 +19,6 @@ package android.appwidget; import android.annotation.Nullable; import android.util.ArraySet; -import java.util.Set; - /** * App widget manager local system service interface. * @@ -44,16 +42,4 @@ public abstract class AppWidgetManagerInternal { * @param userId The user that is being unlocked. */ public abstract void unlockUser(int userId); - - /** - * Updates all widgets, applying changes to Runtime Resource Overlay affecting the specified - * target packages. - * - * @param packageNames The names of all target packages for which an overlay was modified - * @param userId The user for which overlay modifications occurred. - * @param updateFrameworkRes Whether or not an overlay affected the values of framework - * resources. - */ - public abstract void applyResourceOverlaysToWidgets(Set packageNames, int userId, - boolean updateFrameworkRes); } diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java index 91fc5a56d979..e827f0a31bfd 100644 --- a/core/java/android/widget/RemoteViews.java +++ b/core/java/android/widget/RemoteViews.java @@ -5824,25 +5824,6 @@ public class RemoteViews implements Parcelable, Filter { return false; } - /** @hide */ - public void updateAppInfo(@NonNull ApplicationInfo info) { - if (mApplication != null && mApplication.sourceDir.equals(info.sourceDir)) { - // Overlay paths are generated against a particular version of an application. - // The overlays paths of a newly upgraded application are incompatible with the - // old version of the application. - mApplication = info; - } - if (hasSizedRemoteViews()) { - for (RemoteViews layout : mSizedRemoteViews) { - layout.updateAppInfo(info); - } - } - if (hasLandscapeAndPortraitLayouts()) { - mLandscape.updateAppInfo(info); - mPortrait.updateAppInfo(info); - } - } - private Context getContextForResources(Context context) { if (mApplication != null) { if (context.getUserId() == UserHandle.getUserId(mApplication.uid) diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java index a56b1db1494c..5aec6aa99c12 100644 --- a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java +++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java @@ -3285,57 +3285,6 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku } } - private void applyResourceOverlaysToWidgetsLocked(Set packageNames, int userId, - boolean updateFrameworkRes) { - for (int i = 0, N = mProviders.size(); i < N; i++) { - Provider provider = mProviders.get(i); - if (provider.getUserId() != userId) { - continue; - } - - final String packageName = provider.id.componentName.getPackageName(); - if (!updateFrameworkRes && !packageNames.contains(packageName)) { - continue; - } - - ApplicationInfo newAppInfo = null; - try { - newAppInfo = mPackageManager.getApplicationInfo(packageName, - PackageManager.GET_SHARED_LIBRARY_FILES, userId); - } catch (RemoteException e) { - Slog.w(TAG, "Failed to retrieve app info for " + packageName - + " userId=" + userId, e); - } - if (newAppInfo == null) { - continue; - } - ApplicationInfo oldAppInfo = provider.info.providerInfo.applicationInfo; - if (!newAppInfo.sourceDir.equals(oldAppInfo.sourceDir)) { - // Overlay paths are generated against a particular version of an application. - // The overlays paths of a newly upgraded application are incompatible with the - // old version of the application. - continue; - } - - // Isolate the changes relating to RROs. The app info must be copied to prevent - // affecting other parts of system server that may have cached this app info. - oldAppInfo = new ApplicationInfo(oldAppInfo); - oldAppInfo.overlayPaths = newAppInfo.overlayPaths.clone(); - oldAppInfo.resourceDirs = newAppInfo.resourceDirs.clone(); - provider.info.providerInfo.applicationInfo = oldAppInfo; - - for (int j = 0, M = provider.widgets.size(); j < M; j++) { - Widget widget = provider.widgets.get(j); - if (widget.views != null) { - widget.views.updateAppInfo(oldAppInfo); - } - if (widget.maskedViews != null) { - widget.maskedViews.updateAppInfo(oldAppInfo); - } - } - } - } - /** * Updates all providers with the specified package names, and records any providers that were * pruned. @@ -4926,14 +4875,5 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku public void unlockUser(int userId) { handleUserUnlocked(userId); } - - @Override - public void applyResourceOverlaysToWidgets(Set packageNames, int userId, - boolean updateFrameworkRes) { - synchronized (mLock) { - applyResourceOverlaysToWidgetsLocked(new HashSet<>(packageNames), userId, - updateFrameworkRes); - } - } } } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index e0df4b797fe5..99ae52c00995 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -193,7 +193,6 @@ import android.app.usage.UsageEvents.Event; import android.app.usage.UsageStatsManager; import android.app.usage.UsageStatsManagerInternal; import android.appwidget.AppWidgetManager; -import android.appwidget.AppWidgetManagerInternal; import android.content.AttributionSource; import android.content.AutofillOptions; import android.content.BroadcastReceiver; @@ -16598,13 +16597,6 @@ public class ActivityManagerService extends IActivityManager.Stub if (updateFrameworkRes) { ParsingPackageUtils.readConfigUseRoundIcon(null); } - - AppWidgetManagerInternal widgets = LocalServices.getService(AppWidgetManagerInternal.class); - if (widgets != null) { - widgets.applyResourceOverlaysToWidgets(new HashSet<>(packagesToUpdate), userId, - updateFrameworkRes); - } - mProcessList.updateApplicationInfoLOSP(packagesToUpdate, userId, updateFrameworkRes); if (updateFrameworkRes) { -- cgit v1.2.3 From 9eca14b72bf8615824f6900504c750803e8d0087 Mon Sep 17 00:00:00 2001 From: Ming-Shin Lu Date: Wed, 4 Aug 2021 17:45:23 +0000 Subject: [DO NOT MERGE] Revert "Fix flickering when switched to the task without IME shown" This reverts commit 7d9eb2b6f953773887289b910cd4d7337ad246bf. Reason for revert: Regression happens in "com.instagram.android" that IME will cover the comment fields Bug: 195385541 Bug: 192337037 Bug: 194746204 Change-Id: Id33459ab4f53f8bec2027759302dafc1a4f02fae --- .../java/com/android/server/wm/InsetsPolicy.java | 46 +++++----------------- .../com/android/server/wm/WindowStateTests.java | 33 ---------------- 2 files changed, 10 insertions(+), 69 deletions(-) diff --git a/services/core/java/com/android/server/wm/InsetsPolicy.java b/services/core/java/com/android/server/wm/InsetsPolicy.java index 11a0fba4b015..f2f192686ad5 100644 --- a/services/core/java/com/android/server/wm/InsetsPolicy.java +++ b/services/core/java/com/android/server/wm/InsetsPolicy.java @@ -32,10 +32,6 @@ import static android.view.WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_B 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 com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_RECENTS; -import static com.android.server.wm.WindowContainer.AnimationFlags.PARENTS; -import static com.android.server.wm.WindowContainer.AnimationFlags.TRANSITION; - import android.annotation.NonNull; import android.annotation.Nullable; import android.app.StatusBarManager; @@ -215,7 +211,7 @@ class InsetsPolicy { InsetsState getInsetsForWindow(WindowState target) { final InsetsState originalState = mStateController.getInsetsForWindow(target); final InsetsState state = adjustVisibilityForTransientTypes(originalState); - return adjustVisibilityForIme(target, state, state == originalState); + return target.mIsImWindow ? adjustVisibilityForIme(state, state == originalState) : state; } /** @@ -245,38 +241,16 @@ class InsetsPolicy { return state; } - private InsetsState adjustVisibilityForIme(WindowState w, InsetsState originalState, + // Navigation bar insets is always visible to IME. + private static InsetsState adjustVisibilityForIme(InsetsState originalState, boolean copyState) { - if (w.mIsImWindow) { - // Navigation bar insets is always visible to IME. - final InsetsSource originalNavSource = originalState.peekSource(ITYPE_NAVIGATION_BAR); - if (originalNavSource != null && !originalNavSource.isVisible()) { - final InsetsState state = copyState ? new InsetsState(originalState) - : originalState; - final InsetsSource navSource = new InsetsSource(originalNavSource); - navSource.setVisible(true); - state.addSource(navSource); - return state; - } - } else if (w.mActivityRecord != null && !w.mActivityRecord.mLastImeShown) { - // During switching tasks with gestural navigation, if the IME is attached to - // one app window on that time, even the next app window is behind the IME window, - // conceptually the window should not receive the IME insets if the next window is - // not eligible IME requester and ready to show IME on top of it. - final boolean shouldImeAttachedToApp = mDisplayContent.shouldImeAttachedToApp(); - final InsetsSource originalImeSource = originalState.peekSource(ITYPE_IME); - - if (originalImeSource != null && shouldImeAttachedToApp - && (w.isAnimating(PARENTS | TRANSITION, ANIMATION_TYPE_RECENTS) - || !w.getRequestedVisibility(ITYPE_IME))) { - final InsetsState state = copyState ? new InsetsState(originalState) - : originalState; - - final InsetsSource imeSource = new InsetsSource(originalImeSource); - imeSource.setVisible(false); - state.addSource(imeSource); - return state; - } + final InsetsSource originalNavSource = originalState.peekSource(ITYPE_NAVIGATION_BAR); + if (originalNavSource != null && !originalNavSource.isVisible()) { + final InsetsState state = copyState ? new InsetsState(originalState) : originalState; + final InsetsSource navSource = new InsetsSource(originalNavSource); + navSource.setVisible(true); + state.addSource(navSource); + return state; } return originalState; } diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java index 3a50bb0f06bc..92b670ed9699 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java @@ -53,9 +53,6 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify; import static com.android.server.wm.DisplayContent.IME_TARGET_CONTROL; import static com.android.server.wm.DisplayContent.IME_TARGET_LAYERING; -import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_RECENTS; -import static com.android.server.wm.WindowContainer.AnimationFlags.PARENTS; -import static com.android.server.wm.WindowContainer.AnimationFlags.TRANSITION; import static com.android.server.wm.WindowContainer.SYNC_STATE_WAITING_FOR_DRAW; import static com.google.common.truth.Truth.assertThat; @@ -894,36 +891,6 @@ public class WindowStateTests extends WindowTestsBase { assertTrue(mAppWindow.getInsetsState().getSourceOrDefaultVisibility(ITYPE_NAVIGATION_BAR)); } - @UseTestDisplay(addWindows = W_INPUT_METHOD) - @Test - public void testAdjustImeInsetsVisibilityWhenTaskSwitchIsAnimating() { - final WindowState app = createWindow(null, TYPE_APPLICATION, "app"); - final WindowState app2 = createWindow(null, TYPE_APPLICATION, "app2"); - final InsetsStateController controller = mDisplayContent.getInsetsStateController(); - controller.getImeSourceProvider().setWindow(mImeWindow, null, null); - - // Simulate app requests IME with updating all windows Insets State when IME is above app. - mDisplayContent.setImeLayeringTarget(app); - mDisplayContent.setImeInputTarget(app); - assertTrue(mDisplayContent.shouldImeAttachedToApp()); - controller.getImeSourceProvider().scheduleShowImePostLayout(app); - controller.getImeSourceProvider().getSource().setVisible(true); - controller.updateAboveInsetsState(mImeWindow, false); - - // Simulate task switching animation happens when switching app to app2. - spyOn(app); - spyOn(app2); - doReturn(true).when(app).isAnimating(PARENTS | TRANSITION, ANIMATION_TYPE_RECENTS); - doReturn(true).when(app2).isAnimating(PARENTS | TRANSITION, ANIMATION_TYPE_RECENTS); - app.mActivityRecord.mLastImeShown = true; - - // Verify the IME insets is visible on app, but not for app2 during task animating. - InsetsState stateApp = app.getInsetsState(); - InsetsState stateApp2 = app2.getInsetsState(); - assertTrue(stateApp.getSource(ITYPE_IME).isVisible()); - assertFalse(stateApp2.getSource(ITYPE_IME).isVisible()); - } - @UseTestDisplay(addWindows = { W_ACTIVITY }) @Test public void testUpdateImeControlTargetWhenLeavingMultiWindow() { -- cgit v1.2.3 From f0a8ea3f73b15789c3ff61f3741e6ace58929114 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 5 Aug 2021 01:51:01 +0000 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I1267fce02034fe817a51ac6e1cd6bbb6230a6198 --- packages/SettingsLib/res/values-te/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml index a87002679408..4f74d2492d43 100644 --- a/packages/SettingsLib/res/values-te/strings.xml +++ b/packages/SettingsLib/res/values-te/strings.xml @@ -489,7 +489,7 @@ "సక్రియ ఇన్‌పుట్ పద్ధతులు" "సిస్టమ్ భాషలను ఉపయోగించు" "%1$s యొక్క సెట్టింగ్‌లను తెరవడం విఫలమైంది" - "ఈ ఇన్‌పుట్ పద్ధతి మీరు టైప్ చేసే మొత్తం వచనాన్ని అలాగే పాస్‌వర్డ్‌లు మరియు క్రెడిట్ కార్డు నంబర్‌ల వంటి వ్యక్తిగత డేటాను సేకరించగలదు. ఇది %1$s అనువర్తనంలో అందించబడుతుంది. ఈ ఇన్‌పుట్ పద్ధతిని ఉపయోగించాలా?" + "ఈ ఇన్‌పుట్ పద్ధతి మీరు టైప్ చేసే మొత్తం వచనాన్ని అలాగే పాస్‌వర్డ్‌లు మరియు క్రెడిట్ కార్డు నంబర్‌ల వంటి వ్యక్తిగత డేటాను సేకరించగలదు. ఇది %1$s యాప్‌లో అందించబడుతుంది. ఈ ఇన్‌పుట్ పద్ధతిని ఉపయోగించాలా?" "గమనిక: రీబూట్ చేసాక, మీరు మీ ఫోన్‌ను అన్‌లాక్ చేసే వరకు ఈ యాప్ ప్రారంభం కాదు" "IMS నమోదు స్థితి" "నమోదు చేయబడింది" -- cgit v1.2.3 From 3ac246c43294d7f7012bdcb0ccb7bae1aa695bd4 Mon Sep 17 00:00:00 2001 From: Ahaan Ugale Date: Wed, 4 Aug 2021 16:33:36 -0700 Subject: Send the HotwordDetectionService UID to AudioPolicy This change follows the pattern of how the IME UID is set. The UID is stored in AudioService and re-sent there if the audio server dies. Fix: 194368677 Test: manual - hotword works when another app is using the mic and in Auto projection mode; also after restarting the process or killing audio server Test: atest HotwordDetectionServiceBasicTest Change-Id: I325cb33d17387e62302967b261b6fe61086d8893 --- core/jni/android_media_AudioSystem.cpp | 8 ++++++++ media/java/android/media/AudioManagerInternal.java | 11 +++++++++++ media/java/android/media/AudioSystem.java | 7 +++++++ .../java/com/android/server/audio/AudioService.java | 18 ++++++++++++++++++ .../com/android/server/audio/AudioSystemAdapter.java | 8 ++++++++ .../voiceinteraction/HotwordDetectionConnection.java | 16 ++++++++++++++++ 6 files changed, 68 insertions(+) diff --git a/core/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp index 16ee6a745e1d..4b93363b5b90 100644 --- a/core/jni/android_media_AudioSystem.cpp +++ b/core/jni/android_media_AudioSystem.cpp @@ -2429,6 +2429,12 @@ android_media_AudioSystem_setAssistantUid(JNIEnv *env, jobject thiz, jint uid) return (jint)nativeToJavaStatus(status); } +static jint android_media_AudioSystem_setHotwordDetectionServiceUid(JNIEnv *env, jobject thiz, + jint uid) { + status_t status = AudioSystem::setHotwordDetectionServiceUid(uid); + return (jint)nativeToJavaStatus(status); +} + static jint android_media_AudioSystem_setA11yServicesUids(JNIEnv *env, jobject thiz, jintArray uids) { std::vector nativeUidsVector; @@ -2799,6 +2805,8 @@ static const JNINativeMethod gMethods[] = {"setSurroundFormatEnabled", "(IZ)I", (void *)android_media_AudioSystem_setSurroundFormatEnabled}, {"setAssistantUid", "(I)I", (void *)android_media_AudioSystem_setAssistantUid}, + {"setHotwordDetectionServiceUid", "(I)I", + (void *)android_media_AudioSystem_setHotwordDetectionServiceUid}, {"setA11yServicesUids", "([I)I", (void *)android_media_AudioSystem_setA11yServicesUids}, {"isHapticPlaybackSupported", "()Z", (void *)android_media_AudioSystem_isHapticPlaybackSupported}, diff --git a/media/java/android/media/AudioManagerInternal.java b/media/java/android/media/AudioManagerInternal.java index c827932194ae..cb887f2d523d 100644 --- a/media/java/android/media/AudioManagerInternal.java +++ b/media/java/android/media/AudioManagerInternal.java @@ -38,6 +38,17 @@ public abstract class AudioManagerInternal { public abstract void updateRingerModeAffectedStreamsInternal(); + /** + * Notify the UID of the currently active {@link android.service.voice.HotwordDetectionService}. + * + *

The caller is expected to take care of any performance implications, e.g. by using a + * background thread to call this method.

+ * + * @param uid UID of the currently active service or {@link android.os.Process#INVALID_UID} if + * none. + */ + public abstract void setHotwordDetectionServiceUid(int uid); + public abstract void setAccessibilityServiceUids(IntArray uids); /** diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java index 8012f03d84b3..69d1889d5762 100644 --- a/media/java/android/media/AudioSystem.java +++ b/media/java/android/media/AudioSystem.java @@ -1768,6 +1768,13 @@ public class AudioSystem */ public static native int setAssistantUid(int uid); + /** + * Communicate UID of the current {@link android.service.voice.HotwordDetectionService} to audio + * policy service. + * @hide + */ + public static native int setHotwordDetectionServiceUid(int uid); + /** * @hide * Communicate UIDs of active accessibility services to audio policy service. diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index f7d091498456..34e2578f7855 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -736,6 +736,11 @@ public class AudioService extends IAudioService.Stub private VolumePolicy mVolumePolicy = VolumePolicy.DEFAULT; private long mLoweredFromNormalToVibrateTime; + // Uid of the active hotword detection service to check if caller is the one or not. + @GuardedBy("mHotwordDetectionServiceUidLock") + private int mHotwordDetectionServiceUid = android.os.Process.INVALID_UID; + private final Object mHotwordDetectionServiceUidLock = new Object(); + // Array of Uids of valid accessibility services to check if caller is one of them private final Object mAccessibilityServiceUidsLock = new Object(); @GuardedBy("mAccessibilityServiceUidsLock") @@ -1337,6 +1342,9 @@ public class AudioService extends IAudioService.Stub updateAssistantUId(true); AudioSystem.setRttEnabled(mRttEnabled); } + synchronized (mHotwordDetectionServiceUidLock) { + AudioSystem.setHotwordDetectionServiceUid(mHotwordDetectionServiceUid); + } synchronized (mAccessibilityServiceUidsLock) { AudioSystem.setA11yServicesUids(mAccessibilityServiceUids); } @@ -9107,6 +9115,16 @@ public class AudioService extends IAudioService.Stub } } + @Override + public void setHotwordDetectionServiceUid(int uid) { + synchronized (mHotwordDetectionServiceUidLock) { + if (mHotwordDetectionServiceUid != uid) { + mHotwordDetectionServiceUid = uid; + AudioSystem.setHotwordDetectionServiceUid(mHotwordDetectionServiceUid); + } + } + } + @Override public void setAccessibilityServiceUids(IntArray uids) { synchronized (mAccessibilityServiceUidsLock) { diff --git a/services/core/java/com/android/server/audio/AudioSystemAdapter.java b/services/core/java/com/android/server/audio/AudioSystemAdapter.java index 973fbd2bba17..6d567807f357 100644 --- a/services/core/java/com/android/server/audio/AudioSystemAdapter.java +++ b/services/core/java/com/android/server/audio/AudioSystemAdapter.java @@ -366,6 +366,14 @@ public class AudioSystemAdapter implements AudioSystem.RoutingUpdateCallback { return AudioSystem.muteMicrophone(on); } + /** + * Same as {@link AudioSystem#setHotwordDetectionServiceUid(int)} + * Communicate UID of current HotwordDetectionService to audio policy service. + */ + public int setHotwordDetectionServiceUid(int uid) { + return AudioSystem.setHotwordDetectionServiceUid(uid); + } + /** * Same as {@link AudioSystem#setCurrentImeUid(int)} * Communicate UID of current InputMethodService to audio policy service. diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java index 965f126000fd..734172fc1549 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java @@ -36,6 +36,7 @@ import android.content.PermissionChecker; import android.hardware.soundtrigger.IRecognitionStatusCallback; import android.hardware.soundtrigger.SoundTrigger; import android.media.AudioFormat; +import android.media.AudioManagerInternal; import android.media.permission.Identity; import android.media.permission.PermissionUtil; import android.os.Binder; @@ -44,6 +45,7 @@ import android.os.IBinder; import android.os.IRemoteCallback; import android.os.ParcelFileDescriptor; import android.os.PersistableBundle; +import android.os.Process; import android.os.RemoteException; import android.os.ServiceManager; import android.os.SharedMemory; @@ -275,6 +277,7 @@ final class HotwordDetectionConnection { LocalServices.getService(PermissionManagerServiceInternal.class) .setHotwordDetectionServiceProvider(null); mIdentity = null; + updateServiceUidForAudioPolicy(Process.INVALID_UID); } mCancellationTaskFuture.cancel(/* may interrupt */ true); if (mAudioFlinger != null) { @@ -893,6 +896,8 @@ final class HotwordDetectionConnection { connection.run(service -> service.ping(new IRemoteCallback.Stub() { @Override public void sendResult(Bundle bundle) throws RemoteException { + // TODO: Exit if the service has been unbound already (though there's a very low + // chance this happens). if (DEBUG) { Slog.d(TAG, "updating hotword UID " + Binder.getCallingUid()); } @@ -902,10 +907,21 @@ final class HotwordDetectionConnection { LocalServices.getService(PermissionManagerServiceInternal.class) .setHotwordDetectionServiceProvider(() -> uid); mIdentity = new HotwordDetectionServiceIdentity(uid, mVoiceInteractionServiceUid); + updateServiceUidForAudioPolicy(uid); } })); } + private void updateServiceUidForAudioPolicy(int uid) { + mScheduledExecutorService.execute(() -> { + final AudioManagerInternal audioManager = + LocalServices.getService(AudioManagerInternal.class); + if (audioManager != null) { + audioManager.setHotwordDetectionServiceUid(uid); + } + }); + } + private static void bestEffortClose(Closeable closeable) { try { closeable.close(); -- cgit v1.2.3 From fd19460694f050487f4f4400409cb9cd98fdfddf Mon Sep 17 00:00:00 2001 From: Joanne Chung Date: Fri, 30 Jul 2021 21:19:14 +0800 Subject: Fix the Translator references are gone when receiving response. There are some issues TranslationService already sent the response but the View onResponse doesn't be called. The reference seems to be gone. If we don't fix the problem, we will missing the ui translation even the service already give us the response. To fix the problem, we change it to strong reference. The change is low risk, the only risk is if TranslationService doesn not release the reference to the callback properly causing a memory leak for apps but this can recovered by app update. Bug: 194973014 Test: atest CtsTranslationTestCases Test: The translation for chat apps work fine. The memory is decreased after receiving the responses for a while. Change-Id: Ib3956b2250c54a29acf9f7d51f51e8191fe8aba2 --- core/java/android/view/translation/Translator.java | 29 +++++++++++----------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/core/java/android/view/translation/Translator.java b/core/java/android/view/translation/Translator.java index edd0d16a5ccb..606f39d6e25e 100644 --- a/core/java/android/view/translation/Translator.java +++ b/core/java/android/view/translation/Translator.java @@ -18,6 +18,7 @@ package android.view.translation; import static android.view.translation.TranslationManager.STATUS_SYNC_CALL_FAIL; import static android.view.translation.TranslationManager.SYNC_CALLS_TIMEOUT_MS; +import static android.view.translation.UiTranslationController.DEBUG; import android.annotation.CallbackExecutor; import android.annotation.NonNull; @@ -38,7 +39,6 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.os.IResultReceiver; import java.io.PrintWriter; -import java.lang.ref.WeakReference; import java.util.Objects; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Executor; @@ -395,27 +395,26 @@ public class Translator { private static class TranslationResponseCallbackImpl extends ITranslationCallback.Stub { - private final WeakReference> mCallback; - private final WeakReference mExecutor; + private final Consumer mCallback; + private final Executor mExecutor; TranslationResponseCallbackImpl(Consumer callback, Executor executor) { - mCallback = new WeakReference<>(callback); - mExecutor = new WeakReference<>(executor); + mCallback = callback; + mExecutor = executor; } @Override public void onTranslationResponse(TranslationResponse response) throws RemoteException { - final Consumer callback = mCallback.get(); + if (DEBUG) { + Log.i(TAG, "onTranslationResponse called."); + } final Runnable runnable = - () -> callback.accept(response); - if (callback != null) { - final Executor executor = mExecutor.get(); - final long token = Binder.clearCallingIdentity(); - try { - executor.execute(runnable); - } finally { - restoreCallingIdentity(token); - } + () -> mCallback.accept(response); + final long token = Binder.clearCallingIdentity(); + try { + mExecutor.execute(runnable); + } finally { + restoreCallingIdentity(token); } } } -- cgit v1.2.3 From fb54b80240cd4e5a7bbce86a9722c276053d27de Mon Sep 17 00:00:00 2001 From: Issei Suzuki Date: Thu, 5 Aug 2021 10:27:39 +0200 Subject: Fix jank when launching an activity from an occluding activity. Bug: 194243906 Test: manual 1. From lockscreen, double tap power to launch camera. 2. Take photo, go to filmstrip. (no jaaring app transition) 3. Go back twice to lock screen. (no flip between translucent and opaque state in the camere preview) Change-Id: I60dc38e6d9505c8bc949d30e0d84a8771b61d50a --- services/core/java/com/android/server/wm/KeyguardController.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/wm/KeyguardController.java b/services/core/java/com/android/server/wm/KeyguardController.java index 3208ae3aa97d..6cef2ca1d82b 100644 --- a/services/core/java/com/android/server/wm/KeyguardController.java +++ b/services/core/java/com/android/server/wm/KeyguardController.java @@ -372,7 +372,9 @@ class KeyguardController { // can be committed before KEYGUARD_OCCLUDE transition is handled. // Set mRequestForceTransition flag to make sure that the app transition animation // is applied for such case. - if (topActivity != null) { + // TODO(b/194243906): Fix this before enabling the remote keyguard animation. + if (WindowManagerService.sEnableRemoteKeyguardGoingAwayAnimation + && topActivity != null) { topActivity.mRequestForceTransition = true; } updateKeyguardSleepToken(DEFAULT_DISPLAY); -- cgit v1.2.3 From 7ab12ba890c7559b81dd627f4aad5aca7a58d281 Mon Sep 17 00:00:00 2001 From: Simon Bowden Date: Thu, 5 Aug 2021 12:46:45 +0000 Subject: Fix a race condition between calculateWaitTime and actually waiting. When the race was lost with a completion callback, the operation being waited upon may have been de-queued by the completion callback for immediate execution, but the thread was still proceeding with the wait. This caused flaky tests as the extra delay caused the thread to take longer to complete, and the newly extended callback delay happened to coincide with the test's wait timeout. Consequently, the test's wait timeout is shortened slightly to make it clearer when the issue is caused by "falling into" the OffStep callback delay, which isn't intended to be a normal behavior. Test: manual atest Bug: 194408223 Change-Id: I97ec74bbc26171a4384ed9ddd7e2130fb8004b9b --- .../android/server/vibrator/VibrationThread.java | 30 ++++++++++++---------- .../server/vibrator/VibrationThreadTest.java | 2 +- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/services/core/java/com/android/server/vibrator/VibrationThread.java b/services/core/java/com/android/server/vibrator/VibrationThread.java index e85fa234a4ce..0f4f58b32c1b 100644 --- a/services/core/java/com/android/server/vibrator/VibrationThread.java +++ b/services/core/java/com/android/server/vibrator/VibrationThread.java @@ -228,17 +228,20 @@ final class VibrationThread extends Thread implements IBinder.DeathRecipient { Vibration.Status status = null; while (!mStepQueue.isEmpty()) { - long waitTime = mStepQueue.calculateWaitTime(); - if (waitTime <= 0) { - mStepQueue.consumeNext(); - } else { - synchronized (mLock) { + long waitTime; + synchronized (mLock) { + waitTime = mStepQueue.calculateWaitTime(); + if (waitTime > 0) { try { mLock.wait(waitTime); } catch (InterruptedException e) { } } } + // If we waited, the queue may have changed, so let the loop run again. + if (waitTime <= 0) { + mStepQueue.consumeNext(); + } Vibration.Status currentStatus = mStop ? Vibration.Status.CANCELLED : mStepQueue.calculateVibrationStatus(sequentialEffectSize); if (status == null && currentStatus != Vibration.Status.RUNNING) { @@ -387,15 +390,13 @@ final class VibrationThread extends Thread implements IBinder.DeathRecipient { } /** Returns the time in millis to wait before calling {@link #consumeNext()}. */ + @GuardedBy("mLock") public long calculateWaitTime() { - Step nextStep; - synchronized (mLock) { - if (!mPendingOnVibratorCompleteSteps.isEmpty()) { - // Steps anticipated by vibrator complete callback should be played right away. - return 0; - } - nextStep = mNextSteps.peek(); + if (!mPendingOnVibratorCompleteSteps.isEmpty()) { + // Steps anticipated by vibrator complete callback should be played right away. + return 0; } + Step nextStep = mNextSteps.peek(); return nextStep == null ? 0 : nextStep.calculateWaitTime(); } @@ -603,7 +604,10 @@ final class VibrationThread extends Thread implements IBinder.DeathRecipient { return false; } - /** Returns the time in millis to wait before playing this step. */ + /** + * Returns the time in millis to wait before playing this step. This is performed + * while holding the queue lock, so should not rely on potentially slow operations. + */ public long calculateWaitTime() { if (startTime == Long.MAX_VALUE) { // This step don't have a predefined start time, it's just marked to be executed diff --git a/services/tests/servicestests/src/com/android/server/vibrator/VibrationThreadTest.java b/services/tests/servicestests/src/com/android/server/vibrator/VibrationThreadTest.java index 61b5c2b09bb2..4cc4d55f228d 100644 --- a/services/tests/servicestests/src/com/android/server/vibrator/VibrationThreadTest.java +++ b/services/tests/servicestests/src/com/android/server/vibrator/VibrationThreadTest.java @@ -83,7 +83,7 @@ import java.util.stream.Collectors; @Presubmit public class VibrationThreadTest { - private static final int TEST_TIMEOUT_MILLIS = 1_000; + private static final int TEST_TIMEOUT_MILLIS = 900; private static final int UID = Process.ROOT_UID; private static final int VIBRATOR_ID = 1; private static final String PACKAGE_NAME = "package"; -- cgit v1.2.3 From b552048fd7e900e209df11adc828aab0d1f2e1e9 Mon Sep 17 00:00:00 2001 From: Tim Peng Date: Wed, 4 Aug 2021 08:01:24 +0000 Subject: Paired BT devices are not displaying in volume control panel -Add selected device into list -getTransferableRoutes() logic is changed at ag/15426495 Bug: 195266049 Test: make -j50 RunSettingsLibRoboTests ROBOTEST_FILTER=InfoMediaManagerTest Change-Id: I127bf7fabf42bbbd7e90a9193bf1f4ff5a35dc6f --- .../settingslib/media/InfoMediaManager.java | 65 +++++++++++++--------- .../settingslib/media/LocalMediaManager.java | 3 + 2 files changed, 42 insertions(+), 26 deletions(-) diff --git a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java index 79446e430d4f..ed8d524b0132 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java @@ -44,6 +44,8 @@ import android.os.Build; import android.text.TextUtils; import android.util.Log; +import androidx.annotation.RequiresApi; + import com.android.internal.annotations.VisibleForTesting; import com.android.settingslib.bluetooth.CachedBluetoothDevice; import com.android.settingslib.bluetooth.LocalBluetoothManager; @@ -56,6 +58,7 @@ import java.util.concurrent.Executors; /** * InfoMediaManager provide interface to get InfoMediaDevice list. */ +@RequiresApi(Build.VERSION_CODES.R) public class InfoMediaManager extends MediaManager { private static final String TAG = "InfoMediaManager"; @@ -145,9 +148,16 @@ public class InfoMediaManager extends MediaManager { } private RoutingSessionInfo getRoutingSessionInfo() { + return getRoutingSessionInfo(mPackageName); + } + + private RoutingSessionInfo getRoutingSessionInfo(String packageName) { final List sessionInfos = - mRouterManager.getRoutingSessions(mPackageName); + mRouterManager.getRoutingSessions(packageName); + if (sessionInfos == null || sessionInfos.isEmpty()) { + return null; + } return sessionInfos.get(sessionInfos.size() - 1); } @@ -367,33 +377,13 @@ public class InfoMediaManager extends MediaManager { } boolean shouldDisableMediaOutput(String packageName) { - boolean shouldDisableMediaOutput = false; if (TextUtils.isEmpty(packageName)) { Log.w(TAG, "shouldDisableMediaOutput() package name is null or empty!"); - return false; - } - final List infos = mRouterManager.getTransferableRoutes(packageName); - if (infos.size() == 1) { - final MediaRoute2Info info = infos.get(0); - final int deviceType = info.getType(); - switch (deviceType) { - case TYPE_UNKNOWN: - case TYPE_REMOTE_TV: - case TYPE_REMOTE_SPEAKER: - case TYPE_GROUP: - shouldDisableMediaOutput = true; - break; - default: - shouldDisableMediaOutput = false; - break; - } - } - if (DEBUG) { - Log.d(TAG, "shouldDisableMediaOutput() MediaRoute2Info size : " + infos.size() - + ", package name : " + packageName + ", shouldDisableMediaOutput : " - + shouldDisableMediaOutput); + return true; } - return shouldDisableMediaOutput; + + // Disable when there is no transferable route + return mRouterManager.getTransferableRoutes(packageName).isEmpty(); } @TargetApi(Build.VERSION_CODES.R) @@ -456,7 +446,7 @@ public class InfoMediaManager extends MediaManager { } private void buildAvailableRoutes() { - for (MediaRoute2Info route : mRouterManager.getTransferableRoutes(mPackageName)) { + for (MediaRoute2Info route : getAvailableRoutes(mPackageName)) { if (DEBUG) { Log.d(TAG, "buildAvailableRoutes() route : " + route.getName() + ", volume : " + route.getVolume() + ", type : " + route.getType()); @@ -465,6 +455,29 @@ public class InfoMediaManager extends MediaManager { } } + private List getAvailableRoutes(String packageName) { + final List infos = new ArrayList<>(); + RoutingSessionInfo routingSessionInfo = getRoutingSessionInfo(packageName); + if (routingSessionInfo != null) { + infos.addAll(mRouterManager.getSelectedRoutes(routingSessionInfo)); + } + final List transferableRoutes = + mRouterManager.getTransferableRoutes(packageName); + for (MediaRoute2Info transferableRoute : transferableRoutes) { + boolean alreadyAdded = false; + for (MediaRoute2Info mediaRoute2Info : infos) { + if (TextUtils.equals(transferableRoute.getId(), mediaRoute2Info.getId())) { + alreadyAdded = true; + break; + } + } + if (!alreadyAdded) { + infos.add(transferableRoute); + } + } + return infos; + } + @VisibleForTesting void addMediaDevice(MediaRoute2Info route) { final int deviceType = route.getType(); diff --git a/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java index a8da2c0ba269..22001c9c925a 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java @@ -22,11 +22,13 @@ import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.content.Context; import android.media.RoutingSessionInfo; +import android.os.Build; import android.text.TextUtils; import android.util.Log; import androidx.annotation.IntDef; import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; import com.android.internal.annotations.VisibleForTesting; import com.android.settingslib.bluetooth.A2dpProfile; @@ -49,6 +51,7 @@ import java.util.concurrent.CopyOnWriteArrayList; /** * LocalMediaManager provide interface to get MediaDevice list and transfer media to MediaDevice. */ +@RequiresApi(Build.VERSION_CODES.R) public class LocalMediaManager implements BluetoothCallback { private static final Comparator COMPARATOR = Comparator.naturalOrder(); private static final String TAG = "LocalMediaManager"; -- cgit v1.2.3 From e588681c0106097fa04904226afed5c76891f3d6 Mon Sep 17 00:00:00 2001 From: Cassie Date: Mon, 2 Aug 2021 13:19:04 -0700 Subject: Make InternetTile default in SysUI. Bug: 174753536 Test: Manual Change-Id: I1d9642f73b84a1f68cfb3d8a40554fb90b2ca01f Merged-In: I1d9642f73b84a1f68cfb3d8a40554fb90b2ca01f --- .../providers/settings/SettingsProvider.java | 40 +++++++++++++++++++++- packages/SystemUI/res/values/config.xml | 2 +- .../src/com/android/systemui/qs/QSTileHost.java | 36 ------------------- .../systemui/qs/customize/TileQueryHelper.java | 14 +------- .../com/android/systemui/qs/QSTileHostTest.java | 19 ---------- .../systemui/qs/customize/TileQueryHelperTest.java | 24 +------------ 6 files changed, 42 insertions(+), 93 deletions(-) diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java index 1e3ee22fee2f..db301f698753 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java @@ -3585,7 +3585,7 @@ public class SettingsProvider extends ContentProvider { } private final class UpgradeController { - private static final int SETTINGS_VERSION = 203; + private static final int SETTINGS_VERSION = 204; private final int mUserId; @@ -5189,6 +5189,44 @@ public class SettingsProvider extends ContentProvider { currentVersion = 203; } + if (currentVersion == 203) { + // Version 204: Replace 'wifi' or 'cell' tiles with 'internet' if existed. + final SettingsState secureSettings = getSecureSettingsLocked(userId); + final Setting currentValue = secureSettings.getSettingLocked(Secure.QS_TILES); + if (!currentValue.isNull()) { + String tileList = currentValue.getValue(); + String[] tileSplit = tileList.split(","); + final ArrayList tiles = new ArrayList(); + boolean hasInternetTile = false; + for (int i = 0; i < tileSplit.length; i++) { + String tile = tileSplit[i].trim(); + if (tile.isEmpty()) continue; + tiles.add(tile); + if (tile.equals("internet")) hasInternetTile = true; + } + if (!hasInternetTile) { + if (tiles.contains("wifi")) { + // Replace the WiFi with Internet, and remove the Cell + tiles.set(tiles.indexOf("wifi"), "internet"); + tiles.remove("cell"); + } else if (tiles.contains("cell")) { + // Replace the Cell with Internet + tiles.set(tiles.indexOf("cell"), "internet"); + } + } else { + tiles.remove("wifi"); + tiles.remove("cell"); + } + secureSettings.insertSettingOverrideableByRestoreLocked( + Secure.QS_TILES, + TextUtils.join(",", tiles), + null /* tag */, + true /* makeDefault */, + SettingsState.SYSTEM_PACKAGE_NAME); + } + currentVersion = 204; + } + // vXXX: Add new settings above this point. if (currentVersion != newVersion) { diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index 11850b4332e6..d274c917c26d 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -107,7 +107,7 @@ - internet,wifi,cell,bt,flashlight,dnd,alarm,airplane,controls,wallet,rotation,battery,cast,screenrecord,mictoggle,cameratoggle,location,hotspot,inversion,saver,dark,work,night,reverse,reduce_brightness + internet,bt,flashlight,dnd,alarm,airplane,controls,wallet,rotation,battery,cast,screenrecord,mictoggle,cameratoggle,location,hotspot,inversion,saver,dark,work,night,reverse,reduce_brightness diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java b/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java index 756ad9939886..541ee2c4fe8f 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java @@ -51,7 +51,6 @@ import com.android.systemui.qs.external.TileServices; import com.android.systemui.qs.logging.QSLogger; import com.android.systemui.settings.UserTracker; import com.android.systemui.shared.plugins.PluginManager; -import com.android.systemui.statusbar.FeatureFlags; import com.android.systemui.statusbar.phone.AutoTileManager; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBarIconController; @@ -512,33 +511,6 @@ public class QSTileHost implements QSHost, Tunable, PluginListener, D } } } - // TODO(b/174753536): Move it into the config file. - // Only do the below hacking when at least one of the below tiles exist - // --InternetTile - // --WiFiTile - // --CellularTIle - if (tiles.contains("internet") || tiles.contains("wifi") || tiles.contains("cell")) { - if (FeatureFlags.isProviderModelSettingEnabled(context)) { - if (!tiles.contains("internet")) { - if (tiles.contains("wifi")) { - // Replace the WiFi with Internet, and remove the Cell - tiles.set(tiles.indexOf("wifi"), "internet"); - tiles.remove("cell"); - } else if (tiles.contains("cell")) { - // Replace the Cell with Internet - tiles.set(tiles.indexOf("cell"), "internet"); - } - } else { - tiles.remove("wifi"); - tiles.remove("cell"); - } - } else { - if (tiles.contains("internet")) { - tiles.set(tiles.indexOf("internet"), "wifi"); - tiles.add("cell"); - } - } - } return tiles; } @@ -558,14 +530,6 @@ public class QSTileHost implements QSHost, Tunable, PluginListener, D && GarbageMonitor.ADD_MEMORY_TILE_TO_DEFAULT_ON_DEBUGGABLE_BUILDS) { tiles.add(GarbageMonitor.MemoryTile.TILE_SPEC); } - // TODO(b/174753536): Change the config file directly. - // Filter out unused tiles from the default QS config. - if (FeatureFlags.isProviderModelSettingEnabled(context)) { - tiles.remove("cell"); - tiles.remove("wifi"); - } else { - tiles.remove("internet"); - } return tiles; } diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/TileQueryHelper.java b/packages/SystemUI/src/com/android/systemui/qs/customize/TileQueryHelper.java index 3cb715cee8e9..3c2f35b954ea 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/customize/TileQueryHelper.java +++ b/packages/SystemUI/src/com/android/systemui/qs/customize/TileQueryHelper.java @@ -41,7 +41,6 @@ import com.android.systemui.qs.dagger.QSScope; import com.android.systemui.qs.external.CustomTile; import com.android.systemui.qs.tileimpl.QSTileImpl.DrawableIcon; import com.android.systemui.settings.UserTracker; -import com.android.systemui.statusbar.FeatureFlags; import com.android.systemui.util.leak.GarbageMonitor; import java.util.ArrayList; @@ -63,7 +62,6 @@ public class TileQueryHelper { private final Executor mBgExecutor; private final Context mContext; private final UserTracker mUserTracker; - private final FeatureFlags mFeatureFlags; private TileStateListener mListener; private boolean mFinished; @@ -73,14 +71,12 @@ public class TileQueryHelper { Context context, UserTracker userTracker, @Main Executor mainExecutor, - @Background Executor bgExecutor, - FeatureFlags featureFlags + @Background Executor bgExecutor ) { mContext = context; mMainExecutor = mainExecutor; mBgExecutor = bgExecutor; mUserTracker = userTracker; - mFeatureFlags = featureFlags; } public void setListener(TileStateListener listener) { @@ -121,19 +117,11 @@ public class TileQueryHelper { } final ArrayList tilesToAdd = new ArrayList<>(); - // TODO(b/174753536): Move it into the config file. - if (mFeatureFlags.isProviderModelSettingEnabled()) { - possibleTiles.remove("cell"); - possibleTiles.remove("wifi"); - } else { - possibleTiles.remove("internet"); - } for (String spec : possibleTiles) { // Only add current and stock tiles that can be created from QSFactoryImpl. // Do not include CustomTile. Those will be created by `addPackageTiles`. if (spec.startsWith(CustomTile.PREFIX)) continue; - // TODO(b/174753536): Move it into the config file. final QSTile tile = host.createTile(spec); if (tile == null) { continue; diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java index f208b807f747..9e97f801be3e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java @@ -44,7 +44,6 @@ import android.view.View; import androidx.annotation.Nullable; import androidx.test.filters.SmallTest; -import com.android.dx.mockito.inline.extended.ExtendedMockito; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.UiEventLogger; import com.android.internal.util.CollectionUtils; @@ -64,22 +63,18 @@ import com.android.systemui.qs.logging.QSLogger; import com.android.systemui.qs.tileimpl.QSTileImpl; import com.android.systemui.settings.UserTracker; import com.android.systemui.shared.plugins.PluginManager; -import com.android.systemui.statusbar.FeatureFlags; import com.android.systemui.statusbar.phone.AutoTileManager; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBarIconController; import com.android.systemui.tuner.TunerService; import com.android.systemui.util.settings.SecureSettings; -import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import org.mockito.MockitoSession; -import org.mockito.quality.Strictness; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -133,16 +128,9 @@ public class QSTileHostTest extends SysuiTestCase { private Handler mHandler; private TestableLooper mLooper; private QSTileHost mQSTileHost; - MockitoSession mMockingSession = null; @Before public void setUp() { - // TODO(b/174753536): Remove the mMockingSession when - // FeatureFlagUtils.SETTINGS_PROVIDER_MODEL is removed. - mMockingSession = ExtendedMockito.mockitoSession().strictness(Strictness.LENIENT) - .mockStatic(FeatureFlags.class).startMocking(); - ExtendedMockito.doReturn(false) - .when(() -> FeatureFlags.isProviderModelSettingEnabled(mContext)); MockitoAnnotations.initMocks(this); mLooper = TestableLooper.get(this); mHandler = new Handler(mLooper.getLooper()); @@ -156,13 +144,6 @@ public class QSTileHostTest extends SysuiTestCase { .thenReturn(""); } - @After - public void tearDown() throws Exception { - if (mMockingSession != null) { - mMockingSession.finishMocking(); - } - } - private void setUpTileFactory() { when(mMockState.toString()).thenReturn(MOCK_STATE_STRING); // Only create this kind of tiles diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileQueryHelperTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileQueryHelperTest.java index 4a1411a329be..4efcc5c3fc73 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileQueryHelperTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileQueryHelperTest.java @@ -45,13 +45,11 @@ import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.text.TextUtils; import android.util.ArraySet; -import android.util.FeatureFlagUtils; import android.view.View; import androidx.annotation.Nullable; import androidx.test.filters.SmallTest; -import com.android.dx.mockito.inline.extended.ExtendedMockito; import com.android.internal.logging.InstanceId; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; @@ -60,11 +58,9 @@ import com.android.systemui.plugins.qs.QSIconView; import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.qs.QSTileHost; import com.android.systemui.settings.UserTracker; -import com.android.systemui.statusbar.FeatureFlags; import com.android.systemui.util.concurrency.FakeExecutor; import com.android.systemui.util.time.FakeSystemClock; -import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -74,8 +70,6 @@ import org.mockito.Captor; import org.mockito.InOrder; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import org.mockito.MockitoSession; -import org.mockito.quality.Strictness; import java.util.ArrayList; import java.util.Arrays; @@ -114,7 +108,6 @@ public class TileQueryHelperTest extends SysuiTestCase { private PackageManager mPackageManager; @Mock private UserTracker mUserTracker; - @Mock private FeatureFlags mFeatureFlags; @Captor private ArgumentCaptor> mCaptor; @@ -122,18 +115,10 @@ public class TileQueryHelperTest extends SysuiTestCase { private TileQueryHelper mTileQueryHelper; private FakeExecutor mMainExecutor; private FakeExecutor mBgExecutor; - MockitoSession mMockingSession = null; @Before public void setup() { MockitoAnnotations.initMocks(this); - // TODO(b/174753536): Remove the mMockingSession when - // FeatureFlagUtils.SETTINGS_PROVIDER_MODEL is removed. - mMockingSession = ExtendedMockito.mockitoSession().strictness(Strictness.LENIENT) - .mockStatic(FeatureFlagUtils.class).startMocking(); - ExtendedMockito.doReturn(false).when(() -> FeatureFlagUtils.isEnabled(mContext, - FeatureFlagUtils.SETTINGS_PROVIDER_MODEL)); - mContext.setMockPackageManager(mPackageManager); mState = new QSTile.State(); @@ -153,17 +138,10 @@ public class TileQueryHelperTest extends SysuiTestCase { mMainExecutor = new FakeExecutor(clock); mBgExecutor = new FakeExecutor(clock); mTileQueryHelper = new TileQueryHelper( - mContext, mUserTracker, mMainExecutor, mBgExecutor, mFeatureFlags); + mContext, mUserTracker, mMainExecutor, mBgExecutor); mTileQueryHelper.setListener(mListener); } - @After - public void tearDown() throws Exception { - if (mMockingSession != null) { - mMockingSession.finishMocking(); - } - } - @Test public void testIsFinished_falseBeforeQuerying() { assertFalse(mTileQueryHelper.isFinished()); -- cgit v1.2.3 From 84922f4f430536323b17ac4088a5996136a64950 Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Thu, 5 Aug 2021 09:18:32 -0700 Subject: Do not run background animation without a Looper Apps that create RippleDrawable on a background thread could crash, making them incompatible with S. Test: manual with MindBody app Fixes: 194952073 Change-Id: I9d16d5c63c192e96191b4fbc859ff3bc3da733cb --- graphics/java/android/graphics/drawable/RippleDrawable.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/graphics/java/android/graphics/drawable/RippleDrawable.java b/graphics/java/android/graphics/drawable/RippleDrawable.java index d3cff5cb81ff..7354c90c5c98 100644 --- a/graphics/java/android/graphics/drawable/RippleDrawable.java +++ b/graphics/java/android/graphics/drawable/RippleDrawable.java @@ -49,7 +49,9 @@ import android.graphics.RecordingCanvas; import android.graphics.Rect; import android.graphics.Shader; import android.os.Build; +import android.os.Looper; import android.util.AttributeSet; +import android.util.Log; import android.view.animation.AnimationUtils; import android.view.animation.LinearInterpolator; @@ -113,6 +115,7 @@ import java.util.Arrays; * @attr ref android.R.styleable#RippleDrawable_color */ public class RippleDrawable extends LayerDrawable { + private static final String TAG = "RippleDrawable"; /** * Radius value that specifies the ripple radius should be computed based * on the size of the ripple's container. @@ -848,6 +851,10 @@ public class RippleDrawable extends LayerDrawable { private void startBackgroundAnimation() { mRunBackgroundAnimation = false; + if (Looper.myLooper() == null) { + Log.w(TAG, "Thread doesn't have a looper. Skipping animation."); + return; + } mBackgroundAnimation = ValueAnimator.ofFloat(mBackgroundOpacity, mTargetBackgroundOpacity); mBackgroundAnimation.setInterpolator(LINEAR_INTERPOLATOR); mBackgroundAnimation.setDuration(BACKGROUND_OPACITY_DURATION); -- cgit v1.2.3 From 1a7019c85f89ba5c265fdf068146045d94e3cfa1 Mon Sep 17 00:00:00 2001 From: Josh Tsuji Date: Thu, 5 Aug 2021 12:55:36 -0400 Subject: Don't let ringer drawer icons be clicked while the drawer is animating closed. This could happen after a quick double tap on the ringer icon, where you'd hit the ringer icon as the drawer animated shut. This resulted in a permanently unusable ringer drawer (a reboot was needed to fix). Fixes: 195392457 Test: switch to vibrate, then tap the ringer icon several times quickly Change-Id: If5ddd2a27364a6fd66ebd6bfd12b5810e1973a75 --- .../SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java index 3320852ca1f4..60b92ef45291 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java @@ -2248,6 +2248,11 @@ public class VolumeDialogImpl implements VolumeDialog, @Override public void onClick(View view) { + // If the ringer drawer isn't open, don't let anything in it be clicked. + if (!mIsRingerDrawerOpen) { + return; + } + setRingerMode(mClickedRingerMode); mRingerDrawerIconAnimatingSelected = getDrawerIconViewForMode(mClickedRingerMode); -- cgit v1.2.3 From 8d6022e778608ca98c6a9cf79bf305b4b2bdc16e Mon Sep 17 00:00:00 2001 From: Jeff DeCew Date: Thu, 5 Aug 2021 15:36:58 -0400 Subject: Left align the HeadsUp content in the StatusBar. Fixes: 185679234 Test: post Heads Up notification from an app with a long name using each cutout configuration, in LTR and RTL, portrait and landscape. Change-Id: Iccd924ca8103f66af6e732787ba634643acfae1c --- .../systemui/statusbar/HeadsUpStatusBarView.java | 106 +-------------------- 1 file changed, 4 insertions(+), 102 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java index acfd998ff6e4..c561ba28ecae 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java @@ -17,14 +17,10 @@ package com.android.systemui.statusbar; import android.content.Context; -import android.content.res.Configuration; -import android.content.res.Resources; -import android.graphics.Point; import android.graphics.Rect; import android.os.Bundle; import android.os.Parcelable; import android.util.AttributeSet; -import android.view.DisplayCutout; import android.view.View; import android.widget.TextView; @@ -42,22 +38,14 @@ import com.android.systemui.statusbar.notification.collection.NotificationEntry. public class HeadsUpStatusBarView extends AlphaOptimizedLinearLayout { private static final String HEADS_UP_STATUS_BAR_VIEW_SUPER_PARCELABLE = "heads_up_status_bar_view_super_parcelable"; - private static final String FIRST_LAYOUT = "first_layout"; private static final String VISIBILITY = "visibility"; private static final String ALPHA = "alpha"; - private int mAbsoluteStartPadding; - private int mEndMargin; + private final Rect mLayoutedIconRect = new Rect(); + private final int[] mTmpPosition = new int[2]; + private final Rect mIconDrawingRect = new Rect(); private View mIconPlaceholder; private TextView mTextView; private NotificationEntry mShowingEntry; - private Rect mLayoutedIconRect = new Rect(); - private int[] mTmpPosition = new int[2]; - private boolean mFirstLayout = true; - private int mMaxWidth; - private int mSysWinInset; - private int mCutOutInset; - private Rect mIconDrawingRect = new Rect(); - private Point mDisplaySize; private Runnable mOnDrawingRectChangedListener; public HeadsUpStatusBarView(Context context) { @@ -75,40 +63,6 @@ public class HeadsUpStatusBarView extends AlphaOptimizedLinearLayout { public HeadsUpStatusBarView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); - Resources res = getResources(); - mAbsoluteStartPadding = res.getDimensionPixelSize(R.dimen.notification_side_paddings) - + res.getDimensionPixelSize( - com.android.internal.R.dimen.notification_content_margin_start); - mEndMargin = res.getDimensionPixelSize( - com.android.internal.R.dimen.notification_content_margin_end); - setPaddingRelative(mAbsoluteStartPadding, 0, mEndMargin, 0); - updateMaxWidth(); - } - - private void updateMaxWidth() { - int maxWidth = getResources().getDimensionPixelSize(R.dimen.qs_panel_width); - if (maxWidth != mMaxWidth) { - // maxWidth doesn't work with fill_parent, let's manually make it at most as big as the - // notification panel - mMaxWidth = maxWidth; - requestLayout(); - } - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - if (mMaxWidth > 0) { - int newSize = Math.min(MeasureSpec.getSize(widthMeasureSpec), mMaxWidth); - widthMeasureSpec = MeasureSpec.makeMeasureSpec(newSize, - MeasureSpec.getMode(widthMeasureSpec)); - } - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - } - - @Override - protected void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - updateMaxWidth(); } @Override @@ -116,7 +70,6 @@ public class HeadsUpStatusBarView extends AlphaOptimizedLinearLayout { Bundle bundle = new Bundle(); bundle.putParcelable(HEADS_UP_STATUS_BAR_VIEW_SUPER_PARCELABLE, super.onSaveInstanceState()); - bundle.putBoolean(FIRST_LAYOUT, mFirstLayout); bundle.putInt(VISIBILITY, getVisibility()); bundle.putFloat(ALPHA, getAlpha()); @@ -125,7 +78,7 @@ public class HeadsUpStatusBarView extends AlphaOptimizedLinearLayout { @Override public void onRestoreInstanceState(Parcelable state) { - if (state == null || !(state instanceof Bundle)) { + if (!(state instanceof Bundle)) { super.onRestoreInstanceState(state); return; } @@ -133,7 +86,6 @@ public class HeadsUpStatusBarView extends AlphaOptimizedLinearLayout { Bundle bundle = (Bundle) state; Parcelable superState = bundle.getParcelable(HEADS_UP_STATUS_BAR_VIEW_SUPER_PARCELABLE); super.onRestoreInstanceState(superState); - mFirstLayout = bundle.getBoolean(FIRST_LAYOUT, true); if (bundle.containsKey(VISIBILITY)) { setVisibility(bundle.getInt(VISIBILITY)); } @@ -191,20 +143,6 @@ public class HeadsUpStatusBarView extends AlphaOptimizedLinearLayout { int bottom = top + mIconPlaceholder.getHeight(); mLayoutedIconRect.set(left, top, right, bottom); updateDrawingRect(); - int targetPadding = mAbsoluteStartPadding + mSysWinInset + mCutOutInset; - boolean isRtl = isLayoutRtl(); - int start = isRtl ? (mDisplaySize.x - right) : left; - if (start != targetPadding) { - int newPadding = targetPadding - start + getPaddingStart(); - setPaddingRelative(newPadding, 0, mEndMargin, 0); - } - if (mFirstLayout) { - // we need to do the padding calculation in the first frame, so the layout specified - // our visibility to be INVISIBLE in the beginning. let's correct that and set it - // to GONE. - setVisibility(GONE); - mFirstLayout = false; - } } /** In order to do UI alignment, this view will be notified by @@ -226,29 +164,6 @@ public class HeadsUpStatusBarView extends AlphaOptimizedLinearLayout { } } - @Override - protected boolean fitSystemWindows(Rect insets) { - boolean isRtl = isLayoutRtl(); - mSysWinInset = isRtl ? insets.right : insets.left; - DisplayCutout displayCutout = getRootWindowInsets().getDisplayCutout(); - mCutOutInset = (displayCutout != null) - ? (isRtl ? displayCutout.getSafeInsetRight() : displayCutout.getSafeInsetLeft()) - : 0; - - getDisplaySize(); - - // For Double Cut Out mode, the System window navigation bar is at the right - // side of the left cut out. In this condition, mSysWinInset include the left cut - // out width so we set mCutOutInset to be 0. For RTL, the condition is the same. - // The navigation bar is at the left side of the right cut out and include the - // right cut out width. - if (mSysWinInset != 0) { - mCutOutInset = 0; - } - - return super.fitSystemWindows(insets); - } - public NotificationEntry getShowingEntry() { return mShowingEntry; } @@ -264,17 +179,4 @@ public class HeadsUpStatusBarView extends AlphaOptimizedLinearLayout { public void setOnDrawingRectChangedListener(Runnable onDrawingRectChangedListener) { mOnDrawingRectChangedListener = onDrawingRectChangedListener; } - - private void getDisplaySize() { - if (mDisplaySize == null) { - mDisplaySize = new Point(); - } - getDisplay().getRealSize(mDisplaySize); - } - - @Override - protected void onAttachedToWindow() { - super.onAttachedToWindow(); - getDisplaySize(); - } } -- cgit v1.2.3 From 80db54b915baccaf606abd1581d4cfb802579994 Mon Sep 17 00:00:00 2001 From: Beverly Date: Thu, 5 Aug 2021 17:33:16 -0400 Subject: Consider swipes on the unlock icon as intent for device entry Similar to how taps and longpresses are handled, swipes on the unlock icon will also enter the device. Test: manually swipe on unlock icon and see device entry Bug: 195664144 Change-Id: I1fa40c461ce1476b6b1369ad9ac1759165d67740 --- .../SystemUI/src/com/android/keyguard/LockIconViewController.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java b/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java index 4317e258d8f7..509ac8a6d9fe 100644 --- a/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java @@ -514,7 +514,15 @@ public class LockIconViewController extends ViewController impleme if (!wasClickableOnDownEvent()) { return false; } + onAffordanceClick(); + return true; + } + public boolean onFling(MotionEvent e1, MotionEvent e2, + float velocityX, float velocityY) { + if (!wasClickableOnDownEvent()) { + return false; + } onAffordanceClick(); return true; } -- cgit v1.2.3 From 83dde708cccc03c9f110b052eaec962b81d52a39 Mon Sep 17 00:00:00 2001 From: Beverly Date: Mon, 2 Aug 2021 15:58:38 -0400 Subject: Update lock icon and udfps padding By default, use 48px. This value can be overridden by overlays. Update stroke width of lock and udfps icons from 2.5 => 2 Update stroke width of aod udfps icon from 1 => 1.3 Test: manual Change-Id: I7c3883c9acac68acc02684a3115e9e6512fe9a1f Bug: 195564809 --- packages/SystemUI/res/anim/fp_to_unlock.xml | 8 ++++---- packages/SystemUI/res/anim/lock_to_unlock.xml | 4 ++-- packages/SystemUI/res/drawable/ic_unlock.xml | 4 ++-- packages/SystemUI/res/layout/status_bar_expanded.xml | 2 +- packages/SystemUI/res/layout/udfps_keyguard_view.xml | 4 ++-- packages/SystemUI/res/raw/udfps_aod_fp.json | 16 ++++++++-------- packages/SystemUI/res/raw/udfps_lockscreen_fp.json | 2 +- packages/SystemUI/res/values/dimens.xml | 3 +++ 8 files changed, 23 insertions(+), 20 deletions(-) diff --git a/packages/SystemUI/res/anim/fp_to_unlock.xml b/packages/SystemUI/res/anim/fp_to_unlock.xml index a348208f48c7..a5f75b6726c8 100644 --- a/packages/SystemUI/res/anim/fp_to_unlock.xml +++ b/packages/SystemUI/res/anim/fp_to_unlock.xml @@ -19,10 +19,10 @@ - - - - + + + + diff --git a/packages/SystemUI/res/anim/lock_to_unlock.xml b/packages/SystemUI/res/anim/lock_to_unlock.xml index ec51c0171709..76f7a05866d9 100644 --- a/packages/SystemUI/res/anim/lock_to_unlock.xml +++ b/packages/SystemUI/res/anim/lock_to_unlock.xml @@ -21,7 +21,7 @@ - + @@ -30,7 +30,7 @@ - + diff --git a/packages/SystemUI/res/drawable/ic_unlock.xml b/packages/SystemUI/res/drawable/ic_unlock.xml index c3b34699e8e2..46023e6160f5 100644 --- a/packages/SystemUI/res/drawable/ic_unlock.xml +++ b/packages/SystemUI/res/drawable/ic_unlock.xml @@ -21,7 +21,7 @@ android:strokeColor="#FF000000" android:strokeLineCap="round" android:strokeLineJoin="round" - android:strokeWidth="2.5" + android:strokeWidth="2" android:pathData="M4.75 15 C4.75,15 23.25,15 23.25,15 C24.35,15 25.25,15.9 25.25,17 C25.25,17 25.25,33 25.25,33 C25.25,34.1 24.35,35 23.25,35 C23.25,35 4.75,35 4.75,35 C3.65,35 2.75,34.1 2.75,33 C2.75,33 2.75,17 2.75,17 C2.75,15.9 3.65,15 4.75,15c " /> @@ -29,7 +29,7 @@ android:strokeColor="#FF000000" android:strokeLineCap="round" android:strokeLineJoin="round" - android:strokeWidth="2.5" + android:strokeWidth="2" android:pathData="M27.19 14.81 C27.19,14.81 27.19,8.3 27.19,8.3 C27.19,4.92 24.44,2.88 21.19,2.75 C17.74,2.62 15,4.74 15,8.11 C15,8.11 15,15 15,15 " /> diff --git a/packages/SystemUI/res/layout/status_bar_expanded.xml b/packages/SystemUI/res/layout/status_bar_expanded.xml index b0f1f487b260..6d5be301a82d 100644 --- a/packages/SystemUI/res/layout/status_bar_expanded.xml +++ b/packages/SystemUI/res/layout/status_bar_expanded.xml @@ -68,7 +68,7 @@ android:id="@+id/lock_icon" android:layout_width="match_parent" android:layout_height="match_parent" - android:padding="48px" + android:padding="@dimen/lock_icon_padding" android:layout_gravity="center" android:scaleType="centerCrop"/> diff --git a/packages/SystemUI/res/layout/udfps_keyguard_view.xml b/packages/SystemUI/res/layout/udfps_keyguard_view.xml index 1851790673e3..a9eb27ad3b02 100644 --- a/packages/SystemUI/res/layout/udfps_keyguard_view.xml +++ b/packages/SystemUI/res/layout/udfps_keyguard_view.xml @@ -34,7 +34,7 @@ android:id="@+id/udfps_aod_fp" android:layout_width="match_parent" android:layout_height="match_parent" - android:padding="48px" + android:padding="@dimen/lock_icon_padding" android:layout_gravity="center" android:scaleType="centerCrop" app:lottie_autoPlay="false" @@ -46,7 +46,7 @@ android:id="@+id/udfps_lockscreen_fp" android:layout_width="match_parent" android:layout_height="match_parent" - android:padding="48px" + android:padding="@dimen/lock_icon_padding" android:layout_gravity="center" android:scaleType="centerCrop" app:lottie_autoPlay="false" diff --git a/packages/SystemUI/res/raw/udfps_aod_fp.json b/packages/SystemUI/res/raw/udfps_aod_fp.json index 3247fe74fcfe..3b273ff92814 100644 --- a/packages/SystemUI/res/raw/udfps_aod_fp.json +++ b/packages/SystemUI/res/raw/udfps_aod_fp.json @@ -164,7 +164,7 @@ }, "w":{ "a":0, - "k":1, + "k":1.3, "ix":5 }, "lc":2, @@ -526,7 +526,7 @@ }, "w":{ "a":0, - "k":1, + "k":1.3, "ix":5 }, "lc":2, @@ -829,7 +829,7 @@ }, "w":{ "a":0, - "k":1, + "k":1.3, "ix":5 }, "lc":2, @@ -1132,7 +1132,7 @@ }, "w":{ "a":0, - "k":1, + "k":1.3, "ix":5 }, "lc":2, @@ -1507,7 +1507,7 @@ }, "w":{ "a":0, - "k":1, + "k":1.3, "ix":5 }, "lc":2, @@ -1882,7 +1882,7 @@ }, "w":{ "a":0, - "k":1, + "k":1.3, "ix":5 }, "lc":2, @@ -2257,7 +2257,7 @@ }, "w":{ "a":0, - "k":1, + "k":1.3, "ix":5 }, "lc":2, @@ -2560,7 +2560,7 @@ }, "w":{ "a":0, - "k":1, + "k":1.3, "ix":5 }, "lc":2, diff --git a/packages/SystemUI/res/raw/udfps_lockscreen_fp.json b/packages/SystemUI/res/raw/udfps_lockscreen_fp.json index a25a47595fe7..a30a03a7e608 100644 --- a/packages/SystemUI/res/raw/udfps_lockscreen_fp.json +++ b/packages/SystemUI/res/raw/udfps_lockscreen_fp.json @@ -1 +1 @@ -{"v":"5.7.8","fr":60,"ip":0,"op":46,"w":46,"h":65,"nm":"fingerprint_build_on","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Fingerprint_20210701 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[23.091,32.5,0],"ix":2,"l":2},"a":{"a":0,"k":[19.341,24.25,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.701,0.42],[-1.757,0],[-1.577,-0.381],[-1.485,-0.816]],"o":[[1.455,-0.799],[1.608,-0.397],[1.719,0],[1.739,0.42],[0,0]],"v":[[-9.818,1.227],[-5.064,-0.618],[0,-1.227],[4.96,-0.643],[9.818,1.227]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.717999985639,0.948999980852,0.62400004069,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":24,"s":[2.5]}],"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[19.341,7.477],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Top","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-2.446,1.161],[-1.168,0.275],[-1.439,0],[-1.301,-0.304],[-1.225,-0.66],[-1.11,-1.844]],"o":[[1.23,-2.044],[1.024,-0.486],[1.312,-0.31],[1.425,0],[1.454,0.34],[2.122,1.143],[0,0]],"v":[[-13.091,3.273],[-7.438,-1.646],[-4.14,-2.797],[0,-3.273],[4.104,-2.805],[8.141,-1.29],[13.091,3.273]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.717999985639,0.948999980852,0.62400004069,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":24,"s":[2.5]}],"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[19.341,16.069],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Mid Top","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-6.53,0],[0,-5.793],[0,0],[2.159,0],[0.59,1.489],[0,0],[1.587,0],[0,-2.16],[-0.81,-1.363],[-0.844,-0.674],[0,0]],"o":[[-0.753,-2.095],[0,-5.793],[6.529,0],[0,0],[0,2.16],[-1.604,0],[0,0],[-0.589,-1.489],[-2.161,0],[0,1.62],[0.54,0.909],[0,0],[0,0]],"v":[[-10.702,5.728],[-11.454,1.506],[0.001,-9],[11.454,1.506],[11.454,1.817],[7.544,5.728],[3.926,3.273],[2.618,0],[-0.997,-2.454],[-4.91,1.457],[-3.657,6.014],[-1.57,8.412],[-0.818,9]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.717999994755,0.949000000954,0.624000012875,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":24,"s":[2.5]}],"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[19.341,28.341],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Inside to dot ","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.307,-0.561],[0.894,-0.16],[0.706,0],[0.844,0.193],[0.728,0.334],[0.967,0.901]],"o":[[-1.038,0.967],[-0.817,0.351],[-0.673,0.12],[-0.9,0],[-0.794,-0.182],[-1.203,-0.551],[0,0]],"v":[[8.182,-1.636],[4.642,0.681],[2.07,1.453],[-0.001,1.636],[-2.621,1.341],[-4.909,0.563],[-8.182,-1.636]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.717999985639,0.948999980852,0.62400004069,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":24,"s":[2.5]}],"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[19.341,40.614],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Bottom","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0}],"markers":[{"tm":210,"cm":"2","dr":0},{"tm":255,"cm":"1","dr":0}]} \ No newline at end of file +{"v":"5.7.8","fr":60,"ip":0,"op":46,"w":46,"h":65,"nm":"fingerprint_build_on","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Fingerprint_20210701 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[23.091,32.5,0],"ix":2,"l":2},"a":{"a":0,"k":[19.341,24.25,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.701,0.42],[-1.757,0],[-1.577,-0.381],[-1.485,-0.816]],"o":[[1.455,-0.799],[1.608,-0.397],[1.719,0],[1.739,0.42],[0,0]],"v":[[-9.818,1.227],[-5.064,-0.618],[0,-1.227],[4.96,-0.643],[9.818,1.227]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.717999985639,0.948999980852,0.62400004069,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":24,"s":[2]}],"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[19.341,7.477],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Top","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-2.446,1.161],[-1.168,0.275],[-1.439,0],[-1.301,-0.304],[-1.225,-0.66],[-1.11,-1.844]],"o":[[1.23,-2.044],[1.024,-0.486],[1.312,-0.31],[1.425,0],[1.454,0.34],[2.122,1.143],[0,0]],"v":[[-13.091,3.273],[-7.438,-1.646],[-4.14,-2.797],[0,-3.273],[4.104,-2.805],[8.141,-1.29],[13.091,3.273]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.717999985639,0.948999980852,0.62400004069,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":24,"s":[2]}],"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[19.341,16.069],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Mid Top","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-6.53,0],[0,-5.793],[0,0],[2.159,0],[0.59,1.489],[0,0],[1.587,0],[0,-2.16],[-0.81,-1.363],[-0.844,-0.674],[0,0]],"o":[[-0.753,-2.095],[0,-5.793],[6.529,0],[0,0],[0,2.16],[-1.604,0],[0,0],[-0.589,-1.489],[-2.161,0],[0,1.62],[0.54,0.909],[0,0],[0,0]],"v":[[-10.702,5.728],[-11.454,1.506],[0.001,-9],[11.454,1.506],[11.454,1.817],[7.544,5.728],[3.926,3.273],[2.618,0],[-0.997,-2.454],[-4.91,1.457],[-3.657,6.014],[-1.57,8.412],[-0.818,9]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.717999994755,0.949000000954,0.624000012875,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":24,"s":[2]}],"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[19.341,28.341],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Inside to dot ","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.307,-0.561],[0.894,-0.16],[0.706,0],[0.844,0.193],[0.728,0.334],[0.967,0.901]],"o":[[-1.038,0.967],[-0.817,0.351],[-0.673,0.12],[-0.9,0],[-0.794,-0.182],[-1.203,-0.551],[0,0]],"v":[[8.182,-1.636],[4.642,0.681],[2.07,1.453],[-0.001,1.636],[-2.621,1.341],[-4.909,0.563],[-8.182,-1.636]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.717999985639,0.948999980852,0.62400004069,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":24,"s":[2]}],"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[19.341,40.614],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Bottom","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0}],"markers":[{"tm":210,"cm":"2","dr":0},{"tm":255,"cm":"1","dr":0}]} \ No newline at end of file diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 34f8503ac1dd..0e02ad09d2c9 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -529,6 +529,9 @@ 0x31 + + 48px + 24dp -- cgit v1.2.3 From 468e4332ebc9d4dcaebdb506c9a3c5dcea25df93 Mon Sep 17 00:00:00 2001 From: Song Hu Date: Thu, 5 Aug 2021 02:01:21 -0700 Subject: Fix sharesheet timeout by sending CreatePredictionSession request immediately instead of pushing it to the main thread Looper queue. CreatePredictionSession request is latency-sensitive.Its sendImmediately flag was flipped to be false accidentally in I937cdaa6081d2b85d27ee0192f6af7f197b8e102. Bug: 195411307 Test: atest CtsSharesheetTestCases:android.sharesheet.cts.CtsSharesheetDeviceTest Test: manually test on the device Change-Id: If7d3f7acadcbed3340616b0ab239c776dedf7af7 (cherry picked from commit 13b9f947e0cce9f35e577f49b2a6794e3e918a81) --- .../com/android/server/appprediction/AppPredictionPerUserService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/appprediction/java/com/android/server/appprediction/AppPredictionPerUserService.java b/services/appprediction/java/com/android/server/appprediction/AppPredictionPerUserService.java index cd332a68fa88..4946ad442b0a 100644 --- a/services/appprediction/java/com/android/server/appprediction/AppPredictionPerUserService.java +++ b/services/appprediction/java/com/android/server/appprediction/AppPredictionPerUserService.java @@ -125,7 +125,7 @@ public class AppPredictionPerUserService extends // connect with remote AppPredictionService instead for dark launch usesPeopleService = false; } - final boolean serviceExists = resolveService(sessionId, false, + final boolean serviceExists = resolveService(sessionId, true, usesPeopleService, s -> s.onCreatePredictionSession(context, sessionId)); if (serviceExists && !mSessionInfos.containsKey(sessionId)) { final AppPredictionSessionInfo sessionInfo = new AppPredictionSessionInfo( -- cgit v1.2.3 From b08b641a334b08c2fffd7af84724700c96c30483 Mon Sep 17 00:00:00 2001 From: Jing Ji Date: Thu, 5 Aug 2021 18:02:21 -0700 Subject: Apply proper locks onto the service/association state tracking As they should be locked with the ProcessStatsService lock. Bug: 194991626 Test: Manual - build & boot Test: atest ProcStatsValidationTests Test: atest ProcessStatsDumpsysTest Test: atest CtsIncidentHostTestCases:ProcStatsProtoTest Test: atest CtsAppTestCases Change-Id: I18ccd3f4509ba0ee00434012ed47abf81da9c907 --- .../java/com/android/server/am/ActiveServices.java | 162 +++++++++++++-------- .../com/android/server/am/ConnectionRecord.java | 19 ++- .../server/am/ContentProviderConnection.java | 19 ++- .../android/server/am/ContentProviderRecord.java | 15 +- .../java/com/android/server/am/OomAdjuster.java | 6 +- 5 files changed, 139 insertions(+), 82 deletions(-) diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index 07847f1df053..ad1d9b16e7e7 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -805,10 +805,12 @@ public final class ActiveServices { if (fgRequired) { // We are now effectively running a foreground service. - ServiceState stracker = r.getTracker(); - if (stracker != null) { - stracker.setForeground(true, mAm.mProcessStats.getMemFactorLocked(), - r.lastActivity); + synchronized (mAm.mProcessStats.mLock) { + final ServiceState stracker = r.getTracker(); + if (stracker != null) { + stracker.setForeground(true, mAm.mProcessStats.getMemFactorLocked(), + r.lastActivity); + } } mAm.mAppOpsService.startOperation(AppOpsManager.getToken(mAm.mAppOpsService), AppOpsManager.OP_START_FOREGROUND, r.appInfo.uid, r.packageName, null, @@ -1080,9 +1082,11 @@ public final class ActiveServices { ComponentName startServiceInnerLocked(ServiceMap smap, Intent service, ServiceRecord r, boolean callerFg, boolean addToStarting) throws TransactionTooLargeException { - ServiceState stracker = r.getTracker(); - if (stracker != null) { - stracker.setStarted(true, mAm.mProcessStats.getMemFactorLocked(), r.lastActivity); + synchronized (mAm.mProcessStats.mLock) { + final ServiceState stracker = r.getTracker(); + if (stracker != null) { + stracker.setStarted(true, mAm.mProcessStats.getMemFactorLocked(), r.lastActivity); + } } r.callStart = false; @@ -1142,8 +1146,10 @@ public final class ActiveServices { mAm.mBatteryStatsService.noteServiceStopRunning(uid, packageName, serviceName); service.startRequested = false; if (service.tracker != null) { - service.tracker.setStarted(false, mAm.mProcessStats.getMemFactorLocked(), - SystemClock.uptimeMillis()); + synchronized (mAm.mProcessStats.mLock) { + service.tracker.setStarted(false, mAm.mProcessStats.getMemFactorLocked(), + SystemClock.uptimeMillis()); + } } service.callStart = false; @@ -1318,8 +1324,10 @@ public final class ActiveServices { mAm.mBatteryStatsService.noteServiceStopRunning(uid, packageName, serviceName); r.startRequested = false; if (r.tracker != null) { - r.tracker.setStarted(false, mAm.mProcessStats.getMemFactorLocked(), - SystemClock.uptimeMillis()); + synchronized (mAm.mProcessStats.mLock) { + r.tracker.setStarted(false, mAm.mProcessStats.getMemFactorLocked(), + SystemClock.uptimeMillis()); + } } r.callStart = false; final long origId = Binder.clearCallingIdentity(); @@ -1875,10 +1883,12 @@ public final class ActiveServices { r.mStartForegroundCount++; r.mFgsEnterTime = SystemClock.uptimeMillis(); if (!stopProcStatsOp) { - ServiceState stracker = r.getTracker(); - if (stracker != null) { - stracker.setForeground(true, - mAm.mProcessStats.getMemFactorLocked(), r.lastActivity); + synchronized (mAm.mProcessStats.mLock) { + final ServiceState stracker = r.getTracker(); + if (stracker != null) { + stracker.setForeground(true, + mAm.mProcessStats.getMemFactorLocked(), r.lastActivity); + } } } else { stopProcStatsOp = false; @@ -1913,10 +1923,12 @@ public final class ActiveServices { if (stopProcStatsOp) { // We got through to this point with it actively being started foreground, // and never decided we wanted to keep it like that, so drop it. - ServiceState stracker = r.getTracker(); - if (stracker != null) { - stracker.setForeground(false, mAm.mProcessStats.getMemFactorLocked(), - SystemClock.uptimeMillis()); + synchronized (mAm.mProcessStats.mLock) { + final ServiceState stracker = r.getTracker(); + if (stracker != null) { + stracker.setForeground(false, mAm.mProcessStats.getMemFactorLocked(), + SystemClock.uptimeMillis()); + } } } if (alreadyStartedOp) { @@ -1958,10 +1970,12 @@ public final class ActiveServices { r.isForeground = false; r.mFgsExitTime = SystemClock.uptimeMillis(); - ServiceState stracker = r.getTracker(); - if (stracker != null) { - stracker.setForeground(false, mAm.mProcessStats.getMemFactorLocked(), - SystemClock.uptimeMillis()); + synchronized (mAm.mProcessStats.mLock) { + final ServiceState stracker = r.getTracker(); + if (stracker != null) { + stracker.setForeground(false, mAm.mProcessStats.getMemFactorLocked(), + SystemClock.uptimeMillis()); + } } mAm.mAppOpsService.finishOperation( AppOpsManager.getToken(mAm.mAppOpsService), @@ -2736,10 +2750,12 @@ public final class ActiveServices { s.lastActivity = SystemClock.uptimeMillis(); if (!s.hasAutoCreateConnections()) { // This is the first binding, let the tracker know. - ServiceState stracker = s.getTracker(); - if (stracker != null) { - stracker.setBound(true, mAm.mProcessStats.getMemFactorLocked(), - s.lastActivity); + synchronized (mAm.mProcessStats.mLock) { + final ServiceState stracker = s.getTracker(); + if (stracker != null) { + stracker.setBound(true, mAm.mProcessStats.getMemFactorLocked(), + s.lastActivity); + } } } } @@ -3376,9 +3392,11 @@ public final class ActiveServices { ProcessServiceRecord psr; if (r.executeNesting == 0) { r.executeFg = fg; - ServiceState stracker = r.getTracker(); - if (stracker != null) { - stracker.setExecuting(true, mAm.mProcessStats.getMemFactorLocked(), now); + synchronized (mAm.mProcessStats.mLock) { + final ServiceState stracker = r.getTracker(); + if (stracker != null) { + stracker.setExecuting(true, mAm.mProcessStats.getMemFactorLocked(), now); + } } if (r.app != null) { psr = r.app.mServices; @@ -3573,7 +3591,9 @@ public final class ActiveServices { if (!mRestartingServices.contains(r)) { r.createdFromFg = false; mRestartingServices.add(r); - r.makeRestarting(mAm.mProcessStats.getMemFactorLocked(), now); + synchronized (mAm.mProcessStats.mLock) { + r.makeRestarting(mAm.mProcessStats.getMemFactorLocked(), now); + } } cancelForegroundNotificationLocked(r); @@ -3651,8 +3671,10 @@ public final class ActiveServices { } } if (!stillTracking) { - r.restartTracker.setRestarting(false, mAm.mProcessStats.getMemFactorLocked(), - SystemClock.uptimeMillis()); + synchronized (mAm.mProcessStats.mLock) { + r.restartTracker.setRestarting(false, mAm.mProcessStats.getMemFactorLocked(), + SystemClock.uptimeMillis()); + } r.restartTracker = null; } } @@ -4172,9 +4194,11 @@ public final class ActiveServices { + r); r.fgRequired = false; r.fgWaiting = false; - ServiceState stracker = r.getTracker(); - if (stracker != null) { - stracker.setForeground(false, mAm.mProcessStats.getMemFactorLocked(), now); + synchronized (mAm.mProcessStats.mLock) { + ServiceState stracker = r.getTracker(); + if (stracker != null) { + stracker.setForeground(false, mAm.mProcessStats.getMemFactorLocked(), now); + } } mAm.mAppOpsService.finishOperation(AppOpsManager.getToken(mAm.mAppOpsService), AppOpsManager.OP_START_FOREGROUND, r.appInfo.uid, r.packageName, null); @@ -4231,9 +4255,11 @@ public final class ActiveServices { cancelForegroundNotificationLocked(r); if (r.isForeground) { decActiveForegroundAppLocked(smap, r); - ServiceState stracker = r.getTracker(); - if (stracker != null) { - stracker.setForeground(false, mAm.mProcessStats.getMemFactorLocked(), now); + synchronized (mAm.mProcessStats.mLock) { + ServiceState stracker = r.getTracker(); + if (stracker != null) { + stracker.setForeground(false, mAm.mProcessStats.getMemFactorLocked(), now); + } } mAm.mAppOpsService.finishOperation( AppOpsManager.getToken(mAm.mAppOpsService), @@ -4301,13 +4327,15 @@ public final class ActiveServices { ((ServiceRestarter)r.restarter).setService(null); } - int memFactor = mAm.mProcessStats.getMemFactorLocked(); - if (r.tracker != null) { - r.tracker.setStarted(false, memFactor, now); - r.tracker.setBound(false, memFactor, now); - if (r.executeNesting == 0) { - r.tracker.clearCurrentOwner(r, false); - r.tracker = null; + synchronized (mAm.mProcessStats.mLock) { + final int memFactor = mAm.mProcessStats.getMemFactorLocked(); + if (r.tracker != null) { + r.tracker.setStarted(false, memFactor, now); + r.tracker.setBound(false, memFactor, now); + if (r.executeNesting == 0) { + r.tracker.clearCurrentOwner(r, false); + r.tracker = null; + } } } @@ -4438,8 +4466,10 @@ public final class ActiveServices { boolean hasAutoCreate = s.hasAutoCreateConnections(); if (!hasAutoCreate) { if (s.tracker != null) { - s.tracker.setBound(false, mAm.mProcessStats.getMemFactorLocked(), - SystemClock.uptimeMillis()); + synchronized (mAm.mProcessStats.mLock) { + s.tracker.setBound(false, mAm.mProcessStats.getMemFactorLocked(), + SystemClock.uptimeMillis()); + } } } bringDownServiceIfNeededLocked(s, true, hasAutoCreate, enqueueOomAdj); @@ -4531,12 +4561,14 @@ public final class ActiveServices { private void serviceProcessGoneLocked(ServiceRecord r, boolean enqueueOomAdj) { if (r.tracker != null) { - int memFactor = mAm.mProcessStats.getMemFactorLocked(); - long now = SystemClock.uptimeMillis(); - r.tracker.setExecuting(false, memFactor, now); - r.tracker.setForeground(false, memFactor, now); - r.tracker.setBound(false, memFactor, now); - r.tracker.setStarted(false, memFactor, now); + synchronized (mAm.mProcessStats.mLock) { + final int memFactor = mAm.mProcessStats.getMemFactorLocked(); + final long now = SystemClock.uptimeMillis(); + r.tracker.setExecuting(false, memFactor, now); + r.tracker.setForeground(false, memFactor, now); + r.tracker.setBound(false, memFactor, now); + r.tracker.setStarted(false, memFactor, now); + } } serviceDoneExecutingLocked(r, true, true, enqueueOomAdj); } @@ -4583,13 +4615,15 @@ public final class ActiveServices { } r.executeFg = false; if (r.tracker != null) { - final int memFactor = mAm.mProcessStats.getMemFactorLocked(); - final long now = SystemClock.uptimeMillis(); - r.tracker.setExecuting(false, memFactor, now); - r.tracker.setForeground(false, memFactor, now); - if (finishing) { - r.tracker.clearCurrentOwner(r, false); - r.tracker = null; + synchronized (mAm.mProcessStats.mLock) { + final int memFactor = mAm.mProcessStats.getMemFactorLocked(); + final long now = SystemClock.uptimeMillis(); + r.tracker.setExecuting(false, memFactor, now); + r.tracker.setForeground(false, memFactor, now); + if (finishing) { + r.tracker.clearCurrentOwner(r, false); + r.tracker = null; + } } } if (finishing) { @@ -4974,8 +5008,10 @@ public final class ActiveServices { // down it. sr.startRequested = false; if (sr.tracker != null) { - sr.tracker.setStarted(false, mAm.mProcessStats.getMemFactorLocked(), - SystemClock.uptimeMillis()); + synchronized (mAm.mProcessStats.mLock) { + sr.tracker.setStarted(false, mAm.mProcessStats.getMemFactorLocked(), + SystemClock.uptimeMillis()); + } } } } diff --git a/services/core/java/com/android/server/am/ConnectionRecord.java b/services/core/java/com/android/server/am/ConnectionRecord.java index e6cd509f50dc..916127126117 100644 --- a/services/core/java/com/android/server/am/ConnectionRecord.java +++ b/services/core/java/com/android/server/am/ConnectionRecord.java @@ -47,6 +47,7 @@ final class ConnectionRecord { public AssociationState.SourceState association; // Association tracking String stringName; // Caching of toString. boolean serviceDead; // Well is it? + private Object mProcStatsLock; // Internal lock for accessing AssociationState // Please keep the following two enum list synced. private static final int[] BIND_ORIG_ENUMS = new int[] { @@ -137,23 +138,29 @@ final class ConnectionRecord { Slog.wtf(TAG_AM, "Inactive holder in referenced service " + binding.service.shortInstanceName + ": proc=" + binding.service.app); } else { - association = holder.pkg.getAssociationStateLocked(holder.state, - binding.service.instanceName.getClassName()).startSource(clientUid, - clientProcessName, clientPackageName); - + mProcStatsLock = binding.service.app.mService.mProcessStats.mLock; + synchronized (mProcStatsLock) { + association = holder.pkg.getAssociationStateLocked(holder.state, + binding.service.instanceName.getClassName()).startSource(clientUid, + clientProcessName, clientPackageName); + } } } } public void trackProcState(int procState, int seq, long now) { if (association != null) { - association.trackProcState(procState, seq, now); + synchronized (mProcStatsLock) { + association.trackProcState(procState, seq, now); + } } } public void stopAssociation() { if (association != null) { - association.stop(); + synchronized (mProcStatsLock) { + association.stop(); + } association = null; } } diff --git a/services/core/java/com/android/server/am/ContentProviderConnection.java b/services/core/java/com/android/server/am/ContentProviderConnection.java index 3bc4fcf08921..3b9d47d509ad 100644 --- a/services/core/java/com/android/server/am/ContentProviderConnection.java +++ b/services/core/java/com/android/server/am/ContentProviderConnection.java @@ -38,6 +38,7 @@ public final class ContentProviderConnection extends Binder { public final String clientPackage; public AssociationState.SourceState association; public final long createTime; + private Object mProcStatsLock; // Internal lock for accessing AssociationState /** * Internal lock that guards access to the two counters. @@ -87,23 +88,29 @@ public final class ContentProviderConnection extends Binder { Slog.wtf(TAG_AM, "Inactive holder in referenced provider " + provider.name.toShortString() + ": proc=" + provider.proc); } else { - association = holder.pkg.getAssociationStateLocked(holder.state, - provider.name.getClassName()).startSource(client.uid, client.processName, - clientPackage); - + mProcStatsLock = provider.proc.mService.mProcessStats.mLock; + synchronized (mProcStatsLock) { + association = holder.pkg.getAssociationStateLocked(holder.state, + provider.name.getClassName()).startSource(client.uid, + client.processName, clientPackage); + } } } } public void trackProcState(int procState, int seq, long now) { if (association != null) { - association.trackProcState(procState, seq, now); + synchronized (mProcStatsLock) { + association.trackProcState(procState, seq, now); + } } } public void stopAssociation() { if (association != null) { - association.stop(); + synchronized (mProcStatsLock) { + association.stop(); + } association = null; } } diff --git a/services/core/java/com/android/server/am/ContentProviderRecord.java b/services/core/java/com/android/server/am/ContentProviderRecord.java index 5fd15db79d66..75f31c0ac29f 100644 --- a/services/core/java/com/android/server/am/ContentProviderRecord.java +++ b/services/core/java/com/android/server/am/ContentProviderRecord.java @@ -321,6 +321,7 @@ final class ContentProviderRecord implements ComponentName.WithComponentName { final String mOwningProcessName; int mAcquisitionCount; AssociationState.SourceState mAssociation; + private Object mProcStatsLock; // Internal lock for accessing AssociationState public ExternalProcessHandle(IBinder token, int owningUid, String owningProcessName) { mToken = token; @@ -353,17 +354,21 @@ final class ContentProviderRecord implements ComponentName.WithComponentName { Slog.wtf(TAG_AM, "Inactive holder in referenced provider " + provider.name.toShortString() + ": proc=" + provider.proc); } else { - mAssociation = holder.pkg.getAssociationStateLocked(holder.state, - provider.name.getClassName()).startSource(mOwningUid, - mOwningProcessName, null); - + mProcStatsLock = provider.proc.mService.mProcessStats.mLock; + synchronized (mProcStatsLock) { + mAssociation = holder.pkg.getAssociationStateLocked(holder.state, + provider.name.getClassName()).startSource(mOwningUid, + mOwningProcessName, null); + } } } } public void stopAssociation() { if (mAssociation != null) { - mAssociation.stop(); + synchronized (mProcStatsLock) { + mAssociation.stop(); + } mAssociation = null; } } diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java index d6bf8dbe0a6a..5c19ceb7067a 100644 --- a/services/core/java/com/android/server/am/OomAdjuster.java +++ b/services/core/java/com/android/server/am/OomAdjuster.java @@ -2792,8 +2792,10 @@ public class OomAdjuster { state.setNotCachedSinceIdle(false); } if (!doingAll) { - mService.setProcessTrackerStateLOSP(app, - mService.mProcessStats.getMemFactorLocked(), now); + synchronized (mService.mProcessStats.mLock) { + mService.setProcessTrackerStateLOSP(app, + mService.mProcessStats.getMemFactorLocked(), now); + } } else { state.setProcStateChanged(true); } -- cgit v1.2.3 From a04d57070d780ca5d93e9af93c25c5c6dd36ab3a Mon Sep 17 00:00:00 2001 From: Kevin Chyn Date: Thu, 5 Aug 2021 15:31:13 -0700 Subject: Fix KeyguardUpdateMonitor auth lifecycle issues This is split into two high-level issues which together cause strange auth behavior on keyguard: ============= Issue 1 ============= For fingerprint, auth ends when: 1) Success 2) Error For face, auth ends when: 1) Success 2) Reject 3) Error This change ensures that cancellation signal is set to null upon any of these conditions, so that there is never an opportunity of using a stale CancellationSignal. Furthermore, do not invoke stale cancellation signal when starting authentication. In the off chance the bug is re-introduced, or if some other situation can cause a cancellation signal to be non-null when keyguard requests auth again (e.g. bad state management in keyguard), do NOT invoke the stale cancellation signal's cancel method. The framework already handles this case gracefully and will automatically cancel the previous operation. ============= Issue 2 ============= We have a runnable that's scheduled to run after X ms if ERROR_CANCELED is not received after cancel() is requested. However, there are various bugs around that logic: 1) shared runnable for both fp and face, leading to unexpected and incorrect state changes (e.g. face does not respond to cancel within X ms, both fp and face will go to STATE_STOPPED, even though cancel() was never requested of fp 2) Always remove and re-add runnable when requesting cancel() though it should never occur that cancel() is requested in close temporal proximity, it never hurts to have the correct timeout before resetting the state. Bug: 195365422 Bug: 193477749 Test: manual Change-Id: I3702f41c8af7e870798f19c43012a26281a6632a --- .../android/keyguard/KeyguardUpdateMonitor.java | 75 +++++++++++++--------- 1 file changed, 45 insertions(+), 30 deletions(-) diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index 9bfbe325fc03..0bb5b1ce5179 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -347,13 +347,16 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab private static final int HAL_ERROR_RETRY_TIMEOUT = 500; // ms private static final int HAL_ERROR_RETRY_MAX = 20; - private final Runnable mCancelNotReceived = new Runnable() { - @Override - public void run() { - Log.w(TAG, "Cancel not received, transitioning to STOPPED"); - mFingerprintRunningState = mFaceRunningState = BIOMETRIC_STATE_STOPPED; - updateBiometricListeningState(); - } + private final Runnable mFpCancelNotReceived = () -> { + Log.e(TAG, "Fp cancellation not received, transitioning to STOPPED"); + mFingerprintRunningState = BIOMETRIC_STATE_STOPPED; + updateFingerprintListeningState(); + }; + + private final Runnable mFaceCancelNotReceived = () -> { + Log.e(TAG, "Face cancellation not received, transitioning to STOPPED"); + mFaceRunningState = BIOMETRIC_STATE_STOPPED; + updateFaceListeningState(); }; private final Handler mHandler; @@ -791,19 +794,19 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab private void handleFingerprintError(int msgId, String errString) { Assert.isMainThread(); - if (msgId == FingerprintManager.FINGERPRINT_ERROR_CANCELED && mHandler.hasCallbacks( - mCancelNotReceived)) { - mHandler.removeCallbacks(mCancelNotReceived); + if (mHandler.hasCallbacks(mFpCancelNotReceived)) { + mHandler.removeCallbacks(mFpCancelNotReceived); } + // Error is always the end of authentication lifecycle. + mFingerprintCancelSignal = null; + if (msgId == FingerprintManager.FINGERPRINT_ERROR_CANCELED && mFingerprintRunningState == BIOMETRIC_STATE_CANCELLING_RESTARTING) { setFingerprintRunningState(BIOMETRIC_STATE_STOPPED); updateFingerprintListeningState(); } else { setFingerprintRunningState(BIOMETRIC_STATE_STOPPED); - mFingerprintCancelSignal = null; - mFaceCancelSignal = null; } if (msgId == FingerprintManager.FINGERPRINT_ERROR_HW_UNAVAILABLE) { @@ -905,6 +908,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab private void handleFaceAuthFailed() { Assert.isMainThread(); + mFaceCancelSignal = null; setFaceRunningState(BIOMETRIC_STATE_STOPPED); for (int i = 0; i < mCallbacks.size(); i++) { KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); @@ -983,10 +987,13 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab private void handleFaceError(int msgId, String errString) { Assert.isMainThread(); if (DEBUG_FACE) Log.d(TAG, "Face error received: " + errString); - if (msgId == FaceManager.FACE_ERROR_CANCELED && mHandler.hasCallbacks(mCancelNotReceived)) { - mHandler.removeCallbacks(mCancelNotReceived); + if (mHandler.hasCallbacks(mFaceCancelNotReceived)) { + mHandler.removeCallbacks(mFaceCancelNotReceived); } + // Error is always the end of authentication lifecycle + mFaceCancelSignal = null; + if (msgId == FaceManager.FACE_ERROR_CANCELED && mFaceRunningState == BIOMETRIC_STATE_CANCELLING_RESTARTING) { setFaceRunningState(BIOMETRIC_STATE_STOPPED); @@ -2368,6 +2375,14 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab } private void startListeningForFingerprint() { + final int userId = getCurrentUser(); + final boolean unlockPossible = isUnlockWithFingerprintPossible(userId); + if (mFingerprintCancelSignal != null) { + Log.e(TAG, "Cancellation signal is not null, high chance of bug in fp auth lifecycle" + + " management. FP state: " + mFingerprintRunningState + + ", unlockPossible: " + unlockPossible); + } + if (mFingerprintRunningState == BIOMETRIC_STATE_CANCELLING) { setFingerprintRunningState(BIOMETRIC_STATE_CANCELLING_RESTARTING); return; @@ -2377,11 +2392,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab return; } if (DEBUG) Log.v(TAG, "startListeningForFingerprint()"); - int userId = getCurrentUser(); - if (isUnlockWithFingerprintPossible(userId)) { - if (mFingerprintCancelSignal != null) { - mFingerprintCancelSignal.cancel(); - } + + if (unlockPossible) { mFingerprintCancelSignal = new CancellationSignal(); if (isEncryptedOrLockdown(userId)) { @@ -2397,6 +2409,14 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab } private void startListeningForFace() { + final int userId = getCurrentUser(); + final boolean unlockPossible = isUnlockWithFacePossible(userId); + if (mFaceCancelSignal != null) { + Log.e(TAG, "Cancellation signal is not null, high chance of bug in face auth lifecycle" + + " management. Face state: " + mFaceRunningState + + ", unlockPossible: " + unlockPossible); + } + if (mFaceRunningState == BIOMETRIC_STATE_CANCELLING) { setFaceRunningState(BIOMETRIC_STATE_CANCELLING_RESTARTING); return; @@ -2405,11 +2425,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab return; } if (DEBUG) Log.v(TAG, "startListeningForFace(): " + mFaceRunningState); - int userId = getCurrentUser(); - if (isUnlockWithFacePossible(userId)) { - if (mFaceCancelSignal != null) { - mFaceCancelSignal.cancel(); - } + + if (unlockPossible) { mFaceCancelSignal = new CancellationSignal(); // This would need to be updated for multi-sensor devices @@ -2461,9 +2478,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab if (mFingerprintCancelSignal != null) { mFingerprintCancelSignal.cancel(); mFingerprintCancelSignal = null; - if (!mHandler.hasCallbacks(mCancelNotReceived)) { - mHandler.postDelayed(mCancelNotReceived, DEFAULT_CANCEL_SIGNAL_TIMEOUT); - } + mHandler.removeCallbacks(mFpCancelNotReceived); + mHandler.postDelayed(mFpCancelNotReceived, DEFAULT_CANCEL_SIGNAL_TIMEOUT); } setFingerprintRunningState(BIOMETRIC_STATE_CANCELLING); } @@ -2478,9 +2494,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab if (mFaceCancelSignal != null) { mFaceCancelSignal.cancel(); mFaceCancelSignal = null; - if (!mHandler.hasCallbacks(mCancelNotReceived)) { - mHandler.postDelayed(mCancelNotReceived, DEFAULT_CANCEL_SIGNAL_TIMEOUT); - } + mHandler.removeCallbacks(mFaceCancelNotReceived); + mHandler.postDelayed(mFaceCancelNotReceived, DEFAULT_CANCEL_SIGNAL_TIMEOUT); } setFaceRunningState(BIOMETRIC_STATE_CANCELLING); } -- cgit v1.2.3 From 413ab9d586b22535aa70cd1848f437f34f7cc56b Mon Sep 17 00:00:00 2001 From: Jason Chang Date: Thu, 5 Aug 2021 20:22:51 +0800 Subject: Fix one-handed mode tap app to exit doesn't work in factory boot Root cause: 1. Design change "tap app to exit" -> always being true, and settings remove this option. 2. Tuning performance, due to 1, no longer listens to the key change, so we remove the listener. Solution: Change getSettingsTapsAppToExit() API to return default TRUE. Bug: 195629000 Test: Build ROM and factory-reset to test Test: atest WMShellUnitTests Change-Id: Id3c265258ed28f7e0aa54505c339671885d28fa7 --- .../Shell/src/com/android/wm/shell/onehanded/OneHandedSettingsUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedSettingsUtil.java b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedSettingsUtil.java index 60074b8cdb47..7cf4fb7a811d 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedSettingsUtil.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedSettingsUtil.java @@ -130,7 +130,7 @@ public final class OneHandedSettingsUtil { */ public boolean getSettingsTapsAppToExit(ContentResolver resolver, int userId) { return Settings.Secure.getIntForUser(resolver, - Settings.Secure.TAPS_APP_TO_EXIT, 0, userId) == 1; + Settings.Secure.TAPS_APP_TO_EXIT, 1, userId) == 1; } /** -- cgit v1.2.3 From 613e8e1f5d6b63b2876409627b4edf80e1fc7b67 Mon Sep 17 00:00:00 2001 From: Peter Kalauskas Date: Thu, 5 Aug 2021 08:34:48 -0700 Subject: Only auto create guests when device is provisioned Test: atest com.android.cts.devicepolicy.DeviceOwnerTest Test: atest com.android.cts.devicepolicy.MixedDeviceOwnerTest Fixes: 195704842 Change-Id: Ibba75bee2640113b7700de54f4a2f6280ffaeedc --- .../systemui/keyguard/KeyguardViewMediator.java | 2 +- .../statusbar/policy/UserSwitcherController.java | 43 +++++++++++++++++++++- .../statusbar/policy/UserSwitcherControllerTest.kt | 5 +++ 3 files changed, 47 insertions(+), 3 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 84cb12cf5e49..5bf2448a2251 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -2603,7 +2603,7 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable, if (mContext.getResources().getBoolean( com.android.internal.R.bool.config_guestUserAutoCreated)) { // TODO(b/191067027): Move post-boot guest creation to system_server - mUserSwitcherController.guaranteeGuestPresent(); + mUserSwitcherController.schedulePostBootGuestCreation(); } mBootCompleted = true; adjustStatusBarLocked(false, true); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java index 8f1a5782e779..7548d1c435ed 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java @@ -26,6 +26,7 @@ import android.app.ActivityManager; import android.app.AlertDialog; import android.app.Dialog; import android.app.IActivityTaskManager; +import android.app.admin.DevicePolicyManager; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; @@ -114,6 +115,8 @@ public class UserSwitcherController implements Dumpable { @VisibleForTesting final GuestResumeSessionReceiver mGuestResumeSessionReceiver; private final KeyguardStateController mKeyguardStateController; + private final DeviceProvisionedController mDeviceProvisionedController; + private final DevicePolicyManager mDevicePolicyManager; protected final Handler mHandler; private final ActivityStarter mActivityStarter; private final BroadcastDispatcher mBroadcastDispatcher; @@ -149,6 +152,8 @@ public class UserSwitcherController implements Dumpable { UserManager userManager, UserTracker userTracker, KeyguardStateController keyguardStateController, + DeviceProvisionedController deviceProvisionedController, + DevicePolicyManager devicePolicyManager, @Main Handler handler, ActivityStarter activityStarter, BroadcastDispatcher broadcastDispatcher, @@ -178,6 +183,8 @@ public class UserSwitcherController implements Dumpable { mGuestIsResetting = new AtomicBoolean(); mGuestCreationScheduled = new AtomicBoolean(); mKeyguardStateController = keyguardStateController; + mDeviceProvisionedController = deviceProvisionedController; + mDevicePolicyManager = devicePolicyManager; mHandler = handler; mActivityStarter = activityStarter; mUserManager = userManager; @@ -732,11 +739,28 @@ public class UserSwitcherController implements Dumpable { } + /** + * Guarantee guest is present only if the device is provisioned. Otherwise, create a content + * observer to wait until the device is provisioned, then schedule the guest creation. + */ + public void schedulePostBootGuestCreation() { + if (isDeviceAllowedToAddGuest()) { + guaranteeGuestPresent(); + } else { + mDeviceProvisionedController.addCallback(mGuaranteeGuestPresentAfterProvisioned); + } + } + + private boolean isDeviceAllowedToAddGuest() { + return mDeviceProvisionedController.isDeviceProvisioned() + && !mDevicePolicyManager.isDeviceManaged(); + } + /** * If there is no guest on the device, schedule creation of a new guest user in the background. */ - public void guaranteeGuestPresent() { - if (mUserManager.findCurrentGuestUser() == null) { + private void guaranteeGuestPresent() { + if (isDeviceAllowedToAddGuest() && mUserManager.findCurrentGuestUser() == null) { scheduleGuestCreation(); } } @@ -1056,6 +1080,21 @@ public class UserSwitcherController implements Dumpable { } }; + private final DeviceProvisionedController.DeviceProvisionedListener + mGuaranteeGuestPresentAfterProvisioned = + new DeviceProvisionedController.DeviceProvisionedListener() { + @Override + public void onDeviceProvisionedChanged() { + if (isDeviceAllowedToAddGuest()) { + mBgExecutor.execute( + () -> mDeviceProvisionedController.removeCallback( + mGuaranteeGuestPresentAfterProvisioned)); + guaranteeGuestPresent(); + } + } + }; + + private final class ExitGuestDialog extends SystemUIDialog implements DialogInterface.OnClickListener { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/UserSwitcherControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/UserSwitcherControllerTest.kt index ace2c71d9c63..3431a9d895d3 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/UserSwitcherControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/UserSwitcherControllerTest.kt @@ -17,6 +17,7 @@ package com.android.systemui.statusbar.policy import android.app.IActivityTaskManager +import android.app.admin.DevicePolicyManager import android.content.Context import android.content.DialogInterface import android.content.Intent @@ -63,6 +64,8 @@ import org.mockito.MockitoAnnotations @SmallTest class UserSwitcherControllerTest : SysuiTestCase() { @Mock private lateinit var keyguardStateController: KeyguardStateController + @Mock private lateinit var deviceProvisionedController: DeviceProvisionedController + @Mock private lateinit var devicePolicyManager: DevicePolicyManager @Mock private lateinit var handler: Handler @Mock private lateinit var userTracker: UserTracker @Mock private lateinit var userManager: UserManager @@ -107,6 +110,8 @@ class UserSwitcherControllerTest : SysuiTestCase() { userManager, userTracker, keyguardStateController, + deviceProvisionedController, + devicePolicyManager, handler, activityStarter, broadcastDispatcher, -- cgit v1.2.3 From 3873a09959b3596c1dac768a68a88163eb6df771 Mon Sep 17 00:00:00 2001 From: Ahaan Ugale Date: Thu, 5 Aug 2021 19:04:25 -0700 Subject: Make Trusted Hotword session permissions follow previous behavior A prior change to the permissions flow for Trusted Hotword (I80dabaf6ae0e781028dde16ead3321fbff319542) made the system enforce the required permissions on the APIs the conventional way - by throwing a SecurityException. But the existing behavior was to silence these exceptions and instead return error results. This change brings back the old behavior which exists in the SoundTrigger layer. Also removes permissions checks for a couple of APIs to again be consistent with the old behavior (and the current behavior in the SoundTrigger layer). Fix: 193116894 Test: manual - remove permission and reboot / remove permission after boot, stop/start reco Test: atest HotwordDetectionServiceBasicTest Change-Id: I56391260fd4375a04233eb3261bacec8696bda99 --- .../service/voice/AlwaysOnHotwordDetector.java | 3 +++ .../service/voice/SoftwareHotwordDetector.java | 3 +++ .../SoundTriggerSessionPermissionsDecorator.java | 29 +++++++++++++++------- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/core/java/android/service/voice/AlwaysOnHotwordDetector.java b/core/java/android/service/voice/AlwaysOnHotwordDetector.java index 41374167cc56..face870ca1b4 100644 --- a/core/java/android/service/voice/AlwaysOnHotwordDetector.java +++ b/core/java/android/service/voice/AlwaysOnHotwordDetector.java @@ -783,6 +783,9 @@ public class AlwaysOnHotwordDetector extends AbstractHotwordDetector { * This may happen if another detector has been instantiated or the * {@link VoiceInteractionService} hosting this detector has been shut down. */ + // TODO: Remove this RequiresPermission since it isn't actually enforced. Also fix the javadoc + // about permissions enforcement (when it throws vs when it just returns false) for other + // methods in this class. @RequiresPermission(allOf = {RECORD_AUDIO, CAPTURE_AUDIO_HOTWORD}) @Override public boolean stopRecognition() { diff --git a/core/java/android/service/voice/SoftwareHotwordDetector.java b/core/java/android/service/voice/SoftwareHotwordDetector.java index 02294e5720ae..f7a3415259fd 100644 --- a/core/java/android/service/voice/SoftwareHotwordDetector.java +++ b/core/java/android/service/voice/SoftwareHotwordDetector.java @@ -82,6 +82,9 @@ class SoftwareHotwordDetector extends AbstractHotwordDetector { try { mManagerService.startListeningFromMic( mAudioFormat, new BinderCallback(mHandler, mCallback)); + } catch (SecurityException e) { + Slog.e(TAG, "startRecognition failed: " + e); + return false; } catch (RemoteException e) { e.rethrowFromSystemServer(); } diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerSessionPermissionsDecorator.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerSessionPermissionsDecorator.java index 68b2e6168b5c..c0c3e6f530db 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerSessionPermissionsDecorator.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerSessionPermissionsDecorator.java @@ -60,7 +60,7 @@ final class SoundTriggerSessionPermissionsDecorator implements @Override public SoundTrigger.ModuleProperties getDspModuleProperties() throws RemoteException { - // No permission needed. + // No permission needed here (the app must have the Assistant Role to retrieve the session). return mDelegate.getDspModuleProperties(); } @@ -71,7 +71,9 @@ final class SoundTriggerSessionPermissionsDecorator implements if (DEBUG) { Slog.d(TAG, "startRecognition"); } - enforcePermissions(); + if (!isHoldingPermissions()) { + return SoundTrigger.STATUS_PERMISSION_DENIED; + } return mDelegate.startRecognition(i, s, iHotwordRecognitionStatusCallback, recognitionConfig, b); } @@ -80,25 +82,28 @@ final class SoundTriggerSessionPermissionsDecorator implements public int stopRecognition(int i, IHotwordRecognitionStatusCallback iHotwordRecognitionStatusCallback) throws RemoteException { - enforcePermissions(); + // Stopping a model does not require special permissions. Having a handle to the session is + // sufficient. return mDelegate.stopRecognition(i, iHotwordRecognitionStatusCallback); } @Override public int setParameter(int i, int i1, int i2) throws RemoteException { - enforcePermissions(); + if (!isHoldingPermissions()) { + return SoundTrigger.STATUS_PERMISSION_DENIED; + } return mDelegate.setParameter(i, i1, i2); } @Override public int getParameter(int i, int i1) throws RemoteException { - enforcePermissions(); + // No permission needed here (the app must have the Assistant Role to retrieve the session). return mDelegate.getParameter(i, i1); } @Override public SoundTrigger.ModelParamRange queryParameter(int i, int i1) throws RemoteException { - enforcePermissions(); + // No permission needed here (the app must have the Assistant Role to retrieve the session). return mDelegate.queryParameter(i, i1); } @@ -109,9 +114,15 @@ final class SoundTriggerSessionPermissionsDecorator implements } // TODO: Share this code with SoundTriggerMiddlewarePermission. - private void enforcePermissions() { - enforcePermissionForPreflight(mContext, mOriginatorIdentity, RECORD_AUDIO); - enforcePermissionForPreflight(mContext, mOriginatorIdentity, CAPTURE_AUDIO_HOTWORD); + private boolean isHoldingPermissions() { + try { + enforcePermissionForPreflight(mContext, mOriginatorIdentity, RECORD_AUDIO); + enforcePermissionForPreflight(mContext, mOriginatorIdentity, CAPTURE_AUDIO_HOTWORD); + return true; + } catch (SecurityException e) { + Slog.e(TAG, e.toString()); + return false; + } } /** -- cgit v1.2.3 From 3c3465dd3b4f337e26b3584e1977c743134b3c89 Mon Sep 17 00:00:00 2001 From: lpeter Date: Thu, 5 Aug 2021 12:32:43 +0800 Subject: Shutdown hotword detection service when software hotword detector is shutdown Currently we have AlwaysOnHotwordDetector and SoftwareHotwordDetector, when the app creates the detector, it will create a HotwordDetectionConnection to communicate with HotwordDetectionService. Problem: AlwaysOnHotwordDetector will work incorrectly if the app creates SoftwareHotwordDetector first, then creates AlwaysOnHotwordDetector later. A simple flow is that the app created a SoftwareHotwordDetector and used it. After a while, the app may want to use AlwaysOnHotwordDetector, so it will create a new AlwaysOnHotwordDetector. By the original flow, it only allows to keep one detector, so the system will shutdown the old detector(SoftwareHotwordDetector) and create the new detector(AlwaysOnHotwordDetector). Because we don't clear the connection when shutdowning SoftwareHotwordDetector (PS: We clear the connection when shutdowning AlwaysOnHotwordDetector), it will use the previous connection when creating the AlwaysOnHotwordDetector. Root cause: Because we don't shutdown hotword detection service when software hotword detector is shutdown, the new creating AlwaysOnHotwordDetector will use the previous HotwordDetectionConnection to communicate with HotwordDetectionService. Due to the callback in HotwordDetectionConnection is for SoftwareHotwordDetector, it can not pass the right data to AlwaysOnHotwordDetector. Solution: Shutdown hotword detection service when software hotword detector is shutdown. Bug: 195604579 Test: atest CtsVoiceInteractionTestCases Test: atest CtsVoiceInteractionTestCases --instant Test: manual - DSP and non-DSP Change-Id: I999dc4cc9d5ce858127a9b44db261d7abee98929 --- core/java/android/service/voice/VoiceInteractionService.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/java/android/service/voice/VoiceInteractionService.java b/core/java/android/service/voice/VoiceInteractionService.java index 6a0fec790242..f52c9ff210d6 100644 --- a/core/java/android/service/voice/VoiceInteractionService.java +++ b/core/java/android/service/voice/VoiceInteractionService.java @@ -520,6 +520,12 @@ public class VoiceInteractionService extends Service { // Ignore. } + try { + mSystemService.shutdownHotwordDetectionService(); + } catch (Exception ex) { + // Ignore. + } + mSoftwareHotwordDetector = null; } -- cgit v1.2.3 From 150831e55f7497e7769596f641de302fae3f2a41 Mon Sep 17 00:00:00 2001 From: Galia Peycheva Date: Thu, 5 Aug 2021 17:35:48 +0200 Subject: Disable blurs during critical thermal state Bug: 195642101 Test: adb shell cmd thermalservice override-status 0/1/2/3/4/5/6 Change-Id: I693e2f49accd4cd4cdd1fbc97b41320bf6334aac --- services/core/java/com/android/server/wm/BlurController.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/wm/BlurController.java b/services/core/java/com/android/server/wm/BlurController.java index 03639449c3df..41d9dbf894f4 100644 --- a/services/core/java/com/android/server/wm/BlurController.java +++ b/services/core/java/com/android/server/wm/BlurController.java @@ -16,6 +16,7 @@ package com.android.server.wm; +import static android.os.PowerManager.THERMAL_STATUS_CRITICAL; import static android.view.CrossWindowBlurListeners.CROSS_WINDOW_BLUR_SUPPORTED; import android.content.BroadcastReceiver; @@ -45,6 +46,7 @@ final class BlurController { private final Object mLock = new Object(); private volatile boolean mBlurEnabled; private boolean mInPowerSaveMode; + private boolean mCriticalThermalStatus; private boolean mBlurDisabledSetting; private boolean mTunnelModeEnabled = false; @@ -89,6 +91,12 @@ final class BlurController { }); mBlurDisabledSetting = getBlurDisabledSetting(); + powerManager.addThermalStatusListener((status) -> { + mCriticalThermalStatus = status >= THERMAL_STATUS_CRITICAL; + updateBlurEnabled(); + }); + mCriticalThermalStatus = powerManager.getCurrentThermalStatus() >= THERMAL_STATUS_CRITICAL; + TunnelModeEnabledListener.register(mTunnelModeListener); updateBlurEnabled(); @@ -112,7 +120,7 @@ final class BlurController { private void updateBlurEnabled() { synchronized (mLock) { final boolean newEnabled = CROSS_WINDOW_BLUR_SUPPORTED && !mBlurDisabledSetting - && !mInPowerSaveMode && !mTunnelModeEnabled; + && !mInPowerSaveMode && !mTunnelModeEnabled && !mCriticalThermalStatus; if (mBlurEnabled == newEnabled) { return; } -- cgit v1.2.3 From b6e25d2b819f86558a99447703ea88939f31cdc7 Mon Sep 17 00:00:00 2001 From: Josh Tsuji Date: Thu, 5 Aug 2021 15:45:34 -0400 Subject: Fix KeyguardTests#testScreenOffCausesSingleStopAod When the devices goes into doze mode to display AOD contents, the screen turns off before displaying AOD contents on some devices (i.e. config_displayBlanksAfterDoze=true). On such devices, SysUI calls IActivityTaskManager#setLockScreenShown first before start dozing, otherwise ATMS/WM wakes up the activities when dozing starts. Bug: 193479273 Test: manual 1. adb root && adb shell setprop debug.force_blanking 1 && adb reboot 2. atest KeyguardTests Change-Id: I64cecd8e866f1debdcd7429ca4987cd70eceb45c --- .../src/com/android/systemui/keyguard/KeyguardViewMediator.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 84cb12cf5e49..c20ae0b045ac 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -2759,7 +2759,10 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable, // Don't hide the keyguard due to a doze change if there's a lock pending, because we're // just going to show it again. - if (mShowing || !mPendingLock) { + // If the device is not capable of controlling the screen off animation, SysUI needs to + // update lock screen state in ATMS here, otherwise ATMS tries to resume activities when + // enabling doze state. + if (mShowing || !mPendingLock || !mDozeParameters.canControlUnlockedScreenOff()) { setShowingLocked(mShowing); } } -- cgit v1.2.3 From 21f45cd998192942da3428ce8439689097af0aa2 Mon Sep 17 00:00:00 2001 From: Ruslan Tkhakokhov Date: Wed, 4 Aug 2021 09:01:23 +0100 Subject: Handle empty section in android:dataExtractionRules Currently the section in android:dataExtractionRules is ignored unless it contains rules. Instead, we should interpret it as 'everything other than cache and no-backup dirs is eligible for cloud backup'. Bug: 195095045 Test: 1. atest BackupEligibilityHostSideTest 2. Use a test app with empty section to manually test: 2.1. Empty section - everything is backed up 2.2. Empty section but "disableIfNoEncryptionCapabilitites" set to "true" - data only backed up if the transport supports encryption. Change-Id: Ic8066721a46bda688f9211c51a0f2497e9caf93b --- core/java/android/app/backup/FullBackup.java | 22 +++++++++++---- .../src/android/app/backup/FullBackupTest.java | 33 ++++++++++++++++++++++ 2 files changed, 49 insertions(+), 6 deletions(-) diff --git a/core/java/android/app/backup/FullBackup.java b/core/java/android/app/backup/FullBackup.java index 1b03f2f328e5..bf9a9b060b6b 100644 --- a/core/java/android/app/backup/FullBackup.java +++ b/core/java/android/app/backup/FullBackup.java @@ -116,7 +116,7 @@ public class FullBackup { ConfigSection.CLOUD_BACKUP, ConfigSection.DEVICE_TRANSFER }) - private @interface ConfigSection { + @interface ConfigSection { String CLOUD_BACKUP = "cloud-backup"; String DEVICE_TRANSFER = "device-transfer"; } @@ -528,7 +528,8 @@ public class FullBackup { return mExcludes; } - private synchronized int getRequiredTransportFlags() + @VisibleForTesting + public synchronized int getRequiredTransportFlags() throws IOException, XmlPullParserException { if (mRequiredTransportFlags == null) { maybeParseBackupSchemeLocked(); @@ -587,11 +588,13 @@ public class FullBackup { if (mDataExtractionRules != 0) { // New config is present. Use it if it has configuration for this operation // type. + boolean isSectionPresent; try (XmlResourceParser parser = getParserForResource(mDataExtractionRules)) { - parseNewBackupSchemeFromXmlLocked(parser, configSection, mExcludes, mIncludes); + isSectionPresent = parseNewBackupSchemeFromXmlLocked(parser, configSection, + mExcludes, mIncludes); } - if (!mExcludes.isEmpty() || !mIncludes.isEmpty()) { - // Found configuration in the new config, we will use it. + if (isSectionPresent) { + // Found the relevant section in the new config, we will use it. mIsUsingNewScheme = true; return; } @@ -630,24 +633,31 @@ public class FullBackup { .getXml(resourceId); } - private void parseNewBackupSchemeFromXmlLocked(XmlPullParser parser, + @VisibleForTesting + public boolean parseNewBackupSchemeFromXmlLocked(XmlPullParser parser, @ConfigSection String configSection, Set excludes, Map> includes) throws IOException, XmlPullParserException { verifyTopLevelTag(parser, "data-extraction-rules"); + boolean isSectionPresent = false; + int event; while ((event = parser.next()) != XmlPullParser.END_DOCUMENT) { if (event != XmlPullParser.START_TAG || !configSection.equals(parser.getName())) { continue; } + isSectionPresent = true; + parseRequiredTransportFlags(parser, configSection); parseRules(parser, excludes, includes, Optional.of(0), configSection); } logParsingResults(excludes, includes); + + return isSectionPresent; } private void parseRequiredTransportFlags(XmlPullParser parser, diff --git a/core/tests/coretests/src/android/app/backup/FullBackupTest.java b/core/tests/coretests/src/android/app/backup/FullBackupTest.java index 08edb4e9be97..bc92da928d1e 100644 --- a/core/tests/coretests/src/android/app/backup/FullBackupTest.java +++ b/core/tests/coretests/src/android/app/backup/FullBackupTest.java @@ -16,6 +16,8 @@ package android.app.backup; +import static android.app.backup.FullBackup.ConfigSection.CLOUD_BACKUP; + import android.app.backup.FullBackup.BackupScheme.PathWithRequiredFlags; import android.content.Context; import android.test.AndroidTestCase; @@ -414,6 +416,37 @@ public class FullBackupTest extends AndroidTestCase { assertNull("Didn't throw away invalid \"..\" path.", fileDomainIncludes); } + public void testParseNewBackupSchemeFromXml_emptyCloudSectionIsRespected() throws Exception { + mXpp.setInput(new StringReader( + "" + + "" + + "" + + "")); + + FullBackup.BackupScheme backupScheme = FullBackup.getBackupSchemeForTest(mContext); + boolean result = backupScheme.parseNewBackupSchemeFromXmlLocked(mXpp, CLOUD_BACKUP, + excludesSet, includeMap); + + assertTrue(result); + } + + public void testParseNewBackupSchemeFromXml_emptyCloudSectionWithEncryptionFlagIsRespected() + throws Exception { + mXpp.setInput(new StringReader( + "" + + "" + + "" + + "")); + + FullBackup.BackupScheme backupScheme = FullBackup.getBackupSchemeForTest(mContext); + boolean result = backupScheme.parseNewBackupSchemeFromXmlLocked(mXpp, CLOUD_BACKUP, + excludesSet, includeMap); + + assertTrue(result); + assertEquals(backupScheme.getRequiredTransportFlags(), + BackupAgent.FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED); + } + public void testDoubleDotInPath_isIgnored() throws Exception { mXpp.setInput(new StringReader( "" + -- cgit v1.2.3 From 8da2e133e4bd25881529b1d3b6534e578ef6502a Mon Sep 17 00:00:00 2001 From: Jeff DeCew Date: Thu, 5 Aug 2021 16:57:45 -0400 Subject: Remove heads up panel translation. The only time I got a non-zero translation was RTL orientation changes, and it was a transient artifact that caused visual glitches. The translation was done in the name of alignment, which is no longer a desire of this class. Fixes: 185679234 Test: manual; especially with RTL and rotation changes. Change-Id: I8ca03eb4baee05bfec76d708a901048828d53261 --- .../systemui/statusbar/HeadsUpStatusBarView.java | 13 +---- .../phone/HeadsUpAppearanceController.java | 66 ---------------------- .../phone/HeadsUpAppearanceControllerTest.java | 1 - 3 files changed, 1 insertion(+), 79 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java index c561ba28ecae..8e6cf36f8e74 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java @@ -137,7 +137,7 @@ public class HeadsUpStatusBarView extends AlphaOptimizedLinearLayout { protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); mIconPlaceholder.getLocationOnScreen(mTmpPosition); - int left = (int) (mTmpPosition[0] - getTranslationX()); + int left = mTmpPosition[0]; int top = mTmpPosition[1]; int right = left + mIconPlaceholder.getWidth(); int bottom = top + mIconPlaceholder.getHeight(); @@ -145,20 +145,9 @@ public class HeadsUpStatusBarView extends AlphaOptimizedLinearLayout { updateDrawingRect(); } - /** In order to do UI alignment, this view will be notified by - * {@link com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout}. - * After scroller laid out, the scroller will tell this view about scroller's getX() - * @param translationX how to translate the horizontal position - */ - public void setPanelTranslation(float translationX) { - setTranslationX(translationX); - updateDrawingRect(); - } - private void updateDrawingRect() { float oldLeft = mIconDrawingRect.left; mIconDrawingRect.set(mLayoutedIconRect); - mIconDrawingRect.offset((int) getTranslationX(), 0); if (oldLeft != mIconDrawingRect.left && mOnDrawingRectChangedListener != null) { mOnDrawingRectChangedListener.run(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java index f4830fbb0028..878fbbf39627 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java @@ -18,9 +18,7 @@ package com.android.systemui.statusbar.phone; import android.graphics.Point; import android.graphics.Rect; -import android.view.DisplayCutout; import android.view.View; -import android.view.WindowInsets; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.widget.ViewClippingUtil; @@ -61,7 +59,6 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener, private final NotificationPanelViewController mNotificationPanelViewController; private final Consumer mSetTrackingHeadsUp = this::setTrackingHeadsUp; - private final Runnable mUpdatePanelTranslation = this::updatePanelTranslation; private final BiConsumer mSetExpandedHeight = this::setAppearFraction; private final KeyguardBypassController mBypassController; private final StatusBarStateController mStatusBarStateController; @@ -75,9 +72,6 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener, float mAppearFraction; private ExpandableNotificationRow mTrackedChild; private boolean mShown; - private final View.OnLayoutChangeListener mStackScrollLayoutChangeListener = - (v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) - -> updatePanelTranslation(); private final ViewClippingUtil.ClippingParameters mParentClippingParams = new ViewClippingUtil.ClippingParameters() { @Override @@ -134,10 +128,8 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener, mStackScrollerController = stackScrollerController; mNotificationPanelViewController = notificationPanelViewController; notificationPanelViewController.addTrackingHeadsUpListener(mSetTrackingHeadsUp); - notificationPanelViewController.setVerticalTranslationListener(mUpdatePanelTranslation); notificationPanelViewController.setHeadsUpAppearanceController(this); mStackScrollerController.addOnExpandedHeightChangedListener(mSetExpandedHeight); - mStackScrollerController.addOnLayoutChangeListener(mStackScrollLayoutChangeListener); mStackScrollerController.setHeadsUpAppearanceController(this); mClockView = clockView; mOperatorNameView = operatorNameView; @@ -174,7 +166,6 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener, mNotificationPanelViewController.setVerticalTranslationListener(null); mNotificationPanelViewController.setHeadsUpAppearanceController(null); mStackScrollerController.removeOnExpandedHeightChangedListener(mSetExpandedHeight); - mStackScrollerController.removeOnLayoutChangeListener(mStackScrollLayoutChangeListener); mDarkIconDispatcher.removeDarkReceiver(this); } @@ -189,63 +180,6 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener, updateHeader(entry); } - /** To count the distance from the window right boundary to scroller right boundary. The - * distance formula is the following: - * Y = screenSize - (SystemWindow's width + Scroller.getRight()) - * There are four modes MUST to be considered in Cut Out of RTL. - * No Cut Out: - * Scroller + NB - * NB + Scroller - * => SystemWindow = NavigationBar's width - * => Y = screenSize - (SystemWindow's width + Scroller.getRight()) - * Corner Cut Out or Tall Cut Out: - * cut out + Scroller + NB - * NB + Scroller + cut out - * => SystemWindow = NavigationBar's width - * => Y = screenSize - (SystemWindow's width + Scroller.getRight()) - * Double Cut Out: - * cut out left + Scroller + (NB + cut out right) - * SystemWindow = NavigationBar's width + cut out right width - * => Y = screenSize - (SystemWindow's width + Scroller.getRight()) - * (cut out left + NB) + Scroller + cut out right - * SystemWindow = NavigationBar's width + cut out left width - * => Y = screenSize - (SystemWindow's width + Scroller.getRight()) - * @return the translation X value for RTL. In theory, it should be negative. i.e. -Y - */ - private int getRtlTranslation() { - if (mPoint == null) { - mPoint = new Point(); - } - - int realDisplaySize = 0; - if (mStackScrollerController.getDisplay() != null) { - mStackScrollerController.getDisplay().getRealSize(mPoint); - realDisplaySize = mPoint.x; - } - - WindowInsets windowInset = mStackScrollerController.getRootWindowInsets(); - DisplayCutout cutout = (windowInset != null) ? windowInset.getDisplayCutout() : null; - int sysWinLeft = (windowInset != null) ? windowInset.getStableInsetLeft() : 0; - int sysWinRight = (windowInset != null) ? windowInset.getStableInsetRight() : 0; - int cutoutLeft = (cutout != null) ? cutout.getSafeInsetLeft() : 0; - int cutoutRight = (cutout != null) ? cutout.getSafeInsetRight() : 0; - int leftInset = Math.max(sysWinLeft, cutoutLeft); - int rightInset = Math.max(sysWinRight, cutoutRight); - - return leftInset + mStackScrollerController.getRight() + rightInset - realDisplaySize; - } - - public void updatePanelTranslation() { - float newTranslation; - if (mStackScrollerController.isLayoutRtl()) { - newTranslation = getRtlTranslation(); - } else { - newTranslation = mStackScrollerController.getLeft(); - } - newTranslation += mStackScrollerController.getTranslationX(); - mHeadsUpStatusBarView.setPanelTranslation(newTranslation); - } - private void updateTopEntry() { NotificationEntry newEntry = null; if (shouldBeVisible()) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java index 6e0cbd9ecfa3..bca1227b7d35 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java @@ -202,6 +202,5 @@ public class HeadsUpAppearanceControllerTest extends SysuiTestCase { verify(mPanelView).removeTrackingHeadsUpListener(any()); verify(mPanelView).setHeadsUpAppearanceController(isNull()); verify(mStackScrollerController).removeOnExpandedHeightChangedListener(any()); - verify(mStackScrollerController).removeOnLayoutChangeListener(any()); } } -- cgit v1.2.3 From 078f090dedc2244f2c3bef73df6b75fceb3cef7c Mon Sep 17 00:00:00 2001 From: Li Li Date: Wed, 4 Aug 2021 17:21:13 -0700 Subject: Enable Freezer by default The freezer init code will check if the Linux kernel is new enough to support cgroupfs v2. If it does, freezer will be enabled by default. Otherwise, freezer will be disabled. Some tests were not correctly designed. The logic was wrong. This CL also fixes those broken tests. Meanwhile, CachedAppOptimizerTest should ignore freezer related tests if freezer is not supported. Furthermore, the mockingservicestests isn't running within system_server. So the current test always reports freezer is not supported. This should be fixed separately. Bug: 195589090 Bug: 195690032 Test: adb shell dumpsys activity settings | grep use_freezer=true Test: atest CachedAppOptimizerTest Change-Id: If994e452c9771b94130aa8b91240dcf924435710 --- .../com/android/server/am/CachedAppOptimizer.java | 6 ++-- .../android/server/am/CachedAppOptimizerTest.java | 38 +++++++++++----------- 2 files changed, 23 insertions(+), 21 deletions(-) diff --git a/services/core/java/com/android/server/am/CachedAppOptimizer.java b/services/core/java/com/android/server/am/CachedAppOptimizer.java index 7c336d768006..f32aa2295cb8 100644 --- a/services/core/java/com/android/server/am/CachedAppOptimizer.java +++ b/services/core/java/com/android/server/am/CachedAppOptimizer.java @@ -101,7 +101,7 @@ public final class CachedAppOptimizer { // Defaults for phenotype flags. @VisibleForTesting static final Boolean DEFAULT_USE_COMPACTION = false; - @VisibleForTesting static final Boolean DEFAULT_USE_FREEZER = false; + @VisibleForTesting static final Boolean DEFAULT_USE_FREEZER = true; @VisibleForTesting static final int DEFAULT_COMPACT_ACTION_1 = COMPACT_ACTION_FILE; @VisibleForTesting static final int DEFAULT_COMPACT_ACTION_2 = COMPACT_ACTION_FULL; @VisibleForTesting static final long DEFAULT_COMPACT_THROTTLE_1 = 5_000; @@ -276,7 +276,7 @@ public final class CachedAppOptimizer { DEFAULT_COMPACT_THROTTLE_MAX_OOM_ADJ; @GuardedBy("mPhenotypeFlagLock") private volatile boolean mUseCompaction = DEFAULT_USE_COMPACTION; - private volatile boolean mUseFreezer = DEFAULT_USE_FREEZER; + private volatile boolean mUseFreezer = false; // set to DEFAULT in init() @GuardedBy("this") private int mFreezerDisableCount = 1; // Freezer is initially disabled, until enabled private final Random mRandom = new Random(); @@ -678,6 +678,8 @@ public final class CachedAppOptimizer { KEY_USE_FREEZER, DEFAULT_USE_FREEZER)) { mUseFreezer = isFreezerSupported(); updateFreezerDebounceTimeout(); + } else { + mUseFreezer = false; } final boolean useFreezer = mUseFreezer; 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 20a58426f1eb..a883293b13b9 100644 --- a/services/tests/mockingservicestests/src/com/android/server/am/CachedAppOptimizerTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/am/CachedAppOptimizerTest.java @@ -173,8 +173,6 @@ public final class CachedAppOptimizerTest { CachedAppOptimizer.DEFAULT_COMPACT_FULL_RSS_THROTTLE_KB); assertThat(mCachedAppOptimizerUnderTest.mFullDeltaRssThrottleKb).isEqualTo( CachedAppOptimizer.DEFAULT_COMPACT_FULL_DELTA_RSS_THROTTLE_KB); - assertThat(mCachedAppOptimizerUnderTest.useFreezer()).isEqualTo( - CachedAppOptimizer.DEFAULT_USE_FREEZER); assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleMinOomAdj).isEqualTo( CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_MIN_OOM_ADJ); assertThat(mCachedAppOptimizerUnderTest.mCompactThrottleMaxOomAdj).isEqualTo( @@ -188,6 +186,10 @@ public final class CachedAppOptimizerTest { } assertThat(mCachedAppOptimizerUnderTest.mProcStateThrottle) .containsExactlyElementsIn(expected); + + Assume.assumeTrue(mCachedAppOptimizerUnderTest.isFreezerSupported()); + assertThat(mCachedAppOptimizerUnderTest.useFreezer()).isEqualTo( + CachedAppOptimizer.DEFAULT_USE_FREEZER); } @Test @@ -244,9 +246,8 @@ public final class CachedAppOptimizerTest { CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_MAX_OOM_ADJ - 10), false); DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, CachedAppOptimizer.KEY_COMPACT_PROC_STATE_THROTTLE, "1,2,3", false); - assertThat(mCachedAppOptimizerUnderTest.useFreezer()).isEqualTo( - CachedAppOptimizer.DEFAULT_USE_FREEZER); - DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + assertThat(mCachedAppOptimizerUnderTest.useFreezer()).isFalse(); + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER_NATIVE_BOOT, CachedAppOptimizer.KEY_USE_FREEZER, CachedAppOptimizer.DEFAULT_USE_FREEZER ? "false" : "true", false); @@ -291,7 +292,8 @@ public final class CachedAppOptimizerTest { CachedAppOptimizer.DEFAULT_COMPACT_FULL_RSS_THROTTLE_KB + 1); assertThat(mCachedAppOptimizerUnderTest.mProcStateThrottle).containsExactly(1, 2, 3); - if (mCachedAppOptimizerUnderTest.isFreezerSupported()) { + Assume.assumeTrue(CachedAppOptimizer.isFreezerSupported()); + if (CachedAppOptimizer.isFreezerSupported()) { if (CachedAppOptimizer.DEFAULT_USE_FREEZER) { assertThat(mCachedAppOptimizerUnderTest.useFreezer()).isFalse(); } else { @@ -325,15 +327,15 @@ public final class CachedAppOptimizerTest { @Test public void useFreeze_doesNotListenToDeviceConfigChanges() throws InterruptedException { - Assume.assumeTrue(mCachedAppOptimizerUnderTest.isFreezerSupported()); + Assume.assumeTrue(CachedAppOptimizer.isFreezerSupported()); - assertThat(mCachedAppOptimizerUnderTest.useFreezer()).isEqualTo( - CachedAppOptimizer.DEFAULT_USE_FREEZER); + assertThat(mCachedAppOptimizerUnderTest.useFreezer()).isFalse(); // The freezer DeviceConfig property is read at boot only - DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER_NATIVE_BOOT, CachedAppOptimizer.KEY_USE_FREEZER, "true", false); mCachedAppOptimizerUnderTest.init(); + assertThat(mCachedAppOptimizerUnderTest.useFreezer()).isTrue(); mCountDown = new CountDownLatch(1); // No notifications should get to the cached app optimizer. @@ -346,14 +348,13 @@ public final class CachedAppOptimizerTest { // Set the flag the other way without rebooting. It shall not change. mCountDown = new CountDownLatch(1); - DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER_NATIVE_BOOT, CachedAppOptimizer.KEY_USE_FREEZER, "false", false); assertThat(mCountDown.await(5, TimeUnit.SECONDS)).isTrue(); assertThat(mCachedAppOptimizerUnderTest.useFreezer()).isTrue(); - // Now, set the flag to false and restart the cached app optimizer - DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER_NATIVE_BOOT, CachedAppOptimizer.KEY_USE_FREEZER, "false", false); mCachedAppOptimizerUnderTest.init(); @@ -380,18 +381,17 @@ public final class CachedAppOptimizerTest { @Test public void useFreeze_listensToDeviceConfigChangesBadValues() throws InterruptedException { - assertThat(mCachedAppOptimizerUnderTest.useFreezer()).isEqualTo( - CachedAppOptimizer.DEFAULT_USE_FREEZER); + Assume.assumeTrue(CachedAppOptimizer.isFreezerSupported()); + assertThat(mCachedAppOptimizerUnderTest.useFreezer()).isFalse(); // When we push an invalid flag value... - DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER_NATIVE_BOOT, CachedAppOptimizer.KEY_USE_FREEZER, "foobar", false); mCachedAppOptimizerUnderTest.init(); - // Then we set the default. - assertThat(mCachedAppOptimizerUnderTest.useFreezer()).isEqualTo( - CachedAppOptimizer.DEFAULT_USE_FREEZER); + // DeviceConfig treats invalid value as false + assertThat(mCachedAppOptimizerUnderTest.useFreezer()).isFalse(); } @Test -- cgit v1.2.3 From 7fbd0ad0f9ce3c365c61be9b34d3b731b6ecc4d1 Mon Sep 17 00:00:00 2001 From: Leon Scroggins III Date: Fri, 6 Aug 2021 13:42:49 -0400 Subject: CanvasContext::draw: flushAndSubmit when not drawing Bug: 195081399 Test: manual + dumpsys gfxinfo CanvasContext::draw has some conditions under which it will not draw. We still need to flushAndSubmit to free scratch memory if there were texture uploads this frame. Change-Id: I60d230cd36bed310a3155e4f1ca647c99c13c4cd --- libs/hwui/renderthread/CanvasContext.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index 025be7b2b6c1..2f3a509831d1 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -482,6 +482,12 @@ nsecs_t CanvasContext::draw() { if (dirty.isEmpty() && Properties::skipEmptyFrames && !surfaceRequiresRedraw()) { mCurrentFrameInfo->addFlag(FrameInfoFlags::SkippedFrame); + if (auto grContext = getGrContext()) { + // Submit to ensure that any texture uploads complete and Skia can + // free its staging buffers. + grContext->flushAndSubmit(); + } + // Notify the callbacks, even if there's nothing to draw so they aren't waiting // indefinitely waitOnFences(); -- cgit v1.2.3 From 980fc0e14530a31a0ced603303bfc6c22f1519f1 Mon Sep 17 00:00:00 2001 From: Yuncheol Heo Date: Fri, 6 Aug 2021 11:08:33 -0700 Subject: Fix NPE in DisplayModeDirector.isDozeState(). Bug: 195754077 Test: atest android.app.activity.ActivityThreadTest Change-Id: I1ed70ea2c020ab7e9e997e3657b968fb0001164e --- services/core/java/com/android/server/display/DisplayModeDirector.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/services/core/java/com/android/server/display/DisplayModeDirector.java b/services/core/java/com/android/server/display/DisplayModeDirector.java index 186986e17c14..17e8cd6e9a07 100644 --- a/services/core/java/com/android/server/display/DisplayModeDirector.java +++ b/services/core/java/com/android/server/display/DisplayModeDirector.java @@ -2519,6 +2519,9 @@ public class DisplayModeDirector { @Override public boolean isDozeState(Display d) { + if (d == null) { + return false; + } return Display.isDozeState(d.getState()); } -- cgit v1.2.3 From 06aff34a8f02d43ab963c04cdeeb3a0fffbee8c2 Mon Sep 17 00:00:00 2001 From: Michael Wright Date: Fri, 6 Aug 2021 20:05:33 +0100 Subject: Introduce new lock to avoid lock-ordering issues. Because of the way DMD was designed, technically the class lock is below the syncroot in the lock ordering, meaning we can't call into any general display classes while holding the class lock without creating the possibility of deadlock. There's no real reason to use the class lock in this situation though, so just introduce a local lock to SensorObserver that can be above the syncroot and thus call into the rest of the display stack at will. Bug: 195713475 Test: atest DisplayModeDirectorTest Change-Id: Ie32660ae3a3935f0fd4001ca73fecba1e4bbba7d --- .../server/display/DisplayModeDirector.java | 33 +++++++++++++--------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/services/core/java/com/android/server/display/DisplayModeDirector.java b/services/core/java/com/android/server/display/DisplayModeDirector.java index 186986e17c14..0d1b3d6f0ffd 100644 --- a/services/core/java/com/android/server/display/DisplayModeDirector.java +++ b/services/core/java/com/android/server/display/DisplayModeDirector.java @@ -52,6 +52,7 @@ import android.view.Display; import android.view.DisplayInfo; import com.android.internal.R; +import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.os.BackgroundThread; import com.android.server.LocalServices; @@ -2127,7 +2128,7 @@ public class DisplayModeDirector { } } - private final class SensorObserver implements ProximityActiveListener, + private static final class SensorObserver implements ProximityActiveListener, DisplayManager.DisplayListener { private final String mProximitySensorName = null; private final String mProximitySensorType = Sensor.STRING_TYPE_PROXIMITY; @@ -2135,22 +2136,24 @@ public class DisplayModeDirector { private final BallotBox mBallotBox; private final Context mContext; private final Injector mInjector; + @GuardedBy("mSensorObserverLock") + private final SparseBooleanArray mDozeStateByDisplay = new SparseBooleanArray(); + private final Object mSensorObserverLock = new Object(); private DisplayManager mDisplayManager; private DisplayManagerInternal mDisplayManagerInternal; + @GuardedBy("mSensorObserverLock") private boolean mIsProxActive = false; - private final SparseBooleanArray mDozeStateByDisplay; SensorObserver(Context context, BallotBox ballotBox, Injector injector) { mContext = context; mBallotBox = ballotBox; mInjector = injector; - mDozeStateByDisplay = new SparseBooleanArray(); } @Override public void onProximityActive(boolean isActive) { - synchronized (mLock) { + synchronized (mSensorObserverLock) { if (mIsProxActive != isActive) { mIsProxActive = isActive; recalculateVotesLocked(); @@ -2166,7 +2169,7 @@ public class DisplayModeDirector { LocalServices.getService(SensorManagerInternal.class); sensorManager.addProximityActiveListener(BackgroundThread.getExecutor(), this); - synchronized (mLock) { + synchronized (mSensorObserverLock) { for (Display d : mDisplayManager.getDisplays()) { mDozeStateByDisplay.put(d.getDisplayId(), mInjector.isDozeState(d)); } @@ -2196,19 +2199,21 @@ public class DisplayModeDirector { void dumpLocked(PrintWriter pw) { pw.println(" SensorObserver"); - pw.println(" mIsProxActive=" + mIsProxActive); - pw.println(" mDozeStateByDisplay:"); - for (int i = 0; i < mDozeStateByDisplay.size(); i++) { - final int id = mDozeStateByDisplay.keyAt(i); - final boolean dozed = mDozeStateByDisplay.valueAt(i); - pw.println(" " + id + " -> " + dozed); + synchronized (mSensorObserverLock) { + pw.println(" mIsProxActive=" + mIsProxActive); + pw.println(" mDozeStateByDisplay:"); + for (int i = 0; i < mDozeStateByDisplay.size(); i++) { + final int id = mDozeStateByDisplay.keyAt(i); + final boolean dozed = mDozeStateByDisplay.valueAt(i); + pw.println(" " + id + " -> " + dozed); + } } } @Override public void onDisplayAdded(int displayId) { boolean isDozeState = mInjector.isDozeState(mDisplayManager.getDisplay(displayId)); - synchronized (mLock) { + synchronized (mSensorObserverLock) { mDozeStateByDisplay.put(displayId, isDozeState); recalculateVotesLocked(); } @@ -2217,7 +2222,7 @@ public class DisplayModeDirector { @Override public void onDisplayChanged(int displayId) { boolean wasDozeState = mDozeStateByDisplay.get(displayId); - synchronized (mLock) { + synchronized (mSensorObserverLock) { mDozeStateByDisplay.put(displayId, mInjector.isDozeState(mDisplayManager.getDisplay(displayId))); if (wasDozeState != mDozeStateByDisplay.get(displayId)) { @@ -2228,7 +2233,7 @@ public class DisplayModeDirector { @Override public void onDisplayRemoved(int displayId) { - synchronized (mLock) { + synchronized (mSensorObserverLock) { mDozeStateByDisplay.delete(displayId); recalculateVotesLocked(); } -- cgit v1.2.3 From 542027b57106ae5365feeaeefe33e96271a3b5ae Mon Sep 17 00:00:00 2001 From: Wei Wang Date: Fri, 6 Aug 2021 12:36:17 -0700 Subject: HintManagerService: only check isolated process for app uid system_server can initiate ADPF session, which may cause deadlock on chain AMS -> WMS -> graphics -> HintManagerService -> AMS. This CL is to skip the AMS call when calling from system. Test: Boot Bug: 195257481 Signed-off-by: Wei Wang Change-Id: I6c8f431193b31d7643d3782563b9f6c33fe69da0 --- .../core/java/com/android/server/power/hint/HintManagerService.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/power/hint/HintManagerService.java b/services/core/java/com/android/server/power/hint/HintManagerService.java index 6014d0cee171..2491565dd376 100644 --- a/services/core/java/com/android/server/power/hint/HintManagerService.java +++ b/services/core/java/com/android/server/power/hint/HintManagerService.java @@ -255,7 +255,11 @@ public final class HintManagerService extends SystemService { private boolean checkTidValid(int uid, int tgid, int [] tids) { // Make sure all tids belongs to the same UID (including isolated UID), // tids can belong to different application processes. - List eligiblePids = mAmInternal.getIsolatedProcesses(uid); + List eligiblePids = null; + // To avoid deadlock, do not call into AMS if the call is from system. + if (uid != Process.SYSTEM_UID) { + eligiblePids = mAmInternal.getIsolatedProcesses(uid); + } if (eligiblePids == null) { eligiblePids = new ArrayList<>(); } -- cgit v1.2.3 From 18fefecab2d90127f316db2b72c6fa381564ae33 Mon Sep 17 00:00:00 2001 From: Josh Tsuji Date: Fri, 6 Aug 2021 17:06:21 -0400 Subject: Don't call updateIsKeyguard from the UnlockedScreenOffAnimationController if we can't control the screen off animation. This call is intended to ensure the keyguard is in the correct state if the screen off animation is interrupted. It should be very safe to not call this if the screen off animation was not able to play at all. See b/192323808 for detailed investigation. Fixes: 192323808 Test: Disable AOD (thus disabling screen off), press the power off button to begin turning off the screen, then double tap to launch camera as the screen is turning off (I can repro ~10% of the time) Change-Id: I57597308fdc3b5cb86b2c755f33f82d1476c2c09 --- .../phone/UnlockedScreenOffAnimationController.kt | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationController.kt index a5b868b6f8a3..6b52dca42eda 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationController.kt @@ -149,14 +149,18 @@ class UnlockedScreenOffAnimationController @Inject constructor( lightRevealAnimationPlaying = false aodUiAnimationPlaying = false - // Make sure the status bar is in the correct keyguard state, forcing it if necessary. This - // is required if the screen off animation is cancelled, since it might be incorrectly left - // in the KEYGUARD or SHADE states depending on when it was cancelled and whether 'lock - // instantly' is enabled. We need to force it so that the state is set even if we're going - // from SHADE to SHADE or KEYGUARD to KEYGUARD, since we might have changed parts of the UI - // (such as showing AOD in the shade) without actually changing the StatusBarState. This - // ensures that the UI definitely reflects the desired state. - statusBar.updateIsKeyguard(true /* force */) + // If we can't control the screen off animation, we shouldn't mess with the StatusBar's + // keyguard state unnecessarily. + if (dozeParameters.get().canControlUnlockedScreenOff()) { + // Make sure the status bar is in the correct keyguard state, forcing it if necessary. + // This is required if the screen off animation is cancelled, since it might be + // incorrectly left in the KEYGUARD or SHADE states depending on when it was cancelled + // and whether 'lock instantly' is enabled. We need to force it so that the state is set + // even if we're going from SHADE to SHADE or KEYGUARD to KEYGUARD, since we might have + // changed parts of the UI (such as showing AOD in the shade) without actually changing + // the StatusBarState. This ensures that the UI definitely reflects the desired state. + statusBar.updateIsKeyguard(true /* force */) + } } override fun onStartedGoingToSleep() { -- cgit v1.2.3 From 89a3deb75e534a2ba632fc0dd71d0a26f45b7ddc Mon Sep 17 00:00:00 2001 From: Peter Kalauskas Date: Thu, 5 Aug 2021 19:20:17 -0700 Subject: Show indicator if guest creation is not allowed When guest creation is not allowed by the admin, show a badge on the icon. The guest icon will still appear in the list, but if clicked the user will see a dialog that says: "Blocked by your IT admin", "If you have questions, contact your IT admin" Test: With config_guestUserAutoCreated=true, set the device owner during SUW, then disable user creation in the admin app, then open QS user switcher from the lock screen. Bug: 195699593 Change-Id: I2cb404e8c3262b48efafcc73f341b5c45728ab76 --- .../com/android/systemui/statusbar/policy/UserSwitcherController.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java index 7548d1c435ed..251ecc626387 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java @@ -343,8 +343,7 @@ public class UserSwitcherController implements Dumpable { true /* isGuest */, false /* isCurrent */, false /* isAddUser */, false /* isRestricted */, isSwitchToGuestEnabled); - // Don't call checkIfAddUserDisallowedByAdminOnly if - // config_guestUserAutoCreated=true. + checkIfAddUserDisallowedByAdminOnly(guestRecord); records.add(guestRecord); } else if (canCreateGuest) { guestRecord = new UserRecord(null /* info */, null /* picture */, -- cgit v1.2.3 From 0af8ad85f3f657867e939c9c0b629b892a582963 Mon Sep 17 00:00:00 2001 From: Yi Jiang Date: Fri, 6 Aug 2021 15:22:11 -0700 Subject: Reduces the timeout of rotation memeorization. Based on the feedback of beta3 relase, the timeout of rotation memeorization should be reduced to 3 seconds. Test: locally tested Bug: 192010410 Change-Id: Ife25235d89224c80117689935a0c7edefc4a56f9 --- services/core/java/com/android/server/wm/WindowOrientationListener.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/wm/WindowOrientationListener.java b/services/core/java/com/android/server/wm/WindowOrientationListener.java index 0ded8fb313cd..a967ea8fbf8c 100644 --- a/services/core/java/com/android/server/wm/WindowOrientationListener.java +++ b/services/core/java/com/android/server/wm/WindowOrientationListener.java @@ -68,7 +68,7 @@ public abstract class WindowOrientationListener { private static final String KEY_ROTATION_MEMORIZATION_TIMEOUT = "rotation_memorization_timeout_millis"; private static final long DEFAULT_ROTATION_RESOLVER_TIMEOUT_MILLIS = 700L; - private static final long DEFAULT_ROTATION_MEMORIZATION_TIMEOUT_MILLIS = 10_000L; // 10 seconds + private static final long DEFAULT_ROTATION_MEMORIZATION_TIMEOUT_MILLIS = 3_000L; // 3 seconds private Handler mHandler; private SensorManager mSensorManager; -- cgit v1.2.3 From 28df0ce32e57d16786620e14d6d5893f91fe2f42 Mon Sep 17 00:00:00 2001 From: Zim Date: Fri, 6 Aug 2021 14:51:58 +0100 Subject: Remove spammy convertToModernFd log It is a common source of confusion that something went wrong while triaging bugs. Bug: 195587219 Test: m Change-Id: Ieca96a2774f08367b05147b49fcea56dd4f2bfda --- core/java/android/os/FileUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/java/android/os/FileUtils.java b/core/java/android/os/FileUtils.java index 1bc64951ad96..edfcb3d6f12a 100644 --- a/core/java/android/os/FileUtils.java +++ b/core/java/android/os/FileUtils.java @@ -1470,7 +1470,7 @@ public final class FileUtils { try (ParcelFileDescriptor dupFd = ParcelFileDescriptor.dup(fd)) { return MediaStore.getOriginalMediaFormatFileDescriptor(context, dupFd); } catch (Exception e) { - Log.d(TAG, "Failed to convert to modern format file descriptor", e); + // Ignore error return null; } } -- cgit v1.2.3 From a9d8cf886f9271ccac559128f51138d6bc7a15be Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 7 Aug 2021 00:38:51 +0000 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Iabd652a00d38a752f87008e22ca9ee88a76574be --- core/res/res/values-te/strings.xml | 84 +++++++++++++++++++------------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index a2ba8895a265..b8b6b5b76ced 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -68,7 +68,7 @@ "కాలింగ్ నంబర్ అందుబాటులో ఉంది" "కాలింగ్ నంబర్ పరిమితం చేయబడింది" "మూడు మార్గాల కాలింగ్" - "అవాంఛిత అంతరాయ కాల్‌ల తిరస్కరణ" + "అవాంఛిత అంతరాయ కాల్స్‌ల తిరస్కరణ" "కాలింగ్ నంబర్ బట్వాడా" "అంతరాయం కలిగించవద్దు" "కాలర్ ID డిఫాల్ట్‌గా పరిమితానికి ఉంటుంది. తర్వాత కాల్: పరిమితం చేయబడింది" @@ -86,7 +86,7 @@ "మొబైల్ నెట్‌వర్క్ అందుబాటులో లేదు" "ప్రాధాన్య నెట్‌వర్క్‌ను మార్చుకోవడానికి ప్రయత్నించండి. మార్చడానికి నొక్కండి." "అత్యవసర కాలింగ్ అందుబాటులో లేదు" - "Wi-Fiతో అత్యవసర కాల్‌లు చేయలేరు" + "Wi-Fiతో అత్యవసర కాల్స్‌ చేయలేరు" "అలర్ట్‌లు" "కాల్ ఫార్వార్డింగ్" "అత్యవసర కాల్‌బ్యాక్ మోడ్" @@ -124,7 +124,7 @@ "సేవ కోసం శోధిస్తోంది" "Wi‑Fi కాలింగ్‌ని సెటప్ చేయడం సాధ్యపడలేదు" - "Wi-Fiతో కాల్‌లను చేయడానికి మరియు సందేశాలను పంపించడానికి, మొదట ఈ సేవను సెటప్ చేయాల్సిందిగా మీ క్యారియర్‌‌కి చెప్పండి. ఆ తర్వాత సెట్టింగ్‌ల నుండి Wi-Fi కాలింగ్‌ని మళ్లీ ఆన్ చేయండి. (లోపం కోడ్: %1$s)" + "Wi-Fiతో కాల్స్‌ను చేయడానికి మరియు సందేశాలను పంపించడానికి, మొదట ఈ సేవను సెటప్ చేయాల్సిందిగా మీ క్యారియర్‌‌కి చెప్పండి. ఆ తర్వాత సెట్టింగ్‌ల నుండి Wi-Fi కాలింగ్‌ని మళ్లీ ఆన్ చేయండి. (లోపం కోడ్: %1$s)" "మీ క్యారియర్‌తో Wi‑Fi కాలింగ్‌ని నమోదు చేయడంలో సమస్య: %1$s" @@ -173,10 +173,10 @@ "సమకాలీకరణ" "సమకాలీకరించడం సాధ్యపడదు" "చాలా ఎక్కువ %s తొలగించడానికి ప్రయత్నించారు." - "టాబ్లెట్ నిల్వ నిండింది. స్థలాన్ని ఖాళీ చేయడానికి కొన్ని ఫైల్‌లను తొలగించండి." - "వాచ్ నిల్వ నిండింది. స్థలాన్ని ఖాళీ చేయడానికి కొన్ని ఫైల్‌లను తొలగించండి." + "టాబ్లెట్ నిల్వ నిండింది. స్థలాన్ని ఖాళీ చేయడానికి కొన్ని ఫైళ్లను తొలగించండి." + "వాచ్ నిల్వ నిండింది. స్థలాన్ని ఖాళీ చేయడానికి కొన్ని ఫైళ్లను తొలగించండి." "Android TV పరికరం నిల్వ నిండింది. కొంత ప్రదేశాన్ని ఖాళీ చేయడానికి కొన్ని ఫైల్‌‌‌లను తొలగించండి." - "ఫోన్ నిల్వ నిండింది. స్థలాన్ని ఖాళీ చేయడానికి కొన్ని ఫైల్‌లను తొలగించండి." + "ఫోన్ నిల్వ నిండింది. స్థలాన్ని ఖాళీ చేయడానికి కొన్ని ఫైళ్లను తొలగించండి." ప్రమాణపత్ర అధికారాలు ఇన్‌స్టాల్ చేయబడ్డాయి ప్రమాణపత్ర అధికారం ఇన్‌స్టాల్ చేయబడింది @@ -302,7 +302,7 @@ "SMS" "SMS సందేశాలను పంపడం మరియు వీక్షించడం" "ఫైల్స్, మీడియా" - "మీ పరికరంలోని ఫోటోలు, మీడియా మరియు ఫైల్‌లను యాక్సెస్ చేయడానికి" + "మీ పరికరంలోని ఫోటోలు, మీడియా మరియు ఫైళ్లను యాక్సెస్ చేయడానికి" "మైక్రోఫోన్" "ఆడియోను రికార్డ్ చేయడానికి" "ఫిజికల్ యాక్టివిటీ" @@ -312,7 +312,7 @@ "కాల్ లాగ్‌లు" "ఫోన్ కాల్ లాగ్‌ని చదవండి మరియు రాయండి" "ఫోన్" - "ఫోన్ కాల్‌లు చేయడం మరియు నిర్వహించడం" + "ఫోన్ కాల్స్‌ చేయడం మరియు నిర్వహించడం" "శరీర సెన్సార్‌లు" "మీ అత్యంత కీలకమైన గుర్తుల గురించి సెన్సార్ డేటాని యాక్సెస్ చేస్తుంది" "విండో కంటెంట్‍ను తిరిగి పొందుతుంది" @@ -339,10 +339,10 @@ "వినియోగదారు ప్రమేయం లేకుండానే హోమ్‌స్క్రీన్ సత్వరమార్గాలను జోడించడానికి యాప్‌ను అనుమతిస్తుంది." "సత్వరమార్గాలను అన్ఇన్‌స్టాల్ చేయడం" "వినియోగదారు ప్రమేయం లేకుండానే హోమ్‌స్క్రీన్ సత్వరమార్గాలను తీసివేయడానికి యాప్‌ను అనుమతిస్తుంది." - "అవుట్‌గోయింగ్ కాల్‌లను దారి మళ్లించడం" + "అవుట్‌గోయింగ్ కాల్స్‌ను దారి మళ్లించడం" "కాల్‌ను వేరే నంబర్‌కు దారి మళ్లించే లేదా మొత్తంగా కాల్‌ను ఆపివేసే ఎంపిక సహాయంతో అవుట్‌గోయింగ్ కాల్ సమయంలో డయల్ చేయబడుతున్న నంబర్‌ను చూడటానికి యాప్‌ను అనుమతిస్తుంది." - "ఫోన్ కాల్‌లకు సమాధానమివ్వు" - "ఇన్‌కమింగ్ ఫోన్ కాల్‌లకు సమాధానమివ్వడానికి యాప్‌ను అనుమతిస్తుంది." + "ఫోన్ కాల్స్‌కు సమాధానమివ్వు" + "ఇన్‌కమింగ్ ఫోన్ కాల్స్‌కు సమాధానమివ్వడానికి యాప్‌ను అనుమతిస్తుంది." "వచన సందేశాలను (SMS) స్వీకరించడం" "SMS సందేశాలను స్వీకరించడానికి మరియు ప్రాసెస్ చేయడానికి యాప్‌ను అనుమతిస్తుంది. యాప్ మీ డివైజ్‌కు పంపబడిన సందేశాలను మీకు చూపకుండానే పర్యవేక్షించగలదని లేదా తొలగించగలదని దీని అర్థం." "వచన సందేశాలను (MMS) స్వీకరించడం" @@ -361,15 +361,15 @@ "ఈ యాప్‌ మీ ఫోన్‌లో నిల్వ చేసిన అన్ని SMS (వచన) సందేశాలను చదవగలదు." "వచన సందేశాలను (WAP) స్వీకరించడం" "WAP సందేశాలను స్వీకరించడానికి మరియు ప్రాసెస్ చేయడానికి యాప్‌ను అనుమతిస్తుంది. ఈ అనుమతి మీకు పంపబడిన సందేశాలను మీకు చూపకుండానే పర్యవేక్షించగల లేదా తొలగించగల సామర్థ్యాన్ని కలిగి ఉంటుంది." - "అమలవుతున్న అనువర్తనాలను పునరుద్ధరించడం" + "అమలవుతున్న యాప్‌లను పునరుద్ధరించడం" "ప్రస్తుతం మరియు ఇటీవల అమలవుతున్న విధుల గురించి వివరణాత్మక సమాచారాన్ని తిరిగి పొందడానికి యాప్‌ను అనుమతిస్తుంది. ఇది పరికరంలో ఉపయోగించబడిన యాప్‌ల గురించి సమాచారాన్ని కనుగొనడానికి యాప్‌ను అనుమతించవచ్చు." "ప్రొఫైల్ మరియు పరికర యజమానులను నిర్వహించడం" - "ప్రొఫైల్ యజమానులను మరియు పరికరం యజమానిని సెట్ చేయడానికి అనువర్తనాలను అనుమతిస్తుంది." + "ప్రొఫైల్ యజమానులను మరియు పరికరం యజమానిని సెట్ చేయడానికి యాప్‌లను అనుమతిస్తుంది." "అమలవుతోన్న యాప్‌లను మళ్లీ క్రమం చేయడం" "విధులను ముందుకు మరియు నేపథ్యానికి తరలించడానికి యాప్‌ను అనుమతిస్తుంది. యాప్ మీ ప్రమేయం లేకుండానే దీన్ని చేయవచ్చు." "కారు మోడ్‌ను ప్రారంభించడం" "కారు మోడ్‌ను ప్రారంభించడానికి యాప్‌ను అనుమతిస్తుంది." - "ఇతర అనువర్తనాలను మూసివేయడం" + "ఇతర యాప్‌లను మూసివేయడం" "ఇతర యాప్‌ల నేపథ్య ప్రాసెస్‌లను ముగించడానికి యాప్‌ను అనుమతిస్తుంది. దీని వలన ఇతర యాప్‌లు అమలు కాకుండా ఆపివేయబడవచ్చు." "ఈ యాప్ ఇతర యాప్‌ల పైభాగాన కనిపించగలదు" "ఈ యాప్ ఇతర యాప్‌ల పైభాగాన లేదా స్క్రీన్ యొక్క ఇతర భాగాలపైన కనిపించగలదు. ఇది సాధారణ యాప్ వినియోగానికి అంతరాయం కలిగించవచ్చు మరియు ఆ ఇతర యాప్‌లు కనిపించే విధానాన్ని మార్చవచ్చు." @@ -406,9 +406,9 @@ "కాల్ లాగ్‌ను చదవడం" "ఈ యాప్‌ మీ కాల్ చరిత్రను చదవగలదు." "కాల్ లాగ్‌ను వ్రాయడం" - "ఇన్‌కమింగ్ మరియు అవుట్‌గోయింగ్ కాల్‌ల గురించిన డేటాతో సహా మీ టాబ్లెట్ యొక్క కాల్ లాగ్‌ను సవరించడానికి యాప్‌ను అనుమతిస్తుంది. హానికరమైన యాప్‌లు మీ కాల్ లాగ్‌ను ఎరేజ్ చేయడానికి లేదా సవరించడానికి దీన్ని ఉపయోగించవచ్చు." - "ఇన్‌కమింగ్ మరియు అవుట్‌గోయింగ్ కాల్‌లకు సంబంధించిన డేటాతో సహా మీ Android TV పరికరం కాల్ లాగ్‌ను సవరించడానికి యాప్‌ని అనుమతిస్తుంది. హానికరమైన యాప్‌లు మీ కాల్ లాగ్‌ను తీసివేయడానికి లేదా సవరించడానికి దీన్ని ఉపయోగించవచ్చు." - "ఇన్‌కమింగ్ మరియు అవుట్‌గోయింగ్ కాల్‌ల గురించిన డేటాతో సహా మీ ఫోన్ యొక్క కాల్ లాగ్‌ను సవరించడానికి యాప్‌ను అనుమతిస్తుంది. హానికరమైన యాప్‌లు మీ కాల్ లాగ్‌ను ఎరేజ్ చేయడానికి లేదా సవరించడానికి దీన్ని ఉపయోగించవచ్చు." + "ఇన్‌కమింగ్ మరియు అవుట్‌గోయింగ్ కాల్స్‌ల గురించిన డేటాతో సహా మీ టాబ్లెట్ యొక్క కాల్ లాగ్‌ను సవరించడానికి యాప్‌ను అనుమతిస్తుంది. హానికరమైన యాప్‌లు మీ కాల్ లాగ్‌ను ఎరేజ్ చేయడానికి లేదా సవరించడానికి దీన్ని ఉపయోగించవచ్చు." + "ఇన్‌కమింగ్ మరియు అవుట్‌గోయింగ్ కాల్స్‌కు సంబంధించిన డేటాతో సహా మీ Android TV పరికరం కాల్ లాగ్‌ను సవరించడానికి యాప్‌ని అనుమతిస్తుంది. హానికరమైన యాప్‌లు మీ కాల్ లాగ్‌ను తీసివేయడానికి లేదా సవరించడానికి దీన్ని ఉపయోగించవచ్చు." + "ఇన్‌కమింగ్ మరియు అవుట్‌గోయింగ్ కాల్స్‌ల గురించిన డేటాతో సహా మీ ఫోన్ యొక్క కాల్ లాగ్‌ను సవరించడానికి యాప్‌ను అనుమతిస్తుంది. హానికరమైన యాప్‌లు మీ కాల్ లాగ్‌ను ఎరేజ్ చేయడానికి లేదా సవరించడానికి దీన్ని ఉపయోగించవచ్చు." "శరీర సెన్సార్‌లను (గుండె స్పందన రేటు మానిటర్‌ల వంటివి) యాక్సెస్ చేయండి" "మీ శారీరక పరిస్థితిని అనగా మీ గుండె స్పందన రేటు వంటి వాటిని పర్యవేక్షించే సెన్సార్‌ల నుండి డేటాను యాక్సెస్ చేయడానికి యాప్‌ను అనుమతిస్తుంది." "క్యాలెండర్ ఈవెంట్‌లు మరియు వివరాలను చదవడం" @@ -445,15 +445,15 @@ "వైబ్రేటర్‌ను నియంత్రించడానికి యాప్‌ను అనుమతిస్తుంది." "వైబ్రేటర్ స్థితిని యాక్సెస్ చేసేందుకు యాప్‌ను అనుమతిస్తుంది." "నేరుగా కాల్ చేసే ఫోన్ నంబర్‌లు" - "మీ ప్రమేయం లేకుండా ఫోన్ నంబర్‌లకు కాల్ చేయడానికి యాప్‌ను అనుమతిస్తుంది. దీని వలన అనుకోని ఛార్జీలు విధించబడవచ్చు లేదా కాల్‌లు రావచ్చు. ఇది అత్యవసర నంబర్‌లకు కాల్ చేయడానికి యాప్‌ను అనుమతించదని గుర్తుంచుకోండి. హానికరమైన యాప్‌లు మీ నిర్ధారణ లేకుండానే కాల్‌లు చేయడం ద్వారా మీకు డబ్బు ఖర్చయ్యేలా చేయవచ్చు." + "మీ ప్రమేయం లేకుండా ఫోన్ నంబర్‌లకు కాల్ చేయడానికి యాప్‌ను అనుమతిస్తుంది. దీని వలన అనుకోని ఛార్జీలు విధించబడవచ్చు లేదా కాల్స్‌ రావచ్చు. ఇది అత్యవసర నంబర్‌లకు కాల్ చేయడానికి యాప్‌ను అనుమతించదని గుర్తుంచుకోండి. హానికరమైన యాప్‌లు మీ నిర్ధారణ లేకుండానే కాల్స్‌ చేయడం ద్వారా మీకు డబ్బు ఖర్చయ్యేలా చేయవచ్చు." "IMS కాల్ సేవ యాక్సెస్ అనుమతి" - "మీ ప్రమేయం లేకుండా కాల్‌లు చేయడం కోసం IMS సేవను ఉపయోగించడానికి యాప్‌ను అనుమతిస్తుంది." + "మీ ప్రమేయం లేకుండా కాల్స్‌ చేయడం కోసం IMS సేవను ఉపయోగించడానికి యాప్‌ను అనుమతిస్తుంది." "ఫోన్ స్థితి మరియు గుర్తింపుని చదవడం" "పరికరం యొక్క ఫోన్ ఫీచర్‌లను యాక్సెస్ చేయడానికి యాప్‌ను అనుమతిస్తుంది. ఈ అనుమతి ఫోన్ నంబర్ మరియు పరికరం IDలను, కాల్ సక్రియంగా ఉందా లేదా అనే విషయాన్ని మరియు కాల్ ద్వారా కనెక్ట్ చేయబడిన రిమోట్ నంబర్‌ను కనుగొనడానికి యాప్‌ను అనుమతిస్తుంది." - "కాల్‌లను సిస్టమ్ ద్వారా వెళ్లేలా చేయి" - "కాలింగ్ అనుభవాన్ని మెరుగుపరచడం కోసం తన కాల్‌లను సిస్టమ్ ద్వారా వెళ్లేలా చేయడానికి యాప్‌ను అనుమతిస్తుంది." - "సిస్టమ్ ద్వారా కాల్‌లను చూసి, నియంత్రించండి." - "పరికరంలో కొనసాగుతున్న కాల్‌లను చూడడానికి మరియు నియంత్రించడానికి యాప్‌ను అనుమతిస్తుంది. ఇందులో కాల్ కోసం కాల్‌ల నంబర్‌లు మరియు రాష్ట్ర కాల్ వంటి సమాచారం ఉంటుంది." + "కాల్స్‌ను సిస్టమ్ ద్వారా వెళ్లేలా చేయి" + "కాలింగ్ అనుభవాన్ని మెరుగుపరచడం కోసం తన కాల్స్‌ను సిస్టమ్ ద్వారా వెళ్లేలా చేయడానికి యాప్‌ను అనుమతిస్తుంది." + "సిస్టమ్ ద్వారా కాల్స్‌ను చూసి, నియంత్రించండి." + "పరికరంలో కొనసాగుతున్న కాల్స్‌ను చూడడానికి మరియు నియంత్రించడానికి యాప్‌ను అనుమతిస్తుంది. ఇందులో కాల్ కోసం కాల్స్‌ల నంబర్‌లు మరియు రాష్ట్ర కాల్ వంటి సమాచారం ఉంటుంది." "ఆడియో రికార్డ్ పరిమితుల నుండి మినహాయింపు" "ఆడియోను రికార్డ్ చేయడానికి యాప్‌ను పరిమితుల నుండి మినహాయించండి." "మరో యాప్ నుండి కాల్‌ని కొనసాగించండి" @@ -621,8 +621,8 @@ "మీ షేర్ చేసిన నిల్వ యొక్క కంటెంట్‌లను చదవడానికి యాప్‌ను అనుమతిస్తుంది." "మీ షేర్ చేసిన నిల్వ యొక్క కంటెంట్‌లను సవరించండి లేదా తొలగించండి" "మీ షేర్ చేసిన నిల్వ యొక్క కంటెంట్‌లను రాయడానికి యాప్‌ను అనుమతిస్తుంది." - "SIP కాల్‌లను చేయడానికి/స్వీకరించడానికి" - "SIP కాల్‌లను చేయడానికి మరియు స్వీకరించడానికి యాప్‌ను అనుమతిస్తుంది." + "SIP కాల్స్‌ను చేయడానికి/స్వీకరించడానికి" + "SIP కాల్స్‌ను చేయడానికి మరియు స్వీకరించడానికి యాప్‌ను అనుమతిస్తుంది." "కొత్త టెలికామ్ SIM కనెక్షన్‌లను నమోదు చేయడం" "కొత్త టెలికామ్ SIM కనెక్షన్‌లను నమోదు చేయడానికి యాప్‌ను అనుమతిస్తుంది." "కొత్త టెలికామ్ కనెక్షన్‌లను నమోదు చేయడం" @@ -632,7 +632,7 @@ "ఇన్-కాల్ స్క్రీన్‌తో పరస్పర చర్య చేయడం" "వినియోగదారునికి ఇన్-కాల్ స్క్రీన్ ఎప్పుడు, ఎలా కనిపించాలనే దాన్ని నియంత్రించడానికి యాప్‌ను అనుమతిస్తుంది." "టెలిఫోన్ సేవలతో పరస్పర చర్య చేయడం" - "కాల్‌లు చేయడం/స్వీకరించడం కోసం టెలిఫోన్ సేవలతో పరస్పర చర్య చేయడానికి యాప్‌ను అనుమతిస్తుంది." + "కాల్స్‌ చేయడం/స్వీకరించడం కోసం టెలిఫోన్ సేవలతో పరస్పర చర్య చేయడానికి యాప్‌ను అనుమతిస్తుంది." "ఇన్-కాల్ వినియోగదారు అనుభవాన్ని అందించడం" "ఇన్-కాల్ వినియోగదారుని అనుభవాన్ని అందించడానికి యాప్‌ను అనుమతిస్తుంది." "చారిత్రక నెట్‌వర్క్ వినియోగాన్ని చదవడం" @@ -642,29 +642,29 @@ "నెట్‌వర్క్ వినియోగ అకౌంటింగ్‌ను సవరించడం" "యాప్‌లలో నెట్‌వర్క్ వినియోగం ఎలా గణించాలనే దాన్ని సవరించడానికి యాప్‌ను అనుమతిస్తుంది. సాధారణ యాప్‌ల ద్వారా ఉపయోగించడానికి ఉద్దేశించినది కాదు." "నోటిఫికేషన్‌లను యాక్సెస్ చేయడం" - "నోటిఫికేషన్‌లను, ఇతర అనువర్తనాల ద్వారా పోస్ట్ చేయబడిన వాటిని తిరిగి పొందడానికి, పరిశీలించడానికి మరియు క్లియర్ చేయడానికి యాప్‌ను అనుమతిస్తుంది." + "నోటిఫికేషన్‌లను, ఇతర యాప్‌ల ద్వారా పోస్ట్ చేయబడిన వాటిని తిరిగి పొందడానికి, పరిశీలించడానికి మరియు క్లియర్ చేయడానికి యాప్‌ను అనుమతిస్తుంది." "నోటిఫికేషన్ పరిశీలన సేవకు అనుబంధించడం" - "నోటిఫికేషన్ పరిశీలన సేవ యొక్క అగ్ర-స్థాయి ఇంటర్‌ఫేస్‌కు అనుబంధించడానికి హోల్డర్‌ను అనుమతిస్తుంది. సాధారణ అనువర్తనాల కోసం ఎప్పటికీ అవసరం ఉండకూడదు." + "నోటిఫికేషన్ పరిశీలన సేవ యొక్క అగ్ర-స్థాయి ఇంటర్‌ఫేస్‌కు అనుబంధించడానికి హోల్డర్‌ను అనుమతిస్తుంది. సాధారణ యాప్‌ల కోసం ఎప్పటికీ అవసరం ఉండకూడదు." "షరతు ప్రదాత సేవకు అనుబంధించడం" - "షరతు ప్రదాత సేవ యొక్క అగ్ర-స్థాయి ఇంటర్‌ఫేస్‌కు అనుబంధించడానికి హోల్డర్‌ను అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు." + "షరతు ప్రదాత సేవ యొక్క అగ్ర-స్థాయి ఇంటర్‌ఫేస్‌కు అనుబంధించడానికి హోల్డర్‌ను అనుమతిస్తుంది. సాధారణ యాప్‌లకు ఎప్పటికీ అవసరం ఉండదు." "డ్రీమ్ సేవ‌కి అనుబంధించడం" - "డ్రీమ్ సేవ యొక్క అగ్ర-స్థాయి ఇంటర్‌ఫేస్‌కు అనుబంధించడానికి హోల్డర్‌ను అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు." + "డ్రీమ్ సేవ యొక్క అగ్ర-స్థాయి ఇంటర్‌ఫేస్‌కు అనుబంధించడానికి హోల్డర్‌ను అనుమతిస్తుంది. సాధారణ యాప్‌లకు ఎప్పటికీ అవసరం ఉండదు." "క్యారియర్ అందించిన కాన్ఫిగరేషన్ యాప్‌ను అభ్యర్థించడం" - "క్యారియర్ అందించిన కాన్ఫిగరేషన్ యాప్‌ను అభ్యర్థించడానికి హోల్డర్‌ను అనుమతిస్తుంది. సాధారణ అనువర్తనాల కోసం ఎప్పటికీ అవసరం ఉండకూడదు." + "క్యారియర్ అందించిన కాన్ఫిగరేషన్ యాప్‌ను అభ్యర్థించడానికి హోల్డర్‌ను అనుమతిస్తుంది. సాధారణ యాప్‌ల కోసం ఎప్పటికీ అవసరం ఉండకూడదు." "నెట్‌వర్క్ పరిస్థితులపై పరిశీలనల గురించి తెలుసుకోవడం" - "నెట్‌వర్క్ పరిస్థితులపై పరిశీలనల గురించి తెలుసుకోవడానికి యాప్‌ను అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండకూడదు." + "నెట్‌వర్క్ పరిస్థితులపై పరిశీలనల గురించి తెలుసుకోవడానికి యాప్‌ను అనుమతిస్తుంది. సాధారణ యాప్‌లకు ఎప్పటికీ అవసరం ఉండకూడదు." "ఇన్‌పుట్ పరికరం క్రమాంకనాన్ని మార్చండి" - "టచ్ స్క్రీన్ యొక్క క్రమాంకన పరామితులను సవరించడానికి యాప్‌ను అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు." + "టచ్ స్క్రీన్ యొక్క క్రమాంకన పరామితులను సవరించడానికి యాప్‌ను అనుమతిస్తుంది. సాధారణ యాప్‌లకు ఎప్పటికీ అవసరం ఉండదు." "DRM ప్రమాణపత్రాలను యాక్సెస్ చేయడం" - "DRM ప్రమాణపత్రాలను కేటాయించడానికి మరియు ఉపయోగించడానికి యాప్‌ను అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు." + "DRM ప్రమాణపత్రాలను కేటాయించడానికి మరియు ఉపయోగించడానికి యాప్‌ను అనుమతిస్తుంది. సాధారణ యాప్‌లకు ఎప్పటికీ అవసరం ఉండదు." "Android Beam బదిలీ స్థితిని స్వీకరించడం" "ప్రస్తుత Android Beam బదిలీలకు సంబంధించిన సమాచారాన్ని స్వీకరించడానికి ఈ యాప్‌ను అనుమతిస్తుంది" "DRM ప్రమాణపత్రాలను తీసివేయడం" - "DRM ప్రమాణపత్రాలను తీసివేయడానికి యాప్‌ను అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు." + "DRM ప్రమాణపత్రాలను తీసివేయడానికి యాప్‌ను అనుమతిస్తుంది. సాధారణ యాప్‌లకు ఎప్పటికీ అవసరం ఉండదు." "క్యారియర్ సందేశ సేవకు అనుబంధించడం" - "క్యారియర్ సందేశ సేవ యొక్క అగ్ర-స్థాయి ఇంటర్‌ఫేస్‌కు అనుబంధించడానికి హోల్డర్‌ను అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు." + "క్యారియర్ సందేశ సేవ యొక్క అగ్ర-స్థాయి ఇంటర్‌ఫేస్‌కు అనుబంధించడానికి హోల్డర్‌ను అనుమతిస్తుంది. సాధారణ యాప్‌లకు ఎప్పటికీ అవసరం ఉండదు." "క్యారియర్ సేవలకు అనుబంధించడం" - "క్యారియర్ సేవలకు అనుబంధించడానికి హోల్డర్‌ను అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు." + "క్యారియర్ సేవలకు అనుబంధించడానికి హోల్డర్‌ను అనుమతిస్తుంది. సాధారణ యాప్‌లకు ఎప్పటికీ అవసరం ఉండదు." "అంతరాయం కలిగించవద్దును యాక్సెస్ చేయడం" "అంతరాయం కలిగించవద్దు ఎంపిక కాన్ఫిగరేషన్ చదవడానికి మరియు వ్రాయడానికి యాప్‌ను అనుమతిస్తుంది." "వీక్షణ అనుమతి వినియోగాన్ని ప్రారంభించండి" @@ -1198,7 +1198,7 @@ "%1$sని అప్‌గ్రేడ్ చేస్తోంది…" "%2$dలో %1$d యాప్‌ను అనుకూలీకరిస్తోంది." "%1$sని సిద్ధం చేస్తోంది." - "అనువర్తనాలను ప్రారంభిస్తోంది." + "యాప్‌లను ప్రారంభిస్తోంది." "బూట్‌ను ముగిస్తోంది." "%1$s అమలవుతోంది" "గేమ్‌కి తిరిగి రావడానికి నొక్కండి" @@ -1900,7 +1900,7 @@ "కార్యాలయ ప్రొఫైల్ లాక్ అయింది" "కార్యాలయ ప్రొఫైల్ అన్‌లాక్ చేయుటకు నొక్కండి" "%1$sకి కనెక్ట్ చేయబడింది" - "ఫైల్‌లను వీక్షించడానికి నొక్కండి" + "ఫైళ్లను వీక్షించడానికి నొక్కండి" "పిన్ చేయి" "%1$sను పిన్ చేయండి" "అన్‌‌పిన్‌ ‌చేయి" @@ -1985,8 +1985,8 @@ "హానికరమైన యాప్ గుర్తించబడింది" "%1$s %2$s స్లైస్‌లను చూపించాలనుకుంటోంది" "ఎడిట్ చేయండి" - "కాల్‌లు మరియు నోటిఫికేషన్‌లు వైబ్రేట్ అవుతాయి" - "కాల్‌లు మరియు నోటిఫికేషన్‌లు మ్యూట్ చేయబడతాయి" + "కాల్స్‌ మరియు నోటిఫికేషన్‌లు వైబ్రేట్ అవుతాయి" + "కాల్స్‌ మరియు నోటిఫికేషన్‌లు మ్యూట్ చేయబడతాయి" "సిస్టమ్ మార్పులు" "అంతరాయం కలిగించవద్దు" "కొత్తది: అంతరాయం కలిగించవద్దు నోటిఫికేషన్‌లను దాస్తోంది" @@ -2027,7 +2027,7 @@ "విమానం మోడ్‌లో బ్లూటూత్ ఆన్‌లో ఉంటుంది" "లోడవుతోంది" - %s + %d ఫైల్‌లు + %s + %d ఫైళ్లు %s + %d ఫైల్ "ఎవరికి షేర్ చేయాలనే దానికి సంబంధించి సిఫార్సులేవీ లేవు" -- cgit v1.2.3 From 3fceefa91fbb4137e06c972d881405afefbf46b0 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 7 Aug 2021 01:42:23 +0000 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ic78d4515f68cdaed57204865d0f6affcc79ddcbd --- core/res/res/values-fa/strings.xml | 2 +- core/res/res/values-te/strings.xml | 86 +++++++++++++++++++------------------- 2 files changed, 44 insertions(+), 44 deletions(-) diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index f388427acab6..fcca1b39330a 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -1949,7 +1949,7 @@ "بزرگ کردن" "بستن" "%1$s:‏ %2$s" - "پاسخ" + "پاسخ دادن" "ویدیو" "رد کردن" "قطع تماس" diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index 893aedae146d..81be9a7988b0 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -68,7 +68,7 @@ "కాలింగ్ నంబర్ అందుబాటులో ఉంది" "కాలింగ్ నంబర్ పరిమితం చేయబడింది" "మూడు మార్గాల కాలింగ్" - "అవాంఛిత అంతరాయ కాల్‌ల తిరస్కరణ" + "అవాంఛిత అంతరాయ కాల్స్‌ల తిరస్కరణ" "కాలింగ్ నంబర్ బట్వాడా" "అంతరాయం కలిగించవద్దు" "కాలర్ ID డిఫాల్ట్‌గా పరిమితానికి ఉంటుంది. తర్వాత కాల్: పరిమితం చేయబడింది" @@ -86,7 +86,7 @@ "మొబైల్ నెట్‌వర్క్ అందుబాటులో లేదు" "ప్రాధాన్య నెట్‌వర్క్‌ను మార్చుకోవడానికి ప్రయత్నించండి. మార్చడానికి నొక్కండి." "అత్యవసర కాలింగ్ అందుబాటులో లేదు" - "Wi-Fiతో అత్యవసర కాల్‌లు చేయలేరు" + "Wi-Fiతో అత్యవసర కాల్స్‌ చేయలేరు" "అలర్ట్‌లు" "కాల్ ఫార్వార్డింగ్" "అత్యవసర కాల్‌బ్యాక్ మోడ్" @@ -124,7 +124,7 @@ "సేవ కోసం శోధిస్తోంది" "Wi‑Fi కాలింగ్‌ని సెటప్ చేయడం సాధ్యపడలేదు" - "Wi-Fiతో కాల్‌లను చేయడానికి మరియు సందేశాలను పంపించడానికి, మొదట ఈ సేవను సెటప్ చేయాల్సిందిగా మీ క్యారియర్‌‌కి చెప్పండి. ఆ తర్వాత సెట్టింగ్‌ల నుండి Wi-Fi కాలింగ్‌ని మళ్లీ ఆన్ చేయండి. (లోపం కోడ్: %1$s)" + "Wi-Fiతో కాల్స్‌ను చేయడానికి మరియు సందేశాలను పంపించడానికి, మొదట ఈ సేవను సెటప్ చేయాల్సిందిగా మీ క్యారియర్‌‌కి చెప్పండి. ఆ తర్వాత సెట్టింగ్‌ల నుండి Wi-Fi కాలింగ్‌ని మళ్లీ ఆన్ చేయండి. (లోపం కోడ్: %1$s)" "మీ క్యారియర్‌తో Wi‑Fi కాలింగ్‌ని నమోదు చేయడంలో సమస్య: %1$s" @@ -176,10 +176,10 @@ "సమకాలీకరణ" "సమకాలీకరించడం సాధ్యపడదు" "చాలా ఎక్కువ %s తొలగించడానికి ప్రయత్నించారు." - "టాబ్లెట్ నిల్వ నిండింది. స్థలాన్ని ఖాళీ చేయడానికి కొన్ని ఫైల్‌లను తొలగించండి." - "వాచ్ నిల్వ నిండింది. స్థలాన్ని ఖాళీ చేయడానికి కొన్ని ఫైల్‌లను తొలగించండి." + "టాబ్లెట్ నిల్వ నిండింది. స్థలాన్ని ఖాళీ చేయడానికి కొన్ని ఫైళ్లను తొలగించండి." + "వాచ్ నిల్వ నిండింది. స్థలాన్ని ఖాళీ చేయడానికి కొన్ని ఫైళ్లను తొలగించండి." "Android TV పరికరం నిల్వ నిండింది. కొంత ప్రదేశాన్ని ఖాళీ చేయడానికి కొన్ని ఫైల్‌‌‌లను తొలగించండి." - "ఫోన్ నిల్వ నిండింది. స్థలాన్ని ఖాళీ చేయడానికి కొన్ని ఫైల్‌లను తొలగించండి." + "ఫోన్ నిల్వ నిండింది. స్థలాన్ని ఖాళీ చేయడానికి కొన్ని ఫైళ్లను తొలగించండి." ప్రమాణపత్ర అధికారాలు ఇన్‌స్టాల్ చేయబడ్డాయి ప్రమాణపత్ర అధికారం ఇన్‌స్టాల్ చేయబడింది @@ -311,7 +311,7 @@ "SMS" "SMS సందేశాలను పంపడం మరియు వీక్షించడం" "ఫైల్స్, మీడియా" - "మీ పరికరంలోని ఫోటోలు, మీడియా మరియు ఫైల్‌లను యాక్సెస్ చేయడానికి" + "మీ పరికరంలోని ఫోటోలు, మీడియా మరియు ఫైళ్లను యాక్సెస్ చేయడానికి" "మైక్రోఫోన్" "ఆడియోను రికార్డ్ చేయడానికి" "ఫిజికల్ యాక్టివిటీ" @@ -323,7 +323,7 @@ "కాల్ లాగ్‌లు" "ఫోన్ కాల్ లాగ్‌ని చదవండి మరియు రాయండి" "ఫోన్" - "ఫోన్ కాల్‌లు చేయడం మరియు నిర్వహించడం" + "ఫోన్ కాల్స్‌ చేయడం మరియు నిర్వహించడం" "శరీర సెన్సార్‌లు" "మీ అత్యంత కీలకమైన గుర్తుల గురించి సెన్సార్ డేటాని యాక్సెస్ చేస్తుంది" "విండో కంటెంట్‍ను తిరిగి పొందుతుంది" @@ -352,10 +352,10 @@ "వినియోగదారు ప్రమేయం లేకుండానే హోమ్‌స్క్రీన్ సత్వరమార్గాలను జోడించడానికి యాప్‌ను అనుమతిస్తుంది." "సత్వరమార్గాలను అన్ఇన్‌స్టాల్ చేయడం" "వినియోగదారు ప్రమేయం లేకుండానే హోమ్‌స్క్రీన్ సత్వరమార్గాలను తీసివేయడానికి యాప్‌ను అనుమతిస్తుంది." - "అవుట్‌గోయింగ్ కాల్‌లను దారి మళ్లించడం" + "అవుట్‌గోయింగ్ కాల్స్‌ను దారి మళ్లించడం" "కాల్‌ను వేరే నంబర్‌కు దారి మళ్లించే లేదా మొత్తంగా కాల్‌ను ఆపివేసే ఎంపిక సహాయంతో అవుట్‌గోయింగ్ కాల్ సమయంలో డయల్ చేయబడుతున్న నంబర్‌ను చూడటానికి యాప్‌ను అనుమతిస్తుంది." - "ఫోన్ కాల్‌లకు సమాధానమివ్వు" - "ఇన్‌కమింగ్ ఫోన్ కాల్‌లకు సమాధానమివ్వడానికి యాప్‌ను అనుమతిస్తుంది." + "ఫోన్ కాల్స్‌కు సమాధానమివ్వు" + "ఇన్‌కమింగ్ ఫోన్ కాల్స్‌కు సమాధానమివ్వడానికి యాప్‌ను అనుమతిస్తుంది." "వచన సందేశాలను (SMS) స్వీకరించడం" "SMS సందేశాలను స్వీకరించడానికి మరియు ప్రాసెస్ చేయడానికి యాప్‌ను అనుమతిస్తుంది. యాప్ మీ డివైజ్‌కు పంపబడిన సందేశాలను మీకు చూపకుండానే పర్యవేక్షించగలదని లేదా తొలగించగలదని దీని అర్థం." "వచన సందేశాలను (MMS) స్వీకరించడం" @@ -376,15 +376,15 @@ "ఈ యాప్‌ మీ ఫోన్‌లో నిల్వ చేసిన అన్ని SMS (వచన) సందేశాలను చదవగలదు." "వచన సందేశాలను (WAP) స్వీకరించడం" "WAP సందేశాలను స్వీకరించడానికి మరియు ప్రాసెస్ చేయడానికి యాప్‌ను అనుమతిస్తుంది. ఈ అనుమతి మీకు పంపబడిన సందేశాలను మీకు చూపకుండానే పర్యవేక్షించగల లేదా తొలగించగల సామర్థ్యాన్ని కలిగి ఉంటుంది." - "అమలవుతున్న అనువర్తనాలను పునరుద్ధరించడం" + "అమలవుతున్న యాప్‌లను పునరుద్ధరించడం" "ప్రస్తుతం మరియు ఇటీవల అమలవుతున్న విధుల గురించి వివరణాత్మక సమాచారాన్ని తిరిగి పొందడానికి యాప్‌ను అనుమతిస్తుంది. ఇది పరికరంలో ఉపయోగించబడిన యాప్‌ల గురించి సమాచారాన్ని కనుగొనడానికి యాప్‌ను అనుమతించవచ్చు." "ప్రొఫైల్ మరియు పరికర యజమానులను నిర్వహించడం" - "ప్రొఫైల్ యజమానులను మరియు పరికరం యజమానిని సెట్ చేయడానికి అనువర్తనాలను అనుమతిస్తుంది." + "ప్రొఫైల్ యజమానులను మరియు పరికరం యజమానిని సెట్ చేయడానికి యాప్‌లను అనుమతిస్తుంది." "అమలవుతోన్న యాప్‌లను మళ్లీ క్రమం చేయడం" "విధులను ముందుకు మరియు నేపథ్యానికి తరలించడానికి యాప్‌ను అనుమతిస్తుంది. యాప్ మీ ప్రమేయం లేకుండానే దీన్ని చేయవచ్చు." "కారు మోడ్‌ను ప్రారంభించడం" "కారు మోడ్‌ను ప్రారంభించడానికి యాప్‌ను అనుమతిస్తుంది." - "ఇతర అనువర్తనాలను మూసివేయడం" + "ఇతర యాప్‌లను మూసివేయడం" "ఇతర యాప్‌ల నేపథ్య ప్రాసెస్‌లను ముగించడానికి యాప్‌ను అనుమతిస్తుంది. దీని వలన ఇతర యాప్‌లు అమలు కాకుండా ఆపివేయబడవచ్చు." "ఈ యాప్ ఇతర యాప్‌ల పైభాగాన కనిపించగలదు" "ఈ యాప్ ఇతర యాప్‌ల పైభాగాన లేదా స్క్రీన్ యొక్క ఇతర భాగాలపైన కనిపించగలదు. ఇది సాధారణ యాప్ వినియోగానికి అంతరాయం కలిగించవచ్చు మరియు ఆ ఇతర యాప్‌లు కనిపించే విధానాన్ని మార్చవచ్చు." @@ -421,9 +421,9 @@ "కాల్ లాగ్‌ను చదవడం" "ఈ యాప్‌ మీ కాల్ చరిత్రను చదవగలదు." "కాల్ లాగ్‌ను వ్రాయడం" - "ఇన్‌కమింగ్ మరియు అవుట్‌గోయింగ్ కాల్‌ల గురించిన డేటాతో సహా మీ టాబ్లెట్ యొక్క కాల్ లాగ్‌ను సవరించడానికి యాప్‌ను అనుమతిస్తుంది. హానికరమైన యాప్‌లు మీ కాల్ లాగ్‌ను ఎరేజ్ చేయడానికి లేదా సవరించడానికి దీన్ని ఉపయోగించవచ్చు." - "ఇన్‌కమింగ్ మరియు అవుట్‌గోయింగ్ కాల్‌లకు సంబంధించిన డేటాతో సహా మీ Android TV పరికరం కాల్ లాగ్‌ను సవరించడానికి యాప్‌ని అనుమతిస్తుంది. హానికరమైన యాప్‌లు మీ కాల్ లాగ్‌ను తీసివేయడానికి లేదా సవరించడానికి దీన్ని ఉపయోగించవచ్చు." - "ఇన్‌కమింగ్ మరియు అవుట్‌గోయింగ్ కాల్‌ల గురించిన డేటాతో సహా మీ ఫోన్ యొక్క కాల్ లాగ్‌ను సవరించడానికి యాప్‌ను అనుమతిస్తుంది. హానికరమైన యాప్‌లు మీ కాల్ లాగ్‌ను ఎరేజ్ చేయడానికి లేదా సవరించడానికి దీన్ని ఉపయోగించవచ్చు." + "ఇన్‌కమింగ్ మరియు అవుట్‌గోయింగ్ కాల్స్‌ల గురించిన డేటాతో సహా మీ టాబ్లెట్ యొక్క కాల్ లాగ్‌ను సవరించడానికి యాప్‌ను అనుమతిస్తుంది. హానికరమైన యాప్‌లు మీ కాల్ లాగ్‌ను ఎరేజ్ చేయడానికి లేదా సవరించడానికి దీన్ని ఉపయోగించవచ్చు." + "ఇన్‌కమింగ్ మరియు అవుట్‌గోయింగ్ కాల్స్‌కు సంబంధించిన డేటాతో సహా మీ Android TV పరికరం కాల్ లాగ్‌ను సవరించడానికి యాప్‌ని అనుమతిస్తుంది. హానికరమైన యాప్‌లు మీ కాల్ లాగ్‌ను తీసివేయడానికి లేదా సవరించడానికి దీన్ని ఉపయోగించవచ్చు." + "ఇన్‌కమింగ్ మరియు అవుట్‌గోయింగ్ కాల్స్‌ల గురించిన డేటాతో సహా మీ ఫోన్ యొక్క కాల్ లాగ్‌ను సవరించడానికి యాప్‌ను అనుమతిస్తుంది. హానికరమైన యాప్‌లు మీ కాల్ లాగ్‌ను ఎరేజ్ చేయడానికి లేదా సవరించడానికి దీన్ని ఉపయోగించవచ్చు." "శరీర సెన్సార్‌లను (గుండె స్పందన రేటు మానిటర్‌ల వంటివి) యాక్సెస్ చేయండి" "మీ శారీరక పరిస్థితిని అనగా మీ గుండె స్పందన రేటు వంటి వాటిని పర్యవేక్షించే సెన్సార్‌ల నుండి డేటాను యాక్సెస్ చేయడానికి యాప్‌ను అనుమతిస్తుంది." "క్యాలెండర్ ఈవెంట్‌లు మరియు వివరాలను చదవడం" @@ -464,15 +464,15 @@ "వైబ్రేటర్‌ను నియంత్రించడానికి యాప్‌ను అనుమతిస్తుంది." "వైబ్రేటర్ స్థితిని యాక్సెస్ చేసేందుకు యాప్‌ను అనుమతిస్తుంది." "నేరుగా కాల్ చేసే ఫోన్ నంబర్‌లు" - "మీ ప్రమేయం లేకుండా ఫోన్ నంబర్‌లకు కాల్ చేయడానికి యాప్‌ను అనుమతిస్తుంది. దీని వలన అనుకోని ఛార్జీలు విధించబడవచ్చు లేదా కాల్‌లు రావచ్చు. ఇది అత్యవసర నంబర్‌లకు కాల్ చేయడానికి యాప్‌ను అనుమతించదని గుర్తుంచుకోండి. హానికరమైన యాప్‌లు మీ నిర్ధారణ లేకుండానే కాల్‌లు చేయడం ద్వారా మీకు డబ్బు ఖర్చయ్యేలా చేయవచ్చు." + "మీ ప్రమేయం లేకుండా ఫోన్ నంబర్‌లకు కాల్ చేయడానికి యాప్‌ను అనుమతిస్తుంది. దీని వలన అనుకోని ఛార్జీలు విధించబడవచ్చు లేదా కాల్స్‌ రావచ్చు. ఇది అత్యవసర నంబర్‌లకు కాల్ చేయడానికి యాప్‌ను అనుమతించదని గుర్తుంచుకోండి. హానికరమైన యాప్‌లు మీ నిర్ధారణ లేకుండానే కాల్స్‌ చేయడం ద్వారా మీకు డబ్బు ఖర్చయ్యేలా చేయవచ్చు." "IMS కాల్ సేవ యాక్సెస్ అనుమతి" - "మీ ప్రమేయం లేకుండా కాల్‌లు చేయడం కోసం IMS సేవను ఉపయోగించడానికి యాప్‌ను అనుమతిస్తుంది." + "మీ ప్రమేయం లేకుండా కాల్స్‌ చేయడం కోసం IMS సేవను ఉపయోగించడానికి యాప్‌ను అనుమతిస్తుంది." "ఫోన్ స్థితి మరియు గుర్తింపుని చదవడం" "పరికరం యొక్క ఫోన్ ఫీచర్‌లను యాక్సెస్ చేయడానికి యాప్‌ను అనుమతిస్తుంది. ఈ అనుమతి ఫోన్ నంబర్ మరియు పరికరం IDలను, కాల్ సక్రియంగా ఉందా లేదా అనే విషయాన్ని మరియు కాల్ ద్వారా కనెక్ట్ చేయబడిన రిమోట్ నంబర్‌ను కనుగొనడానికి యాప్‌ను అనుమతిస్తుంది." - "కాల్‌లను సిస్టమ్ ద్వారా వెళ్లేలా చేయి" - "కాలింగ్ అనుభవాన్ని మెరుగుపరచడం కోసం తన కాల్‌లను సిస్టమ్ ద్వారా వెళ్లేలా చేయడానికి యాప్‌ను అనుమతిస్తుంది." - "సిస్టమ్ ద్వారా కాల్‌లను చూసి, నియంత్రించండి." - "పరికరంలో కొనసాగుతున్న కాల్‌లను చూడడానికి మరియు నియంత్రించడానికి యాప్‌ను అనుమతిస్తుంది. ఇందులో కాల్ కోసం కాల్‌ల నంబర్‌లు మరియు రాష్ట్ర కాల్ వంటి సమాచారం ఉంటుంది." + "కాల్స్‌ను సిస్టమ్ ద్వారా వెళ్లేలా చేయి" + "కాలింగ్ అనుభవాన్ని మెరుగుపరచడం కోసం తన కాల్స్‌ను సిస్టమ్ ద్వారా వెళ్లేలా చేయడానికి యాప్‌ను అనుమతిస్తుంది." + "సిస్టమ్ ద్వారా కాల్స్‌ను చూసి, నియంత్రించండి." + "పరికరంలో కొనసాగుతున్న కాల్స్‌ను చూడడానికి మరియు నియంత్రించడానికి యాప్‌ను అనుమతిస్తుంది. ఇందులో కాల్ కోసం కాల్స్‌ల నంబర్‌లు మరియు రాష్ట్ర కాల్ వంటి సమాచారం ఉంటుంది." "ఆడియో రికార్డ్ పరిమితుల నుండి మినహాయింపు" "ఆడియోను రికార్డ్ చేయడానికి యాప్‌ను పరిమితుల నుండి మినహాయించండి." "మరో యాప్ నుండి కాల్‌ని కొనసాగించండి" @@ -672,8 +672,8 @@ "మీ షేర్ చేసిన నిల్వ యొక్క కంటెంట్‌లను చదవడానికి యాప్‌ను అనుమతిస్తుంది." "మీ షేర్ చేసిన నిల్వ యొక్క కంటెంట్‌లను సవరించండి లేదా తొలగించండి" "మీ షేర్ చేసిన నిల్వ యొక్క కంటెంట్‌లను రాయడానికి యాప్‌ను అనుమతిస్తుంది." - "SIP కాల్‌లను చేయడానికి/స్వీకరించడానికి" - "SIP కాల్‌లను చేయడానికి మరియు స్వీకరించడానికి యాప్‌ను అనుమతిస్తుంది." + "SIP కాల్స్‌ను చేయడానికి/స్వీకరించడానికి" + "SIP కాల్స్‌ను చేయడానికి మరియు స్వీకరించడానికి యాప్‌ను అనుమతిస్తుంది." "కొత్త టెలికామ్ SIM కనెక్షన్‌లను నమోదు చేయడం" "కొత్త టెలికామ్ SIM కనెక్షన్‌లను నమోదు చేయడానికి యాప్‌ను అనుమతిస్తుంది." "కొత్త టెలికామ్ కనెక్షన్‌లను నమోదు చేయడం" @@ -683,7 +683,7 @@ "ఇన్-కాల్ స్క్రీన్‌తో పరస్పర చర్య చేయడం" "వినియోగదారునికి ఇన్-కాల్ స్క్రీన్ ఎప్పుడు, ఎలా కనిపించాలనే దాన్ని నియంత్రించడానికి యాప్‌ను అనుమతిస్తుంది." "టెలిఫోన్ సేవలతో పరస్పర చర్య చేయడం" - "కాల్‌లు చేయడం/స్వీకరించడం కోసం టెలిఫోన్ సేవలతో పరస్పర చర్య చేయడానికి యాప్‌ను అనుమతిస్తుంది." + "కాల్స్‌ చేయడం/స్వీకరించడం కోసం టెలిఫోన్ సేవలతో పరస్పర చర్య చేయడానికి యాప్‌ను అనుమతిస్తుంది." "ఇన్-కాల్ వినియోగదారు అనుభవాన్ని అందించడం" "ఇన్-కాల్ వినియోగదారుని అనుభవాన్ని అందించడానికి యాప్‌ను అనుమతిస్తుంది." "చారిత్రక నెట్‌వర్క్ వినియోగాన్ని చదవడం" @@ -693,29 +693,29 @@ "నెట్‌వర్క్ వినియోగ అకౌంటింగ్‌ను సవరించడం" "యాప్‌లలో నెట్‌వర్క్ వినియోగం ఎలా గణించాలనే దాన్ని సవరించడానికి యాప్‌ను అనుమతిస్తుంది. సాధారణ యాప్‌ల ద్వారా ఉపయోగించడానికి ఉద్దేశించినది కాదు." "నోటిఫికేషన్‌లను యాక్సెస్ చేయడం" - "నోటిఫికేషన్‌లను, ఇతర అనువర్తనాల ద్వారా పోస్ట్ చేయబడిన వాటిని తిరిగి పొందడానికి, పరిశీలించడానికి మరియు క్లియర్ చేయడానికి యాప్‌ను అనుమతిస్తుంది." + "నోటిఫికేషన్‌లను, ఇతర యాప్‌ల ద్వారా పోస్ట్ చేయబడిన వాటిని తిరిగి పొందడానికి, పరిశీలించడానికి మరియు క్లియర్ చేయడానికి యాప్‌ను అనుమతిస్తుంది." "నోటిఫికేషన్ పరిశీలన సేవకు అనుబంధించడం" - "నోటిఫికేషన్ పరిశీలన సేవ యొక్క అగ్ర-స్థాయి ఇంటర్‌ఫేస్‌కు అనుబంధించడానికి హోల్డర్‌ను అనుమతిస్తుంది. సాధారణ అనువర్తనాల కోసం ఎప్పటికీ అవసరం ఉండకూడదు." + "నోటిఫికేషన్ పరిశీలన సేవ యొక్క అగ్ర-స్థాయి ఇంటర్‌ఫేస్‌కు అనుబంధించడానికి హోల్డర్‌ను అనుమతిస్తుంది. సాధారణ యాప్‌ల కోసం ఎప్పటికీ అవసరం ఉండకూడదు." "షరతు ప్రదాత సేవకు అనుబంధించడం" - "షరతు ప్రదాత సేవ యొక్క అగ్ర-స్థాయి ఇంటర్‌ఫేస్‌కు అనుబంధించడానికి హోల్డర్‌ను అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు." + "షరతు ప్రదాత సేవ యొక్క అగ్ర-స్థాయి ఇంటర్‌ఫేస్‌కు అనుబంధించడానికి హోల్డర్‌ను అనుమతిస్తుంది. సాధారణ యాప్‌లకు ఎప్పటికీ అవసరం ఉండదు." "డ్రీమ్ సేవ‌కి అనుబంధించడం" - "డ్రీమ్ సేవ యొక్క అగ్ర-స్థాయి ఇంటర్‌ఫేస్‌కు అనుబంధించడానికి హోల్డర్‌ను అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు." + "డ్రీమ్ సేవ యొక్క అగ్ర-స్థాయి ఇంటర్‌ఫేస్‌కు అనుబంధించడానికి హోల్డర్‌ను అనుమతిస్తుంది. సాధారణ యాప్‌లకు ఎప్పటికీ అవసరం ఉండదు." "క్యారియర్ అందించిన కాన్ఫిగరేషన్ యాప్‌ను అభ్యర్థించడం" - "క్యారియర్ అందించిన కాన్ఫిగరేషన్ యాప్‌ను అభ్యర్థించడానికి హోల్డర్‌ను అనుమతిస్తుంది. సాధారణ అనువర్తనాల కోసం ఎప్పటికీ అవసరం ఉండకూడదు." + "క్యారియర్ అందించిన కాన్ఫిగరేషన్ యాప్‌ను అభ్యర్థించడానికి హోల్డర్‌ను అనుమతిస్తుంది. సాధారణ యాప్‌ల కోసం ఎప్పటికీ అవసరం ఉండకూడదు." "నెట్‌వర్క్ పరిస్థితులపై పరిశీలనల గురించి తెలుసుకోవడం" - "నెట్‌వర్క్ పరిస్థితులపై పరిశీలనల గురించి తెలుసుకోవడానికి యాప్‌ను అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండకూడదు." + "నెట్‌వర్క్ పరిస్థితులపై పరిశీలనల గురించి తెలుసుకోవడానికి యాప్‌ను అనుమతిస్తుంది. సాధారణ యాప్‌లకు ఎప్పటికీ అవసరం ఉండకూడదు." "ఇన్‌పుట్ పరికరం క్రమాంకనాన్ని మార్చండి" - "టచ్ స్క్రీన్ యొక్క క్రమాంకన పరామితులను సవరించడానికి యాప్‌ను అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు." + "టచ్ స్క్రీన్ యొక్క క్రమాంకన పరామితులను సవరించడానికి యాప్‌ను అనుమతిస్తుంది. సాధారణ యాప్‌లకు ఎప్పటికీ అవసరం ఉండదు." "DRM ప్రమాణపత్రాలను యాక్సెస్ చేయడం" - "DRM ప్రమాణపత్రాలను కేటాయించడానికి మరియు ఉపయోగించడానికి యాప్‌ను అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు." + "DRM ప్రమాణపత్రాలను కేటాయించడానికి మరియు ఉపయోగించడానికి యాప్‌ను అనుమతిస్తుంది. సాధారణ యాప్‌లకు ఎప్పటికీ అవసరం ఉండదు." "Android Beam బదిలీ స్థితిని స్వీకరించడం" "ప్రస్తుత Android Beam బదిలీలకు సంబంధించిన సమాచారాన్ని స్వీకరించడానికి ఈ యాప్‌ను అనుమతిస్తుంది" "DRM ప్రమాణపత్రాలను తీసివేయడం" - "DRM ప్రమాణపత్రాలను తీసివేయడానికి యాప్‌ను అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు." + "DRM ప్రమాణపత్రాలను తీసివేయడానికి యాప్‌ను అనుమతిస్తుంది. సాధారణ యాప్‌లకు ఎప్పటికీ అవసరం ఉండదు." "క్యారియర్ సందేశ సేవకు అనుబంధించడం" - "క్యారియర్ సందేశ సేవ యొక్క అగ్ర-స్థాయి ఇంటర్‌ఫేస్‌కు అనుబంధించడానికి హోల్డర్‌ను అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు." + "క్యారియర్ సందేశ సేవ యొక్క అగ్ర-స్థాయి ఇంటర్‌ఫేస్‌కు అనుబంధించడానికి హోల్డర్‌ను అనుమతిస్తుంది. సాధారణ యాప్‌లకు ఎప్పటికీ అవసరం ఉండదు." "క్యారియర్ సేవలకు అనుబంధించడం" - "క్యారియర్ సేవలకు అనుబంధించడానికి హోల్డర్‌ను అనుమతిస్తుంది. సాధారణ అనువర్తనాలకు ఎప్పటికీ అవసరం ఉండదు." + "క్యారియర్ సేవలకు అనుబంధించడానికి హోల్డర్‌ను అనుమతిస్తుంది. సాధారణ యాప్‌లకు ఎప్పటికీ అవసరం ఉండదు." "అంతరాయం కలిగించవద్దును యాక్సెస్ చేయడం" "అంతరాయం కలిగించవద్దు ఎంపిక కాన్ఫిగరేషన్ చదవడానికి మరియు వ్రాయడానికి యాప్‌ను అనుమతిస్తుంది." "వీక్షణ అనుమతి వినియోగాన్ని ప్రారంభించండి" @@ -1258,7 +1258,7 @@ "%1$sని అప్‌గ్రేడ్ చేస్తోంది…" "%2$dలో %1$d యాప్‌ను అనుకూలీకరిస్తోంది." "%1$sని సిద్ధం చేస్తోంది." - "అనువర్తనాలను ప్రారంభిస్తోంది." + "యాప్‌లను ప్రారంభిస్తోంది." "బూట్‌ను ముగిస్తోంది." "స్క్రీన్‌ను ఆఫ్ చేయాలా?" "మీ వేలిముద్రను సెటప్ చేస్తున్నప్పుడు, మీరు పవర్ బటన్‌ను నొక్కారు.\n\nఇది సాధారణంగా మీ స్క్రీన్‌ను ఆఫ్ చేస్తుంది." @@ -1990,7 +1990,7 @@ "కార్యాలయ ప్రొఫైల్ లాక్ అయింది" "కార్యాలయ ప్రొఫైల్ అన్‌లాక్ చేయుటకు నొక్కండి" "%1$sకి కనెక్ట్ చేయబడింది" - "ఫైల్‌లను వీక్షించడానికి నొక్కండి" + "ఫైళ్లను వీక్షించడానికి నొక్కండి" "పిన్ చేయి" "%1$sను పిన్ చేయండి" "అన్‌‌పిన్‌ ‌చేయి" @@ -2076,8 +2076,8 @@ "హానికరమైన యాప్ గుర్తించబడింది" "%1$s %2$s స్లైస్‌లను చూపించాలనుకుంటోంది" "ఎడిట్ చేయండి" - "కాల్‌లు మరియు నోటిఫికేషన్‌లు వైబ్రేట్ అవుతాయి" - "కాల్‌లు మరియు నోటిఫికేషన్‌లు మ్యూట్ చేయబడతాయి" + "కాల్స్‌ మరియు నోటిఫికేషన్‌లు వైబ్రేట్ అవుతాయి" + "కాల్స్‌ మరియు నోటిఫికేషన్‌లు మ్యూట్ చేయబడతాయి" "సిస్టమ్ మార్పులు" "అంతరాయం కలిగించవద్దు" "కొత్తది: అంతరాయం కలిగించవద్దు నోటిఫికేషన్‌లను దాస్తోంది" @@ -2099,7 +2099,7 @@ "సరే" "ఆఫ్ చేయండి" "మరింత తెలుసుకోండి" - "Android 12లో Android అనుకూల నోటిఫికేషన్‌లను, మెరుగైన నోటిఫికేషన్‌లు భర్తీ చేశాయి. సూచించిన చర్యలు, రిప్లయిలను ఈ ఫీచర్ చూపించి, మీ నోటిఫికేషన్‌లను ఆర్గనైజ్ చేస్తుంది.\n\nకాంటాక్ట్ పేర్లు, మెసేజ్‌లు లాంటి వ్యక్తిగత సమాచారంతో సహా నోటిఫికేషన్ కంటెంట్‌ను మెరుగైన నోటిఫికేషన్‌లు యాక్సెస్ చేయవచ్చు. ఫోన్ కాల్‌లకు సమాధానమివ్వడం, \'అంతరాయం కలిగించవద్దు\' ఆప్షన్‌ను కంట్రోల్ చేయడం లాంటి నోటిఫికేషన్‌లను విస్మరించడం లేదా ప్రతిస్పందించడం కూడా ఈ ఫీచర్ చేయగలదు." + "Android 12లో Android అనుకూల నోటిఫికేషన్‌లను, మెరుగైన నోటిఫికేషన్‌లు భర్తీ చేశాయి. సూచించిన చర్యలు, రిప్లయిలను ఈ ఫీచర్ చూపించి, మీ నోటిఫికేషన్‌లను ఆర్గనైజ్ చేస్తుంది.\n\nకాంటాక్ట్ పేర్లు, మెసేజ్‌లు లాంటి వ్యక్తిగత సమాచారంతో సహా నోటిఫికేషన్ కంటెంట్‌ను మెరుగైన నోటిఫికేషన్‌లు యాక్సెస్ చేయవచ్చు. ఫోన్ కాల్స్‌కు సమాధానమివ్వడం, \'అంతరాయం కలిగించవద్దు\' ఆప్షన్‌ను కంట్రోల్ చేయడం లాంటి నోటిఫికేషన్‌లను విస్మరించడం లేదా ప్రతిస్పందించడం కూడా ఈ ఫీచర్ చేయగలదు." "రొటీన్ మోడ్ సమాచార నోటిఫికేషన్" "మామూలుగా ఛార్జ్ చేసేలోపు బ్యాటరీ ఖాళీ కావచ్చు" "బ్యాటరీ జీవితకాలాన్ని పెంచడానికి బ్యాటరీ సేవర్ యాక్టివేట్ చేయబడింది" @@ -2129,7 +2129,7 @@ "విమానం మోడ్‌లో బ్లూటూత్ ఆన్‌లో ఉంటుంది" "లోడవుతోంది" - %s + %d ఫైల్‌లు + %s + %d ఫైళ్లు %s + %d ఫైల్ "ఎవరికి షేర్ చేయాలనే దానికి సంబంధించి సిఫార్సులేవీ లేవు" -- cgit v1.2.3 From a8814acff39719b5d49e981368a16dbcf6ef34e2 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 7 Aug 2021 04:46:55 +0000 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I505c97ab1f9d8e803542788005a07d581e485d47 --- packages/PackageInstaller/res/values-te/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/PackageInstaller/res/values-te/strings.xml b/packages/PackageInstaller/res/values-te/strings.xml index ec52fac0b2cc..eb6cfdbfacd7 100644 --- a/packages/PackageInstaller/res/values-te/strings.xml +++ b/packages/PackageInstaller/res/values-te/strings.xml @@ -83,7 +83,7 @@ "మీ భద్రత దృష్ట్యా, ఈ మూలం నుండి తెలియని యాప్‌లను ఇన్‌స్టాల్ చేయడానికి మీ టాబ్లెట్ అనుమతించబడదు." "మీ భద్రత దృష్ట్యా, ఈ మూలం నుండి తెలియని యాప్‌లను ఇన్‌స్టాల్ చేయడానికి మీ టీవీ అనుమతించబడదు." "మీ భద్రత దృష్ట్యా, ఈ మూలం నుండి తెలియని యాప్‌లను ఇన్‌స్టాల్ చేయడానికి మీ ఫోన్ అనుమతించబడదు." - "తెలియని యాప్‌లు మీ ఫోన్ పైన, వ్యక్తిగత డేటా పైన దాడి చేయడానికి ఎక్కువగా అవకాశం ఉంటుంది. ఈ యాప్ను ఇన్‌స్టాల్ చేయడం ద్వారా, దాని వినియోగంతో మీ ఫోన్‌కు ఏదైనా నష్టం జరిగితే లేదా మీ డేటాను కోల్పోతే అందుకు మీరే బాధ్యత వహిస్తారని అంగీకరిస్తున్నారు." + "తెలియని యాప్‌లు మీ ఫోన్ పైన, వ్యక్తిగత డేటా పైన దాడి చేయడానికి ఎక్కువగా అవకాశం ఉంటుంది. ఈ యాప్‌ను ఇన్‌స్టాల్ చేయడం ద్వారా, దాని వినియోగంతో మీ ఫోన్‌కు ఏదైనా నష్టం జరిగితే లేదా మీ డేటాను కోల్పోతే అందుకు మీరే బాధ్యత వహిస్తారని అంగీకరిస్తున్నారు." "మీ టాబ్లెట్ మరియు వ్యక్తిగత డేటాపై తెలియని యాప్‌లు దాడి చేయడానికి ఎక్కువ అవకాశం ఉంది. మీరు ఈ యాప్‌ను ఇన్‌స్టాల్ చేయడం ద్వారా, దీనిని ఉపయోగించడం వలన మీ టాబ్లెట్‌కు ఏదైనా హాని జరిగినా లేదా డేటా కోల్పోయినా బాధ్యత మీదేనని అంగీకరిస్తున్నారు." "మీ టీవీ మరియు వ్యక్తిగత డేటాపై తెలియని యాప్‌లు దాడి చేయడానికి ఎక్కువ అవకాశం ఉంది. మీరు ఈ యాప్‌ను ఇన్‌స్టాల్ చేయడం ద్వారా, దీనిని ఉపయోగించడం వలన మీ టీవీకి ఏదైనా హాని జరిగినా లేదా డేటా కోల్పోయినా బాధ్యత మీదేనని అంగీకరిస్తున్నారు." "కొనసాగించు" -- cgit v1.2.3 From 4216ca985ca0bf86b53d31b52618e916346cda0b Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 7 Aug 2021 04:53:04 +0000 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I3487141c85b503b8280ef2adfc187bb4021c1412 --- packages/PackageInstaller/res/values-te/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/PackageInstaller/res/values-te/strings.xml b/packages/PackageInstaller/res/values-te/strings.xml index 8951e0def1cb..dba1ab4de61f 100644 --- a/packages/PackageInstaller/res/values-te/strings.xml +++ b/packages/PackageInstaller/res/values-te/strings.xml @@ -83,7 +83,7 @@ "మీ భద్రత దృష్ట్యా, ఈ సోర్సు నుండి తెలియని యాప్‌లను ఇన్‌స్టాల్ చేయడానికి మీ టాబ్లెట్ ప్రస్తుతం అనుమతించబడదు. మీరు దీన్ని సెట్టింగ్‌లలో మార్చవచ్చు." "మీ భద్రత దృష్ట్యా, ఈ సోర్సు నుండి తెలియని యాప్‌లను ఇన్‌స్టాల్ చేయడానికి మీ టీవీ ప్రస్తుతం అనుమతించబడదు. మీరు దీన్ని సెట్టింగ్‌లలో మార్చవచ్చు." "మీ భద్రత దృష్ట్యా, ఈ సోర్సు నుండి తెలియని యాప్‌లను ఇన్‌స్టాల్ చేయడానికి మీ ఫోన్ ప్రస్తుతం అనుమతించబడదు. మీరు దీన్ని సెట్టింగ్‌లలో మార్చవచ్చు." - "తెలియని యాప్‌లు మీ ఫోన్ పైన, వ్యక్తిగత డేటా పైన దాడి చేయడానికి ఎక్కువగా అవకాశం ఉంటుంది. ఈ యాప్ను ఇన్‌స్టాల్ చేయడం ద్వారా, దాని వినియోగంతో మీ ఫోన్‌కు ఏదైనా నష్టం జరిగితే లేదా మీ డేటాను కోల్పోతే అందుకు మీరే బాధ్యత వహిస్తారని అంగీకరిస్తున్నారు." + "తెలియని యాప్‌లు మీ ఫోన్ పైన, వ్యక్తిగత డేటా పైన దాడి చేయడానికి ఎక్కువగా అవకాశం ఉంటుంది. ఈ యాప్‌ను ఇన్‌స్టాల్ చేయడం ద్వారా, దాని వినియోగంతో మీ ఫోన్‌కు ఏదైనా నష్టం జరిగితే లేదా మీ డేటాను కోల్పోతే అందుకు మీరే బాధ్యత వహిస్తారని అంగీకరిస్తున్నారు." "మీ టాబ్లెట్ మరియు వ్యక్తిగత డేటాపై తెలియని యాప్‌లు దాడి చేయడానికి ఎక్కువ అవకాశం ఉంది. మీరు ఈ యాప్‌ను ఇన్‌స్టాల్ చేయడం ద్వారా, దీనిని ఉపయోగించడం వలన మీ టాబ్లెట్‌కు ఏదైనా హాని జరిగినా లేదా డేటా కోల్పోయినా బాధ్యత మీదేనని అంగీకరిస్తున్నారు." "మీ టీవీ మరియు వ్యక్తిగత డేటాపై తెలియని యాప్‌లు దాడి చేయడానికి ఎక్కువ అవకాశం ఉంది. మీరు ఈ యాప్‌ను ఇన్‌స్టాల్ చేయడం ద్వారా, దీనిని ఉపయోగించడం వలన మీ టీవీకి ఏదైనా హాని జరిగినా లేదా డేటా కోల్పోయినా బాధ్యత మీదేనని అంగీకరిస్తున్నారు." "కొనసాగించు" -- cgit v1.2.3 From 79c4365808faa6edc24baf1f71d2e24a454eefdd Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 7 Aug 2021 05:18:08 +0000 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ic5c4a3fbd8385a918e28365640bb7229b2304010 --- packages/Shell/res/values-te/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/Shell/res/values-te/strings.xml b/packages/Shell/res/values-te/strings.xml index 989b53e7810d..fc49f079f82d 100644 --- a/packages/Shell/res/values-te/strings.xml +++ b/packages/Shell/res/values-te/strings.xml @@ -28,7 +28,7 @@ "స్క్రీన్‌షాట్ లేకుండా మీ బగ్ నివేదికను భాగస్వామ్యం చేయడానికి ఎంచుకోండి లేదా స్క్రీన్‌షాట్ ముగిసేదాకా వేచి ఉండండి" "స్క్రీన్‌షాట్ లేకుండా మీ బగ్ నివే. భాగ. చేయడానికి నొక్కండి లేదా స్క్రీన్‌షాట్ ముగిసేదాకా వేచి ఉండండి" "స్క్రీన్‌షాట్ లేకుండా మీ బగ్ నివే. భాగ. చేయడానికి నొక్కండి లేదా స్క్రీన్‌షాట్ ముగిసేదాకా వేచి ఉండండి" - "బగ్ రిపోర్ట్స్‌లో మీరు గోప్యమైనదిగా పరిగణించే (యాప్ వినియోగం, లొకేష‌న్‌ డేటా వంటి) డేటాతో పాటు సిస్టమ్‌కు సంబంధించిన విభిన్న లాగ్ ఫైల్‌ల డేటా ఉంటుంది. బగ్ నివేదికలను మీరు విశ్వసించే యాప్‌లు, వ్యక్తులతో మాత్రమే షేర్ చేయండి." + "బగ్ రిపోర్ట్స్‌లో మీరు గోప్యమైనదిగా పరిగణించే (యాప్ వినియోగం, లొకేష‌న్‌ డేటా వంటి) డేటాతో పాటు సిస్టమ్‌కు సంబంధించిన విభిన్న లాగ్ ఫైళ్ల డేటా ఉంటుంది. బగ్ నివేదికలను మీరు విశ్వసించే యాప్‌లు, వ్యక్తులతో మాత్రమే షేర్ చేయండి." "మళ్లీ చూపవద్దు" "బగ్ రిపోర్ట్స్" "బగ్ నివేదిక ఫైల్‌ను చదవడం సాధ్యపడలేదు" -- cgit v1.2.3 From a2faa0735476d68c113ad28502a02a87d646245e Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 7 Aug 2021 05:24:04 +0000 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I30aaf43d118769489a768b64337ba16a12d57b80 --- packages/Shell/res/values-te/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/Shell/res/values-te/strings.xml b/packages/Shell/res/values-te/strings.xml index 989b53e7810d..fc49f079f82d 100644 --- a/packages/Shell/res/values-te/strings.xml +++ b/packages/Shell/res/values-te/strings.xml @@ -28,7 +28,7 @@ "స్క్రీన్‌షాట్ లేకుండా మీ బగ్ నివేదికను భాగస్వామ్యం చేయడానికి ఎంచుకోండి లేదా స్క్రీన్‌షాట్ ముగిసేదాకా వేచి ఉండండి" "స్క్రీన్‌షాట్ లేకుండా మీ బగ్ నివే. భాగ. చేయడానికి నొక్కండి లేదా స్క్రీన్‌షాట్ ముగిసేదాకా వేచి ఉండండి" "స్క్రీన్‌షాట్ లేకుండా మీ బగ్ నివే. భాగ. చేయడానికి నొక్కండి లేదా స్క్రీన్‌షాట్ ముగిసేదాకా వేచి ఉండండి" - "బగ్ రిపోర్ట్స్‌లో మీరు గోప్యమైనదిగా పరిగణించే (యాప్ వినియోగం, లొకేష‌న్‌ డేటా వంటి) డేటాతో పాటు సిస్టమ్‌కు సంబంధించిన విభిన్న లాగ్ ఫైల్‌ల డేటా ఉంటుంది. బగ్ నివేదికలను మీరు విశ్వసించే యాప్‌లు, వ్యక్తులతో మాత్రమే షేర్ చేయండి." + "బగ్ రిపోర్ట్స్‌లో మీరు గోప్యమైనదిగా పరిగణించే (యాప్ వినియోగం, లొకేష‌న్‌ డేటా వంటి) డేటాతో పాటు సిస్టమ్‌కు సంబంధించిన విభిన్న లాగ్ ఫైళ్ల డేటా ఉంటుంది. బగ్ నివేదికలను మీరు విశ్వసించే యాప్‌లు, వ్యక్తులతో మాత్రమే షేర్ చేయండి." "మళ్లీ చూపవద్దు" "బగ్ రిపోర్ట్స్" "బగ్ నివేదిక ఫైల్‌ను చదవడం సాధ్యపడలేదు" -- cgit v1.2.3 From acf698dc64e32b1ab2a0b7cdcdc5087665c07cc1 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 7 Aug 2021 05:27:32 +0000 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ib66a43c5d4c9fda52d5ac779f53aed22a366e336 --- packages/SystemUI/res/values-bs/strings.xml | 2 +- packages/SystemUI/res/values-te/strings.xml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index 07d56512928d..68450a71f6aa 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -979,7 +979,7 @@ "Nećete imati pristup podacima ni internetu putem mobilnog operatera %s. Internet će biti dostupan samo putem WiFi mreže." "vaš operater" "Postavke ne mogu potvrditi vaš odgovor jer aplikacija zaklanja zahtjev za odobrenje." - "Dozvoliti aplikaciji %1$s prikazivanje isječaka aplikacije %2$s?" + "Dozvoliti aplikaciji %1$s da prikazuje isječke aplikacije %2$s?" "- Može čitati informacije iz aplikacije %1$s" "- Može poduzeti radnje u aplikaciji %1$s" "Dozvoli aplikaciji %1$s prikazivanje isječaka iz svake aplikacije" diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index 6a97b9391ebc..d72859b520c6 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -95,7 +95,7 @@ "రికార్డ్ చేస్తున్నప్పుడు, Android సిస్టమ్ మీ స్క్రీన్‌పై ప్రదర్శించబడిన లేదా మీ పరికరం నుండి ప్లే చేయబడిన ఏ సున్నితమైన సమాచారాన్నైనా క్యాప్చర్ చేయగలదు. ఈ సమాచారంలో, పాస్‌వర్డ్‌లు, పేమెంట్ వివరాలు, ఫోటోలు, మెసేజ్‌లు, ఆడియో ఉంటాయి." "ఆడియోను రికార్డ్ చేయి" "పరికరం ఆడియో" - "మీ పరికరం నుండి వచ్చే సంగీతం, కాల్‌లు, రింగ్‌టోన్‌ల వంటి ధ్వనులు" + "మీ పరికరం నుండి వచ్చే సంగీతం, కాల్స్‌, రింగ్‌టోన్‌ల వంటి ధ్వనులు" "మైక్రోఫోన్" "పరికరం ఆడియో, మైక్రోఫోన్" "ప్రారంభించు" @@ -447,7 +447,7 @@ "మీరు పేర్కొనే అలారాలు, రిమైండర్‌లు, ఈవెంట్‌లు మరియు కాలర్‌ల నుండి మినహా మరే ఇతర ధ్వనులు మరియు వైబ్రేషన్‌లతో మీకు అంతరాయం కలగదు. మీరు ఇప్పటికీ సంగీతం, వీడియోలు మరియు గేమ్‌లతో సహా మీరు ప్లే చేయడానికి ఎంచుకున్నవి ఏవైనా వింటారు." "అలారాలు నుండి మినహా మరే ఇతర ధ్వనులు మరియు వైబ్రేషన్‌లతో మీకు అంతరాయం కలగదు. మీరు ఇప్పటికీ సంగీతం, వీడియోలు మరియు గేమ్‌లతో సహా మీరు ప్లే చేయడానికి ఎంచుకున్నవి ఏవైనా వింటారు." "అనుకూలీకరించు" - "ఇది అలారాలు, సంగీతం, వీడియోలు మరియు గేమ్‌లతో సహా అన్ని ధ్వనులు మరియు వైబ్రేషన్‌లను బ్లాక్ చేస్తుంది. మీరు ఇప్పటికీ ఫోన్ కాల్‌లు చేయగలుగుతారు." + "ఇది అలారాలు, సంగీతం, వీడియోలు మరియు గేమ్‌లతో సహా అన్ని ధ్వనులు మరియు వైబ్రేషన్‌లను బ్లాక్ చేస్తుంది. మీరు ఇప్పటికీ ఫోన్ కాల్స్‌ చేయగలుగుతారు." "ఇది అలారాలు, సంగీతం, వీడియోలు మరియు గేమ్‌లతో సహా అన్ని ధ్వనులు మరియు వైబ్రేషన్‌లను బ్లాక్ చేస్తుంది." "+%d" "తక్కువ అత్యవసర నోటిఫికేషన్‌లు దిగువన" @@ -619,7 +619,7 @@ "బ్లూటూత్" "డ్యూయల్ మల్టీ టోన్ ఫ్రీక్వెన్సీ" "యాక్సెసిబిలిటీ" - "కాల్‌లు" + "కాల్స్‌" "రింగ్" "వైబ్రేట్" "మ్యూట్" @@ -634,7 +634,7 @@ "అన్‌మ్యూట్ చేయి" "వైబ్రేట్" "%s వాల్యూమ్ నియంత్రణలు" - "కాల్‌లు మరియు నోటిఫికేషన్‌లు రింగ్ అవుతాయి (%1$s)" + "కాల్స్‌ మరియు నోటిఫికేషన్‌లు రింగ్ అవుతాయి (%1$s)" "మీడియా అవుట్‌పుట్" "ఫోన్ కాల్ అవుట్‌పుట్" "పరికరాలు ఏవీ కనుగొనబడలేదు" @@ -923,7 +923,7 @@ "పరిమాణం మార్చు" "వేడెక్కినందుకు ఫోన్ ఆఫ్ చేయబడింది" "మీ ఫోన్ ఇప్పుడు సాధారణంగా పని చేస్తుంది" - "మీ ఫోన్ చాలా వేడిగా ఉంది, కనుక చల్లబర్చడానికి ఆఫ్ చేయబడింది. మీ ఫోన్ ఇప్పుడు సాధారణంగా పని చేస్తుంది.\n\nమీరు ఇలా చేస్తే మీ ఫోన్ చాలా వేడెక్కవచ్చు:\n • వనరు-ఆధారిత యాప్‌లు (గేమింగ్, వీడియో లేదా నావిగేషన్ వంటి యాప్‌లు) ఉపయోగించడం\n • పెద్ద ఫైల్‌లను డౌన్‌లోడ్ లేదా అప్‌లోడ్ చేయడం\n • అధిక ఉష్ణోగ్రతలలో మీ ఫోన్‌ని ఉపయోగించడం" + "మీ ఫోన్ చాలా వేడిగా ఉంది, కనుక చల్లబర్చడానికి ఆఫ్ చేయబడింది. మీ ఫోన్ ఇప్పుడు సాధారణంగా పని చేస్తుంది.\n\nమీరు ఇలా చేస్తే మీ ఫోన్ చాలా వేడెక్కవచ్చు:\n • వనరు-ఆధారిత యాప్‌లు (గేమింగ్, వీడియో లేదా నావిగేషన్ వంటి యాప్‌లు) ఉపయోగించడం\n • పెద్ద ఫైళ్లను డౌన్‌లోడ్ లేదా అప్‌లోడ్ చేయడం\n • అధిక ఉష్ణోగ్రతలలో మీ ఫోన్‌ని ఉపయోగించడం" "ఫోన్ వేడెక్కుతోంది" "ఫోన్‌ను చల్లబరిచే క్రమంలో కొన్ని లక్షణాలు పరిమితం చేయబడ్డాయి" "మీ ఫోన్ స్వయంచాలకంగా చల్లబడటానికి ప్రయత్నిస్తుంది. మీరు ఇప్పటికీ మీ ఫోన్‌ను ఉపయోగించవచ్చు, కానీ దాని పనితీరు నెమ్మదిగా ఉండవచ్చు.\n\nమీ ఫోన్ చల్లబడిన తర్వాత, అది సాధారణ రీతిలో పని చేస్తుంది." -- cgit v1.2.3 From 670abf2c7012dc892d5601055cd0b2efaa2dd25c Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 7 Aug 2021 05:58:54 +0000 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I0a74b20fb1ce41497931c4dba2127c24c58721b9 --- packages/SystemUI/res/values-af/strings.xml | 2 ++ packages/SystemUI/res/values-am/strings.xml | 2 ++ packages/SystemUI/res/values-ar/strings.xml | 2 ++ packages/SystemUI/res/values-as/strings.xml | 2 ++ packages/SystemUI/res/values-az/strings.xml | 2 ++ packages/SystemUI/res/values-b+sr+Latn/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 | 2 ++ packages/SystemUI/res/values-bs/strings.xml | 4 +++- packages/SystemUI/res/values-ca/strings.xml | 4 +++- packages/SystemUI/res/values-cs/strings.xml | 2 ++ packages/SystemUI/res/values-da/strings.xml | 2 ++ packages/SystemUI/res/values-de/strings.xml | 4 +++- packages/SystemUI/res/values-el/strings.xml | 2 ++ packages/SystemUI/res/values-en-rAU/strings.xml | 2 ++ packages/SystemUI/res/values-en-rCA/strings.xml | 2 ++ packages/SystemUI/res/values-en-rGB/strings.xml | 2 ++ packages/SystemUI/res/values-en-rIN/strings.xml | 2 ++ packages/SystemUI/res/values-en-rXC/strings.xml | 2 ++ packages/SystemUI/res/values-es-rUS/strings.xml | 2 ++ packages/SystemUI/res/values-es/strings.xml | 2 ++ packages/SystemUI/res/values-et/strings.xml | 2 ++ packages/SystemUI/res/values-eu/strings.xml | 2 ++ packages/SystemUI/res/values-fa/strings.xml | 2 ++ packages/SystemUI/res/values-fi/strings.xml | 2 ++ packages/SystemUI/res/values-fr-rCA/strings.xml | 2 ++ packages/SystemUI/res/values-fr/strings.xml | 2 ++ packages/SystemUI/res/values-gl/strings.xml | 2 ++ packages/SystemUI/res/values-gu/strings.xml | 2 ++ packages/SystemUI/res/values-hi/strings.xml | 2 ++ packages/SystemUI/res/values-hr/strings.xml | 2 ++ packages/SystemUI/res/values-hu/strings.xml | 2 ++ packages/SystemUI/res/values-hy/strings.xml | 2 ++ packages/SystemUI/res/values-in/strings.xml | 2 ++ packages/SystemUI/res/values-is/strings.xml | 2 ++ packages/SystemUI/res/values-it/strings.xml | 2 ++ packages/SystemUI/res/values-iw/strings.xml | 2 ++ packages/SystemUI/res/values-ja/strings.xml | 2 ++ packages/SystemUI/res/values-ka/strings.xml | 2 ++ packages/SystemUI/res/values-kk/strings.xml | 2 ++ packages/SystemUI/res/values-km/strings.xml | 2 ++ packages/SystemUI/res/values-kn/strings.xml | 2 ++ packages/SystemUI/res/values-ko/strings.xml | 2 ++ packages/SystemUI/res/values-ky/strings.xml | 2 ++ packages/SystemUI/res/values-lo/strings.xml | 2 ++ packages/SystemUI/res/values-lt/strings.xml | 2 ++ packages/SystemUI/res/values-lv/strings.xml | 2 ++ packages/SystemUI/res/values-mk/strings.xml | 2 ++ packages/SystemUI/res/values-ml/strings.xml | 2 ++ packages/SystemUI/res/values-mn/strings.xml | 2 ++ packages/SystemUI/res/values-mr/strings.xml | 2 ++ packages/SystemUI/res/values-ms/strings.xml | 2 ++ packages/SystemUI/res/values-my/strings.xml | 2 ++ packages/SystemUI/res/values-nb/strings.xml | 2 ++ packages/SystemUI/res/values-ne/strings.xml | 2 ++ packages/SystemUI/res/values-nl/strings.xml | 2 ++ packages/SystemUI/res/values-or/strings.xml | 2 ++ packages/SystemUI/res/values-pa/strings.xml | 2 ++ packages/SystemUI/res/values-pl/strings.xml | 2 ++ packages/SystemUI/res/values-pt-rBR/strings.xml | 2 ++ packages/SystemUI/res/values-pt-rPT/strings.xml | 2 ++ packages/SystemUI/res/values-pt/strings.xml | 2 ++ packages/SystemUI/res/values-ro/strings.xml | 2 ++ packages/SystemUI/res/values-ru/strings.xml | 2 ++ packages/SystemUI/res/values-si/strings.xml | 2 ++ packages/SystemUI/res/values-sk/strings.xml | 2 ++ packages/SystemUI/res/values-sl/strings.xml | 2 ++ packages/SystemUI/res/values-sq/strings.xml | 2 ++ packages/SystemUI/res/values-sr/strings.xml | 2 ++ packages/SystemUI/res/values-sv/strings.xml | 2 ++ packages/SystemUI/res/values-sw/strings.xml | 2 ++ packages/SystemUI/res/values-ta/strings.xml | 2 ++ packages/SystemUI/res/values-te/strings.xml | 14 ++++++++------ packages/SystemUI/res/values-th/strings.xml | 2 ++ packages/SystemUI/res/values-tl/strings.xml | 2 ++ packages/SystemUI/res/values-tr/strings.xml | 2 ++ packages/SystemUI/res/values-uk/strings.xml | 2 ++ packages/SystemUI/res/values-ur/strings.xml | 2 ++ packages/SystemUI/res/values-uz/strings.xml | 2 ++ packages/SystemUI/res/values-vi/strings.xml | 2 ++ packages/SystemUI/res/values-zh-rCN/strings.xml | 2 ++ packages/SystemUI/res/values-zh-rHK/strings.xml | 2 ++ packages/SystemUI/res/values-zh-rTW/strings.xml | 2 ++ packages/SystemUI/res/values-zu/strings.xml | 2 ++ 85 files changed, 179 insertions(+), 9 deletions(-) diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index 5a4a8ea20891..8229661fbc24 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -184,6 +184,8 @@ "Kan nie gesig herken nie. Gebruik eerder vingerafdruk." "Gebruik jou vingerafdruk om voort te gaan" "Kan nie vingerafdruk herken nie. Gebruik eerder skermslot." + + "Soek tans vir jou …" "Gesig-ikoon" "Versoenbaarheid-zoem se knoppie." diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index 3a3938fc16d3..7f101d73b925 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -184,6 +184,8 @@ "መልክን መለየት አልተቻለም። በምትኩ የጣት አሻራ ይጠቀሙ።" "ለመቀጠል የእርስዎን የጣት አሻራ ይጠቀሙ" "የጣት አሻራን መለየት አልተቻለም። በምትኩ የማያ ገጽ መቆለፊያ ይጠቀሙ።" + + "እርስዎን በመፈለግ ላይ…" "የፊት አዶ" "የተኳኋኝአጉላ አዝራር።" diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 72279a6ed89d..8f230246a70e 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -184,6 +184,8 @@ "يتعذّر التعرّف على الوجه. استخدِم بصمة الإصبع بدلاً من ذلك." "عليك استخدام بصمة الإصبع للمتابعة." "يتعذّر التعرّف على بصمة الإصبع. عليك استخدام قفل الشاشة بدلاً من ذلك." + + "جارٍ البحث عن وجهك…" "رمز الوجه" "زر تكبير/تصغير للتوافق." diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index 7fe06e3bfe2b..c4438fca51e3 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -184,6 +184,8 @@ "মুখাৱয়ব চিনিব নোৱাৰি। ফিংগাৰপ্ৰিণ্ট ব্যৱহাৰ কৰক।" "অব্যাহত ৰাখিবলৈ আপোনাৰ ফিংগাৰপ্ৰিণ্ট ব্যৱহাৰ কৰক" "ফিংগাৰপ্ৰিণ্ট চিনাক্ত কৰিব নোৱাৰি। তাৰ সলনি স্ক্ৰীন লক ব্যৱহাৰ কৰক।" + + "আপোনাৰ মুখমণ্ডল বিচাৰি আছে…" "মুখমণ্ডলৰ আইকন" "উপযোগিতা অনুসৰি জুম কৰা বুটাম।" diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index 0b97347d70f1..7e50b194000a 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -184,6 +184,8 @@ "Tanımaq olmur. Barmaq izini işlədin." "Davam etmək üçün barmaq izinizi istifadə edin" "Barmaq izini tanımaq olmur. Əvəzində ekran kilidindən istifadə edin." + + "Siz axtarılırsınız…" "Üz işarəsi" "Uyğunluq zoom düyməsi." diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index 2aff0a34271c..701765f4036c 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -184,6 +184,8 @@ "Lice nije prepoznato. Koristite otisak prsta." "Nastavite pomoću otiska prsta" "Prepoznavanje otiska prsta nije uspelo. Koristite zaključavanje ekrana umesto toga." + + "Tražimo vas…" "Ikona lica" "Dugme Zum kompatibilnosti." diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index ac37b8e8451e..5da6cf8b9c35 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -184,6 +184,8 @@ "Твар не распазнаны. Скарыстайце адбітак пальца." "Каб працягнуць, скарыстайце адбітак пальца" "Не ўдалося распазнаць адбітак пальца. Разблакіруйце экран іншым спосабам." + + "Ідзе пошук вашага твару…" "Значок твару" "Кнопка сумяшчальнасці маштаба." diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index 73724a8ba617..742de25d539c 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -184,6 +184,8 @@ "Лицето не е разпознато. Използвайте отпечатък." "Използвайте отпечатъка си, за да продължите" "Отпечатъкът не може да бъде разпознат. Вместо това използвайте опция за заключване на екрана." + + "Търсим ви…" "Икона на лице" "Бутон за промяна на мащаба с цел съвместимост." diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index a70fa8d18b25..b35ae1f1efde 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -184,6 +184,8 @@ "মুখ শনাক্ত করতে পারছি না। পরিবর্তে আঙ্গুলের ছাপ ব্যবহার করুন।" "চালিয়ে যেতে আঙ্গুলের ছাপ ব্যবহার করুন" "আঙ্গুলের ছাপ শনাক্ত করতে পারছি না। পরিবর্তে স্ক্রিন লক ব্যবহার করুন।" + + "আপনার জন্য খোঁজা হচ্ছে…" "ফেস আইকন" "সামঞ্জস্যের জুম বোতাম৷" diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index afc21b5a605c..b87739732e4b 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -184,6 +184,8 @@ "Nije moguće prepoznati lice. Koristite otisak prsta." "Nastavite pomoću otiska prsta" "Nije moguće prepoznati otisak prsta. Umjesto toga koristite zaključavanje ekrana." + + "Tražimo vas…" "Ikona lica" "Dugme za uvećavanje u slučaju nekompatibilnosti." @@ -993,7 +995,7 @@ "Nećete imati pristup podacima ni internetu putem mobilnog operatera %s. Internet će biti dostupan samo putem WiFi mreže." "vaš operater" "Postavke ne mogu potvrditi vaš odgovor jer aplikacija zaklanja zahtjev za odobrenje." - "Dozvoliti aplikaciji %1$s prikazivanje isječaka aplikacije %2$s?" + "Dozvoliti aplikaciji %1$s da prikazuje isječke aplikacije %2$s?" "- Može čitati informacije iz aplikacije %1$s" "- Može poduzeti radnje u aplikaciji %1$s" "Dozvoli aplikaciji %1$s prikazivanje isječaka iz svake aplikacije" diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index e9da15559214..a5504f02833e 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -184,6 +184,8 @@ "No podem detectar la cara. Usa l\'empremta digital." "Fes servir l\'empremta digital per continuar" "No es pot reconèixer l\'empremta digital. Utilitza el bloqueig de pantalla." + + "S\'està cercant la teva cara…" "Icona facial" "Botó de zoom de compatibilitat." @@ -577,7 +579,7 @@ "L\'administrador ha activat el registre de xarxa, que supervisa el trànsit del teu dispositiu.\n\nPer obtenir més informació, contacta amb l\'administrador." "Has donat permís a una aplicació per configurar una connexió VPN.\n\nAquesta aplicació pot supervisar el dispositiu i l\'activitat a la xarxa, com ara els correus electrònics, les aplicacions i els llocs web." "%1$s gestiona el teu perfil de treball.\n\nL\'administrador pot supervisar la teva activitat a la xarxa, com ara els correus electrònics, les aplicacions i els llocs web.\n\nPer obtenir més informació, contacta amb l\'administrador.\n\nA més, estàs connectat a una VPN, que també pot supervisar la teva activitat a la xarxa." - "El teu pare o la teva mare gestionen aquest dispositiu, i poden veure i gestionar informació com ara les aplicacions que utilitzes, la teva ubicació i el teu temps de connexió." + "El teu pare o mare gestionen aquest dispositiu, i poden veure i gestionar informació com ara les aplicacions que utilitzes, la teva ubicació i el teu temps de connexió." "VPN" "Estàs connectat a %1$s, que pot supervisar la teva activitat a la xarxa, com ara els correus electrònics, les aplicacions i els llocs web." "Estàs connectat a %1$s, que pot supervisar la teva activitat personal a la xarxa, com ara els correus electrònics, les aplicacions i els llocs web." diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index 3463586f3c5e..f48c9fb1cd77 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -184,6 +184,8 @@ "Obličej se nepodařilo rozpoznat. Použijte místo něj otisk prstu." "Pokračujte přiložením prstu" "Otisk prstu se nepodařilo rozpoznat. Použijte místo něj zámek obrazovky." + + "Hledáme vás…" "Ikona obličeje" "Tlačítko úpravy velikosti z důvodu kompatibility" diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index 8367077445ff..cbef46488c5a 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -184,6 +184,8 @@ "Ansigtet kan ikke genkendes. Brug fingeraftryk i stedet." "Brug dit fingeraftryk for at fortsætte" "Fingeraftrykket kan ikke genkendes. Brug skærmlåsen i stedet." + + "Forsøger at finde dig…" "Ansigt" "Knap for kompatibilitetszoom." diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index f2cb79a300ff..50fcdfb7032a 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -184,6 +184,8 @@ "Gesicht wurde nicht erkannt. Verwende stattdessen den Fingerabdruck." "Mithilfe deines Fingerabdrucks fortfahren" "Fingerabdruck wurde nicht erkannt. Verwende stattdessen die Displaysperre." + + "Wir suchen nach dir…" "Gesichtssymbol" "Schaltfläche für Kompatibilitätszoom" @@ -1083,7 +1085,7 @@ "Medien" "Diese Mediensitzung ausblenden?" "Die Mediensitzung kann nicht ausgeblendet werden." - "Ablehnen" + "Ausblenden" "Fortsetzen" "Einstellungen" "%1$s von %2$s wird gerade über %3$s wiedergegeben" diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index ef7771df0295..b8d357f3ff95 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -184,6 +184,8 @@ "Το πρόσωπο δεν αναγνωρίζεται. Χρησιμ. δακτ. αποτ." "Χρησιμοποιήστε δακτυλ. αποτύπωμα για να συνεχίσετε" "Δεν είναι δυνατή η αναγνώριση του δακτυλικού αποτυπώματος. Χρησιμοποιήστε εναλλακτικά το κλείδωμα οθόνης." + + "Αναζήτηση για εσάς…" "Εικονίδιο προσώπου" "Κουμπί εστίασης συμβατότητας." diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index 905beaedc642..d69a95bba878 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -184,6 +184,8 @@ "Can’t recognise face. Use fingerprint instead." "Use your fingerprint to continue" "Can’t recognise fingerprint. Use screen lock instead." + + "Looking for you…" "Face icon" "Compatibility zoom button." diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml index 51ed681f4676..3666069ee54b 100644 --- a/packages/SystemUI/res/values-en-rCA/strings.xml +++ b/packages/SystemUI/res/values-en-rCA/strings.xml @@ -184,6 +184,8 @@ "Can’t recognise face. Use fingerprint instead." "Use your fingerprint to continue" "Can’t recognise fingerprint. Use screen lock instead." + + "Looking for you…" "Face icon" "Compatibility zoom button." diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index 905beaedc642..d69a95bba878 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -184,6 +184,8 @@ "Can’t recognise face. Use fingerprint instead." "Use your fingerprint to continue" "Can’t recognise fingerprint. Use screen lock instead." + + "Looking for you…" "Face icon" "Compatibility zoom button." diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index 905beaedc642..d69a95bba878 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -184,6 +184,8 @@ "Can’t recognise face. Use fingerprint instead." "Use your fingerprint to continue" "Can’t recognise fingerprint. Use screen lock instead." + + "Looking for you…" "Face icon" "Compatibility zoom button." diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml index 8cd587e04166..030c5884d3e3 100644 --- a/packages/SystemUI/res/values-en-rXC/strings.xml +++ b/packages/SystemUI/res/values-en-rXC/strings.xml @@ -184,6 +184,8 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‎‏‏‏‏‎‏‎‏‏‏‏‎‏‎‎‏‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‎‏‎‏‎‎‏‏‎‎‎‏‎‎‎‏‎‎‎Can’t recognize face. Use fingerprint instead.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‎‏‏‎‏‎‎‎‏‏‏‏‎‏‎‏‎‎‏‎‏‎‎‎‏‎‎‏‎‎‏‏‏‎‏‎‏‏‏‎‏‏‏‎‏‎‏‏‏‎‏‎‎‏‏‎‏‎Use your fingerprint to continue‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‎‏‏‎‎‎‎‏‎‏‎‎‏‎‏‎‏‏‎‏‎‎‏‏‏‎‎‏‏‏‎‎‎‏‏‏‎‏‎‎‎‎‎‏‎‎‏‎‏‏‏‎‎‎‏‎Can’t recognize fingerprint. Use screen lock instead.‎‏‎‎‏‎" + + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‏‏‎‏‏‏‏‏‎‎‎‎‎‏‎‏‏‎‏‎‎‏‎‏‎‎‏‎‏‎‏‎‏‎‏‏‎‏‎‏‏‏‏‎‏‎‎‏‎‏‎‎‎‏‎‏‎Looking for you…‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‎‏‎‏‏‎‎‎‎‏‏‎‏‎‏‎‏‎‎‏‏‎‎‎‏‎‎‏‏‏‏‏‎‎‎‎‎‏‎‏‏‏‏‏‏‎‏‏‎‏‎‎‎‎‎‎Face icon‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‎‏‎‎‎‎‎‎‏‏‏‎‎‏‏‏‏‏‏‎‎‎‏‏‏‎‎‏‏‏‎‎‎‎‏‎‏‏‎‎‏‏‎‎‏‎‎‏‏‏‎‏‏‎‏‎Compatibility zoom button.‎‏‎‎‏‎" diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index c1323ce57994..bb43d81596be 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -184,6 +184,8 @@ "No se reconoce el rostro. Usa la huella dactilar." "Utiliza tu huella dactilar para continuar" "No se reconoce la huella dactilar. Utiliza el bloqueo de pantalla en su lugar." + + "Autenticando tu rostro…" "Ícono de rostro" "Botón de zoom de compatibilidad" diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index bcac5cb4e008..820c708e4fe1 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -184,6 +184,8 @@ "No se reconoce la cara. Usa la huella digital." "Usa tu huella digital para continuar" "No se reconoce la huella digital. Usa el bloqueo de pantalla." + + "Buscando tu cara…" "Icono de cara" "Botón de zoom de compatibilidad" diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index 83fd5e559023..6cd609fa6151 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -184,6 +184,8 @@ "Nägu ei õnnestu tuvastada. Kasutage sõrmejälge." "Jätkamiseks kasutage sõrmejälge" "Sõrmejälge ei õnnestu tuvastada. Kasutage selle asemel ekraanilukku." + + "Otsitakse teid …" "Näoikoon" "Sobivussuumi nupp." diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index 7a36b9b657c1..4f4892cf8f00 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -184,6 +184,8 @@ "Ez da hauteman aurpegia. Erabili hatz-marka." "Aurrera egiteko, erabili hatz-marka" "Ez da hauteman hatz-marka. Erabili pantailaren blokeoa." + + "Zure bila…" "Aurpegiaren ikonoa" "Zoom-bateragarritasunaren botoia." diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index f8e1378c4768..d1ddd8c042f4 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -184,6 +184,8 @@ "چهره شناسایی نشد. درعوض از اثر انگشت استفاده کنید." "برای ادامه، از اثر انگشتتان استفاده کنید" "اثر انگشت شناسایی نشد. درعوض از قفل صفحه استفاده کنید." + + "درحال جستجوی شما…" "نماد چهره" "دکمه بزرگ‌نمایی سازگار." diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index d4449f1b57f5..652acf7ddd89 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -184,6 +184,8 @@ "Kasvoja ei voi tunnistaa. Käytä sormenjälkeä." "Jatka sormenjäljen avulla" "Sormenjälkeä ei voi tunnistaa. Käytä sen sijaan näytön lukitusta." + + "Etsitään kasvoja…" "Kasvokuvake" "Yhteensopivuuszoomaus-painike." diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index c1dd1046dc6f..1ec1f9190a22 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -184,6 +184,8 @@ "Visage non reconnu. Utilisez plutôt l\'empreinte digitale." "Utilisez votre empreinte digitale pour continuer" "Empreinte digitale non reconnue. Utilisez plutôt le verrouillage de l\'écran." + + "Recherche de votre visage…" "Icône de visage" "Bouton \"Zoom de compatibilité\"" diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index c06c62f004a9..6a08d8716677 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -184,6 +184,8 @@ "Visage non reconnu. Utilisez votre empreinte." "Utilisez votre empreinte pour continuer" "Empreinte non reconnue. Utilisez le verrouillage de l\'écran." + + "Recherche de votre visage…" "Icône représentant un visage" "Bouton \"Zoom de compatibilité\"" diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index f70dd3cbe4c4..15678e4cc907 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -184,6 +184,8 @@ "Non se recoñeceu a cara. Usa a impresión dixital." "Utiliza a túa impresión dixital para continuar" "Non se puido recoñecer a impresión dixital. Mellor usa o bloqueo de pantalla." + + "Buscándote…" "Icona de cara" "Botón de zoom de compatibilidade" diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index fe16c9593e9f..9255827aa64e 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -184,6 +184,8 @@ "ચહેરો ઓળખી શકતા નથી. તેને બદલે ફિંગરપ્રિન્ટ વાપરો." "આગળ વધવા માટે તમારી ફિંગરપ્રિન્ટનો ઉપયોગ કરો" "ફિંગરપ્રિન્ટ ઓળખી શકતા નથી. તેને બદલે સ્ક્રીન લૉકનો ઉપયોગ કરો." + + "તમારા માટે શોધી રહ્યાં છે..." "ચહેરા આઇકન" "સુસંગતતા ઝૂમ બટન." diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 464a7976b80c..1ebb517dc316 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -184,6 +184,8 @@ "चेहरे की पहचान नहीं हुई. फ़िंगरप्रिंट इस्तेमाल करें." "जारी रखने के लिए, फ़िंगरप्रिंट का इस्तेमाल करें" "फ़िंगरप्रिंट पहचाना नहीं जा सका. इसके बजाय, स्क्रीन लॉक इस्तेमाल करके देखें." + + "आपको पहचान रहा है…" "चेहरे का आइकॉन" "संगतता ज़ूम बटन." diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index 118927a0d411..9ec657d8d19d 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -184,6 +184,8 @@ "Prepoznavanje lica nije uspjelo. Upotrijebite otisak prsta." "Nastavite pomoću otiska prsta" "Prepoznavanje otiska prsta nije uspjelo. Umjesto toga upotrebljavajte zaključavanje zaslona." + + "Tražimo vas…" "Ikona lica" "Gumb za kompatibilnost zumiranja." diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index 6ee8db5770ff..d9d8148938de 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -184,6 +184,8 @@ "Az arc nem felismerhető. Használjon ujjlenyomatot." "A folytatáshoz használja ujjlenyomatát" "Az ujjlenyomat nem ismerhető fel. Használja inkább a képernyőzárat." + + "Keresem az Ön arcát…" "Arcikon" "Kompatibilitási zoom gomb." diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index 982527716a4d..1d8094a4f61c 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -184,6 +184,8 @@ "Դեմքը չի հաջողվում ճանաչել։ Օգտագործեք մատնահետքը։" "Շարունակելու համար անհրաժեշտ է ձեր մատնահետքը" "Մատնահետքը չի հաջողվում ճանաչել։ Օգտագործեք էկրանի կողպումը։" + + "Դեմքի ճանաչում…" "Դեմքի պատկերակ" "Համատեղելիության խոշորացման կոճակը:" diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index 0e056bba8df9..76ee7224933c 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -184,6 +184,8 @@ "Tidak dapat mengenali wajah. Gunakan sidik jari." "Gunakan sidik jari untuk melanjutkan" "Tidak dapat mengenali sidik jari. Gunakan kunci layar." + + "Mencari wajah Anda…" "Ikon wajah" "Tombol perbesar/perkecil kompatibilitas." diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index fa3310b228db..01905542684d 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -184,6 +184,8 @@ "Andlit þekkist ekki. Notaðu fingrafar í staðinn." "Notaðu fingrafarið þitt til að halda áfram" "Fingrafar þekkist ekki. Notaðu skjálás í staðinn." + + "Leitar að þér ..." "Andlitstákn" "Hnappur fyrir samhæfisaðdrátt." diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index abf708f2da7f..0efab5ceb84e 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -184,6 +184,8 @@ "Impossibile riconoscere il volto. Usa l\'impronta." "Utilizza la tua impronta per continuare" "Impossibile riconoscere l\'impronta. Usa il blocco schermo." + + "In attesa del volto…" "Icona volto" "Pulsante zoom compatibilità." diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index f03420270737..1e4c9d66ed9c 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -184,6 +184,8 @@ "לא ניתן לזהות את הפנים. יש להשתמש בטביעת אצבע במקום." "יש להשתמש בטביעת האצבע כדי להמשיך" "לא ניתן לזהות את טביעת האצבע. יש להשתמש בנעילת המסך במקום." + + "מתבצע חיפוש…" "סמל הפנים" "לחצן מרחק מתצוגה של תאימות." diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index e17f032e961f..27259791f664 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -184,6 +184,8 @@ "顔を認識できません。指紋認証を使用してください。" "続行するには指紋認証を使用してください" "指紋を認識できません。代わりに画面ロックを使用してください。" + + "顔を認証しています…" "顔アイコン" "互換ズームボタン。" diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml index 4363876e5e6c..21e1c52ae136 100644 --- a/packages/SystemUI/res/values-ka/strings.xml +++ b/packages/SystemUI/res/values-ka/strings.xml @@ -184,6 +184,8 @@ "სახის ამოცნობა ვერ ხერხდება. სანაცვლოდ თითის ანაბეჭდი გამოიყენეთ." "გასაგრძელებლად გამოიყენეთ თქვენი თითის ანაბეჭდი" "თითის ანაბეჭდის ამოცნობა ვერ ხერხდება. სანაცვლოდ, გამოიყენეთ ეკრანის დაბლოკვა." + + "მიმდინარეობს თქვენი ძიება…" "სახის ხატულა" "თავსებადი მასშტაბირების ღილაკი." diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index 6dc3b327d0a9..6a9a9b5d8d11 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -184,6 +184,8 @@ "Бет танылмады. Орнына саусақ ізін пайдаланыңыз." "Жалғастыру үшін саусақ ізін пайдаланыңыз." "Саусақ ізі танылмады. Орнына экран құлпын пайдаланыңыз." + + "Бет ізделуде…" "Бет белгішесі" "Үйлесімділік ұлғайту түймесі." diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index 9210e624de69..080ba1958e24 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -184,6 +184,8 @@ "មិនអាចសម្គាល់មុខបានទេ។ សូមប្រើស្នាមម្រាមដៃជំនួសវិញ។" "ប្រើ​ស្នាមម្រាមដៃ​របស់អ្នក ដើម្បីបន្ត" "មិនអាចសម្គាល់​ស្នាមម្រាមដៃបានទេ។ សូមប្រើសោ​អេក្រង់ជំនួសវិញ។" + + "កំពុងស្វែងរកអ្នក…" "រូប​ផ្ទៃមុខ" "ប៊ូតុង​ពង្រីក​ត្រូវ​គ្នា។" diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index e32bddd6534b..f63d02f6682a 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -184,6 +184,8 @@ "ಮುಖ ಗುರುತಿಸಲಾಗುತ್ತಿಲ್ಲ ಬದಲಿಗೆ ಫಿಂಗರ್‌ಪ್ರಿಂಟ್ ಬಳಸಿ." "ಮುಂದುವರಿಸಲು ನಿಮ್ಮ ಫಿಂಗರ್‌ಪ್ರಿಂಟ್ ಬಳಸಿ" "ಫಿಂಗರ್‌ಪ್ರಿಂಟ್ ಅನ್ನು ಗುರುತಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಬದಲಾಗಿ ಪರದೆಲಾಕ್ ಬಳಸಿ." + + "ನಿಮಗಾಗಿ ಹುಡುಕಲಾಗುತ್ತಿದೆ…" "ಮುಖದ ಐಕಾನ್‌" "ಹೊಂದಾಣಿಕೆಯ ಝೂಮ್ ಬಟನ್." diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index 1dc505443b03..371b7de67806 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -184,6 +184,8 @@ "얼굴을 인식할 수 없습니다. 대신 지문을 사용하세요." "계속하려면 지문을 사용하세요." "지문을 인식할 수 없습니다. 화면 잠금을 대신 사용하세요." + + "찾는 중..." "얼굴 아이콘" "호환성 확대/축소 버튼입니다." diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index 8a26ed364e15..404b9ac45179 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -184,6 +184,8 @@ "Жүз таанылбай жатат. Манжа изин колдонуңуз." "Улантуу үчүн манжаңызды сканерге тийгизиңиз" "Манжа изи таанылбай жатат. Эрканды кулпулоо функциясын колдонуңуз." + + "Жүзүңүз изделүүдө…" "Жүздүн сүрөтчөсү" "Масштабды сыйыштыруу баскычы." diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index bb6b235065de..33fddef3efb3 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -184,6 +184,8 @@ "ບໍ່ສາມາດຈຳແນກໜ້າໄດ້. ກະລຸນາໃຊ້ລາຍນິ້ວມືແທນ." "ກະລຸນາໃຊ້ລາຍນິ້ວມືຂອງທ່ານເພື່ອສືບຕໍ່" "ບໍ່ສາມາດຈຳແນກລາຍນິ້ວມືໄດ້. ກະລຸນາໃຊ້ການລອກໜ້າຈໍແທນ." + + "ກຳລັງຊອກຫາທ່ານ…" "ໄອຄອນໃບໜ້າ" "ປຸ່ມຊູມທີ່ໃຊ້ຮ່ວມກັນໄດ້." diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index 3469b3e89496..94faaf42d1b9 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -184,6 +184,8 @@ "Veidas neatpažintas. Naudokite kontrolinį kodą." "Jei norite tęsti, naudokite kontrolinį kodą" "Nepavyko atpažinti kontrolinio kodo. Naudokite ekrano užraktą." + + "Ieškoma jūsų…" "Veido piktograma" "Suderinamumo priartinimo mygtukas." diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index cec582cb6a66..0d14405ea4fb 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -184,6 +184,8 @@ "Nevar atpazīt seju. Lietojiet pirksta nospiedumu." "Lai turpinātu, izmantojiet pirksta nospiedumu." "Nevar atpazīt pirksta nospiedumu. Izmantojiet ekrāna bloķēšanu." + + "Notiek jūsu sejas meklēšana…" "Sejas ikona" "Saderības tālummaiņas poga." diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index 2a2e121fb134..5fda8b211ab1 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -184,6 +184,8 @@ "Не се препознава ликот. Користете отпечаток." "Употребете го отпечатокот за да продолжите" "Не се препознава отпечатокот. Користете заклучување екран." + + "Ве бараме вас…" "Икона за лице" "Копче за компатибилност на зум." diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index 95aec7d86b9d..6956934d7af7 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -184,6 +184,8 @@ "മുഖം തിരിച്ചറിയാനായില്ല. പകരം ഫിംഗർപ്രിന്റ് ഉപയോഗിക്കൂ." "തുടരുന്നതിന് നിങ്ങളുടെ ഫിംഗർപ്രിന്റ് ഉപയോഗിക്കുക" "ഫിംഗർപ്രിന്റ് തിരിച്ചറിയാനാകുന്നില്ല. പകരം സ്‌ക്രീൻ ലോക്ക് ഉപയോഗിക്കുക." + + "നിങ്ങൾക്കായി തിരയുന്നു…" "മുഖത്തിന്റെ ഐക്കൺ" "അനുയോജ്യതാ സൂം ബട്ടൺ." diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index 1665e456ecbc..0d1ad4bebce6 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -184,6 +184,8 @@ "Царай таних боломжгүй. Оронд нь хурууны хээ ашигла" "Үргэлжлүүлэхийн тулд хурууныхаа хээг ашиглана уу" "Хурууны хээг таних боломжгүй. Оронд нь дэлгэцийн түгжээ ашиглана уу." + + "Таныг хайж байна…" "Царайны дүрс тэмдэг" "Тохиромжтой өсгөх товч." diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index 0a79f48ffd4a..cee701953f69 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -184,6 +184,8 @@ "चेहरा ओळखू शकत नाही. त्याऐवजी फिंगरप्रिंट वापरा." "पुढे सुरू ठेवण्‍यासाठी तुमची फिंगरप्रिंट वापरा" "फिंगरप्रिंट ओळखता आली नाही. त्याऐवजी स्क्रीन लॉक वापरा." + + "तुमच्यासाठी शोधत आहे…" "चेहरा आयकन" "सुसंगतता झूम बटण." diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index 65cf32142770..b7d0246c4095 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -184,6 +184,8 @@ "Tidak mengenali wajah. Gunakan cap jari." "Gunakan cap jari anda untuk teruskan" "Tidak mengenali cap jari. Sebaliknya, gunakan kunci skrin." + + "Mencari anda…" "Ikon wajah" "Butang zum keserasian." diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index 07f3a75dced5..81d168b79065 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -184,6 +184,8 @@ "မျက်နှာကို မမှတ်မိပါ။ လက်ဗွေကို အစားထိုးသုံးပါ။" "ရှေ့ဆက်ရန် သင့်လက်ဗွေကို သုံးပါ" "လက်ဗွေကို မမှတ်မိပါ။ ဖန်သားပြင်လော့ခ်ချခြင်းကို အစားထိုးသုံးပါ။" + + "သင့်ကို ရှာဖွေနေသည်…" "မျက်နှာသင်္ကေတ" "အံဝင်ခွင်ကျ ဇူးမ်ခလုတ်" diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index 6c234001ade9..360c58b9e2dc 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -184,6 +184,8 @@ "Ansiktet gjenkjennes ikke. Bruk fingeravtrykk." "Bruk fingeravtrykket for å fortsette" "Fingeravtrykket gjenkjennes ikke. Bruk skjermlås i stedet." + + "Ser etter deg …" "Ansiktikon" "Zoomknapp for kompatibilitet." diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index 40ceb59e7169..e5787b578430 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -184,6 +184,8 @@ "अनुहार पहिचान गर्न सकिएन। बरु फिंगरप्रिन्ट प्रयोग गर्नुहोस्।" "जारी राख्न आफ्नो फिंगरप्रिन्ट प्रयोग गर्नुहोस्" "फिंगरप्रिन्ट पहिचान गर्न सकिएन। बरु स्क्रिन लक प्रयोग गर्नुहोस्।" + + "तपाईंलाई खोज्दै…" "अनुहारको आइकन" "मिलाउने जुम बटन।" diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index 6614638253f3..7d75b6e20a1e 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -184,6 +184,8 @@ "Gezicht niet herkend. Gebruik je vingerafdruk." "Gebruik je vingerafdruk om door te gaan." "Vingerafdruk niet herkend. Gebruik in plaats daarvan de schermvergrendeling." + + "Jouw gezicht zoeken…" "Gezichtspictogram" "Knop voor compatibiliteitszoom." diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index fab0ac601c69..ee524bf2e3c8 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -184,6 +184,8 @@ "ଫେସ୍ ଚିହ୍ନଟ କରିହେବ ନାହିଁ। ଟିପଚିହ୍ନ ବ୍ୟବହାର କରନ୍ତୁ।" "ଜାରି ରଖିବାକୁ ଆପଣଙ୍କ ଟିପଚିହ୍ନ ବ୍ୟବହାର କରନ୍ତୁ" "ଟିପଚିହ୍ନକୁ ଚିହ୍ନଟ କରାଯାଇପାରିବ ନାହିଁ। ଏହା ପରିବର୍ତ୍ତେ ସ୍କ୍ରିନ୍ ଲକ୍ ବ୍ୟବହାର କରନ୍ତୁ।" + + "ଆପଣଙ୍କୁ ଚିହ୍ନଟ କରୁଛି…" "ମୁହଁ ଆଇକନ୍" "କମ୍ପାଟିବିଲିଟୀ ଜୁମ୍ ବଟନ୍।" diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index 7e64a2407fd4..d68ab4fe347a 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -184,6 +184,8 @@ "ਚਿਹਰਾ ਨਹੀਂ ਪਛਾਣ ਸਕਦੇ। ਇਸਦੀ ਬਜਾਏ ਫਿੰਗਰਪ੍ਰਿੰਟ ਵਰਤੋ।" "ਜਾਰੀ ਰੱਖਣ ਲਈ ਆਪਣਾ ਫਿੰਗਰਪ੍ਰਿੰਟ ਵਰਤੋ" "ਫਿੰਗਰਪ੍ਰਿੰਟ ਦੀ ਪਛਾਣ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ। ਇਸਦੀ ਬਜਾਏ ਸਕ੍ਰੀਨ ਲਾਕ ਵਰਤੋ।" + + "ਤੁਹਾਡੀ ਪਛਾਣ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…" "ਚਿਹਰਾ ਪ੍ਰਤੀਕ" "ਅਨੁਰੂਪਤਾ ਜ਼ੂਮ ਬਟਨ।" diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index 7c0da9d29596..9aade18169ad 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -184,6 +184,8 @@ "Nie rozpoznaję twarzy. Użyj odcisku palca." "Użyj odcisku palca, aby kontynuować" "Nie rozpoznaję odcisku palca. Użyj blokady ekranu." + + "Szukam Cię…" "Ikona twarzy" "Przycisk powiększenia na potrzeby zgodności." diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index 1bfb7012aa39..cab482ae56fd 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -184,6 +184,8 @@ "Não foi possível reconhecer o rosto Use a impressão digital." "Use sua impressão digital para continuar" "Não foi possível reconhecer a impressão digital. Use o bloqueio de tela." + + "Procurando você…" "Ícone facial" "Botão de zoom da compatibilidade." diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index 80f4bc649ba9..eec34684ff4a 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -184,6 +184,8 @@ "Impos. reconh. rosto. Utilize a impressão digital." "Utilize a sua impressão digital para continuar" "Não é possível reconhecer a impressão digital. Em alternativa, utilize o bloqueio de ecrã." + + "À sua procura…" "Ícone de rosto" "Botão zoom de compatibilidade." diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 1bfb7012aa39..cab482ae56fd 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -184,6 +184,8 @@ "Não foi possível reconhecer o rosto Use a impressão digital." "Use sua impressão digital para continuar" "Não foi possível reconhecer a impressão digital. Use o bloqueio de tela." + + "Procurando você…" "Ícone facial" "Botão de zoom da compatibilidade." diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index d82626bb44be..1e30ea713210 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -184,6 +184,8 @@ "Chipul nu a fost recunoscut. Folosiți amprenta." "Folosiți amprenta pentru a continua" "Amprenta nu a fost recunoscută. Folosiți blocarea ecranului." + + "Vă căutăm…" "Pictograma chip" "Buton zoom pentru compatibilitate." diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index f3768280313a..99465d54e124 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -184,6 +184,8 @@ "Не удалось распознать лицо. Используйте отпечаток." "Чтобы продолжить, прикоснитесь пальцем к сканеру." "Не удалось распознать отпечаток пальца. Используйте другой способ разблокировки экрана." + + "Поиск лица…" "Значок лица" "Кнопка масштабирования (режим совместимости)" diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index 1f4813ea5f38..6ea2a0dd5d7a 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -184,6 +184,8 @@ "මුහුණ හැඳිනිය නොහැක. ඒ වෙනුවට ඇඟිලි සලකුණ භාවිත ක." "ඉදිරියට යාමට ඔබගේ ඇඟිලි සලකුණ භාවිත කරන්න" "ඇඟිලි සලකුණ හඳුනා ගත නොහැකිය. ඒ වෙනුවට තිර අගුල භාවිත කරන්න." + + "ඔබව සොයමින්…" "මුහුණ නිරූපකය" "ගැළපෙන විශාලන බොත්තම." diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index 966745b3789e..399b9797d21f 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -184,6 +184,8 @@ "Tvár sa nedá rozpoznať. Použite odtlačok prsta." "Pokračujte nasnímaním odtlačku prsta" "Odtlačok prsta sa nedá rozpoznať. Použite radšej zámku obrazovky." + + "Hľadáme vás…" "Ikona tváre" "Tlačidlo úpravy veľkosti z dôvodu kompatibility." diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index 7af0970e322d..0c93bced9f41 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -184,6 +184,8 @@ "Obraza ni mogoče prepoznati. Uporabite prstni odtis." "Uporabite prstni odtis, če želite nadaljevati." "Prstnega odtisa ni mogoče prepoznati. Uporabite odklepanje s poverilnico." + + "Preverjanje vašega obraza …" "Ikona obraza" "Gumb povečave za združljivost." diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index a948fae6de6b..7f101dbd3f57 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -184,6 +184,8 @@ "Nuk mund ta dallojë fytyrën. Përdor më mirë gjurmën e gishtit." "Përdor gjurmën e gishtit për të vazhduar" "Nuk mund ta dallojë gjurmën e gishtit. Përdor më mirë kyçjen e ekranit." + + "Po të kërkojmë…" "Ikona e fytyrës" "Butoni i zmadhimit të pajtueshmërisë." diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index 499c4e1d1489..1da42cfb2d3d 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -184,6 +184,8 @@ "Лице није препознато. Користите отисак прста." "Наставите помоћу отиска прста" "Препознавање отиска прста није успело. Користите закључавање екрана уместо тога." + + "Тражимо вас…" "Икона лица" "Дугме Зум компатибилности." diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index 86333f0e3a5c..05aeffbc300d 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -184,6 +184,8 @@ "Ansiktet kändes inte igen. Använd fingeravtryck." "Fortsätt med hjälp av ditt fingeravtryck" "Fingeravtrycket kändes inte igen. Använd låsskärmen i stället." + + "Håller utkik efter dig …" "Ansiktsikon" "Knapp för kompatibilitetszoom." diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index 6b938e41d392..7f51e82683b7 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -184,6 +184,8 @@ "Imeshindwa kutambua uso. Tumia alama ya kidole." "Tumia alama ya kidole chako ili uendelee" "Imeshindwa kutambua alama ya kidole. Tumia mbinu ya kufunga skrini badala yake." + + "Inakutafuta…" "Aikoni ya uso" "Kichupo cha kukuza kwa utangamanifu" diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index b9115a74910d..b51fb9efbbee 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -184,6 +184,8 @@ "முகத்தை அடையாளம் காண முடியவில்லை. கைரேகையைப் பயன்படுத்தவும்." "தொடர்வதற்குக் கைரேகையைப் பயன்படுத்தவும்" "கைரேகையை அடையாளம் காண முடியவில்லை. அதற்குப் பதிலாகத் திரைப்பூட்டைப் பயன்படுத்தவும்." + + "உங்கள் முகத்தைத் தேடுகிறது…" "முக ஐகான்" "பொருந்துமாறு அளவை மாற்றும் பட்டன்." diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index bcc5404af2f0..7ad382ec6bbc 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -103,7 +103,7 @@ "రికార్డ్ చేస్తున్నప్పుడు, Android సిస్టమ్ మీ స్క్రీన్‌పై ప్రదర్శించబడిన లేదా మీ పరికరం నుండి ప్లే చేయబడిన ఏ సున్నితమైన సమాచారాన్నైనా క్యాప్చర్ చేయగలదు. ఈ సమాచారంలో, పాస్‌వర్డ్‌లు, పేమెంట్ వివరాలు, ఫోటోలు, మెసేజ్‌లు, ఆడియో ఉంటాయి." "ఆడియోను రికార్డ్ చేయి" "పరికరం ఆడియో" - "మీ పరికరం నుండి వచ్చే సంగీతం, కాల్‌లు, రింగ్‌టోన్‌ల వంటి ధ్వనులు" + "మీ పరికరం నుండి వచ్చే సంగీతం, కాల్స్‌, రింగ్‌టోన్‌ల వంటి ధ్వనులు" "మైక్రోఫోన్" "పరికరం ఆడియో, మైక్రోఫోన్" "ప్రారంభించు" @@ -184,6 +184,8 @@ "ముఖం గుర్తించలేము. బదులుగా వేలిముద్ర ఉపయోగించండి." "కొనసాగించడానికి మీ వేలిముద్రను ఉపయోగించండి" "వేలిముద్రను గుర్తించడం సాధ్యపడదు. బదులుగా స్క్రీన్ లాక్‌ను ఉపయోగించండి." + + "మీ కోసం చూస్తోంది…" "ముఖ చిహ్నం" "అనుకూలత జూమ్ బటన్." @@ -445,7 +447,7 @@ "మీరు పేర్కొనే అలారాలు, రిమైండర్‌లు, ఈవెంట్‌లు మరియు కాలర్‌ల నుండి మినహా మరే ఇతర ధ్వనులు మరియు వైబ్రేషన్‌లతో మీకు అంతరాయం కలగదు. మీరు ఇప్పటికీ సంగీతం, వీడియోలు మరియు గేమ్‌లతో సహా మీరు ప్లే చేయడానికి ఎంచుకున్నవి ఏవైనా వింటారు." "అలారాలు నుండి మినహా మరే ఇతర ధ్వనులు మరియు వైబ్రేషన్‌లతో మీకు అంతరాయం కలగదు. మీరు ఇప్పటికీ సంగీతం, వీడియోలు మరియు గేమ్‌లతో సహా మీరు ప్లే చేయడానికి ఎంచుకున్నవి ఏవైనా వింటారు." "అనుకూలీకరించు" - "ఇది అలారాలు, సంగీతం, వీడియోలు మరియు గేమ్‌లతో సహా అన్ని ధ్వనులు మరియు వైబ్రేషన్‌లను బ్లాక్ చేస్తుంది. మీరు ఇప్పటికీ ఫోన్ కాల్‌లు చేయగలుగుతారు." + "ఇది అలారాలు, సంగీతం, వీడియోలు మరియు గేమ్‌లతో సహా అన్ని ధ్వనులు మరియు వైబ్రేషన్‌లను బ్లాక్ చేస్తుంది. మీరు ఇప్పటికీ ఫోన్ కాల్స్‌ చేయగలుగుతారు." "ఇది అలారాలు, సంగీతం, వీడియోలు మరియు గేమ్‌లతో సహా అన్ని ధ్వనులు మరియు వైబ్రేషన్‌లను బ్లాక్ చేస్తుంది." "+%d" "తక్కువ అత్యవసర నోటిఫికేషన్‌లు దిగువన" @@ -629,7 +631,7 @@ "బ్లూటూత్" "డ్యూయల్ మల్టీ టోన్ ఫ్రీక్వెన్సీ" "యాక్సెసిబిలిటీ" - "కాల్‌లు" + "కాల్స్‌" "రింగ్" "వైబ్రేట్" "మ్యూట్" @@ -645,7 +647,7 @@ "అన్‌మ్యూట్ చేయి" "వైబ్రేట్" "%s వాల్యూమ్ నియంత్రణలు" - "కాల్‌లు మరియు నోటిఫికేషన్‌లు రింగ్ అవుతాయి (%1$s)" + "కాల్స్‌ మరియు నోటిఫికేషన్‌లు రింగ్ అవుతాయి (%1$s)" "మీడియా అవుట్‌పుట్" "ఫోన్ కాల్ అవుట్‌పుట్" "పరికరాలు ఏవీ కనుగొనబడలేదు" @@ -935,7 +937,7 @@ "లాక్ స్క్రీన్" "వేడెక్కినందుకు ఫోన్ ఆఫ్ చేయబడింది" "మీ ఫోన్ ఇప్పుడు సాధారణంగా పని చేస్తోంది.\nమరింత సమాచారం కోసం ట్యాప్ చేయండి" - "మీ ఫోన్ చాలా వేడిగా ఉంది, కనుక చల్లబర్చడానికి ఆఫ్ చేయబడింది. మీ ఫోన్ ఇప్పుడు సాధారణంగా పని చేస్తుంది.\n\nమీరు ఇలా చేస్తే మీ ఫోన్ చాలా వేడెక్కవచ్చు:\n • వనరు-ఆధారిత యాప్‌లు (గేమింగ్, వీడియో లేదా నావిగేషన్ వంటి యాప్‌లు) ఉపయోగించడం\n • పెద్ద ఫైల్‌లను డౌన్‌లోడ్ లేదా అప్‌లోడ్ చేయడం\n • అధిక ఉష్ణోగ్రతలలో మీ ఫోన్‌ని ఉపయోగించడం" + "మీ ఫోన్ చాలా వేడిగా ఉంది, కనుక చల్లబర్చడానికి ఆఫ్ చేయబడింది. మీ ఫోన్ ఇప్పుడు సాధారణంగా పని చేస్తుంది.\n\nమీరు ఇలా చేస్తే మీ ఫోన్ చాలా వేడెక్కవచ్చు:\n • వనరు-ఆధారిత యాప్‌లు (గేమింగ్, వీడియో లేదా నావిగేషన్ వంటి యాప్‌లు) ఉపయోగించడం\n • పెద్ద ఫైళ్లను డౌన్‌లోడ్ లేదా అప్‌లోడ్ చేయడం\n • అధిక ఉష్ణోగ్రతలలో మీ ఫోన్‌ని ఉపయోగించడం" "తీసుకోవాల్సిన జాగ్రత్తలు ఏమిటో చూడండి" "ఫోన్ వేడెక్కుతోంది" "ఫోన్‌ను చల్లబరిచే క్రమంలో కొన్ని ఫీచర్లు పరిమితం చేయబడ్డాయి.\nమరింత సమాచారం కోసం ట్యాప్ చేయండి" @@ -1142,7 +1144,7 @@ "కంటెంట్ త్వరలో కనిపిస్తుంది" "మిస్డ్ కాల్" "%d+" - "ఇటీవలి మెసేజ్‌లు, మిస్డ్ కాల్‌లు, అలాగే స్టేటస్ అప్‌డేట్‌లను చూడండి" + "ఇటీవలి మెసేజ్‌లు, మిస్డ్ కాల్స్‌, అలాగే స్టేటస్ అప్‌డేట్‌లను చూడండి" "సంభాషణ" "అంతరాయం కలిగించవద్దు ద్వారా పాజ్ చేయబడింది" "%1$s మెసేజ్‌ను పంపారు: %2$s" diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index 6f7df9fdcf3f..1fd1313719dc 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -184,6 +184,8 @@ "ไม่รู้จักใบหน้า ใช้ลายนิ้วมือแทน" "ใช้ลายนิ้วมือของคุณเพื่อดำเนินการต่อ" "ไม่รู้จักลายนิ้วมือ ใช้การล็อกหน้าจอแทน" + + "กำลังหาใบหน้าคุณ…" "ไอคอนใบหน้า" "ปุ่มซูมที่ใช้งานร่วมกันได้" diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index d0312b3a99f6..3837364887cf 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -184,6 +184,8 @@ "Hindi makilala ang mukha. Gumamit ng fingerprint." "Gamitin ang iyong fingerprint para magpatuloy" "Hindi makilala ang fingerprint. Gamitin na lang ang lock ng screen." + + "Hinahanap ka…" "Face icon" "Button ng zoom ng pagiging tugma." diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 33eb5f3f9af2..1cd547ca7793 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -184,6 +184,8 @@ "Yüz tanınamadı. Bunun yerine parmak izi kullanın." "Devam etmek için parmak izinizi kullanın" "Parmak izi tanınamadı. Bunun yerine ekran kilidini kullanın." + + "Yüzünüz tanınmaya çalışılıyor…" "Yüz simgesi" "Uyumluluk zum düğmesi." diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 24650f751319..70922aa77db3 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -184,6 +184,8 @@ "Обличчя не розпізнано. Скористайтеся відбитком пальця." "Щоб продовжити, скористайтеся відбитком пальця" "Відбиток пальця не розпізнано. Використайте натомість дані для розблокування екрана." + + "Пошук обличчя…" "Значок обличчя" "Кнопка масштабування сумісності." diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index 5afb43d42a69..7ef014923960 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -184,6 +184,8 @@ "چہرے کی شناخت نہیں ہو سکی۔ اس کے بجائے فنگر پرنٹ استعمال کریں۔" "جاری رکھنے کے لیے اپنا فنگر پرنٹ استعمال کریں" "فنگر پرنٹ کی شناخت نہیں کی جا سکی۔ اس کے بجائے اسکرین لاک کا استعمال کریں۔" + + "آپ کے لیے تلاش کیا جا رہا ہے…" "چہرے کا آئیکن" "مطابقت پذیری زوم بٹن۔" diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index 7968452ec284..08ac980d3bee 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -184,6 +184,8 @@ "Bu yuz notanish. Barmoq izi orqali urining." "Davom etish uchun barmoq izingizdan foydalaning" "Bu barmoq izi notanish. Ekran qulfi orqali urining." + + "Yuzingiz tekshirilmoqda…" "Yuz belgisi" "Kattalashtirish tugmasi mosligi." diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 50e45cb9c114..60b1232cd8a3 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -184,6 +184,8 @@ "Không thể nhận dạng khuôn mặt. Hãy dùng vân tay." "Hãy dùng vân tay để tiếp tục" "Không thể nhận dạng vân tay. Hãy dùng phương thức khóa màn hình." + + "Đang tìm kiếm bạn…" "Biểu tượng khuôn mặt" "Nút thu phóng khả năng tương thích." diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index 2291902333ba..357e59e7ece5 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -184,6 +184,8 @@ "无法识别人脸。请改用指纹。" "使用指纹验证身份后才能继续" "无法识别指纹。请改用屏幕锁定功能。" + + "正在查找您的面孔…" "面孔图标" "兼容性缩放按钮。" diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index 38228895297b..f8ede3a55b88 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -184,6 +184,8 @@ "無法辨識面孔,請改用指紋完成驗證。" "請使用您的指紋繼續" "無法辨識指紋,請改用螢幕鎖定完成驗證。" + + "正在搜尋您的臉孔…" "面孔圖示" "相容性縮放按鈕。" diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index fd6ad7ad5bd7..df84fb0699c9 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -184,6 +184,8 @@ "無法辨識臉孔,請改用指紋完成驗證。" "使用指紋完成驗證才能繼續操作" "無法辨識指紋,請改用螢幕鎖定完成驗證。" + + "正在尋找你的臉孔…" "臉孔圖示" "相容性縮放按鈕。" diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index 58ecc7c3b147..fe97daa7682e 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -184,6 +184,8 @@ "Ayibazi ubuso. Sebenzisa izigxivizo zeminwe kunalokho." "Sebenzisa izigxivizo zakho zeminwe ukuze uqhubeke" "Ayizazi izigxivizo zeminwe. Sebenzisa ukukhiya isikrini kunalokho." + + "Kufunwa wena…" "Isithonjana sobuso" "Inkinobho evumelekile yokusondeza" -- cgit v1.2.3 From 5329ad47a53d2125f986bbedf2e3437f16f37b6b Mon Sep 17 00:00:00 2001 From: Caitlin Cassidy Date: Mon, 9 Aug 2021 17:17:03 +0000 Subject: [Ongoing Call] Always unregister the UidObserver. Test: atest OngoingCallControllerTest Fixes: 194731244 Change-Id: I39d20313f78ec0c632dcde999abc0057141bac64 --- .../statusbar/phone/ongoingcall/OngoingCallController.kt | 4 ++++ .../phone/ongoingcall/OngoingCallControllerTest.kt | 15 +++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt index 16fa5da9e979..6982631766f7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt @@ -218,6 +218,10 @@ class OngoingCallController @Inject constructor( isCallAppVisible = isProcessVisibleToUser( iActivityManager.getUidProcessState(currentCallNotificationInfo.uid, null)) + if (uidObserver != null) { + iActivityManager.unregisterUidObserver(uidObserver) + } + uidObserver = object : IUidObserver.Stub() { override fun onUidStateChanged( uid: Int, procState: Int, procStateSeq: Long, capability: Int) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallControllerTest.kt index d36cb0b3a717..d26db4c69ece 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallControllerTest.kt @@ -184,6 +184,21 @@ class OngoingCallControllerTest : SysuiTestCase() { .isGreaterThan(0) } + /** Regression test for b/194731244. */ + @Test + fun onEntryUpdated_calledManyTimes_uidObserverUnregisteredManyTimes() { + val numCalls = 4 + + for (i in 0 until numCalls) { + // Re-create the notification each time so that it's considered a different object and + // observers will get re-registered (and hopefully unregistered). + notifCollectionListener.onEntryUpdated(createOngoingCallNotifEntry()) + } + + // There should be 1 observer still registered, so we should unregister n-1 times. + verify(mockIActivityManager, times(numCalls - 1)).unregisterUidObserver(any()) + } + /** * If a call notification is never added before #onEntryRemoved is called, then the listener * should never be notified. -- cgit v1.2.3 From eb5a3553dcae07481b15b93dd7223e29611a36b4 Mon Sep 17 00:00:00 2001 From: Leon Scroggins III Date: Mon, 9 Aug 2021 14:22:15 -0400 Subject: Do not turn on dithering by default Bug: 195281495 Test: Ief7025c21f365ae90fa63120f1cc82e0695901af This is a partial revert of 47c51fe80e3dd9d6b518c11c2e1714c271835af5/ I5d5d03e430af380e23016c6deba5eca46067a22b. The intent was to bring today's rendering implementation in line with the old HWUI implementation, which always dithered gradients by default. However, when dithering is enabled, the Skia implementation dithers more than just gradients (e.g. Bitmaps). Combined with poor performance of the dithering algorithm on certain GPUs, this led to a performance regression on key apps. Change-Id: Id54121091e2cc47131dc9b5ae67bd638fbc005fc --- graphics/java/android/graphics/Paint.java | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/graphics/java/android/graphics/Paint.java b/graphics/java/android/graphics/Paint.java index 51bf6d539ce8..42e470b7f660 100644 --- a/graphics/java/android/graphics/Paint.java +++ b/graphics/java/android/graphics/Paint.java @@ -254,12 +254,6 @@ public class Paint { static final int HIDDEN_DEFAULT_PAINT_FLAGS = DEV_KERN_TEXT_FLAG | EMBEDDED_BITMAP_TEXT_FLAG | FILTER_BITMAP_FLAG; - /** - * These flags are always set on a reset paint or a new paint instantiated using - * {@link #Paint()}. - */ - private static final int DEFAULT_PAINT_FLAGS = ANTI_ALIAS_FLAG | DITHER_FLAG; - /** * Font hinter option that disables font hinting. * @@ -577,12 +571,12 @@ public class Paint { * On devices running {@link Build.VERSION_CODES#Q} and above, * {@code FILTER_BITMAP_FLAG} is set by this constructor, and it can be * cleared with {@link #setFlags} or {@link #setFilterBitmap}. - * On devices running {@link Build.VERSION_CODES#S} and above, {@code ANTI_ALIAS_FLAG} and - * {@code DITHER_FLAG} are set by this constructor, and they can be cleared with - * {@link #setFlags} or {@link #setAntiAlias} and {@link #setDither}, respectively.

+ * On devices running {@link Build.VERSION_CODES#S} and above, {@code ANTI_ALIAS_FLAG} + * is set by this constructor, and it can be cleared with {@link #setFlags} or + * {@link #setAntiAlias}.

*/ public Paint() { - this(DEFAULT_PAINT_FLAGS); + this(ANTI_ALIAS_FLAG); } /** @@ -627,7 +621,7 @@ public class Paint { /** Restores the paint to its default settings. */ public void reset() { nReset(mNativePaint); - setFlags(HIDDEN_DEFAULT_PAINT_FLAGS | DEFAULT_PAINT_FLAGS); + setFlags(HIDDEN_DEFAULT_PAINT_FLAGS | ANTI_ALIAS_FLAG); // TODO: Turning off hinting has undesirable side effects, we need to // revisit hinting once we add support for subpixel positioning -- cgit v1.2.3 From 73e1c53c80bd0a503ed7ef531b561558cbb5010e Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Mon, 9 Aug 2021 11:38:07 -0700 Subject: Consider shade expansion when blurring because QS Test: manually pull shade when locked, unlocked, from top and middle Test: atest NotificationShadeDepthControllerTest Fixes: 195285764 Bug: 195667456 Change-Id: I19e73a4a1b49c73534f3e20884da8a198ae83b6a --- .../com/android/systemui/statusbar/NotificationShadeDepthController.kt | 3 ++- .../android/systemui/statusbar/NotificationShadeDepthControllerTest.kt | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt index db553e4b093b..002c9c7d2544 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt @@ -178,7 +178,8 @@ class NotificationShadeDepthController @Inject constructor( blurUtils.minBlurRadius, blurUtils.maxBlurRadius) var combinedBlur = (shadeSpring.radius * INTERACTION_BLUR_FRACTION + normalizedBlurRadius * ANIMATION_BLUR_FRACTION).toInt() - combinedBlur = max(combinedBlur, blurUtils.blurRadiusOfRatio(qsPanelExpansion)) + val qsExpandedRatio = qsPanelExpansion * shadeExpansion + combinedBlur = max(combinedBlur, blurUtils.blurRadiusOfRatio(qsExpandedRatio)) combinedBlur = max(combinedBlur, blurUtils.blurRadiusOfRatio(transitionToFullShadeProgress)) var shadeRadius = max(combinedBlur, wakeAndUnlockBlurRadius).toFloat() diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationShadeDepthControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationShadeDepthControllerTest.kt index d23a9ce26def..7c045c1f2894 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationShadeDepthControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationShadeDepthControllerTest.kt @@ -184,8 +184,9 @@ class NotificationShadeDepthControllerTest : SysuiTestCase() { @Test fun setQsPanelExpansion_appliesBlur() { notificationShadeDepthController.qsPanelExpansion = 1f + notificationShadeDepthController.onPanelExpansionChanged(0.5f, tracking = false) notificationShadeDepthController.updateBlurCallback.doFrame(0) - verify(blurUtils).applyBlur(any(), eq(maxBlur), eq(false)) + verify(blurUtils).applyBlur(any(), eq(maxBlur / 2), eq(false)) } @Test -- cgit v1.2.3 From a57b0e9c4eb13412bd8618890991b99681b7144a Mon Sep 17 00:00:00 2001 From: Ryan Mitchell Date: Mon, 9 Aug 2021 13:14:05 -0700 Subject: Revert "Revert "Apply overlay updates to widget provider info"" Bug: 15332156 Bug: 195649929 This reverts commit 471720cccf848d896639322644314e16264f8af8. Change-Id: Ifa89ae43613add1137ddeca4cb40543a3a01d6a7 --- .../appwidget/AppWidgetManagerInternal.java | 14 +++++ core/java/android/widget/RemoteViews.java | 19 +++++++ .../server/appwidget/AppWidgetServiceImpl.java | 60 ++++++++++++++++++++++ .../android/server/am/ActivityManagerService.java | 8 +++ 4 files changed, 101 insertions(+) diff --git a/core/java/android/appwidget/AppWidgetManagerInternal.java b/core/java/android/appwidget/AppWidgetManagerInternal.java index 5694ca860453..266e33af0e22 100644 --- a/core/java/android/appwidget/AppWidgetManagerInternal.java +++ b/core/java/android/appwidget/AppWidgetManagerInternal.java @@ -19,6 +19,8 @@ package android.appwidget; import android.annotation.Nullable; import android.util.ArraySet; +import java.util.Set; + /** * App widget manager local system service interface. * @@ -42,4 +44,16 @@ public abstract class AppWidgetManagerInternal { * @param userId The user that is being unlocked. */ public abstract void unlockUser(int userId); + + /** + * Updates all widgets, applying changes to Runtime Resource Overlay affecting the specified + * target packages. + * + * @param packageNames The names of all target packages for which an overlay was modified + * @param userId The user for which overlay modifications occurred. + * @param updateFrameworkRes Whether or not an overlay affected the values of framework + * resources. + */ + public abstract void applyResourceOverlaysToWidgets(Set packageNames, int userId, + boolean updateFrameworkRes); } diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java index e827f0a31bfd..91fc5a56d979 100644 --- a/core/java/android/widget/RemoteViews.java +++ b/core/java/android/widget/RemoteViews.java @@ -5824,6 +5824,25 @@ public class RemoteViews implements Parcelable, Filter { return false; } + /** @hide */ + public void updateAppInfo(@NonNull ApplicationInfo info) { + if (mApplication != null && mApplication.sourceDir.equals(info.sourceDir)) { + // Overlay paths are generated against a particular version of an application. + // The overlays paths of a newly upgraded application are incompatible with the + // old version of the application. + mApplication = info; + } + if (hasSizedRemoteViews()) { + for (RemoteViews layout : mSizedRemoteViews) { + layout.updateAppInfo(info); + } + } + if (hasLandscapeAndPortraitLayouts()) { + mLandscape.updateAppInfo(info); + mPortrait.updateAppInfo(info); + } + } + private Context getContextForResources(Context context) { if (mApplication != null) { if (context.getUserId() == UserHandle.getUserId(mApplication.uid) diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java index 5aec6aa99c12..a56b1db1494c 100644 --- a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java +++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java @@ -3285,6 +3285,57 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku } } + private void applyResourceOverlaysToWidgetsLocked(Set packageNames, int userId, + boolean updateFrameworkRes) { + for (int i = 0, N = mProviders.size(); i < N; i++) { + Provider provider = mProviders.get(i); + if (provider.getUserId() != userId) { + continue; + } + + final String packageName = provider.id.componentName.getPackageName(); + if (!updateFrameworkRes && !packageNames.contains(packageName)) { + continue; + } + + ApplicationInfo newAppInfo = null; + try { + newAppInfo = mPackageManager.getApplicationInfo(packageName, + PackageManager.GET_SHARED_LIBRARY_FILES, userId); + } catch (RemoteException e) { + Slog.w(TAG, "Failed to retrieve app info for " + packageName + + " userId=" + userId, e); + } + if (newAppInfo == null) { + continue; + } + ApplicationInfo oldAppInfo = provider.info.providerInfo.applicationInfo; + if (!newAppInfo.sourceDir.equals(oldAppInfo.sourceDir)) { + // Overlay paths are generated against a particular version of an application. + // The overlays paths of a newly upgraded application are incompatible with the + // old version of the application. + continue; + } + + // Isolate the changes relating to RROs. The app info must be copied to prevent + // affecting other parts of system server that may have cached this app info. + oldAppInfo = new ApplicationInfo(oldAppInfo); + oldAppInfo.overlayPaths = newAppInfo.overlayPaths.clone(); + oldAppInfo.resourceDirs = newAppInfo.resourceDirs.clone(); + provider.info.providerInfo.applicationInfo = oldAppInfo; + + for (int j = 0, M = provider.widgets.size(); j < M; j++) { + Widget widget = provider.widgets.get(j); + if (widget.views != null) { + widget.views.updateAppInfo(oldAppInfo); + } + if (widget.maskedViews != null) { + widget.maskedViews.updateAppInfo(oldAppInfo); + } + } + } + } + /** * Updates all providers with the specified package names, and records any providers that were * pruned. @@ -4875,5 +4926,14 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku public void unlockUser(int userId) { handleUserUnlocked(userId); } + + @Override + public void applyResourceOverlaysToWidgets(Set packageNames, int userId, + boolean updateFrameworkRes) { + synchronized (mLock) { + applyResourceOverlaysToWidgetsLocked(new HashSet<>(packageNames), userId, + updateFrameworkRes); + } + } } } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 99ae52c00995..e0df4b797fe5 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -193,6 +193,7 @@ import android.app.usage.UsageEvents.Event; import android.app.usage.UsageStatsManager; import android.app.usage.UsageStatsManagerInternal; import android.appwidget.AppWidgetManager; +import android.appwidget.AppWidgetManagerInternal; import android.content.AttributionSource; import android.content.AutofillOptions; import android.content.BroadcastReceiver; @@ -16597,6 +16598,13 @@ public class ActivityManagerService extends IActivityManager.Stub if (updateFrameworkRes) { ParsingPackageUtils.readConfigUseRoundIcon(null); } + + AppWidgetManagerInternal widgets = LocalServices.getService(AppWidgetManagerInternal.class); + if (widgets != null) { + widgets.applyResourceOverlaysToWidgets(new HashSet<>(packagesToUpdate), userId, + updateFrameworkRes); + } + mProcessList.updateApplicationInfoLOSP(packagesToUpdate, userId, updateFrameworkRes); if (updateFrameworkRes) { -- cgit v1.2.3 From 9070689419e624681e9b8103049421d73b2bfc8d Mon Sep 17 00:00:00 2001 From: Ryan Mitchell Date: Mon, 9 Aug 2021 13:01:07 -0700 Subject: Fix app widget deadlock when toggling overlays AppWidgetManager uses ActivityManager so we must update it without holding the AMS lock. Bug: 195649929 Bug: 193866093 Test: Repeatedly change wallpaper & style color to a "basic" color and go back to launcher to observe overlay correct color is applied Change-Id: I7a3ba2af026b98c87da8ebbe4dbca602f8c4bcf2 --- .../android/server/am/ActivityManagerService.java | 30 ++++++++++++---------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index e0df4b797fe5..953e6e24236f 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -16570,13 +16570,21 @@ public class ActivityManagerService extends IActivityManager.Stub enforceCallingPermission(android.Manifest.permission.CHANGE_CONFIGURATION, "scheduleApplicationInfoChanged()"); - synchronized (mProcLock) { - final long origId = Binder.clearCallingIdentity(); - try { - updateApplicationInfoLOSP(packageNames, userId); - } finally { - Binder.restoreCallingIdentity(origId); + final long origId = Binder.clearCallingIdentity(); + try { + final boolean updateFrameworkRes = packageNames.contains("android"); + synchronized (mProcLock) { + updateApplicationInfoLOSP(packageNames, updateFrameworkRes, userId); + } + + AppWidgetManagerInternal widgets = LocalServices.getService( + AppWidgetManagerInternal.class); + if (widgets != null) { + widgets.applyResourceOverlaysToWidgets(new HashSet<>(packageNames), userId, + updateFrameworkRes); } + } finally { + Binder.restoreCallingIdentity(origId); } } @@ -16593,18 +16601,12 @@ public class ActivityManagerService extends IActivityManager.Stub } @GuardedBy(anyOf = {"this", "mProcLock"}) - private void updateApplicationInfoLOSP(@NonNull List packagesToUpdate, int userId) { - final boolean updateFrameworkRes = packagesToUpdate.contains("android"); + private void updateApplicationInfoLOSP(@NonNull List packagesToUpdate, + boolean updateFrameworkRes, int userId) { if (updateFrameworkRes) { ParsingPackageUtils.readConfigUseRoundIcon(null); } - AppWidgetManagerInternal widgets = LocalServices.getService(AppWidgetManagerInternal.class); - if (widgets != null) { - widgets.applyResourceOverlaysToWidgets(new HashSet<>(packagesToUpdate), userId, - updateFrameworkRes); - } - mProcessList.updateApplicationInfoLOSP(packagesToUpdate, userId, updateFrameworkRes); if (updateFrameworkRes) { -- cgit v1.2.3 From c7bdaff11fb8f7442b882aadb9f5e402f8f827f6 Mon Sep 17 00:00:00 2001 From: Beverly Date: Mon, 9 Aug 2021 15:16:42 -0400 Subject: Update udfps AOD icon Change burn in prevention period to a prime number to avoid overlap with other periods Test: manual Refer to bug for burn-in simulation Fixes: 195773640 Change-Id: I4c9dd875827138b8cd0407a01e7bb4941bb48088 --- packages/SystemUI/res/raw/udfps_aod_fp.json | 1920 ++++---------------- .../com/android/systemui/doze/util/BurnInHelper.kt | 4 +- 2 files changed, 306 insertions(+), 1618 deletions(-) diff --git a/packages/SystemUI/res/raw/udfps_aod_fp.json b/packages/SystemUI/res/raw/udfps_aod_fp.json index 3b273ff92814..51d9058f4dd2 100644 --- a/packages/SystemUI/res/raw/udfps_aod_fp.json +++ b/packages/SystemUI/res/raw/udfps_aod_fp.json @@ -5,7 +5,7 @@ "op":361, "w":46, "h":65, - "nm":"fingerprint_burn_in_Loop_02", + "nm":"fingerprint_burn_in_loop", "ddd":0, "assets":[ @@ -15,7 +15,7 @@ "ddd":0, "ind":2, "ty":4, - "nm":"Fingerprint_20210701 Outlines 9", + "nm":"Fingerprint_20210701 Outlines 8", "sr":1, "ks":{ "o":{ @@ -90,1394 +90,51 @@ ], [ -1.485, - -0.816 - ] - ], - "o":[ - [ - 1.455, - -0.799 - ], - [ - 1.608, - -0.397 - ], - [ - 1.719, - 0 - ], - [ - 1.739, - 0.42 - ], - [ - 0, - 0 - ] - ], - "v":[ - [ - -9.818, - 1.227 - ], - [ - -5.064, - -0.618 - ], - [ - 0, - -1.227 - ], - [ - 4.96, - -0.643 - ], - [ - 9.818, - 1.227 - ] - ], - "c":false - }, - "ix":2 - }, - "nm":"Path 1", - "mn":"ADBE Vector Shape - Group", - "hd":false - }, - { - "ty":"st", - "c":{ - "a":0, - "k":[ - 1, - 1, - 1, - 1 - ], - "ix":3 - }, - "o":{ - "a":0, - "k":100, - "ix":4 - }, - "w":{ - "a":0, - "k":1.3, - "ix":5 - }, - "lc":2, - "lj":1, - "ml":10, - "bm":0, - "nm":"Stroke 1", - "mn":"ADBE Vector Graphic - Stroke", - "hd":false - }, - { - "ty":"tr", - "p":{ - "a":0, - "k":[ - 19.341, - 7.477 - ], - "ix":2 - }, - "a":{ - "a":0, - "k":[ - 0, - 0 - ], - "ix":1 - }, - "s":{ - "a":0, - "k":[ - 100, - 100 - ], - "ix":3 - }, - "r":{ - "a":0, - "k":0, - "ix":6 - }, - "o":{ - "a":0, - "k":100, - "ix":7 - }, - "sk":{ - "a":0, - "k":0, - "ix":4 - }, - "sa":{ - "a":0, - "k":0, - "ix":5 - }, - "nm":"Transform" - } - ], - "nm":"Top", - "np":2, - "cix":2, - "bm":0, - "ix":1, - "mn":"ADBE Vector Group", - "hd":false - }, - { - "ty":"tm", - "s":{ - "a":0, - "k":0, - "ix":1 - }, - "e":{ - "a":0, - "k":17, - "ix":2 - }, - "o":{ - "a":1, - "k":[ - { - "i":{ - "x":[ - 0.833 - ], - "y":[ - 0.833 - ] - }, - "o":{ - "x":[ - 0.167 - ], - "y":[ - 0.167 - ] - }, - "t":0, - "s":[ - 246 - ] - }, - { - "t":360, - "s":[ - 1326 - ] - } - ], - "ix":3 - }, - "m":1, - "ix":2, - "nm":"Trim Paths 1", - "mn":"ADBE Vector Filter - Trim", - "hd":false - }, - { - "ty":"gr", - "it":[ - { - "ty":"tm", - "s":{ - "a":0, - "k":0, - "ix":1 - }, - "e":{ - "a":0, - "k":17, - "ix":2 - }, - "o":{ - "a":0, - "k":0, - "ix":3 - }, - "m":1, - "ix":1, - "nm":"Trim Paths 1", - "mn":"ADBE Vector Filter - Trim", - "hd":false - }, - { - "ty":"tr", - "p":{ - "a":0, - "k":[ - 0, - 0 - ], - "ix":2 - }, - "a":{ - "a":0, - "k":[ - 0, - 0 - ], - "ix":1 - }, - "s":{ - "a":0, - "k":[ - 100, - 100 - ], - "ix":3 - }, - "r":{ - "a":0, - "k":0, - "ix":6 - }, - "o":{ - "a":0, - "k":100, - "ix":7 - }, - "sk":{ - "a":0, - "k":0, - "ix":4 - }, - "sa":{ - "a":0, - "k":0, - "ix":5 - }, - "nm":"Transform" - } - ], - "nm":"Group 1", - "np":1, - "cix":2, - "bm":0, - "ix":3, - "mn":"ADBE Vector Group", - "hd":false - } - ], - "ip":0, - "op":600, - "st":0, - "bm":0 - }, - { - "ddd":0, - "ind":3, - "ty":4, - "nm":"Fingerprint_20210701 Outlines 8", - "sr":1, - "ks":{ - "o":{ - "a":0, - "k":100, - "ix":11 - }, - "r":{ - "a":0, - "k":0, - "ix":10 - }, - "p":{ - "a":0, - "k":[ - 23.091, - 32.5, - 0 - ], - "ix":2, - "l":2 - }, - "a":{ - "a":0, - "k":[ - 19.341, - 24.25, - 0 - ], - "ix":1, - "l":2 - }, - "s":{ - "a":0, - "k":[ - 100, - 100, - 100 - ], - "ix":6, - "l":2 - } - }, - "ao":0, - "shapes":[ - { - "ty":"gr", - "it":[ - { - "ind":0, - "ty":"sh", - "ix":1, - "ks":{ - "a":0, - "k":{ - "i":[ - [ - 0, - 0 - ], - [ - -1.701, - 0.42 - ], - [ - -1.757, - 0 - ], - [ - -1.577, - -0.381 - ], - [ - -1.485, - -0.816 - ] - ], - "o":[ - [ - 1.455, - -0.799 - ], - [ - 1.608, - -0.397 - ], - [ - 1.719, - 0 - ], - [ - 1.739, - 0.42 - ], - [ - 0, - 0 - ] - ], - "v":[ - [ - -9.818, - 1.227 - ], - [ - -5.064, - -0.618 - ], - [ - 0, - -1.227 - ], - [ - 4.96, - -0.643 - ], - [ - 9.818, - 1.227 - ] - ], - "c":false - }, - "ix":2 - }, - "nm":"Path 1", - "mn":"ADBE Vector Shape - Group", - "hd":false - }, - { - "ty":"st", - "c":{ - "a":0, - "k":[ - 1, - 1, - 1, - 1 - ], - "ix":3 - }, - "o":{ - "a":0, - "k":100, - "ix":4 - }, - "w":{ - "a":0, - "k":1.3, - "ix":5 - }, - "lc":2, - "lj":1, - "ml":10, - "bm":0, - "nm":"Stroke 1", - "mn":"ADBE Vector Graphic - Stroke", - "hd":false - }, - { - "ty":"tr", - "p":{ - "a":0, - "k":[ - 19.341, - 7.477 - ], - "ix":2 - }, - "a":{ - "a":0, - "k":[ - 0, - 0 - ], - "ix":1 - }, - "s":{ - "a":0, - "k":[ - 100, - 100 - ], - "ix":3 - }, - "r":{ - "a":0, - "k":0, - "ix":6 - }, - "o":{ - "a":0, - "k":100, - "ix":7 - }, - "sk":{ - "a":0, - "k":0, - "ix":4 - }, - "sa":{ - "a":0, - "k":0, - "ix":5 - }, - "nm":"Transform" - } - ], - "nm":"Top", - "np":2, - "cix":2, - "bm":0, - "ix":1, - "mn":"ADBE Vector Group", - "hd":false - }, - { - "ty":"tm", - "s":{ - "a":0, - "k":0, - "ix":1 - }, - "e":{ - "a":0, - "k":54, - "ix":2 - }, - "o":{ - "a":1, - "k":[ - { - "i":{ - "x":[ - 0.833 - ], - "y":[ - 0.833 - ] - }, - "o":{ - "x":[ - 0.167 - ], - "y":[ - 0.167 - ] - }, - "t":0, - "s":[ - 0 - ] - }, - { - "t":360, - "s":[ - 1080 - ] - } - ], - "ix":3 - }, - "m":1, - "ix":2, - "nm":"Trim Paths 1", - "mn":"ADBE Vector Filter - Trim", - "hd":false - } - ], - "ip":0, - "op":600, - "st":0, - "bm":0 - }, - { - "ddd":0, - "ind":4, - "ty":4, - "nm":"Fingerprint_20210701 Outlines 7", - "sr":1, - "ks":{ - "o":{ - "a":0, - "k":100, - "ix":11 - }, - "r":{ - "a":0, - "k":0, - "ix":10 - }, - "p":{ - "a":0, - "k":[ - 23.091, - 32.5, - 0 - ], - "ix":2, - "l":2 - }, - "a":{ - "a":0, - "k":[ - 19.341, - 24.25, - 0 - ], - "ix":1, - "l":2 - }, - "s":{ - "a":0, - "k":[ - 100, - 100, - 100 - ], - "ix":6, - "l":2 - } - }, - "ao":0, - "shapes":[ - { - "ty":"gr", - "it":[ - { - "ind":0, - "ty":"sh", - "ix":1, - "ks":{ - "a":0, - "k":{ - "i":[ - [ - 0, - 0 - ], - [ - -2.446, - 1.161 - ], - [ - -1.168, - 0.275 - ], - [ - -1.439, - 0 - ], - [ - -1.301, - -0.304 - ], - [ - -1.225, - -0.66 - ], - [ - -1.11, - -1.844 - ] - ], - "o":[ - [ - 1.23, - -2.044 - ], - [ - 1.024, - -0.486 - ], - [ - 1.312, - -0.31 - ], - [ - 1.425, - 0 - ], - [ - 1.454, - 0.34 - ], - [ - 2.122, - 1.143 - ], - [ - 0, - 0 - ] - ], - "v":[ - [ - -13.091, - 3.273 - ], - [ - -7.438, - -1.646 - ], - [ - -4.14, - -2.797 - ], - [ - 0, - -3.273 - ], - [ - 4.104, - -2.805 - ], - [ - 8.141, - -1.29 - ], - [ - 13.091, - 3.273 - ] - ], - "c":false - }, - "ix":2 - }, - "nm":"Path 1", - "mn":"ADBE Vector Shape - Group", - "hd":false - }, - { - "ty":"st", - "c":{ - "a":0, - "k":[ - 1, - 1, - 1, - 1 - ], - "ix":3 - }, - "o":{ - "a":0, - "k":100, - "ix":4 - }, - "w":{ - "a":0, - "k":1.3, - "ix":5 - }, - "lc":2, - "lj":1, - "ml":10, - "bm":0, - "nm":"Stroke 1", - "mn":"ADBE Vector Graphic - Stroke", - "hd":false - }, - { - "ty":"tr", - "p":{ - "a":0, - "k":[ - 19.341, - 16.069 - ], - "ix":2 - }, - "a":{ - "a":0, - "k":[ - 0, - 0 - ], - "ix":1 - }, - "s":{ - "a":0, - "k":[ - 100, - 100 - ], - "ix":3 - }, - "r":{ - "a":0, - "k":0, - "ix":6 - }, - "o":{ - "a":0, - "k":100, - "ix":7 - }, - "sk":{ - "a":0, - "k":0, - "ix":4 - }, - "sa":{ - "a":0, - "k":0, - "ix":5 - }, - "nm":"Transform" - } - ], - "nm":"Mid Top", - "np":2, - "cix":2, - "bm":0, - "ix":1, - "mn":"ADBE Vector Group", - "hd":false - }, - { - "ty":"tm", - "s":{ - "a":0, - "k":0, - "ix":1 - }, - "e":{ - "a":0, - "k":38.2, - "ix":2 - }, - "o":{ - "a":1, - "k":[ - { - "i":{ - "x":[ - 0.833 - ], - "y":[ - 0.833 - ] - }, - "o":{ - "x":[ - 0.167 - ], - "y":[ - 0.167 - ] - }, - "t":0, - "s":[ - 170 - ] - }, - { - "t":360, - "s":[ - 890 - ] - } - ], - "ix":3 - }, - "m":1, - "ix":2, - "nm":"Trim Paths 1", - "mn":"ADBE Vector Filter - Trim", - "hd":false - } - ], - "ip":0, - "op":600, - "st":0, - "bm":0 - }, - { - "ddd":0, - "ind":5, - "ty":4, - "nm":"Fingerprint_20210701 Outlines 6", - "sr":1, - "ks":{ - "o":{ - "a":0, - "k":100, - "ix":11 - }, - "r":{ - "a":0, - "k":0, - "ix":10 - }, - "p":{ - "a":0, - "k":[ - 23.091, - 32.5, - 0 - ], - "ix":2, - "l":2 - }, - "a":{ - "a":0, - "k":[ - 19.341, - 24.25, - 0 - ], - "ix":1, - "l":2 - }, - "s":{ - "a":0, - "k":[ - 100, - 100, - 100 - ], - "ix":6, - "l":2 - } - }, - "ao":0, - "shapes":[ - { - "ty":"gr", - "it":[ - { - "ind":0, - "ty":"sh", - "ix":1, - "ks":{ - "a":0, - "k":{ - "i":[ - [ - 0, - 0 - ], - [ - -2.446, - 1.161 - ], - [ - -1.168, - 0.275 - ], - [ - -1.439, - 0 - ], - [ - -1.301, - -0.304 - ], - [ - -1.225, - -0.66 - ], - [ - -1.11, - -1.844 - ] - ], - "o":[ - [ - 1.23, - -2.044 - ], - [ - 1.024, - -0.486 - ], - [ - 1.312, - -0.31 - ], - [ - 1.425, - 0 - ], - [ - 1.454, - 0.34 - ], - [ - 2.122, - 1.143 - ], - [ - 0, - 0 - ] - ], - "v":[ - [ - -13.091, - 3.273 - ], - [ - -7.438, - -1.646 - ], - [ - -4.14, - -2.797 - ], - [ - 0, - -3.273 - ], - [ - 4.104, - -2.805 - ], - [ - 8.141, - -1.29 - ], - [ - 13.091, - 3.273 - ] - ], - "c":false - }, - "ix":2 - }, - "nm":"Path 1", - "mn":"ADBE Vector Shape - Group", - "hd":false - }, - { - "ty":"st", - "c":{ - "a":0, - "k":[ - 1, - 1, - 1, - 1 - ], - "ix":3 - }, - "o":{ - "a":0, - "k":100, - "ix":4 - }, - "w":{ - "a":0, - "k":1.3, - "ix":5 - }, - "lc":2, - "lj":1, - "ml":10, - "bm":0, - "nm":"Stroke 1", - "mn":"ADBE Vector Graphic - Stroke", - "hd":false - }, - { - "ty":"tr", - "p":{ - "a":0, - "k":[ - 19.341, - 16.069 - ], - "ix":2 - }, - "a":{ - "a":0, - "k":[ - 0, - 0 - ], - "ix":1 - }, - "s":{ - "a":0, - "k":[ - 100, - 100 - ], - "ix":3 - }, - "r":{ - "a":0, - "k":0, - "ix":6 - }, - "o":{ - "a":0, - "k":100, - "ix":7 - }, - "sk":{ - "a":0, - "k":0, - "ix":4 - }, - "sa":{ - "a":0, - "k":0, - "ix":5 - }, - "nm":"Transform" - } - ], - "nm":"Mid Top", - "np":2, - "cix":2, - "bm":0, - "ix":1, - "mn":"ADBE Vector Group", - "hd":false - }, - { - "ty":"tm", - "s":{ - "a":0, - "k":0, - "ix":1 - }, - "e":{ - "a":0, - "k":34.2, - "ix":2 - }, - "o":{ - "a":1, - "k":[ - { - "i":{ - "x":[ - 0.833 - ], - "y":[ - 0.833 - ] - }, - "o":{ - "x":[ - 0.167 - ], - "y":[ - 0.167 - ] - }, - "t":0, - "s":[ - 0 - ] - }, - { - "t":360, - "s":[ - 720 - ] - } - ], - "ix":3 - }, - "m":1, - "ix":2, - "nm":"Trim Paths 1", - "mn":"ADBE Vector Filter - Trim", - "hd":false - } - ], - "ip":0, - "op":600, - "st":0, - "bm":0 - }, - { - "ddd":0, - "ind":6, - "ty":4, - "nm":"Fingerprint_20210701 Outlines 5", - "sr":1, - "ks":{ - "o":{ - "a":0, - "k":100, - "ix":11 - }, - "r":{ - "a":0, - "k":0, - "ix":10 - }, - "p":{ - "a":0, - "k":[ - 23.091, - 32.5, - 0 - ], - "ix":2, - "l":2 - }, - "a":{ - "a":0, - "k":[ - 19.341, - 24.25, - 0 - ], - "ix":1, - "l":2 - }, - "s":{ - "a":0, - "k":[ - 100, - 100, - 100 - ], - "ix":6, - "l":2 - } - }, - "ao":0, - "shapes":[ - { - "ty":"gr", - "it":[ - { - "ind":0, - "ty":"sh", - "ix":1, - "ks":{ - "a":0, - "k":{ - "i":[ - [ - 0, - 0 - ], - [ - 0, - 0 - ], - [ - -6.53, - 0 - ], - [ - 0, - -5.793 - ], - [ - 0, - 0 - ], - [ - 2.159, - 0 - ], - [ - 0.59, - 1.489 - ], - [ - 0, - 0 - ], - [ - 1.587, - 0 - ], - [ - 0, - -2.16 - ], - [ - -0.81, - -1.363 - ], - [ - -0.844, - -0.674 - ], - [ - 0, - 0 - ] - ], - "o":[ - [ - -0.753, - -2.095 - ], - [ - 0, - -5.793 - ], - [ - 6.529, - 0 - ], - [ - 0, - 0 - ], - [ - 0, - 2.16 - ], - [ - -1.604, - 0 - ], - [ - 0, - 0 - ], - [ - -0.589, - -1.489 - ], - [ - -2.161, - 0 - ], - [ - 0, - 1.62 - ], - [ - 0.54, - 0.909 - ], - [ - 0, - 0 - ], - [ - 0, - 0 - ] - ], - "v":[ - [ - -10.702, - 5.728 - ], - [ - -11.454, - 1.506 - ], - [ - 0.001, - -9 - ], + -0.816 + ] + ], + "o":[ [ - 11.454, - 1.506 + 1.455, + -0.799 ], [ - 11.454, - 1.817 + 1.608, + -0.397 ], [ - 7.544, - 5.728 + 1.719, + 0 ], [ - 3.926, - 3.273 + 1.739, + 0.42 ], [ - 2.618, + 0, 0 - ], + ] + ], + "v":[ [ - -0.997, - -2.454 + -9.818, + 1.227 ], [ - -4.91, - 1.457 + -5.064, + -0.618 ], [ - -3.657, - 6.014 + 0, + -1.227 ], [ - -1.57, - 8.412 + 4.96, + -0.643 ], [ - -0.818, - 9 + 9.818, + 1.227 ] ], "c":false @@ -1514,6 +171,55 @@ "lj":1, "ml":10, "bm":0, + "d":[ + { + "n":"d", + "nm":"dash", + "v":{ + "a":0, + "k":3, + "ix":1 + } + }, + { + "n":"o", + "nm":"offset", + "v":{ + "a":1, + "k":[ + { + "i":{ + "x":[ + 0.833 + ], + "y":[ + 0.833 + ] + }, + "o":{ + "x":[ + 0.167 + ], + "y":[ + 0.167 + ] + }, + "t":0, + "s":[ + 0 + ] + }, + { + "t":360, + "s":[ + -6 + ] + } + ], + "ix":7 + } + } + ], "nm":"Stroke 1", "mn":"ADBE Vector Graphic - Stroke", "hd":false @@ -1524,7 +230,7 @@ "a":0, "k":[ 19.341, - 28.341 + 7.477 ], "ix":2 }, @@ -1567,7 +273,7 @@ "nm":"Transform" } ], - "nm":"Inside to dot ", + "nm":"Top", "np":2, "cix":2, "bm":0, @@ -1584,41 +290,12 @@ }, "e":{ "a":0, - "k":35, + "k":100, "ix":2 }, "o":{ - "a":1, - "k":[ - { - "i":{ - "x":[ - 0.833 - ], - "y":[ - 0.833 - ] - }, - "o":{ - "x":[ - 0.167 - ], - "y":[ - 0.167 - ] - }, - "t":0, - "s":[ - -159 - ] - }, - { - "t":360, - "s":[ - 201 - ] - } - ], + "a":0, + "k":0, "ix":3 }, "m":1, @@ -1626,6 +303,29 @@ "nm":"Trim Paths 1", "mn":"ADBE Vector Filter - Trim", "hd":false + }, + { + "ty":"tm", + "s":{ + "a":0, + "k":0, + "ix":1 + }, + "e":{ + "a":0, + "k":100, + "ix":2 + }, + "o":{ + "a":0, + "k":0, + "ix":3 + }, + "m":1, + "ix":3, + "nm":"Trim Paths 2", + "mn":"ADBE Vector Filter - Trim", + "hd":false } ], "ip":0, @@ -1635,9 +335,9 @@ }, { "ddd":0, - "ind":7, + "ind":3, "ty":4, - "nm":"Fingerprint_20210701 Outlines 4", + "nm":"Fingerprint_20210701 Outlines 6", "sr":1, "ks":{ "o":{ @@ -1699,102 +399,54 @@ 0 ], [ - 0, - 0 - ], - [ - -6.53, - 0 - ], - [ - 0, - -5.793 - ], - [ - 0, - 0 - ], - [ - 2.159, - 0 - ], - [ - 0.59, - 1.489 + -2.446, + 1.161 ], [ - 0, - 0 + -1.168, + 0.275 ], [ - 1.587, + -1.439, 0 ], [ - 0, - -2.16 - ], - [ - -0.81, - -1.363 + -1.301, + -0.304 ], [ - -0.844, - -0.674 + -1.225, + -0.66 ], [ - 0, - 0 + -1.11, + -1.844 ] ], "o":[ [ - -0.753, - -2.095 - ], - [ - 0, - -5.793 - ], - [ - 6.529, - 0 - ], - [ - 0, - 0 - ], - [ - 0, - 2.16 - ], - [ - -1.604, - 0 + 1.23, + -2.044 ], [ - 0, - 0 + 1.024, + -0.486 ], [ - -0.589, - -1.489 + 1.312, + -0.31 ], [ - -2.161, + 1.425, 0 ], [ - 0, - 1.62 - ], - [ - 0.54, - 0.909 + 1.454, + 0.34 ], [ - 0, - 0 + 2.122, + 1.143 ], [ 0, @@ -1803,56 +455,32 @@ ], "v":[ [ - -10.702, - 5.728 - ], - [ - -11.454, - 1.506 - ], - [ - 0.001, - -9 - ], - [ - 11.454, - 1.506 - ], - [ - 11.454, - 1.817 - ], - [ - 7.544, - 5.728 - ], - [ - 3.926, + -13.091, 3.273 ], [ - 2.618, - 0 + -7.438, + -1.646 ], [ - -0.997, - -2.454 + -4.14, + -2.797 ], [ - -4.91, - 1.457 + 0, + -3.273 ], [ - -3.657, - 6.014 + 4.104, + -2.805 ], [ - -1.57, - 8.412 + 8.141, + -1.29 ], [ - -0.818, - 9 + 13.091, + 3.273 ] ], "c":false @@ -1889,6 +517,55 @@ "lj":1, "ml":10, "bm":0, + "d":[ + { + "n":"d", + "nm":"dash", + "v":{ + "a":0, + "k":3, + "ix":1 + } + }, + { + "n":"o", + "nm":"offset", + "v":{ + "a":1, + "k":[ + { + "i":{ + "x":[ + 0.833 + ], + "y":[ + 0.833 + ] + }, + "o":{ + "x":[ + 0.167 + ], + "y":[ + 0.167 + ] + }, + "t":0, + "s":[ + 0 + ] + }, + { + "t":360, + "s":[ + -6 + ] + } + ], + "ix":7 + } + } + ], "nm":"Stroke 1", "mn":"ADBE Vector Graphic - Stroke", "hd":false @@ -1899,7 +576,7 @@ "a":0, "k":[ 19.341, - 28.341 + 16.069 ], "ix":2 }, @@ -1942,7 +619,7 @@ "nm":"Transform" } ], - "nm":"Inside to dot ", + "nm":"Mid Top", "np":2, "cix":2, "bm":0, @@ -1959,41 +636,12 @@ }, "e":{ "a":0, - "k":9, + "k":100, "ix":2 }, "o":{ - "a":1, - "k":[ - { - "i":{ - "x":[ - 0.833 - ], - "y":[ - 0.833 - ] - }, - "o":{ - "x":[ - 0.167 - ], - "y":[ - 0.167 - ] - }, - "t":0, - "s":[ - 135 - ] - }, - { - "t":360, - "s":[ - 495 - ] - } - ], + "a":0, + "k":0, "ix":3 }, "m":1, @@ -2010,9 +658,9 @@ }, { "ddd":0, - "ind":8, + "ind":4, "ty":4, - "nm":"Fingerprint_20210701 Outlines 3", + "nm":"Fingerprint_20210701 Outlines 5", "sr":1, "ks":{ "o":{ @@ -2264,6 +912,55 @@ "lj":1, "ml":10, "bm":0, + "d":[ + { + "n":"d", + "nm":"dash", + "v":{ + "a":0, + "k":3, + "ix":1 + } + }, + { + "n":"o", + "nm":"offset", + "v":{ + "a":1, + "k":[ + { + "i":{ + "x":[ + 0.833 + ], + "y":[ + 0.833 + ] + }, + "o":{ + "x":[ + 0.167 + ], + "y":[ + 0.167 + ] + }, + "t":0, + "s":[ + 0 + ] + }, + { + "t":360, + "s":[ + -6 + ] + } + ], + "ix":7 + } + } + ], "nm":"Stroke 1", "mn":"ADBE Vector Graphic - Stroke", "hd":false @@ -2334,41 +1031,12 @@ }, "e":{ "a":0, - "k":30, + "k":100, "ix":2 }, "o":{ - "a":1, - "k":[ - { - "i":{ - "x":[ - 0.833 - ], - "y":[ - 0.833 - ] - }, - "o":{ - "x":[ - 0.167 - ], - "y":[ - 0.167 - ] - }, - "t":0, - "s":[ - 0 - ] - }, - { - "t":360, - "s":[ - 360 - ] - } - ], + "a":0, + "k":0, "ix":3 }, "m":1, @@ -2385,7 +1053,7 @@ }, { "ddd":0, - "ind":9, + "ind":5, "ty":4, "nm":"Fingerprint_20210701 Outlines", "sr":1, @@ -2567,6 +1235,55 @@ "lj":1, "ml":10, "bm":0, + "d":[ + { + "n":"d", + "nm":"dash", + "v":{ + "a":0, + "k":2.5, + "ix":1 + } + }, + { + "n":"o", + "nm":"offset", + "v":{ + "a":1, + "k":[ + { + "i":{ + "x":[ + 0.833 + ], + "y":[ + 0.833 + ] + }, + "o":{ + "x":[ + 0.167 + ], + "y":[ + 0.167 + ] + }, + "t":0, + "s":[ + 0 + ] + }, + { + "t":360, + "s":[ + -5 + ] + } + ], + "ix":7 + } + } + ], "nm":"Stroke 1", "mn":"ADBE Vector Graphic - Stroke", "hd":false @@ -2637,41 +1354,12 @@ }, "e":{ "a":0, - "k":69, + "k":100, "ix":2 }, "o":{ - "a":1, - "k":[ - { - "i":{ - "x":[ - 0.833 - ], - "y":[ - 0.833 - ] - }, - "o":{ - "x":[ - 0.167 - ], - "y":[ - 0.167 - ] - }, - "t":0, - "s":[ - 0 - ] - }, - { - "t":360, - "s":[ - 720 - ] - } - ], + "a":0, + "k":0, "ix":3 }, "m":1, @@ -2699,4 +1387,4 @@ "dr":0 } ] -} \ No newline at end of file +} diff --git a/packages/SystemUI/src/com/android/systemui/doze/util/BurnInHelper.kt b/packages/SystemUI/src/com/android/systemui/doze/util/BurnInHelper.kt index 15e3f3a6b1e9..5c6478ed0895 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/util/BurnInHelper.kt +++ b/packages/SystemUI/src/com/android/systemui/doze/util/BurnInHelper.kt @@ -21,8 +21,8 @@ import android.util.MathUtils private const val MILLIS_PER_MINUTES = 1000 * 60f private const val BURN_IN_PREVENTION_PERIOD_Y = 521f private const val BURN_IN_PREVENTION_PERIOD_X = 83f -private const val BURN_IN_PREVENTION_PERIOD_SCALE = 180f -private const val BURN_IN_PREVENTION_PERIOD_PROGRESS = 120f +private const val BURN_IN_PREVENTION_PERIOD_SCALE = 181f +private const val BURN_IN_PREVENTION_PERIOD_PROGRESS = 89f /** * Returns the translation offset that should be used to avoid burn in at -- cgit v1.2.3 From b1b868fabe8ffccdd613905ce2320e437e681386 Mon Sep 17 00:00:00 2001 From: Curtis Belmonte Date: Mon, 9 Aug 2021 12:43:11 -0700 Subject: Show fingerprint icon when face fails on BiometricPrompt When BiometricPrompt is launched with both a face and fingerprint enrolled, ensure that the fingerprint icon is shown immediately after face authentication fails. This replaces the old behavior where an error icon would be shown for ~2 seconds after face authentication failed. Test: Manual: 1. Enroll both fingerprint and face on a device 2. Trigger BiometricPrompt (e.g. Internet > Settings > Share) 3. Ensure face authentication fails (e.g. by not looking at device) 4. Verify that the fingerprint icon is shown immediately Fixes: 195794375 Change-Id: I5abf788df5e973711d932af685e674f03e89fae6 --- .../biometrics/AuthBiometricFaceToFingerprintView.java | 13 ++++++++++--- .../biometrics/AuthBiometricFaceToFingerprintViewTest.java | 10 ++++------ 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFaceToFingerprintView.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFaceToFingerprintView.java index 98ad87506819..ae3e94b9a1cb 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFaceToFingerprintView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFaceToFingerprintView.java @@ -44,11 +44,17 @@ public class AuthBiometricFaceToFingerprintView extends AuthBiometricFaceView { private static final String TAG = "BiometricPrompt/AuthBiometricFaceToFingerprintView"; protected static class UdfpsIconController extends IconController { + @BiometricState private int mIconState = STATE_IDLE; + protected UdfpsIconController( @NonNull Context context, @NonNull ImageView iconView, @NonNull TextView textView) { super(context, iconView, textView); } + void updateState(@BiometricState int newState) { + updateState(mIconState, newState); + } + @Override protected void updateState(int lastState, int newState) { final boolean lastStateIsErrorIcon = @@ -86,6 +92,7 @@ public class AuthBiometricFaceToFingerprintView extends AuthBiometricFaceView { } mState = newState; + mIconState = newState; } } @@ -191,11 +198,11 @@ public class AuthBiometricFaceToFingerprintView extends AuthBiometricFaceView { // Deactivate the face icon controller so it stops drawing to the view mFaceIconController.deactivate(); - // Then, activate this icon controller. We need to start in the "error" state - mUdfpsIconController.updateState(mState, newState); + // Then, activate this icon controller. We need to start in the "idle" state + mUdfpsIconController.updateState(STATE_IDLE); } } else { // Fingerprint - mUdfpsIconController.updateState(mState, newState); + mUdfpsIconController.updateState(newState); } super.updateState(newState); diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthBiometricFaceToFingerprintViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthBiometricFaceToFingerprintViewTest.java index 090cf9f63eaf..f91c02938845 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthBiometricFaceToFingerprintViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthBiometricFaceToFingerprintViewTest.java @@ -101,7 +101,7 @@ public class AuthBiometricFaceToFingerprintViewTest extends SysuiTestCase { mFaceToFpView.onDialogAnimatedIn(); verify(mFaceToFpView.mFaceIconController) .updateState(anyInt(), eq(AuthBiometricFaceToFingerprintView.STATE_AUTHENTICATING)); - verify(mFaceToFpView.mUdfpsIconController, never()).updateState(anyInt(), anyInt()); + verify(mFaceToFpView.mUdfpsIconController, never()).updateState(anyInt()); } @Test @@ -109,13 +109,13 @@ public class AuthBiometricFaceToFingerprintViewTest extends SysuiTestCase { mFaceToFpView.onDialogAnimatedIn(); verify(mFaceToFpView.mFaceIconController) .updateState(anyInt(), eq(AuthBiometricFaceToFingerprintView.STATE_AUTHENTICATING)); - verify(mFaceToFpView.mUdfpsIconController, never()).updateState(anyInt(), anyInt()); + verify(mFaceToFpView.mUdfpsIconController, never()).updateState(anyInt()); mFaceToFpView.updateState(AuthBiometricFaceView.STATE_AUTHENTICATED); verify(mFaceToFpView.mFaceIconController).updateState( eq(AuthBiometricFaceToFingerprintView.STATE_AUTHENTICATING), eq(AuthBiometricFaceToFingerprintView.STATE_AUTHENTICATED)); - verify(mFaceToFpView.mUdfpsIconController, never()).updateState(anyInt(), anyInt()); + verify(mFaceToFpView.mUdfpsIconController, never()).updateState(anyInt()); assertEquals(AuthBiometricFaceToFingerprintView.STATE_AUTHENTICATED, mFaceToFpView.mState); } @@ -130,14 +130,12 @@ public class AuthBiometricFaceToFingerprintViewTest extends SysuiTestCase { verify(mFaceToFpView.mFaceIconController).deactivate(); verify(mFaceToFpView.mUdfpsIconController).updateState( - eq(AuthBiometricFaceToFingerprintView.STATE_AUTHENTICATING), - eq(AuthBiometricFaceToFingerprintView.STATE_ERROR)); + eq(AuthBiometricFaceToFingerprintView.STATE_IDLE)); verify(mConfirmButton).setVisibility(eq(View.GONE)); mFaceToFpView.updateState(AuthBiometricFaceToFingerprintView.STATE_AUTHENTICATING); verify(mFaceToFpView.mUdfpsIconController).updateState( - eq(AuthBiometricFaceToFingerprintView.STATE_ERROR), eq(AuthBiometricFaceToFingerprintView.STATE_AUTHENTICATING)); } -- cgit v1.2.3 From fc0965fc7ec27860f670eb77f943d166ac5bcfe9 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 10 Aug 2021 00:47:15 +0000 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I5629387b66935c7871511cd5ba54d2eb39cc3daa --- core/res/res/values-te/strings.xml | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index b8b6b5b76ced..ddbb3e3677aa 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -240,21 +240,21 @@ "పవర్" "రీస్టార్ట్ చేయి" "ఎమర్జెన్సీ" - "బగ్ నివేదిక" + "బగ్ రిపోర్ట్‌" "సెషన్‌ను ముగించు" "స్క్రీన్‌షాట్" "బగ్ రిపోర్ట్‌" - "ఇది ఇ-మెయిల్ సందేశం రూపంలో పంపడానికి మీ ప్రస్తుత పరికర స్థితి గురించి సమాచారాన్ని సేకరిస్తుంది. బగ్ నివేదికను ప్రారంభించడం మొదలుకొని పంపడానికి సిద్ధం చేసే వరకు ఇందుకు కొంత సమయం పడుతుంది; దయచేసి ఓపిక పట్టండి." - "ప్రభావశీల నివేదిక" - "చాలా సందర్భాల్లో దీన్ని ఉపయోగించండి. ఇది నివేదిక ప్రోగ్రెస్‌ను ట్రాక్ చేయడానికి, సమస్య గురించి మరిన్ని వివరాలను నమోదు చేయడానికి మరియు స్క్రీన్‌షాట్‌లు తీయడానికి మిమ్మల్ని అనుమతిస్తుంది. ఇది నివేదించడానికి ఎక్కువ సమయం పట్టే తక్కువ వినియోగ విభాగాలను విడిచిపెట్టవచ్చు." - "పూర్తి నివేదిక" - "మీ పరికరం ప్రతిస్పందనరహితంగా ఉన్నప్పుడు లేదా చాలా నెమ్మదిగా ఉన్నప్పుడు లేదా మీకు అన్ని నివేదిక విభాగాలు అవసరమైనప్పుడు సిస్టమ్‌కి అంతరాయ స్థాయి కనిష్టంగా ఉండేలా చేయడానికి ఈ ఎంపిక ఉపయోగించండి. ఇది మరిన్ని వివరాలను నమోదు చేయడానికి లేదా అదనపు స్క్రీన్‌షాట్‌లు తీయడానికి మిమ్మల్ని అనుమతించదు." + "ఇది ఇ-మెయిల్ సందేశం రూపంలో పంపడానికి మీ ప్రస్తుత పరికర స్థితి గురించి సమాచారాన్ని సేకరిస్తుంది. బగ్ రిపోర్ట్‌ను ప్రారంభించడం మొదలుకొని పంపడానికి సిద్ధం చేసే వరకు ఇందుకు కొంత సమయం పడుతుంది; దయచేసి ఓపిక పట్టండి." + "ప్రభావశీల రిపోర్ట్‌" + "చాలా సందర్భాల్లో దీన్ని ఉపయోగించండి. ఇది రిపోర్ట్‌ ప్రోగ్రెస్‌ను ట్రాక్ చేయడానికి, సమస్య గురించి మరిన్ని వివరాలను నమోదు చేయడానికి మరియు స్క్రీన్‌షాట్‌లు తీయడానికి మిమ్మల్ని అనుమతిస్తుంది. ఇది నివేదించడానికి ఎక్కువ సమయం పట్టే తక్కువ వినియోగ విభాగాలను విడిచిపెట్టవచ్చు." + "పూర్తి రిపోర్ట్‌" + "మీ పరికరం ప్రతిస్పందనరహితంగా ఉన్నప్పుడు లేదా చాలా నెమ్మదిగా ఉన్నప్పుడు లేదా మీకు అన్ని రిపోర్ట్‌ విభాగాలు అవసరమైనప్పుడు సిస్టమ్‌కి అంతరాయ స్థాయి కనిష్టంగా ఉండేలా చేయడానికి ఈ ఎంపిక ఉపయోగించండి. ఇది మరిన్ని వివరాలను నమోదు చేయడానికి లేదా అదనపు స్క్రీన్‌షాట్‌లు తీయడానికి మిమ్మల్ని అనుమతించదు." - బగ్ నివేదిక కోసం %d సెకన్లలో స్క్రీన్‌షాట్ తీయబోతోంది. - బగ్ నివేదిక కోసం %d సెకనులో స్క్రీన్‌షాట్ తీయబోతోంది. + బగ్ రిపోర్ట్‌ కోసం %d సెకన్లలో స్క్రీన్‌షాట్ తీయబోతోంది. + బగ్ రిపోర్ట్‌ కోసం %d సెకనులో స్క్రీన్‌షాట్ తీయబోతోంది. - "బగ్ నివేదికతో ఉన్న స్క్రీన్‌షాట్ తీయబడింది" - "బగ్ నివేదికతో ఉన్న స్క్రీన్‌షాట్‌ను తీయడం విఫలమైంది" + "బగ్ రిపోర్ట్‌తో ఉన్న స్క్రీన్‌షాట్ తీయబడింది" + "బగ్ రిపోర్ట్‌తో ఉన్న స్క్రీన్‌షాట్‌ను తీయడం విఫలమైంది" "నిశ్శబ్ద మోడ్" "ధ్వని ఆఫ్‌లో ఉంది" "ధ్వని ఆన్‌లో ఉంది" @@ -1320,10 +1320,10 @@ "USB పోర్ట్ ఆటోమేటిక్‌గా నిలిపివేయబడింది. మరింత తెలుసుకోవడానికి నొక్కండి." "USB పోర్ట్‌ను ఉపయోగించడం సురక్షితం" "ఫోన్ ఇకపై ద్రవ లేదా వ్యర్థ పదార్థాలను గుర్తించదు." - "బగ్ నివేదికను తీస్తోంది…" - "బగ్ నివేదికను భాగస్వామ్యం చేయాలా?" - "బగ్ నివేదికను భాగస్వామ్యం చేస్తోంది..." - "మీ నిర్వాహకులు ఈ పరికరం సమస్యకు పరిష్కారాన్ని కనుగొనడంలో సహాయం కోసం బగ్ నివేదికను అభ్యర్థించారు. యాప్‌లు మరియు డేటా భాగస్వామ్యం చేయబడవచ్చు." + "బగ్ రిపోర్ట్‌ను తీస్తోంది…" + "బగ్ రిపోర్ట్‌ను భాగస్వామ్యం చేయాలా?" + "బగ్ రిపోర్ట్‌ను భాగస్వామ్యం చేస్తోంది..." + "మీ నిర్వాహకులు ఈ పరికరం సమస్యకు పరిష్కారాన్ని కనుగొనడంలో సహాయం కోసం బగ్ రిపోర్ట్‌ను అభ్యర్థించారు. యాప్‌లు మరియు డేటా భాగస్వామ్యం చేయబడవచ్చు." "షేర్ చేయి" "తిరస్కరిస్తున్నాను" "ఇన్‌పుట్ పద్ధతిని ఎంచుకోండి" -- cgit v1.2.3 From 316fbf76728f75fd1f4da5935e08b803fdaeb4b1 Mon Sep 17 00:00:00 2001 From: Joe Bolinger Date: Fri, 6 Aug 2021 18:33:44 -0700 Subject: Add detailed fingerprint logging and a historical buffer. This was done for face as part of I5021534069d59158dde4488ebb13ef90d339ee39 and this extends the pattern for fingerprint to enable better debugging of the listening state changes. Bug: 194817979 Test: manual (adb bugreport and verify recent auth attempts in logs) Test: atest KeyguardListenQueueTest Change-Id: Ib782c9e95c12a65496e2d0245f5f8169f478a6ca --- .../android/keyguard/KeyguardFaceListenModel.kt | 28 ---- .../com/android/keyguard/KeyguardListenModel.kt | 77 +++++++++++ .../com/android/keyguard/KeyguardListenQueue.kt | 67 +++++++++ .../android/keyguard/KeyguardUpdateMonitor.java | 154 ++++++++++++--------- .../android/keyguard/KeyguardListenQueueTest.kt | 101 ++++++++++++++ 5 files changed, 337 insertions(+), 90 deletions(-) delete mode 100644 packages/SystemUI/src/com/android/keyguard/KeyguardFaceListenModel.kt create mode 100644 packages/SystemUI/src/com/android/keyguard/KeyguardListenModel.kt create mode 100644 packages/SystemUI/src/com/android/keyguard/KeyguardListenQueue.kt create mode 100644 packages/SystemUI/tests/src/com/android/keyguard/KeyguardListenQueueTest.kt diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardFaceListenModel.kt b/packages/SystemUI/src/com/android/keyguard/KeyguardFaceListenModel.kt deleted file mode 100644 index 0785cc3c04d2..000000000000 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardFaceListenModel.kt +++ /dev/null @@ -1,28 +0,0 @@ -package com.android.keyguard - -import android.annotation.CurrentTimeMillisLong - -/** - * Data class for tracking information associated with [KeyguardUpdateMonitor.shouldListenForFace] - * method calls. - */ -data class KeyguardFaceListenModel( - @CurrentTimeMillisLong val timeMillis: Long, - val userId: Int, - val isListeningForFace: Boolean, - val isBouncer: Boolean, - val isAuthInterruptActive: Boolean, - val isOccludingAppRequestingFaceAuth: Boolean, - val isKeyguardAwake: Boolean, - val isListeningForFaceAssistant: Boolean, - val isSwitchingUser: Boolean, - val isFaceDisabled: Boolean, - val isBecauseCannotSkipBouncer: Boolean, - val isKeyguardGoingAway: Boolean, - val isBiometricSettingEnabledForUser: Boolean, - val isLockIconPressed: Boolean, - val isScanningAllowedByStrongAuth: Boolean, - val isPrimaryUser: Boolean, - val isSecureCameraLaunched: Boolean, - val isFaceAuthenticated: Boolean -) diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardListenModel.kt b/packages/SystemUI/src/com/android/keyguard/KeyguardListenModel.kt new file mode 100644 index 000000000000..9286175cc2ea --- /dev/null +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardListenModel.kt @@ -0,0 +1,77 @@ +package com.android.keyguard + +import android.annotation.CurrentTimeMillisLong +import android.hardware.biometrics.BiometricAuthenticator.Modality +import android.hardware.biometrics.BiometricAuthenticator.TYPE_FACE +import android.hardware.biometrics.BiometricAuthenticator.TYPE_FINGERPRINT + +/** Verbose logging for various keyguard listening states. */ +sealed class KeyguardListenModel { + /** Timestamp of the state change. */ + abstract val timeMillis: Long + /** Current user */ + abstract val userId: Int + /** If keyguard is listening for the given [modality]. */ + abstract val listening: Boolean + /** Sensor type */ + @Modality abstract val modality: Int +} + +/** + * Verbose debug information associated with [KeyguardUpdateMonitor.shouldListenForFingerprint]. + */ +data class KeyguardFingerprintListenModel( + @CurrentTimeMillisLong override val timeMillis: Long, + override val userId: Int, + override val listening: Boolean, + // keep sorted + val biometricEnabledForUser: Boolean, + val bouncer: Boolean, + val canSkipBouncer: Boolean, + val credentialAttempted: Boolean, + val deviceInteractive: Boolean, + val dreaming: Boolean, + val encryptedOrLockdown: Boolean, + val fingerprintDisabled: Boolean, + val fingerprintLockedOut: Boolean, + val goingToSleep: Boolean, + val keyguardGoingAway: Boolean, + val keyguardIsVisible: Boolean, + val keyguardOccluded: Boolean, + val occludingAppRequestingFp: Boolean, + val primaryUser: Boolean, + val shouldListenForFingerprintAssistant: Boolean, + val switchingUser: Boolean, + val udfps: Boolean, + val userDoesNotHaveTrust: Boolean, + val userNeedsStrongAuth: Boolean +) : KeyguardListenModel() { + override val modality: Int = TYPE_FACE +} + +/** + * Verbose debug information associated with [KeyguardUpdateMonitor.shouldListenForFace]. + */ +data class KeyguardFaceListenModel( + @CurrentTimeMillisLong override val timeMillis: Long, + override val userId: Int, + override val listening: Boolean, + // keep sorted + val authInterruptActive: Boolean, + val becauseCannotSkipBouncer: Boolean, + val biometricSettingEnabledForUser: Boolean, + val bouncer: Boolean, + val faceAuthenticated: Boolean, + val faceDisabled: Boolean, + val keyguardAwake: Boolean, + val keyguardGoingAway: Boolean, + val listeningForFaceAssistant: Boolean, + val lockIconPressed: Boolean, + val occludingAppRequestingFaceAuth: Boolean, + val primaryUser: Boolean, + val scanningAllowedByStrongAuth: Boolean, + val secureCameraLaunched: Boolean, + val switchingUser: Boolean +) : KeyguardListenModel() { + override val modality: Int = TYPE_FINGERPRINT +} diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardListenQueue.kt b/packages/SystemUI/src/com/android/keyguard/KeyguardListenQueue.kt new file mode 100644 index 000000000000..f13a59a84811 --- /dev/null +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardListenQueue.kt @@ -0,0 +1,67 @@ +/* + * 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.keyguard + +import androidx.annotation.VisibleForTesting +import java.io.PrintWriter +import java.text.DateFormat +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale +import kotlin.collections.ArrayDeque + +private val DEFAULT_FORMATTING = SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.US) + +/** Queue for verbose logging checks for the listening state. */ +class KeyguardListenQueue( + val sizePerModality: Int = 20 +) { + private val faceQueue = ArrayDeque() + private val fingerprintQueue = ArrayDeque() + + @get:VisibleForTesting val models: List + get() = faceQueue + fingerprintQueue + + /** Push a [model] to the queue (will be logged until the queue exceeds [sizePerModality]). */ + fun add(model: KeyguardListenModel) { + val queue = when (model) { + is KeyguardFaceListenModel -> faceQueue.apply { add(model) } + is KeyguardFingerprintListenModel -> fingerprintQueue.apply { add(model) } + } + + if (queue.size > sizePerModality) { + queue.removeFirstOrNull() + } + } + + /** Print verbose logs via the [writer]. */ + @JvmOverloads + fun print(writer: PrintWriter, dateFormat: DateFormat = DEFAULT_FORMATTING) { + val stringify: (KeyguardListenModel) -> String = { model -> + " ${dateFormat.format(Date(model.timeMillis))} $model" + } + + writer.println(" Face listen results (last ${faceQueue.size} calls):") + for (model in faceQueue) { + writer.println(stringify(model)) + } + writer.println(" Fingerprint listen results (last ${fingerprintQueue.size} calls):") + for (model in fingerprintQueue) { + writer.println(stringify(model)) + } + } +} diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index 0bb5b1ce5179..877e76480b1e 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -118,15 +118,11 @@ import com.google.android.collect.Lists; import java.io.FileDescriptor; import java.io.PrintWriter; import java.lang.ref.WeakReference; -import java.text.SimpleDateFormat; -import java.util.ArrayDeque; import java.util.ArrayList; -import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; -import java.util.Locale; import java.util.Map; import java.util.Map.Entry; import java.util.Set; @@ -148,6 +144,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab private static final boolean DEBUG = KeyguardConstants.DEBUG; private static final boolean DEBUG_SIM_STATES = KeyguardConstants.DEBUG_SIM_STATES; private static final boolean DEBUG_FACE = Build.IS_DEBUGGABLE; + private static final boolean DEBUG_FINGERPRINT = Build.IS_DEBUGGABLE; private static final boolean DEBUG_SPEW = false; private static final int FINGERPRINT_LOCKOUT_RESET_DELAY_MS = 600; @@ -422,9 +419,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab @VisibleForTesting SparseArray mUserFaceAuthenticated = new SparseArray<>(); - // Keep track of recent calls to shouldListenForFace() for debugging. - private static final int FACE_LISTEN_CALLS_QUEUE_SIZE = 20; - private ArrayDeque mFaceListenModels; + // Keep track of recent calls to shouldListenFor*() for debugging. + private final KeyguardListenQueue mListenModels = new KeyguardListenQueue(); private static int sCurrentUser; private Runnable mUpdateBiometricListeningState = this::updateBiometricListeningState; @@ -2229,37 +2225,75 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab @VisibleForTesting protected boolean shouldListenForFingerprint(boolean isUdfps) { - final boolean userDoesNotHaveTrust = !getUserHasTrust(getCurrentUser()); + final int user = getCurrentUser(); + final boolean userDoesNotHaveTrust = !getUserHasTrust(user); + final boolean shouldListenForFingerprintAssistant = shouldListenForFingerprintAssistant(); final boolean shouldListenKeyguardState = mKeyguardIsVisible || !mDeviceInteractive || (mBouncer && !mKeyguardGoingAway) || mGoingToSleep - || shouldListenForFingerprintAssistant() + || shouldListenForFingerprintAssistant || (mKeyguardOccluded && mIsDreaming) || (mKeyguardOccluded && userDoesNotHaveTrust && (mOccludingAppRequestingFp || isUdfps)); // Only listen if this KeyguardUpdateMonitor belongs to the primary user. There is an // instance of KeyguardUpdateMonitor for each user but KeyguardUpdateMonitor is user-aware. + final boolean biometricEnabledForUser = mBiometricEnabledForUser.get(user); + final boolean userCanSkipBouncer = getUserCanSkipBouncer(user); + final boolean fingerprintDisabledForUser = isFingerprintDisabled(user); final boolean shouldListenUserState = !mSwitchingUser - && !isFingerprintDisabled(getCurrentUser()) + && !fingerprintDisabledForUser && (!mKeyguardGoingAway || !mDeviceInteractive) && mIsPrimaryUser - && mBiometricEnabledForUser.get(getCurrentUser()); + && biometricEnabledForUser; final boolean shouldListenBouncerState = !(mFingerprintLockedOut && mBouncer && mCredentialAttempted); + final boolean isEncryptedOrLockdownForUser = isEncryptedOrLockdown(user); + final boolean userNeedsStrongAuth = userNeedsStrongAuth(); final boolean shouldListenUdfpsState = !isUdfps - || (!getUserCanSkipBouncer(getCurrentUser()) - && !isEncryptedOrLockdown(getCurrentUser()) - && !userNeedsStrongAuth() + || (!userCanSkipBouncer + && !isEncryptedOrLockdownForUser + && !userNeedsStrongAuth && userDoesNotHaveTrust && !mFingerprintLockedOut); - return shouldListenKeyguardState && shouldListenUserState && shouldListenBouncerState - && shouldListenUdfpsState; + + final boolean shouldListen = shouldListenKeyguardState && shouldListenUserState + && shouldListenBouncerState && shouldListenUdfpsState; + + if (DEBUG_FINGERPRINT || DEBUG_SPEW) { + maybeLogListenerModelData( + new KeyguardFingerprintListenModel( + System.currentTimeMillis(), + user, + shouldListen, + biometricEnabledForUser, + mBouncer, + userCanSkipBouncer, + mCredentialAttempted, + mDeviceInteractive, + mIsDreaming, + isEncryptedOrLockdownForUser, + fingerprintDisabledForUser, + mFingerprintLockedOut, + mGoingToSleep, + mKeyguardGoingAway, + mKeyguardIsVisible, + mKeyguardOccluded, + mOccludingAppRequestingFp, + mIsPrimaryUser, + shouldListenForFingerprintAssistant, + mSwitchingUser, + isUdfps, + userDoesNotHaveTrust, + userNeedsStrongAuth)); + } + + return shouldListen; } /** @@ -2283,12 +2317,12 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab containsFlag(strongAuth, STRONG_AUTH_REQUIRED_AFTER_BOOT) || containsFlag(strongAuth, STRONG_AUTH_REQUIRED_AFTER_TIMEOUT); - boolean canBypass = mKeyguardBypassController != null + final boolean canBypass = mKeyguardBypassController != null && mKeyguardBypassController.canBypass(); // There's no reason to ask the HAL for authentication when the user can dismiss the // bouncer, unless we're bypassing and need to auto-dismiss the lock screen even when // TrustAgents or biometrics are keeping the device unlocked. - boolean becauseCannotSkipBouncer = !getUserCanSkipBouncer(user) || canBypass; + final boolean becauseCannotSkipBouncer = !getUserCanSkipBouncer(user) || canBypass; // Scan even when encrypted or timeout to show a preemptive bouncer when bypassing. // Lock-down mode shouldn't scan, since it is more explicit. @@ -2296,69 +2330,72 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab // If the device supports face detection (without authentication), allow it to happen // if the device is in lockdown mode. Otherwise, prevent scanning. - boolean supportsDetectOnly = !mFaceSensorProperties.isEmpty() + final boolean supportsDetectOnly = !mFaceSensorProperties.isEmpty() && mFaceSensorProperties.get(0).supportsFaceDetection; if (isLockDown && !supportsDetectOnly) { strongAuthAllowsScanning = false; } // If the face has recently been authenticated do not attempt to authenticate again. - boolean faceAuthenticated = getIsFaceAuthenticated(); + final boolean faceAuthenticated = getIsFaceAuthenticated(); + final boolean faceDisabledForUser = isFaceDisabled(user); + final boolean biometricEnabledForUser = mBiometricEnabledForUser.get(user); + final boolean shouldListenForFaceAssistant = shouldListenForFaceAssistant(); // Only listen if this KeyguardUpdateMonitor belongs to the primary user. There is an // instance of KeyguardUpdateMonitor for each user but KeyguardUpdateMonitor is user-aware. final boolean shouldListen = (mBouncer || mAuthInterruptActive || mOccludingAppRequestingFace || awakeKeyguard - || shouldListenForFaceAssistant()) - && !mSwitchingUser && !isFaceDisabled(user) && becauseCannotSkipBouncer - && !mKeyguardGoingAway && mBiometricEnabledForUser.get(user) && !mLockIconPressed + || shouldListenForFaceAssistant) + && !mSwitchingUser && !faceDisabledForUser && becauseCannotSkipBouncer + && !mKeyguardGoingAway && biometricEnabledForUser && !mLockIconPressed && strongAuthAllowsScanning && mIsPrimaryUser && (!mSecureCameraLaunched || mOccludingAppRequestingFace) && !faceAuthenticated; // Aggregate relevant fields for debug logging. if (DEBUG_FACE || DEBUG_SPEW) { - final KeyguardFaceListenModel model = new KeyguardFaceListenModel( - System.currentTimeMillis(), - user, - shouldListen, - mBouncer, - mAuthInterruptActive, - mOccludingAppRequestingFace, - awakeKeyguard, - shouldListenForFaceAssistant(), - mSwitchingUser, - isFaceDisabled(user), - becauseCannotSkipBouncer, - mKeyguardGoingAway, - mBiometricEnabledForUser.get(user), - mLockIconPressed, - strongAuthAllowsScanning, - mIsPrimaryUser, - mSecureCameraLaunched, - faceAuthenticated); - maybeLogFaceListenerModelData(model); + maybeLogListenerModelData( + new KeyguardFaceListenModel( + System.currentTimeMillis(), + user, + shouldListen, + mAuthInterruptActive, + becauseCannotSkipBouncer, + biometricEnabledForUser, + mBouncer, + faceAuthenticated, + faceDisabledForUser, + awakeKeyguard, + mKeyguardGoingAway, + shouldListenForFaceAssistant, + mLockIconPressed, + mOccludingAppRequestingFace, + mIsPrimaryUser, + strongAuthAllowsScanning, + mSecureCameraLaunched, + mSwitchingUser)); } return shouldListen; } - private void maybeLogFaceListenerModelData(KeyguardFaceListenModel model) { + private void maybeLogListenerModelData(KeyguardListenModel model) { // Too chatty, but very useful when debugging issues. if (DEBUG_SPEW) { Log.v(TAG, model.toString()); } // Add model data to the historical buffer. - if (DEBUG_FACE && mFaceRunningState != BIOMETRIC_STATE_RUNNING - && model.isListeningForFace()) { - if (mFaceListenModels == null) { - mFaceListenModels = new ArrayDeque<>(FACE_LISTEN_CALLS_QUEUE_SIZE); - } - if (mFaceListenModels.size() >= FACE_LISTEN_CALLS_QUEUE_SIZE) { - mFaceListenModels.remove(); - } - mFaceListenModels.add(model); + final boolean notYetRunning = + (DEBUG_FACE + && model instanceof KeyguardFaceListenModel + && mFaceRunningState != BIOMETRIC_STATE_RUNNING) + || (DEBUG_FINGERPRINT + && model instanceof KeyguardFingerprintListenModel + && mFingerprintRunningState != BIOMETRIC_STATE_RUNNING); + if (notYetRunning && model.getListening()) { + mListenModels.add(model); } } @@ -3437,15 +3474,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab pw.println(" enabledByUser=" + mBiometricEnabledForUser.get(userId)); pw.println(" mSecureCameraLaunched=" + mSecureCameraLaunched); } - if (mFaceListenModels != null && !mFaceListenModels.isEmpty()) { - final SimpleDateFormat dateFormat = - new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.US); - pw.println(" Face listen results (last " + FACE_LISTEN_CALLS_QUEUE_SIZE + " calls):"); - for (final KeyguardFaceListenModel model : mFaceListenModels) { - final String time = dateFormat.format(new Date(model.getTimeMillis())); - pw.println(" " + time + " " + model.toString()); - } - } + mListenModels.print(pw); + if (mIsAutomotive) { pw.println(" Running on Automotive build"); } diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardListenQueueTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardListenQueueTest.kt new file mode 100644 index 000000000000..db87c5df16e1 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardListenQueueTest.kt @@ -0,0 +1,101 @@ +/* + * 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.keyguard + +import android.testing.AndroidTestingRunner +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.google.common.truth.Truth.assertThat +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidTestingRunner::class) +@SmallTest +class KeyguardListenQueueTest : SysuiTestCase() { + + @Test + fun testQueueIsBounded() { + val size = 5 + val queue = KeyguardListenQueue(sizePerModality = size) + + val fingerprints = List(100) { fingerprintModel(it) } + fingerprints.forEach { queue.add(it) } + + assertThat(queue.models).containsExactlyElementsIn(fingerprints.takeLast(size)) + + val faces = List(100) { faceModel(it) } + faces.forEach { queue.add(it) } + + assertThat(queue.models).containsExactlyElementsIn( + faces.takeLast(size) + fingerprints.takeLast(5) + ) + + repeat(100) { + queue.add(faceModel(-1)) + queue.add(fingerprintModel(-1)) + } + assertThat(queue.models).hasSize(2 * size) + assertThat(queue.models.count { it.userId == -1 }).isEqualTo(2 * size) + } +} + +private fun fingerprintModel(user: Int) = KeyguardFingerprintListenModel( + timeMillis = System.currentTimeMillis(), + userId = user, + listening = false, + biometricEnabledForUser = false, + bouncer = false, + canSkipBouncer = false, + credentialAttempted = false, + deviceInteractive = false, + dreaming = false, + encryptedOrLockdown = false, + fingerprintDisabled = false, + fingerprintLockedOut = false, + goingToSleep = false, + keyguardGoingAway = false, + keyguardIsVisible = false, + keyguardOccluded = false, + occludingAppRequestingFp = false, + primaryUser = false, + shouldListenForFingerprintAssistant = false, + switchingUser = false, + udfps = false, + userDoesNotHaveTrust = false, + userNeedsStrongAuth = false +) + +private fun faceModel(user: Int) = KeyguardFaceListenModel( + timeMillis = System.currentTimeMillis(), + userId = user, + listening = false, + authInterruptActive = false, + becauseCannotSkipBouncer = false, + biometricSettingEnabledForUser = false, + bouncer = false, + faceAuthenticated = false, + faceDisabled = false, + keyguardAwake = false, + keyguardGoingAway = false, + listeningForFaceAssistant = false, + lockIconPressed = false, + occludingAppRequestingFaceAuth = false, + primaryUser = false, + scanningAllowedByStrongAuth = false, + secureCameraLaunched = false, + switchingUser = false +) -- cgit v1.2.3 From 1f69d5875e10d342dce34d0c66255d9a9ac20cba Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 10 Aug 2021 01:50:03 +0000 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I81876dd7997ec3f72890ebb1cce1d42a6fd1917f --- core/res/res/values-ka/strings.xml | 2 +- core/res/res/values-te/strings.xml | 28 ++++++++++++++-------------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml index 8765659347f9..789e2794e083 100644 --- a/core/res/res/values-ka/strings.xml +++ b/core/res/res/values-ka/strings.xml @@ -57,7 +57,7 @@ "IMEI" "MEID" "შემომავალი ზარის აბონენტის ID" - "გამავალი აბონენტის ID-ის დამალვა" + "გამავალი აბონენტის ID-ს დამალვა" "დაუკავშირდა Line ID-ს" "დაუკავშირდა Line ID Restriction-ს" "ზარის გადამისამართება" diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index 81be9a7988b0..1d2fd8a0885b 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -247,21 +247,21 @@ "పవర్" "రీస్టార్ట్ చేయి" "ఎమర్జెన్సీ" - "బగ్ నివేదిక" + "బగ్ రిపోర్ట్‌" "సెషన్‌ను ముగించు" "స్క్రీన్‌షాట్" "బగ్ రిపోర్ట్‌" - "ఇది ఇ-మెయిల్ సందేశం రూపంలో పంపడానికి మీ ప్రస్తుత పరికర స్థితి గురించి సమాచారాన్ని సేకరిస్తుంది. బగ్ నివేదికను ప్రారంభించడం మొదలుకొని పంపడానికి సిద్ధం చేసే వరకు ఇందుకు కొంత సమయం పడుతుంది; దయచేసి ఓపిక పట్టండి." - "ప్రభావశీల నివేదిక" - "చాలా సందర్భాల్లో దీన్ని ఉపయోగించండి. ఇది నివేదిక ప్రోగ్రెస్‌ను ట్రాక్ చేయడానికి, సమస్య గురించి మరిన్ని వివరాలను నమోదు చేయడానికి మరియు స్క్రీన్‌షాట్‌లు తీయడానికి మిమ్మల్ని అనుమతిస్తుంది. ఇది నివేదించడానికి ఎక్కువ సమయం పట్టే తక్కువ వినియోగ విభాగాలను విడిచిపెట్టవచ్చు." - "పూర్తి నివేదిక" - "మీ పరికరం ప్రతిస్పందనరహితంగా ఉన్నప్పుడు లేదా చాలా నెమ్మదిగా ఉన్నప్పుడు లేదా మీకు అన్ని నివేదిక విభాగాలు అవసరమైనప్పుడు సిస్టమ్‌కి అంతరాయ స్థాయి కనిష్టంగా ఉండేలా చేయడానికి ఈ ఎంపిక ఉపయోగించండి. ఇది మరిన్ని వివరాలను నమోదు చేయడానికి లేదా అదనపు స్క్రీన్‌షాట్‌లు తీయడానికి మిమ్మల్ని అనుమతించదు." + "ఇది ఇ-మెయిల్ సందేశం రూపంలో పంపడానికి మీ ప్రస్తుత పరికర స్థితి గురించి సమాచారాన్ని సేకరిస్తుంది. బగ్ రిపోర్ట్‌ను ప్రారంభించడం మొదలుకొని పంపడానికి సిద్ధం చేసే వరకు ఇందుకు కొంత సమయం పడుతుంది; దయచేసి ఓపిక పట్టండి." + "ప్రభావశీల రిపోర్ట్‌" + "చాలా సందర్భాల్లో దీన్ని ఉపయోగించండి. ఇది రిపోర్ట్‌ ప్రోగ్రెస్‌ను ట్రాక్ చేయడానికి, సమస్య గురించి మరిన్ని వివరాలను నమోదు చేయడానికి మరియు స్క్రీన్‌షాట్‌లు తీయడానికి మిమ్మల్ని అనుమతిస్తుంది. ఇది నివేదించడానికి ఎక్కువ సమయం పట్టే తక్కువ వినియోగ విభాగాలను విడిచిపెట్టవచ్చు." + "పూర్తి రిపోర్ట్‌" + "మీ పరికరం ప్రతిస్పందనరహితంగా ఉన్నప్పుడు లేదా చాలా నెమ్మదిగా ఉన్నప్పుడు లేదా మీకు అన్ని రిపోర్ట్‌ విభాగాలు అవసరమైనప్పుడు సిస్టమ్‌కి అంతరాయ స్థాయి కనిష్టంగా ఉండేలా చేయడానికి ఈ ఎంపిక ఉపయోగించండి. ఇది మరిన్ని వివరాలను నమోదు చేయడానికి లేదా అదనపు స్క్రీన్‌షాట్‌లు తీయడానికి మిమ్మల్ని అనుమతించదు." - బగ్ నివేదిక కోసం %d సెకన్లలో స్క్రీన్‌షాట్ తీయబోతోంది. - బగ్ నివేదిక కోసం %d సెకనులో స్క్రీన్‌షాట్ తీయబోతోంది. + బగ్ రిపోర్ట్‌ కోసం %d సెకన్లలో స్క్రీన్‌షాట్ తీయబోతోంది. + బగ్ రిపోర్ట్‌ కోసం %d సెకనులో స్క్రీన్‌షాట్ తీయబోతోంది. - "బగ్ నివేదికతో ఉన్న స్క్రీన్‌షాట్ తీయబడింది" - "బగ్ నివేదికతో ఉన్న స్క్రీన్‌షాట్‌ను తీయడం విఫలమైంది" + "బగ్ రిపోర్ట్‌తో ఉన్న స్క్రీన్‌షాట్ తీయబడింది" + "బగ్ రిపోర్ట్‌తో ఉన్న స్క్రీన్‌షాట్‌ను తీయడం విఫలమైంది" "నిశ్శబ్ద మోడ్" "ధ్వని ఆఫ్‌లో ఉంది" "ధ్వని ఆన్‌లో ఉంది" @@ -1384,10 +1384,10 @@ "USB పోర్ట్ ఆటోమేటిక్‌గా నిలిపివేయబడింది. మరింత తెలుసుకోవడానికి నొక్కండి." "USB పోర్ట్‌ను ఉపయోగించడం సురక్షితం" "ఫోన్ ఇకపై ద్రవ లేదా వ్యర్థ పదార్థాలను గుర్తించదు." - "బగ్ నివేదికను తీస్తోంది…" - "బగ్ నివేదికను భాగస్వామ్యం చేయాలా?" - "బగ్ నివేదికను భాగస్వామ్యం చేస్తోంది..." - "మీ నిర్వాహకులు ఈ పరికరం సమస్యకు పరిష్కారాన్ని కనుగొనడంలో సహాయం కోసం బగ్ నివేదికను అభ్యర్థించారు. యాప్‌లు మరియు డేటా భాగస్వామ్యం చేయబడవచ్చు." + "బగ్ రిపోర్ట్‌ను తీస్తోంది…" + "బగ్ రిపోర్ట్‌ను భాగస్వామ్యం చేయాలా?" + "బగ్ రిపోర్ట్‌ను భాగస్వామ్యం చేస్తోంది..." + "మీ నిర్వాహకులు ఈ పరికరం సమస్యకు పరిష్కారాన్ని కనుగొనడంలో సహాయం కోసం బగ్ రిపోర్ట్‌ను అభ్యర్థించారు. యాప్‌లు మరియు డేటా భాగస్వామ్యం చేయబడవచ్చు." "షేర్ చేయి" "తిరస్కరిస్తున్నాను" "ఇన్‌పుట్ పద్ధతిని ఎంచుకోండి" -- cgit v1.2.3 From 33f7214384598709d7afa592901d1f891bdf063c Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 10 Aug 2021 02:04:10 +0000 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: If354b64f0817b60f66e4623699e7cf17d20df8fa --- packages/VpnDialogs/res/values-eu/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/VpnDialogs/res/values-eu/strings.xml b/packages/VpnDialogs/res/values-eu/strings.xml index 9fc16e27ca7f..a27a66a86c9d 100644 --- a/packages/VpnDialogs/res/values-eu/strings.xml +++ b/packages/VpnDialogs/res/values-eu/strings.xml @@ -17,7 +17,7 @@ "Konektatzeko eskaera" - "%s aplikazioak VPN bidezko konexioa ezarri nahi du sareko trafikoa kontrolatzeko. Iturburua fidagarria bada bakarrik baimendu. <br /> <br /> VPN konexioa aktibo dagoenean, <img src=vpn_icon /> agertuko da pantailaren goialdean." + "%s aplikazioak VPN bidezko konexioa ezarri nahi du sareko trafikoa kontrolatzeko. Iturburua fidagarria bada bakarrik baimendu. <br /> <br /> VPN bidezko konexioa aktibo dagoenean, <img src=vpn_icon /> agertuko da pantailaren goialdean." "%s aplikazioak VPN bidezko konexio bat konfiguratu nahi du sareko trafikoa gainbegiratzeko. Onartu soilik iturburuaz fidatzen bazara. <br /> <br /> <img src=vpn_icon /> agertzen da pantailan, VPNa aktibo dagoenean." "VPN sarera konektatuta dago" "Saioa:" -- cgit v1.2.3 From c4e1c545e269968238a3a3628bd96a6d6994c6ab Mon Sep 17 00:00:00 2001 From: Beth Thibodeau Date: Fri, 23 Jul 2021 17:59:38 -0400 Subject: Reduce height of expanded media controls Total height is now 192 dp. Reduced album art size and some padding for expanded media control layout. Also adjusted album art size and padding for expanded recommendations card to fit Bug: 189700268 Fixes: 194492458 Test: visual Change-Id: I3ca096e663d10a05abee2a645dacfe4ce001597c (cherry picked from commit 69377262a45d355dd42ff555edd600191177d04f) --- packages/SystemUI/res/layout/media_view.xml | 2 +- packages/SystemUI/res/values/dimens.xml | 9 +++++---- packages/SystemUI/res/xml/media_expanded.xml | 10 +++------- packages/SystemUI/res/xml/media_recommendation_expanded.xml | 12 ++++++------ 4 files changed, 15 insertions(+), 18 deletions(-) diff --git a/packages/SystemUI/res/layout/media_view.xml b/packages/SystemUI/res/layout/media_view.xml index c0d353bf8f56..075473aef9ac 100644 --- a/packages/SystemUI/res/layout/media_view.xml +++ b/packages/SystemUI/res/layout/media_view.xml @@ -185,7 +185,7 @@ android:maxHeight="@dimen/qs_media_enabled_seekbar_height" android:paddingTop="@dimen/qs_media_enabled_seekbar_vertical_padding" android:layout_marginTop="-22dp" - android:paddingBottom="0dp" + android:paddingBottom="2dp" android:splitTrack="false" /> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 0e02ad09d2c9..6ad9ab9a26ec 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -1287,7 +1287,7 @@ 16dp 72dp - 92dp + 84dp 14dp 26dp 12dp @@ -1304,13 +1304,14 @@ 22dp 1dp 2dp - 31dp - 32dp + 28dp + 29dp 72dp - 80dp + 76dp 8dp + 4dp 16sp diff --git a/packages/SystemUI/res/xml/media_expanded.xml b/packages/SystemUI/res/xml/media_expanded.xml index 9d706c5bad20..0e284e6ad631 100644 --- a/packages/SystemUI/res/xml/media_expanded.xml +++ b/packages/SystemUI/res/xml/media_expanded.xml @@ -93,7 +93,7 @@ android:layout_marginEnd="@dimen/qs_media_padding" android:layout_marginBottom="@dimen/qs_media_info_margin" app:layout_constrainedWidth="true" - android:layout_marginTop="@dimen/qs_media_info_spacing" + android:layout_marginTop="1dp" app:layout_constraintTop_toBottomOf="@id/header_title" app:layout_constraintStart_toStartOf="@id/header_title" app:layout_constraintEnd_toEndOf="parent" @@ -104,7 +104,8 @@ android:id="@+id/media_progress_bar" android:layout_width="0dp" android:layout_height="wrap_content" - app:layout_constraintTop_toBottomOf="@id/header_artist" + android:layout_marginTop="34dp" + app:layout_constraintTop_toBottomOf="@id/center_horizontal_guideline" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" /> @@ -124,7 +125,6 @@ android:id="@+id/action0" android:layout_width="48dp" android:layout_height="48dp" - android:layout_marginTop="@dimen/qs_media_action_margin" android:layout_marginStart="@dimen/qs_media_padding" android:layout_marginEnd="@dimen/qs_media_action_spacing" android:layout_marginBottom="@dimen/qs_media_action_margin" @@ -139,7 +139,6 @@ android:id="@+id/action1" android:layout_width="48dp" android:layout_height="48dp" - android:layout_marginTop="@dimen/qs_media_action_margin" android:layout_marginStart="@dimen/qs_media_action_spacing" android:layout_marginEnd="@dimen/qs_media_action_spacing" android:layout_marginBottom="@dimen/qs_media_action_margin" @@ -153,7 +152,6 @@ android:id="@+id/action2" android:layout_width="48dp" android:layout_height="48dp" - android:layout_marginTop="@dimen/qs_media_action_margin" android:layout_marginStart="@dimen/qs_media_action_spacing" android:layout_marginEnd="@dimen/qs_media_action_spacing" android:layout_marginBottom="@dimen/qs_media_action_margin" @@ -167,7 +165,6 @@ android:id="@+id/action3" android:layout_width="48dp" android:layout_height="48dp" - android:layout_marginTop="@dimen/qs_media_action_margin" android:layout_marginStart="@dimen/qs_media_action_spacing" android:layout_marginEnd="@dimen/qs_media_action_spacing" android:layout_marginBottom="@dimen/qs_media_action_margin" @@ -181,7 +178,6 @@ android:id="@+id/action4" android:layout_width="48dp" android:layout_height="48dp" - android:layout_marginTop="@dimen/qs_media_action_margin" android:layout_marginStart="@dimen/qs_media_action_spacing" android:layout_marginEnd="@dimen/qs_media_padding" android:layout_marginBottom="@dimen/qs_media_action_margin" diff --git a/packages/SystemUI/res/xml/media_recommendation_expanded.xml b/packages/SystemUI/res/xml/media_recommendation_expanded.xml index d8e132cc1208..8a3d5ca75a77 100644 --- a/packages/SystemUI/res/xml/media_recommendation_expanded.xml +++ b/packages/SystemUI/res/xml/media_recommendation_expanded.xml @@ -43,7 +43,7 @@ android:layout_height="@dimen/qs_aa_media_rec_album_size_expanded" app:layout_constraintWidth_max="@dimen/qs_aa_media_rec_album_size_expanded" android:layout_marginTop="@dimen/qs_media_padding" - android:layout_marginBottom="@dimen/qs_aa_media_rec_album_margin" + android:layout_marginBottom="@dimen/qs_aa_media_rec_album_margin_vert" android:layout_marginEnd="@dimen/qs_aa_media_rec_album_margin" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toTopOf="@+id/media_horizontal_center_guideline" @@ -61,7 +61,7 @@ android:layout_height="@dimen/qs_aa_media_rec_album_size_expanded" app:layout_constraintWidth_max="@dimen/qs_aa_media_rec_album_size_expanded" android:layout_marginTop="@dimen/qs_media_padding" - android:layout_marginBottom="@dimen/qs_aa_media_rec_album_margin" + android:layout_marginBottom="@dimen/qs_aa_media_rec_album_margin_vert" android:layout_marginEnd="@dimen/qs_aa_media_rec_album_margin" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toTopOf="@+id/media_horizontal_center_guideline" @@ -79,7 +79,7 @@ android:layout_height="@dimen/qs_aa_media_rec_album_size_expanded" app:layout_constraintWidth_max="@dimen/qs_aa_media_rec_album_size_expanded" android:layout_marginTop="@dimen/qs_media_padding" - android:layout_marginBottom="@dimen/qs_aa_media_rec_album_margin" + android:layout_marginBottom="@dimen/qs_aa_media_rec_album_margin_vert" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toTopOf="@+id/media_horizontal_center_guideline" app:layout_constraintStart_toEndOf="@id/media_cover2_container" @@ -95,7 +95,7 @@ android:layout_width="0dp" android:layout_height="@dimen/qs_aa_media_rec_album_size_expanded" app:layout_constraintWidth_max="@dimen/qs_aa_media_rec_album_size_expanded" - android:layout_marginTop="@dimen/qs_aa_media_rec_album_margin" + android:layout_marginTop="@dimen/qs_aa_media_rec_album_margin_vert" android:layout_marginBottom="@dimen/qs_media_padding" android:layout_marginEnd="@dimen/qs_aa_media_rec_album_margin" app:layout_constraintTop_toBottomOf="@+id/media_horizontal_center_guideline" @@ -113,7 +113,7 @@ android:layout_width="0dp" android:layout_height="@dimen/qs_aa_media_rec_album_size_expanded" app:layout_constraintWidth_max="@dimen/qs_aa_media_rec_album_size_expanded" - android:layout_marginTop="@dimen/qs_aa_media_rec_album_margin" + android:layout_marginTop="@dimen/qs_aa_media_rec_album_margin_vert" android:layout_marginBottom="@dimen/qs_media_padding" android:layout_marginEnd="@dimen/qs_aa_media_rec_album_margin" app:layout_constraintTop_toBottomOf="@+id/media_horizontal_center_guideline" @@ -131,7 +131,7 @@ android:layout_width="0dp" android:layout_height="@dimen/qs_aa_media_rec_album_size_expanded" app:layout_constraintWidth_max="@dimen/qs_aa_media_rec_album_size_expanded" - android:layout_marginTop="@dimen/qs_aa_media_rec_album_margin" + android:layout_marginTop="@dimen/qs_aa_media_rec_album_margin_vert" android:layout_marginBottom="@dimen/qs_media_padding" app:layout_constraintTop_toBottomOf="@id/media_horizontal_center_guideline" app:layout_constraintBottom_toBottomOf="parent" -- cgit v1.2.3 From 6c60c5c7c1cf671066838413c6d799e9df244bc0 Mon Sep 17 00:00:00 2001 From: Michael Groover Date: Mon, 9 Aug 2021 19:50:56 -0700 Subject: Create new instance of shared lineage signers to preserve capabilities When the platform writes package signatures to packages.xml the first instance of a shared signature is written with the hex value of the ANS.1 DER encoding and an index; subsequent instances of the same signature just reference it via the index value. When writing a previous signer in the lineage a flags attribute is also written containing the capabilities of this previous signer in the lineage. During boot the platform will read the packages and signatures from the packages.xml, but when a shared signer is read the initial instance of the signature is used for all packages that share this same signer even if the signer is a previous signer with its own capabilities. This causes the platform to lose the unique capabilities granted to each signing lineage that use the same signatures and can prevent apps from being able to join a sharedUserId if another app with a lineage has revoked this capability from its own signer. This commit creates a new signature for each shared signature used as a previous signer in the lineage to ensure these unique capabilities are maintained. Bug: 195789348 Test: atest PkgInstallSignatureVerificationTest# testSharedKeyInSeparateLineageRetainsDeclaredCapabilities Change-Id: I0f763a1b1b004c6e6e4f80d0e401ad5d4c4fab34 --- .../core/java/com/android/server/pm/PackageSignatures.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/pm/PackageSignatures.java b/services/core/java/com/android/server/pm/PackageSignatures.java index 394cdee8f917..83f54f156750 100644 --- a/services/core/java/com/android/server/pm/PackageSignatures.java +++ b/services/core/java/com/android/server/pm/PackageSignatures.java @@ -174,7 +174,16 @@ class PackageSignatures { if (index >= 0 && index < readSignatures.size()) { Signature sig = readSignatures.get(index); if (sig != null) { - signatures.add(sig); + // An app using a shared signature in its signing lineage + // can have unique capabilities assigned to this previous + // signer; create a new instance of this Signature to ensure + // its flags do not overwrite those of the instance from + // readSignatures. + if (isPastSigs) { + signatures.add(new Signature(sig)); + } else { + signatures.add(sig); + } signatureParsed = true; } else { PackageManagerService.reportSettingsProblem(Log.WARN, -- cgit v1.2.3 From 8a0482a6f79a4dfcd6b2672554a40fde7ebc04c6 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 10 Aug 2021 04:48:41 +0000 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I9d52956f3c7e82d2c6efb17b77e68ecec9f445a6 --- packages/PackageInstaller/res/values-te/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/PackageInstaller/res/values-te/strings.xml b/packages/PackageInstaller/res/values-te/strings.xml index eb6cfdbfacd7..0e55e28bf473 100644 --- a/packages/PackageInstaller/res/values-te/strings.xml +++ b/packages/PackageInstaller/res/values-te/strings.xml @@ -86,7 +86,7 @@ "తెలియని యాప్‌లు మీ ఫోన్ పైన, వ్యక్తిగత డేటా పైన దాడి చేయడానికి ఎక్కువగా అవకాశం ఉంటుంది. ఈ యాప్‌ను ఇన్‌స్టాల్ చేయడం ద్వారా, దాని వినియోగంతో మీ ఫోన్‌కు ఏదైనా నష్టం జరిగితే లేదా మీ డేటాను కోల్పోతే అందుకు మీరే బాధ్యత వహిస్తారని అంగీకరిస్తున్నారు." "మీ టాబ్లెట్ మరియు వ్యక్తిగత డేటాపై తెలియని యాప్‌లు దాడి చేయడానికి ఎక్కువ అవకాశం ఉంది. మీరు ఈ యాప్‌ను ఇన్‌స్టాల్ చేయడం ద్వారా, దీనిని ఉపయోగించడం వలన మీ టాబ్లెట్‌కు ఏదైనా హాని జరిగినా లేదా డేటా కోల్పోయినా బాధ్యత మీదేనని అంగీకరిస్తున్నారు." "మీ టీవీ మరియు వ్యక్తిగత డేటాపై తెలియని యాప్‌లు దాడి చేయడానికి ఎక్కువ అవకాశం ఉంది. మీరు ఈ యాప్‌ను ఇన్‌స్టాల్ చేయడం ద్వారా, దీనిని ఉపయోగించడం వలన మీ టీవీకి ఏదైనా హాని జరిగినా లేదా డేటా కోల్పోయినా బాధ్యత మీదేనని అంగీకరిస్తున్నారు." - "కొనసాగించు" + "కొనసాగండి" "సెట్టింగ్‌లు" "Wear యాప్‌లను ఇన్‌స్టాల్/అన్‌ఇన్‌స్టాల్ చేస్తోంది" "యాప్ ఇన్‌స్టాల్ చేయబడిందనే నోటిఫికేషన్" -- cgit v1.2.3 From 3f1e09793bb652be8a139d92a375ad2a416a2415 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 10 Aug 2021 04:54:33 +0000 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Iafd9faff184740491284b5e433383a88d0c886dc --- packages/PackageInstaller/res/values-te/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/PackageInstaller/res/values-te/strings.xml b/packages/PackageInstaller/res/values-te/strings.xml index dba1ab4de61f..11e01c7ce51d 100644 --- a/packages/PackageInstaller/res/values-te/strings.xml +++ b/packages/PackageInstaller/res/values-te/strings.xml @@ -86,7 +86,7 @@ "తెలియని యాప్‌లు మీ ఫోన్ పైన, వ్యక్తిగత డేటా పైన దాడి చేయడానికి ఎక్కువగా అవకాశం ఉంటుంది. ఈ యాప్‌ను ఇన్‌స్టాల్ చేయడం ద్వారా, దాని వినియోగంతో మీ ఫోన్‌కు ఏదైనా నష్టం జరిగితే లేదా మీ డేటాను కోల్పోతే అందుకు మీరే బాధ్యత వహిస్తారని అంగీకరిస్తున్నారు." "మీ టాబ్లెట్ మరియు వ్యక్తిగత డేటాపై తెలియని యాప్‌లు దాడి చేయడానికి ఎక్కువ అవకాశం ఉంది. మీరు ఈ యాప్‌ను ఇన్‌స్టాల్ చేయడం ద్వారా, దీనిని ఉపయోగించడం వలన మీ టాబ్లెట్‌కు ఏదైనా హాని జరిగినా లేదా డేటా కోల్పోయినా బాధ్యత మీదేనని అంగీకరిస్తున్నారు." "మీ టీవీ మరియు వ్యక్తిగత డేటాపై తెలియని యాప్‌లు దాడి చేయడానికి ఎక్కువ అవకాశం ఉంది. మీరు ఈ యాప్‌ను ఇన్‌స్టాల్ చేయడం ద్వారా, దీనిని ఉపయోగించడం వలన మీ టీవీకి ఏదైనా హాని జరిగినా లేదా డేటా కోల్పోయినా బాధ్యత మీదేనని అంగీకరిస్తున్నారు." - "కొనసాగించు" + "కొనసాగండి" "సెట్టింగ్‌లు" "Wear యాప్‌లను ఇన్‌స్టాల్/అన్‌ఇన్‌స్టాల్ చేస్తోంది" "యాప్ ఇన్‌స్టాల్ చేయబడిందనే నోటిఫికేషన్" -- cgit v1.2.3 From 514aa6acf04a644b497bc91daa1705a96cf72bf5 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 10 Aug 2021 05:19:04 +0000 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I81ef822474ecd8002af6695335bf02c16b326735 --- packages/Shell/res/values-te/strings.xml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/Shell/res/values-te/strings.xml b/packages/Shell/res/values-te/strings.xml index fc49f079f82d..50b5c8550ef2 100644 --- a/packages/Shell/res/values-te/strings.xml +++ b/packages/Shell/res/values-te/strings.xml @@ -18,30 +18,30 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "షెల్" "బగ్ రిపోర్ట్స్" - "బగ్ నివేదిక #%d ఉత్పాదించబడుతోంది" - "బగ్ నివేదిక #%d సంగ్రహించబడింది" - "బగ్ నివేదికకు వివరాలను జోడిస్తోంది" + "బగ్ రిపోర్ట్‌ #%d ఉత్పాదించబడుతోంది" + "బగ్ రిపోర్ట్‌ #%d సంగ్రహించబడింది" + "బగ్ రిపోర్ట్‌‌కు వివరాలను జోడిస్తోంది" "దయచేసి వేచి ఉండండి..." - "బగ్ నివేదిక త్వరలో ఫోన్‌లో కనిపిస్తుంది" - "మీ బగ్ నివేదికను భాగస్వామ్యం చేయడానికి ఎంచుకోండి" - "మీ బగ్ నివేదికను షేర్ చేయడానికి నొక్కండి" - "స్క్రీన్‌షాట్ లేకుండా మీ బగ్ నివేదికను భాగస్వామ్యం చేయడానికి ఎంచుకోండి లేదా స్క్రీన్‌షాట్ ముగిసేదాకా వేచి ఉండండి" + "బగ్ రిపోర్ట్‌ త్వరలో ఫోన్‌లో కనిపిస్తుంది" + "మీ బగ్ రిపోర్ట్‌ను భాగస్వామ్యం చేయడానికి ఎంచుకోండి" + "మీ బగ్ రిపోర్ట్‌ను షేర్ చేయడానికి నొక్కండి" + "స్క్రీన్‌షాట్ లేకుండా మీ బగ్ రిపోర్ట్‌ను భాగస్వామ్యం చేయడానికి ఎంచుకోండి లేదా స్క్రీన్‌షాట్ ముగిసేదాకా వేచి ఉండండి" "స్క్రీన్‌షాట్ లేకుండా మీ బగ్ నివే. భాగ. చేయడానికి నొక్కండి లేదా స్క్రీన్‌షాట్ ముగిసేదాకా వేచి ఉండండి" "స్క్రీన్‌షాట్ లేకుండా మీ బగ్ నివే. భాగ. చేయడానికి నొక్కండి లేదా స్క్రీన్‌షాట్ ముగిసేదాకా వేచి ఉండండి" - "బగ్ రిపోర్ట్స్‌లో మీరు గోప్యమైనదిగా పరిగణించే (యాప్ వినియోగం, లొకేష‌న్‌ డేటా వంటి) డేటాతో పాటు సిస్టమ్‌కు సంబంధించిన విభిన్న లాగ్ ఫైళ్ల డేటా ఉంటుంది. బగ్ నివేదికలను మీరు విశ్వసించే యాప్‌లు, వ్యక్తులతో మాత్రమే షేర్ చేయండి." + "బగ్ రిపోర్ట్స్‌లో మీరు గోప్యమైనదిగా పరిగణించే (యాప్ వినియోగం, లొకేష‌న్‌ డేటా వంటి) డేటాతో పాటు సిస్టమ్‌కు సంబంధించిన విభిన్న లాగ్ ఫైళ్ల డేటా ఉంటుంది. బగ్ రిపోర్ట్‌లను మీరు విశ్వసించే యాప్‌లు, వ్యక్తులతో మాత్రమే షేర్ చేయండి." "మళ్లీ చూపవద్దు" "బగ్ రిపోర్ట్స్" - "బగ్ నివేదిక ఫైల్‌ను చదవడం సాధ్యపడలేదు" - "బగ్ నివేదిక వివరాలను జిప్ ఫైల్‌కు జోడించడం సాధ్యపడలేదు" + "బగ్ రిపోర్ట్‌ ఫైల్‌ను చదవడం సాధ్యపడలేదు" + "బగ్ రిపోర్ట్‌ వివరాలను జిప్ ఫైల్‌కు జోడించడం సాధ్యపడలేదు" "పేరు లేనివి" "వివరాలు" "స్క్రీన్‌షాట్" "స్క్రీన్‌షాట్ విజయవంతంగా తీయబడింది." "స్క్రీన్‌షాట్‌ను తీయడం సాధ్యపడలేదు." - "బగ్ నివేదిక #%d వివరాలు" + "బగ్ రిపోర్ట్‌ #%d వివరాలు" "ఫైల్ పేరు" "బగ్ శీర్షిక" "బగ్ సారాంశం" "సేవ్ చేయి" - "బగ్ నివేదిక షేర్ చేయండి" + "బగ్ రిపోర్ట్‌ షేర్ చేయండి" -- cgit v1.2.3 From 27ea8be07ac63fe1074ac3e02d86ace43b047059 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 10 Aug 2021 05:24:47 +0000 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I4cac51ac28c8c10d614f6be467030ac0d151b7e1 --- packages/Shell/res/values-te/strings.xml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/Shell/res/values-te/strings.xml b/packages/Shell/res/values-te/strings.xml index fc49f079f82d..50b5c8550ef2 100644 --- a/packages/Shell/res/values-te/strings.xml +++ b/packages/Shell/res/values-te/strings.xml @@ -18,30 +18,30 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "షెల్" "బగ్ రిపోర్ట్స్" - "బగ్ నివేదిక #%d ఉత్పాదించబడుతోంది" - "బగ్ నివేదిక #%d సంగ్రహించబడింది" - "బగ్ నివేదికకు వివరాలను జోడిస్తోంది" + "బగ్ రిపోర్ట్‌ #%d ఉత్పాదించబడుతోంది" + "బగ్ రిపోర్ట్‌ #%d సంగ్రహించబడింది" + "బగ్ రిపోర్ట్‌‌కు వివరాలను జోడిస్తోంది" "దయచేసి వేచి ఉండండి..." - "బగ్ నివేదిక త్వరలో ఫోన్‌లో కనిపిస్తుంది" - "మీ బగ్ నివేదికను భాగస్వామ్యం చేయడానికి ఎంచుకోండి" - "మీ బగ్ నివేదికను షేర్ చేయడానికి నొక్కండి" - "స్క్రీన్‌షాట్ లేకుండా మీ బగ్ నివేదికను భాగస్వామ్యం చేయడానికి ఎంచుకోండి లేదా స్క్రీన్‌షాట్ ముగిసేదాకా వేచి ఉండండి" + "బగ్ రిపోర్ట్‌ త్వరలో ఫోన్‌లో కనిపిస్తుంది" + "మీ బగ్ రిపోర్ట్‌ను భాగస్వామ్యం చేయడానికి ఎంచుకోండి" + "మీ బగ్ రిపోర్ట్‌ను షేర్ చేయడానికి నొక్కండి" + "స్క్రీన్‌షాట్ లేకుండా మీ బగ్ రిపోర్ట్‌ను భాగస్వామ్యం చేయడానికి ఎంచుకోండి లేదా స్క్రీన్‌షాట్ ముగిసేదాకా వేచి ఉండండి" "స్క్రీన్‌షాట్ లేకుండా మీ బగ్ నివే. భాగ. చేయడానికి నొక్కండి లేదా స్క్రీన్‌షాట్ ముగిసేదాకా వేచి ఉండండి" "స్క్రీన్‌షాట్ లేకుండా మీ బగ్ నివే. భాగ. చేయడానికి నొక్కండి లేదా స్క్రీన్‌షాట్ ముగిసేదాకా వేచి ఉండండి" - "బగ్ రిపోర్ట్స్‌లో మీరు గోప్యమైనదిగా పరిగణించే (యాప్ వినియోగం, లొకేష‌న్‌ డేటా వంటి) డేటాతో పాటు సిస్టమ్‌కు సంబంధించిన విభిన్న లాగ్ ఫైళ్ల డేటా ఉంటుంది. బగ్ నివేదికలను మీరు విశ్వసించే యాప్‌లు, వ్యక్తులతో మాత్రమే షేర్ చేయండి." + "బగ్ రిపోర్ట్స్‌లో మీరు గోప్యమైనదిగా పరిగణించే (యాప్ వినియోగం, లొకేష‌న్‌ డేటా వంటి) డేటాతో పాటు సిస్టమ్‌కు సంబంధించిన విభిన్న లాగ్ ఫైళ్ల డేటా ఉంటుంది. బగ్ రిపోర్ట్‌లను మీరు విశ్వసించే యాప్‌లు, వ్యక్తులతో మాత్రమే షేర్ చేయండి." "మళ్లీ చూపవద్దు" "బగ్ రిపోర్ట్స్" - "బగ్ నివేదిక ఫైల్‌ను చదవడం సాధ్యపడలేదు" - "బగ్ నివేదిక వివరాలను జిప్ ఫైల్‌కు జోడించడం సాధ్యపడలేదు" + "బగ్ రిపోర్ట్‌ ఫైల్‌ను చదవడం సాధ్యపడలేదు" + "బగ్ రిపోర్ట్‌ వివరాలను జిప్ ఫైల్‌కు జోడించడం సాధ్యపడలేదు" "పేరు లేనివి" "వివరాలు" "స్క్రీన్‌షాట్" "స్క్రీన్‌షాట్ విజయవంతంగా తీయబడింది." "స్క్రీన్‌షాట్‌ను తీయడం సాధ్యపడలేదు." - "బగ్ నివేదిక #%d వివరాలు" + "బగ్ రిపోర్ట్‌ #%d వివరాలు" "ఫైల్ పేరు" "బగ్ శీర్షిక" "బగ్ సారాంశం" "సేవ్ చేయి" - "బగ్ నివేదిక షేర్ చేయండి" + "బగ్ రిపోర్ట్‌ షేర్ చేయండి" -- cgit v1.2.3 From 545021a0d835cd418ae573ecbfe85a3f1c5ee70c Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 10 Aug 2021 05:28:14 +0000 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I447fab54cdd16552944b84b9f7d2c99b69698c05 --- packages/SystemUI/res/values-eu/strings.xml | 4 ++-- packages/SystemUI/res/values-mr/strings.xml | 2 +- packages/SystemUI/res/values-te/strings.xml | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index 60193a05aa84..5073b9fdc0d7 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -58,7 +58,7 @@ "Ireki %1$s %2$s konektatzen den guztietan" "Ireki %1$s %2$s konektatzen den guztietan" "USB bidezko arazketa onartu?" - "Ordenagailuaren RSA gakoaren erreferentzia-gako digitala hau da:\n%1$s" + "Ordenagailuaren RSA gakoaren aztarna digitala hau da:\n%1$s" "Eman beti ordenagailu honetatik arazteko baimena" "Eman baimena" "Ez da onartzen USB bidezko arazketa" @@ -566,7 +566,7 @@ " " "Ireki kredentzial fidagarriak" "Administratzaileak sarearen erregistroak aktibatu ditu; horrela, zure gailuko trafikoa gainbegira dezake.\n\nInformazio gehiago lortzeko, jarri administratzailearekin harremanetan." - "Aplikazio bati VPN konexio bat konfiguratzeko baimena eman diozu.\n\nAplikazio horrek gailuko eta sareko jarduerak kontrola ditzake, mezu elektronikoak, aplikazioak eta webguneak barne." + "Aplikazio bati VPN bidezko konexio bat konfiguratzeko baimena eman diozu.\n\nAplikazio horrek gailuko eta sareko jarduerak kontrola ditzake, mezu elektronikoak, aplikazioak eta webguneak barne." "%1$s erakundeak kudeatzen du zure laneko profila.\n\nAdministratzaileak sareko jarduerak kontrola diezazkizuke, besteak beste, posta elektronikoa, aplikazioak eta webguneak.\n\nInformazio gehiago lortzeko, jarri administratzailearekin harremanetan.\n\nHorrez gain, VPN batera zaude konektatuta, eta hark ere kontrola ditzake zure sareko jarduerak." "VPN konexioa" "%1$s aplikaziora konektatuta zaude. Aplikazio horrek sarean egiten dituzun jarduerak kontrola ditzake, mezu elektronikoak, aplikazioak eta webguneak barne." diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index 8cf9b34f365f..08a0443f2f2b 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -139,7 +139,7 @@ "व्हॉइस सहाय्य उघडा" "कॅमेरा उघडा" "रद्द करा" - "खात्री करा" + "कंफर्म करा" "पुन्हा प्रयत्न करा" "ऑथेंटिकेशन रद्द करण्यासाठी टॅप करा" "कृपया पुन्हा प्रयत्न करा" diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index d72859b520c6..da56f85b7908 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -332,10 +332,10 @@ "%1$s: %2$s" "నోటిఫికేషన్ సెట్టింగ్‌లు" "%s సెట్టింగ్‌లు" - "స్క్రీన్ స్వయంచాలకంగా తిప్పబడుతుంది." + "స్క్రీన్ ఆటోమేటిక్‌గా తిప్పబడుతుంది." "స్క్రీన్ ల్యాండ్‌స్కేప్ దృగ్విన్యాసంలో లాక్ చేయబడుతుంది." "స్క్రీన్ పోర్ట్రెయిట్ దృగ్విన్యాసంలో లాక్ చేయబడుతుంది." - "స్క్రీన్ ఇప్పుడు స్వయంచాలకంగా తిరుగుతుంది." + "స్క్రీన్ ఇప్పుడు ఆటోమేటిక్‌గా తిరుగుతుంది." "స్క్రీన్ ఇప్పుడు ల్యాండ్‌స్కేప్ దృగ్విన్యాసంలో లాక్ చేయబడింది." "స్క్రీన్ ఇప్పుడు పోర్ట్రెయిట్ దృగ్విన్యాసంలో లాక్ చేయబడింది." "డెజర్ట్ కేస్" @@ -434,7 +434,7 @@ "ఆపు" "పరికరం" "యాప్‌లను మార్చడం కోసం ఎగువకు స్వైప్ చేయండి" - "యాప్‌లను శీఘ్రంగా స్విచ్ చేయడానికి కుడి వైపుకు లాగండి" + "యాప్‌లను శీఘ్రంగా స్విచ్ చేయడానికి కుడి వైపునకు లాగండి" "స్థూలదృష్టిని టోగుల్ చేయి" "ఛార్జ్ చేయబడింది" "ఛార్జ్ అవుతోంది" @@ -926,7 +926,7 @@ "మీ ఫోన్ చాలా వేడిగా ఉంది, కనుక చల్లబర్చడానికి ఆఫ్ చేయబడింది. మీ ఫోన్ ఇప్పుడు సాధారణంగా పని చేస్తుంది.\n\nమీరు ఇలా చేస్తే మీ ఫోన్ చాలా వేడెక్కవచ్చు:\n • వనరు-ఆధారిత యాప్‌లు (గేమింగ్, వీడియో లేదా నావిగేషన్ వంటి యాప్‌లు) ఉపయోగించడం\n • పెద్ద ఫైళ్లను డౌన్‌లోడ్ లేదా అప్‌లోడ్ చేయడం\n • అధిక ఉష్ణోగ్రతలలో మీ ఫోన్‌ని ఉపయోగించడం" "ఫోన్ వేడెక్కుతోంది" "ఫోన్‌ను చల్లబరిచే క్రమంలో కొన్ని లక్షణాలు పరిమితం చేయబడ్డాయి" - "మీ ఫోన్ స్వయంచాలకంగా చల్లబడటానికి ప్రయత్నిస్తుంది. మీరు ఇప్పటికీ మీ ఫోన్‌ను ఉపయోగించవచ్చు, కానీ దాని పనితీరు నెమ్మదిగా ఉండవచ్చు.\n\nమీ ఫోన్ చల్లబడిన తర్వాత, అది సాధారణ రీతిలో పని చేస్తుంది." + "మీ ఫోన్ ఆటోమేటిక్‌గా చల్లబడటానికి ప్రయత్నిస్తుంది. మీరు ఇప్పటికీ మీ ఫోన్‌ను ఉపయోగించవచ్చు, కానీ దాని పనితీరు నెమ్మదిగా ఉండవచ్చు.\n\nమీ ఫోన్ చల్లబడిన తర్వాత, అది సాధారణ రీతిలో పని చేస్తుంది." "ప్లగ్ నుండి ఛార్జర్‌ తీసివేయండి" "ఈ పరికరాన్ని ఛార్జ్ చేయడంలో సమస్య ఉంది. పవర్ అడాప్టర్‌ను ప్లగ్ నుండి తీసివేసి, కేబుల్ ఏమైనా వేడిగా అయితే తగిన జాగ్రత్తలు తీసుకోండి." "తీసుకోవాల్సిన జాగ్రత్తలు ఏమిటో చూడండి" -- cgit v1.2.3 From b4a8dd665992e53c07da9c178b34c6ec4fffe6c9 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 10 Aug 2021 05:35:21 +0000 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I5f737debd2a4befcaa0a6c612af1374d15ffa937 --- packages/SystemUI/res/values-te-ldrtl/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/SystemUI/res/values-te-ldrtl/strings.xml b/packages/SystemUI/res/values-te-ldrtl/strings.xml index 1c1b56274c8e..94bdbcf19038 100644 --- a/packages/SystemUI/res/values-te-ldrtl/strings.xml +++ b/packages/SystemUI/res/values-te-ldrtl/strings.xml @@ -19,5 +19,5 @@ - "యాప్‌లను శీఘ్రంగా స్విచ్ చేయడానికి ఎడమ వైపుకు లాగండి" + "యాప్‌లను శీఘ్రంగా స్విచ్ చేయడానికి ఎడమ వైపునకు లాగండి" -- cgit v1.2.3 From 92f8c700b2f57bb0b8e3ff058d98d045235dfa48 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 10 Aug 2021 06:00:13 +0000 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I971598f81991b4d5e44c224939b401eb90b4e4e5 --- packages/SystemUI/res/values-eu/strings.xml | 4 ++-- packages/SystemUI/res/values-mr/strings.xml | 2 +- packages/SystemUI/res/values-te/strings.xml | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index 4f4892cf8f00..b6162a830186 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -58,7 +58,7 @@ "Ireki %1$s %2$s konektatzen den guztietan" "Ireki %1$s %2$s konektatzen den guztietan" "USB bidezko arazketa onartu?" - "Ordenagailuaren RSA gakoaren erreferentzia-gako digitala hau da:\n%1$s" + "Ordenagailuaren RSA gakoaren aztarna digitala hau da:\n%1$s" "Eman beti ordenagailu honetatik arazteko baimena" "Eman baimena" "Ez da onartzen USB bidezko arazketa" @@ -577,7 +577,7 @@ " " "Ireki kredentzial fidagarriak" "Administratzaileak sarearen erregistroak aktibatu ditu; horrela, zure gailuko trafikoa gainbegira dezake.\n\nInformazio gehiago lortzeko, jarri administratzailearekin harremanetan." - "Aplikazio bati VPN konexio bat konfiguratzeko baimena eman diozu.\n\nAplikazio horrek gailuko eta sareko jarduerak kontrola ditzake, mezu elektronikoak, aplikazioak eta webguneak barne." + "Aplikazio bati VPN bidezko konexio bat konfiguratzeko baimena eman diozu.\n\nAplikazio horrek gailuko eta sareko jarduerak kontrola ditzake, mezu elektronikoak, aplikazioak eta webguneak barne." "%1$s erakundeak kudeatzen du zure laneko profila.\n\nAdministratzaileak sareko jarduerak kontrola diezazkizuke, besteak beste, posta elektronikoa, aplikazioak eta webguneak.\n\nInformazio gehiago lortzeko, jarri administratzailearekin harremanetan.\n\nHorrez gain, VPN batera zaude konektatuta, eta hark ere kontrola ditzake zure sareko jarduerak." "Zure gurasoak kudeatzen du gailua. Zure gurasoak gailuko informazioa ikusi eta kudea dezake; besteak beste, zer aplikazio erabiltzen dituzun, zure kokapena zein den eta pantaila aurrean zenbat eta noiz egoten zaren." "VPN konexioa" diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index cee701953f69..1202a7467a2c 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -148,7 +148,7 @@ "व्हॉइस सहाय्य उघडा" "कॅमेरा उघडा" "रद्द करा" - "खात्री करा" + "कंफर्म करा" "पुन्हा प्रयत्न करा" "ऑथेंटिकेशन रद्द करण्यासाठी टॅप करा" "कृपया पुन्हा प्रयत्न करा" diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index 7ad382ec6bbc..45236a795573 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -319,10 +319,10 @@ "%1$s: %2$s" "నోటిఫికేషన్ సెట్టింగ్‌లు" "%s సెట్టింగ్‌లు" - "స్క్రీన్ స్వయంచాలకంగా తిప్పబడుతుంది." + "స్క్రీన్ ఆటోమేటిక్‌గా తిప్పబడుతుంది." "స్క్రీన్ ల్యాండ్‌స్కేప్ దృగ్విన్యాసంలో లాక్ చేయబడుతుంది." "స్క్రీన్ పోర్ట్రెయిట్ దృగ్విన్యాసంలో లాక్ చేయబడుతుంది." - "స్క్రీన్ ఇప్పుడు స్వయంచాలకంగా తిరుగుతుంది." + "స్క్రీన్ ఇప్పుడు ఆటోమేటిక్‌గా తిరుగుతుంది." "స్క్రీన్ ఇప్పుడు ల్యాండ్‌స్కేప్ దృగ్విన్యాసంలో లాక్ చేయబడింది." "స్క్రీన్ ఇప్పుడు పోర్ట్రెయిట్ దృగ్విన్యాసంలో లాక్ చేయబడింది." "డెజర్ట్ కేస్" @@ -941,7 +941,7 @@ "తీసుకోవాల్సిన జాగ్రత్తలు ఏమిటో చూడండి" "ఫోన్ వేడెక్కుతోంది" "ఫోన్‌ను చల్లబరిచే క్రమంలో కొన్ని ఫీచర్లు పరిమితం చేయబడ్డాయి.\nమరింత సమాచారం కోసం ట్యాప్ చేయండి" - "మీ ఫోన్ స్వయంచాలకంగా చల్లబడటానికి ప్రయత్నిస్తుంది. మీరు ఇప్పటికీ మీ ఫోన్‌ను ఉపయోగించవచ్చు, కానీ దాని పనితీరు నెమ్మదిగా ఉండవచ్చు.\n\nమీ ఫోన్ చల్లబడిన తర్వాత, అది సాధారణ రీతిలో పని చేస్తుంది." + "మీ ఫోన్ ఆటోమేటిక్‌గా చల్లబడటానికి ప్రయత్నిస్తుంది. మీరు ఇప్పటికీ మీ ఫోన్‌ను ఉపయోగించవచ్చు, కానీ దాని పనితీరు నెమ్మదిగా ఉండవచ్చు.\n\nమీ ఫోన్ చల్లబడిన తర్వాత, అది సాధారణ రీతిలో పని చేస్తుంది." "తీసుకోవాల్సిన జాగ్రత్తలు ఏమిటో చూడండి" "ప్లగ్ నుండి ఛార్జర్‌ తీసివేయండి" "ఈ పరికరాన్ని ఛార్జ్ చేయడంలో సమస్య ఉంది. పవర్ అడాప్టర్‌ను ప్లగ్ నుండి తీసివేసి, కేబుల్ ఏమైనా వేడిగా అయితే తగిన జాగ్రత్తలు తీసుకోండి." -- cgit v1.2.3 From cdf5fcd0353f4e9f10baf2482ab0b6eaf03ebb32 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 10 Aug 2021 06:10:26 +0000 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I3cbdbea10da9a5d918397a4395861a746830ed8b --- packages/SystemUI/res/values-te-ldrtl/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/SystemUI/res/values-te-ldrtl/strings.xml b/packages/SystemUI/res/values-te-ldrtl/strings.xml index 1c1b56274c8e..94bdbcf19038 100644 --- a/packages/SystemUI/res/values-te-ldrtl/strings.xml +++ b/packages/SystemUI/res/values-te-ldrtl/strings.xml @@ -19,5 +19,5 @@ - "యాప్‌లను శీఘ్రంగా స్విచ్ చేయడానికి ఎడమ వైపుకు లాగండి" + "యాప్‌లను శీఘ్రంగా స్విచ్ చేయడానికి ఎడమ వైపునకు లాగండి" -- cgit v1.2.3 From d1147b79330f32df0d50c22326dd68bb1b5bd5a9 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 10 Aug 2021 13:56:13 +0000 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ie9784ff9b9832ca8ad24b185078f9db1bcf833ef --- packages/SettingsLib/res/values-hi/strings.xml | 2 +- packages/SettingsLib/res/values-ta/strings.xml | 2 +- packages/SettingsLib/res/values-te/strings.xml | 14 +++++++------- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml index c83883d5a632..c52f6a4d52db 100644 --- a/packages/SettingsLib/res/values-hi/strings.xml +++ b/packages/SettingsLib/res/values-hi/strings.xml @@ -512,7 +512,7 @@ "कनेक्ट करने में समस्या हो रही है. डिवाइस को बंद करके चालू करें" "वायर वाला ऑडियो डिवाइस" "सहायता और सुझाव" - "डिवाइस की मेमोरी" + "डिवाइस का स्टोरेज" "शेयर किया गया डेटा" "शेयर किए गए डेटा को देखें और उसमें बदलाव करें" "इस उपयोगकर्ता के साथ किसी तरह का डेटा शेयर नहीं किया गया है." diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml index dbda29c5c44e..b10eae99b943 100644 --- a/packages/SettingsLib/res/values-ta/strings.xml +++ b/packages/SettingsLib/res/values-ta/strings.xml @@ -97,7 +97,7 @@ "செவித்துணை கருவிகளுடன் இணைக்கப்பட்டது" "மீடியா ஆடியோவுடன் இணைக்கப்பட்டது" "மொபைல் ஆடியோவுடன் இணைக்கப்பட்டது" - "கோப்பைப் பரிமாற்றும் சேவையகத்துடன் இணைக்கப்பட்டது" + "ஃபைலைப் பரிமாற்றும் சேவையகத்துடன் இணைக்கப்பட்டது" "வரைபடத்துடன் இணைக்கப்பட்டது" "SAP உடன் இணைக்கப்பட்டது" "கோப்பு இடமாற்றும் சேவையகத்துடன் இணைக்கப்படவில்லை" diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml index 26d12e03db59..41362b8ba869 100644 --- a/packages/SettingsLib/res/values-te/strings.xml +++ b/packages/SettingsLib/res/values-te/strings.xml @@ -33,11 +33,11 @@ "\'%1$s\'కు కనెక్ట్ చేయడం సాధ్యపడదు" "పాస్‌వర్డ్‌ను చెక్ చేసి, మళ్లీ ప్రయత్నించండి" "పరిధిలో లేదు" - "స్వయంచాలకంగా కనెక్ట్ కాదు" + "ఆటోమేటిక్‌గా కనెక్ట్ కాదు" "ఇంటర్నెట్ యాక్సెస్ లేదు" "%1$s ద్వారా సేవ్ చేయబడింది" - "%1$s ద్వారా స్వయంచాలకంగా కనెక్ట్ చేయబడింది" - "నెట్‌వర్క్ రేటింగ్ ప్రదాత ద్వారా స్వయంచాలకంగా కనెక్ట్ చేయబడింది" + "%1$s ద్వారా ఆటోమేటిక్‌గా కనెక్ట్ చేయబడింది" + "నెట్‌వర్క్ రేటింగ్ ప్రదాత ద్వారా ఆటోమేటిక్‌గా కనెక్ట్ చేయబడింది" "%1$s ద్వారా కనెక్ట్ చేయబడింది" "%1$s ద్వారా కనెక్ట్ చేయబడింది" "%1$s ద్వారా అందుబాటులో ఉంది" @@ -82,7 +82,7 @@ "L: %1$s బ్యాటరీ, R: %2$s బ్యాటరీ" "యాక్టివ్‌గా ఉంది" "మీడియా ఆడియో" - "ఫోన్ కాల్‌లు" + "ఫోన్ కాల్స్‌" "ఫైల్ బదిలీ" "ఇన్‌పుట్ పరికరం" "ఇంటర్నెట్ యాక్సెస్" @@ -301,7 +301,7 @@ "ఎల్లప్పుడూ మొబైల్ డేటాను యాక్టివ్‌గా ఉంచు, Wi‑Fi యాక్టివ్‌గా ఉన్నా కూడా (వేగవంతమైన నెట్‌వర్క్ మార్పు కోసం)." "అందుబాటులో ఉంటే టెథెరింగ్ హార్డ్‌వేర్ వేగవృద్ధిని ఉపయోగించండి" "USB డీబగ్గింగ్‌ను అనుమతించాలా?" - "USB డీబగ్గింగ్ అనేది అభివృద్ధి ప్రయోజనాల కోసం మాత్రమే ఉద్దేశించబడింది. మీ కంప్యూటర్ మరియు మీ పరికరం మధ్య డేటాను కాపీ చేయడానికి, నోటిఫికేషన్ లేకుండా మీ పరికరంలో అనువర్తనాలను ఇన్‌స్టాల్ చేయడానికి మరియు లాగ్ డేటాను చదవడానికి దీన్ని ఉపయోగించండి." + "USB డీబగ్గింగ్ అనేది అభివృద్ధి ప్రయోజనాల కోసం మాత్రమే ఉద్దేశించబడింది. మీ కంప్యూటర్ మరియు మీ పరికరం మధ్య డేటాను కాపీ చేయడానికి, నోటిఫికేషన్ లేకుండా మీ పరికరంలో యాప్‌లను ఇన్‌స్టాల్ చేయడానికి మరియు లాగ్ డేటాను చదవడానికి దీన్ని ఉపయోగించండి." "వైర్‌లెస్ డీబగ్గింగ్‌ను అనుమతించాలా?" "వైర్‌లెస్ డీబగ్గింగ్ అనేది అభివృద్ధి ప్రయోజనాల కోసం మాత్రమే ఉద్దేశించబడింది. మీ కంప్యూటర్, పరికరాల మధ్య డేటాను కాపీ చేయడానికి, నోటిఫికేషన్ లేకుండా మీ పరికరంలో యాప్‌లను ఇన్‌స్టాల్ చేయడానికి, లాగ్ డేటాను చదవడానికి దీన్ని ఉపయోగించండి." "మీరు గతంలో ప్రామాణీకరించిన అన్ని కంప్యూటర్‌ల నుండి USB డీబగ్గింగ్‌కు ప్రాప్యతను ఉపసంహరించాలా?" @@ -526,8 +526,8 @@ "లీజు గడువు %sతో ముగుస్తుంది" "షేర్ చేసిన డేటాను తొలగించు" "మీరు ఖచ్చితంగా ఈ షేర్ చేసిన డేటాను తొలగించాలనుకుంటున్నారా?" - "వినియోగదారులు వారి స్వంత అనువర్తనాలను మరియు కంటెంట్‌ను కలిగి ఉన్నారు" - "మీరు మీ ఖాతా నుండి అనువర్తనాలకు మరియు కంటెంట్‌కు ప్రాప్యతను పరిమితం చేయవచ్చు" + "వినియోగదారులు వారి స్వంత యాప్‌లను మరియు కంటెంట్‌ను కలిగి ఉన్నారు" + "మీరు మీ ఖాతా నుండి యాప్‌లకు మరియు కంటెంట్‌కు ప్రాప్యతను పరిమితం చేయవచ్చు" "యూజర్" "పరిమితం చేయబడిన ప్రొఫైల్" "కొత్త వినియోగదారుని జోడించాలా?" -- cgit v1.2.3 From 2bddf2e8378d14d4b9da35d4cf59ea834c5ea2c5 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 10 Aug 2021 14:13:51 +0000 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I0a6f501007df4e6e66acc7b61742fbb1b8c22507 --- packages/SettingsLib/res/values-ar/strings.xml | 2 +- packages/SettingsLib/res/values-es-rUS/strings.xml | 2 +- packages/SettingsLib/res/values-et/strings.xml | 2 +- packages/SettingsLib/res/values-hi/strings.xml | 2 +- packages/SettingsLib/res/values-in/strings.xml | 2 +- packages/SettingsLib/res/values-iw/strings.xml | 2 +- packages/SettingsLib/res/values-mn/strings.xml | 2 +- packages/SettingsLib/res/values-sq/strings.xml | 2 +- packages/SettingsLib/res/values-ta/strings.xml | 4 ++-- packages/SettingsLib/res/values-te/strings.xml | 14 +++++++------- 10 files changed, 17 insertions(+), 17 deletions(-) diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml index 881b76bcf62d..e397035ea0ac 100644 --- a/packages/SettingsLib/res/values-ar/strings.xml +++ b/packages/SettingsLib/res/values-ar/strings.xml @@ -511,7 +511,7 @@ "المنبّهات والتذكيرات" "السماح بضبط المنبّهات والتذكيرات" "المنبّهات والتذكيرات" - "عليك السماح لهذا التطبيق بضبط المنبّهات وتحديد مواعيد للإجراءات الحساسة زمنيًا. يسمح هذا الأذن بتشغيل التطبيق في الخلفية، ما قد يستهلك المزيد من شحن البطارية.\n\nإذا كان هذا الإذن غير مسموح به، لن تعمل الأحداث المستندة إلى وقت والمنبّهات الحالية التي يحدِّد هذا التطبيق موعدها." + "يمكنك السماح لهذا التطبيق بضبط المنبّهات وجدولة الإجراءات لتنفيذها في الوقت المناسب. ويسمح هذا الإذن بتشغيل التطبيق في الخلفية، ما قد يستهلك المزيد من البطارية.\n\nفي حال عدم تفعيل هذا الإذن، لن تعمل المنبهات الحالية والأحداث المستندة إلى الوقت المضبوطة في هذا التطبيق." "جدول زمني، جدولة، منبّه، تذكير، ساعة" "تفعيل" "تفعيل ميزة \"عدم الإزعاج\"" diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml index 7755cb74b04f..048039f6af81 100644 --- a/packages/SettingsLib/res/values-es-rUS/strings.xml +++ b/packages/SettingsLib/res/values-es-rUS/strings.xml @@ -426,7 +426,7 @@ "Protanomalía (rojo-verde)" "Tritanomalía (azul-amarillo)" "Corrección de color" - "Ajusta cómo se muestran los colores en tu dispositivo. Esto puede ser útil cuando quieres:<br/><br/> <ol> <li> Ver colores con más exactitud</li> <li> Quitar colores para tener un enfoque más claro</li> </ol>" + "Ajusta cómo se muestran los colores en tu dispositivo. Esto puede ser útil cuando quieres:<br/><br/> <ol> <li>&nbsp;Ver colores con más exactitud</li> <li>&nbsp;Quitar colores para tener un enfoque más claro</li> </ol>" "Reemplazado por %1$s" "%1$s - %2$s" "Tiempo restante: aproximadamente %1$s" diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml index d835cb95ed98..60469a1d2b17 100644 --- a/packages/SettingsLib/res/values-et/strings.xml +++ b/packages/SettingsLib/res/values-et/strings.xml @@ -507,7 +507,7 @@ "Alarmid ja meeldetuletused" "Luba alarmide ja meeldetuletuste määramine" "Alarmid ja meeldetuletused" - "Lubage sellel rakendusel määrata alarme ja ajastada kiire tähtajaga toiminguid. See võimaldab rakendusel töötada taustal, mistõttu võib akukasutus olla suurem.\n\nKui see luba on välja lülitatud, siis olemasolevad alarmid ja selle rakenduse ajastatud ajapõhised sündmused ei tööta." + "Lubage sellel rakendusel määrata alarme ja ajastada ajakriitilisi toiminguid. See võimaldab rakendusel töötada taustal, mistõttu võib akukasutus olla suurem.\n\nKui see luba on välja lülitatud, siis olemasolevad alarmid ja selle rakenduse ajastatud ajapõhised sündmused ei tööta." "ajakava, äratus, meeldetuletus, kell" "Lülita sisse" "Valiku Mitte segada sisselülitamine" diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml index bf9b72e45a88..630000fe6921 100644 --- a/packages/SettingsLib/res/values-hi/strings.xml +++ b/packages/SettingsLib/res/values-hi/strings.xml @@ -527,7 +527,7 @@ "कनेक्ट करने में समस्या हो रही है. डिवाइस को बंद करके चालू करें" "वायर वाला ऑडियो डिवाइस" "सहायता और सुझाव" - "डिवाइस की मेमोरी" + "डिवाइस का स्टोरेज" "शेयर किया गया डेटा" "शेयर किए गए डेटा को देखें और उसमें बदलाव करें" "इस उपयोगकर्ता के साथ किसी तरह का डेटा शेयर नहीं किया गया है." diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml index 4b37650563ac..c1403082e37b 100644 --- a/packages/SettingsLib/res/values-in/strings.xml +++ b/packages/SettingsLib/res/values-in/strings.xml @@ -507,7 +507,7 @@ "Alarm dan pengingat" "Izinkan menyetel alarm dan pengingat" "Alarm & pengingat" - "Izinkan aplikasi ini menyetel alarm dan menjadwalkan tindakan berjangka waktu. Hal ini memungkinkan aplikasi berjalan di latar belakang, sehingga mungkin menggunakan lebih banyak daya baterai.\n\nJika izin ini dinonaktifkan, alarm dan acara berjangka waktu yang dijadwalkan oleh aplikasi ini tidak akan berfungsi." + "Izinkan aplikasi ini menyetel alarm dan menjadwalkan tindakan yang sensitif waktu. Hal ini memungkinkan aplikasi berjalan di latar belakang, sehingga mungkin menggunakan lebih banyak daya baterai.\n\nJika izin ini dinonaktifkan, alarm dan acara berbasis waktu yang dijadwalkan oleh aplikasi ini tidak akan berfungsi." "jadwal, alarm, pengingat, jam" "Aktifkan" "Aktifkan mode Jangan Ganggu" diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml index 71cc9a031364..9f2d8a2d346e 100644 --- a/packages/SettingsLib/res/values-iw/strings.xml +++ b/packages/SettingsLib/res/values-iw/strings.xml @@ -426,7 +426,7 @@ "פרוטנומליה (אדום-ירוק)" "טריטנומליה (כחול-צהוב)" "תיקון צבע" - "‏ניתן לשנות את האופן שבו צבעים מוצגים במכשיר. שינוי כזה עשוי לעזור:<br/><br/> <ol> <li> להבחין בצבעים בצורה יותר מדויקת</li> <li> להסיר צבעים מסוימים כדי להתמקד</li> </ol>" + "‏ניתן לשנות את האופן שבו צבעים מוצגים במכשיר. שינוי כזה עשוי לעזור:<br/><br/> <ol> <li>&nbsp;להבחין בצבעים בצורה יותר מדויקת</li> <li>&nbsp;להסיר צבעים מסוימים כדי להתמקד</li> </ol>" "נעקף על ידי %1$s" "%1$s%2$s" "הזמן הנותר: בערך %1$s" diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml index 25769936ebfc..474ded9972c7 100644 --- a/packages/SettingsLib/res/values-mn/strings.xml +++ b/packages/SettingsLib/res/values-mn/strings.xml @@ -426,7 +426,7 @@ "Протаномаль (улаан-ногоон)" "Тританомаль (цэнхэр-шар)" "Өнгө тохируулах" - "Таны төхөөрөмж дээр өнгийг хэрхэн үзүүлэхийг тохируулна уу. Энэ нь танд дараахыг хийхийг хүссэн үед хэрэг болж магадгүй:<br/><br/> <ol> <li>Өнгийг илүү оновчтой харах</li> <li>Танд төвлөрөхөд туслахын тулд өнгийг хасах</li> </ol>" + "Таны төхөөрөмж дээр өнгийг хэрхэн үзүүлэхийг тохируулна уу. Энэ нь танд дараахыг хийхийг хүссэн үед хэрэг болж магадгүй:<br/><br/> <ol> <li>&nbsp;Өнгийг илүү оновчтой харах</li> <li>&nbsp;Танд төвлөрөхөд туслахын тулд өнгийг хасах</li> </ol>" "Давхарласан %1$s" "%1$s - %2$s" "Ойролцоогоор %1$s үлдсэн" diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml index 78b35aad1b20..e39b4200b83b 100644 --- a/packages/SettingsLib/res/values-sq/strings.xml +++ b/packages/SettingsLib/res/values-sq/strings.xml @@ -507,7 +507,7 @@ "Alarmet dhe alarmet rikujtuese" "Lejo caktimin e alarmeve dhe alarmeve rikujtuese" "Alarmet dhe alarmet rikujtuese" - "Lejo që ky aplikacion të caktojë alarmet dhe të planifikojë veprime që kanë një afat të caktuar. Kjo lejon që aplikacioni të ekzekutohet në sfond, gjë që mund të përdorë më shumë bateri.\n\nNëse kjo leje është caktuar si joaktive, alarmet ekzistuese dhe ngjarjet me bazë kohore të planifikuara nga ky apliikacion nuk do të funksionojnë." + "Lejo që ky aplikacion të caktojë alarmet dhe të planifikojë veprime që kanë një afat të caktuar. Kjo mundëson që aplikacioni të ekzekutohet në sfond, gjë që mund të përdorë më shumë bateri.\n\nNëse kjo leje është caktuar si joaktive, alarmet ekzistuese dhe ngjarjet në bazë kohore të planifikuara nga ky aplikacion nuk do të funksionojnë." "planifiko, alarm, alarm rikujtues, ora" "Aktivizo" "Aktivizo \"Mos shqetëso\"" diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml index 6255d4132953..4a3b32a3a90f 100644 --- a/packages/SettingsLib/res/values-ta/strings.xml +++ b/packages/SettingsLib/res/values-ta/strings.xml @@ -98,7 +98,7 @@ "செவித்துணை கருவிகளுடன் இணைக்கப்பட்டது" "மீடியா ஆடியோவுடன் இணைக்கப்பட்டது" "மொபைல் ஆடியோவுடன் இணைக்கப்பட்டது" - "கோப்பைப் பரிமாற்றும் சேவையகத்துடன் இணைக்கப்பட்டது" + "ஃபைலைப் பரிமாற்றும் சேவையகத்துடன் இணைக்கப்பட்டது" "வரைபடத்துடன் இணைக்கப்பட்டது" "SAP உடன் இணைக்கப்பட்டது" "கோப்பு இடமாற்றும் சேவையகத்துடன் இணைக்கப்படவில்லை" @@ -426,7 +426,7 @@ "நிறம் அடையாளங்காண முடியாமை (சிவப்பு-பச்சை)" "நிறம் அடையாளங்காண முடியாமை (நீலம்-மஞ்சள்)" "வண்ணத்திருத்தம்" - "சாதனத்தில் வண்ணங்கள் காண்பிக்கப்படும் விதத்தைச் சரிசெய்யலாம். இதன் மூலம் நீங்கள் விரும்பும்போதெல்லாம்:<br/><br/> <ol> <li>&nbsp;வண்ணங்களை மிகத் தெளிவாகப் பார்க்கலாம்</li> <li>கவனம் சிதறாமல் இருக்க வண்ணங்களை நீக்கலாம்</li> </ol>" + "சாதனத்தில் வண்ணங்கள் காண்பிக்கப்படும் விதத்தைச் சரிசெய்யலாம். இதன் மூலம் நீங்கள் விரும்பும்போதெல்லாம்:<br/><br/> <ol> <li>&nbsp;வண்ணங்களை மிகத் தெளிவாகப் பார்க்கலாம்</li> <li>&nbsp;கவனம் சிதறாமல் இருக்க வண்ணங்களை நீக்கலாம்</li> </ol>" "%1$s மூலம் மேலெழுதப்பட்டது" "%1$s - %2$s" "கிட்டத்தட்ட %1$s மீதமுள்ளது" diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml index 4f74d2492d43..9a1e4f4297c4 100644 --- a/packages/SettingsLib/res/values-te/strings.xml +++ b/packages/SettingsLib/res/values-te/strings.xml @@ -33,12 +33,12 @@ "\'%1$s\'కు కనెక్ట్ చేయడం సాధ్యపడదు" "పాస్‌వర్డ్‌ను చెక్ చేసి, మళ్లీ ప్రయత్నించండి" "పరిధిలో లేదు" - "స్వయంచాలకంగా కనెక్ట్ కాదు" + "ఆటోమేటిక్‌గా కనెక్ట్ కాదు" "ఇంటర్నెట్ యాక్సెస్ లేదు" "%1$s ద్వారా సేవ్ చేయబడింది" "డేటా నియంత్రణ నెట్‌వర్క్‌కు కనెక్ట్ చేయబడింది" - "%1$s ద్వారా స్వయంచాలకంగా కనెక్ట్ చేయబడింది" - "నెట్‌వర్క్ రేటింగ్ ప్రదాత ద్వారా స్వయంచాలకంగా కనెక్ట్ చేయబడింది" + "%1$s ద్వారా ఆటోమేటిక్‌గా కనెక్ట్ చేయబడింది" + "నెట్‌వర్క్ రేటింగ్ ప్రదాత ద్వారా ఆటోమేటిక్‌గా కనెక్ట్ చేయబడింది" "%1$s ద్వారా కనెక్ట్ చేయబడింది" "%1$s ద్వారా కనెక్ట్ చేయబడింది" "%1$s ద్వారా అందుబాటులో ఉంది" @@ -83,7 +83,7 @@ "L: %1$s బ్యాటరీ, R: %2$s బ్యాటరీ" "యాక్టివ్‌గా ఉంది" "మీడియా ఆడియో" - "ఫోన్ కాల్‌లు" + "ఫోన్ కాల్స్‌" "ఫైల్ బదిలీ" "ఇన్‌పుట్ పరికరం" "ఇంటర్నెట్ యాక్సెస్" @@ -301,7 +301,7 @@ "ఎల్లప్పుడూ మొబైల్ డేటాను యాక్టివ్‌గా ఉంచు, Wi‑Fi యాక్టివ్‌గా ఉన్నా కూడా (వేగవంతమైన నెట్‌వర్క్ మార్పు కోసం)." "అందుబాటులో ఉంటే టెథెరింగ్ హార్డ్‌వేర్ వేగవృద్ధిని ఉపయోగించండి" "USB డీబగ్గింగ్‌ను అనుమతించాలా?" - "USB డీబగ్గింగ్ అనేది అభివృద్ధి ప్రయోజనాల కోసం మాత్రమే ఉద్దేశించబడింది. మీ కంప్యూటర్ మరియు మీ పరికరం మధ్య డేటాను కాపీ చేయడానికి, నోటిఫికేషన్ లేకుండా మీ పరికరంలో అనువర్తనాలను ఇన్‌స్టాల్ చేయడానికి మరియు లాగ్ డేటాను చదవడానికి దీన్ని ఉపయోగించండి." + "USB డీబగ్గింగ్ అనేది అభివృద్ధి ప్రయోజనాల కోసం మాత్రమే ఉద్దేశించబడింది. మీ కంప్యూటర్ మరియు మీ పరికరం మధ్య డేటాను కాపీ చేయడానికి, నోటిఫికేషన్ లేకుండా మీ పరికరంలో యాప్‌లను ఇన్‌స్టాల్ చేయడానికి మరియు లాగ్ డేటాను చదవడానికి దీన్ని ఉపయోగించండి." "వైర్‌లెస్ డీబగ్గింగ్‌ను అనుమతించాలా?" "వైర్‌లెస్ డీబగ్గింగ్ అనేది అభివృద్ధి ప్రయోజనాల కోసం మాత్రమే ఉద్దేశించబడింది. మీ కంప్యూటర్, పరికరాల మధ్య డేటాను కాపీ చేయడానికి, నోటిఫికేషన్ లేకుండా మీ పరికరంలో యాప్‌లను ఇన్‌స్టాల్ చేయడానికి, లాగ్ డేటాను చదవడానికి దీన్ని ఉపయోగించండి." "మీరు గతంలో ప్రామాణీకరించిన అన్ని కంప్యూటర్‌ల నుండి USB డీబగ్గింగ్‌కు ప్రాప్యతను ఉపసంహరించాలా?" @@ -541,8 +541,8 @@ "లీజు గడువు %sతో ముగుస్తుంది" "షేర్ చేసిన డేటాను తొలగించు" "మీరు ఖచ్చితంగా ఈ షేర్ చేసిన డేటాను తొలగించాలనుకుంటున్నారా?" - "వినియోగదారులు వారి స్వంత అనువర్తనాలను మరియు కంటెంట్‌ను కలిగి ఉన్నారు" - "మీరు మీ ఖాతా నుండి అనువర్తనాలకు మరియు కంటెంట్‌కు ప్రాప్యతను పరిమితం చేయవచ్చు" + "వినియోగదారులు వారి స్వంత యాప్‌లను మరియు కంటెంట్‌ను కలిగి ఉన్నారు" + "మీరు మీ ఖాతా నుండి యాప్‌లకు మరియు కంటెంట్‌కు ప్రాప్యతను పరిమితం చేయవచ్చు" "యూజర్" "పరిమితం చేయబడిన ప్రొఫైల్" "కొత్త వినియోగదారుని జోడించాలా?" -- cgit v1.2.3 From 309ab3bb4983327624a7373b39b7b7818ab50b01 Mon Sep 17 00:00:00 2001 From: Soonil Nagarkar Date: Tue, 10 Aug 2021 09:46:12 -0700 Subject: Log locations received by default and add javadocs Logging received locations was originally removed over fears it would be too spammy, but it is proving too difficult to debug without at least some logs here. Bug: 196053011 Test: manual Change-Id: Ie18baa26daca9ad761125ad07a734f27fabfd89e --- .../java/android/location/LocationListener.java | 23 ++++++++++++++++++---- .../server/location/eventlog/LocationEventLog.java | 4 +--- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/location/java/android/location/LocationListener.java b/location/java/android/location/LocationListener.java index 35a40910e373..031642b752e5 100644 --- a/location/java/android/location/LocationListener.java +++ b/location/java/android/location/LocationListener.java @@ -38,9 +38,9 @@ import java.util.concurrent.Executor; public interface LocationListener { /** - * Called when the location has changed. A wakelock is held on behalf on the listener for some - * brief amount of time as this callback executes. If this callback performs long running - * operations, it is the client's responsibility to obtain their own wakelock. + * Called when the location has changed. A wakelock may be held on behalf on the listener for + * some brief amount of time as this callback executes. If this callback performs long running + * operations, it is the client's responsibility to obtain their own wakelock if necessary. * * @param location the updated location */ @@ -48,7 +48,7 @@ public interface LocationListener { /** * Called when the location has changed and locations are being delivered in batches. The - * default implementation calls through to ({@link #onLocationChanged(Location)} with all + * default implementation calls through to {@link #onLocationChanged(Location)} with all * locations in the batch. The list of locations is always guaranteed to be non-empty, and is * always guaranteed to be ordered from earliest location to latest location (so that the * earliest location in the batch is at index 0 in the list, and the latest location in the @@ -76,6 +76,11 @@ public interface LocationListener { * This callback will never be invoked on Android Q and above, and providers can be considered * as always in the {@link LocationProvider#AVAILABLE} state. * + *

Note that this method only has a default implementation on Android R and + * above, and this method must still be overridden in order to run successfully on Android + * versions below R. LocationListenerCompat from the compat libraries may be used to avoid the + * need to override for older platforms. + * * @deprecated This callback will never be invoked on Android Q and above. */ @Deprecated @@ -84,6 +89,11 @@ public interface LocationListener { /** * Called when a provider this listener is registered with becomes enabled. * + *

Note that this method only has a default implementation on Android R and + * above, and this method must still be overridden in order to run successfully on Android + * versions below R. LocationListenerCompat from the compat libraries may be used to avoid the + * need to override for older platforms. + * * @param provider the name of the location provider */ default void onProviderEnabled(@NonNull String provider) {} @@ -92,6 +102,11 @@ public interface LocationListener { * Called when the provider this listener is registered with becomes disabled. If a provider is * disabled when this listener is registered, this callback will be invoked immediately. * + *

Note that this method only has a default implementation on Android R and + * above, and this method must still be overridden in order to run successfully on Android + * versions below R. LocationListenerCompat from the compat libraries may be used to avoid the + * need to override for older platforms. + * * @param provider the name of the location provider */ default void onProviderDisabled(@NonNull String provider) {} diff --git a/services/core/java/com/android/server/location/eventlog/LocationEventLog.java b/services/core/java/com/android/server/location/eventlog/LocationEventLog.java index db2a43f7a00d..2178672cbea9 100644 --- a/services/core/java/com/android/server/location/eventlog/LocationEventLog.java +++ b/services/core/java/com/android/server/location/eventlog/LocationEventLog.java @@ -192,9 +192,7 @@ public class LocationEventLog extends LocalEventLog { /** Logs a new incoming location for a location provider. */ public void logProviderReceivedLocations(String provider, int numLocations) { - if (D) { - addLogEvent(EVENT_PROVIDER_RECEIVE_LOCATION, provider, numLocations); - } + addLogEvent(EVENT_PROVIDER_RECEIVE_LOCATION, provider, numLocations); } /** Logs a location deliver for a client of a location provider. */ -- cgit v1.2.3