From 9164c79377cf22602981487a1f436877280b08db Mon Sep 17 00:00:00 2001 From: Chiawei Wang Date: Tue, 15 Jun 2021 23:04:22 +0800 Subject: Add config_customizedMaxCachedProcesses to symbols.xml Add a new config to customize the number of max cached processes by projects. Bug: 190531672 Test: make Test: dumpsys activity | grep CUR_MAX_CACHED_PROCESSES Change-Id: I0455d03d8d35ad39259aea580554134e1be01b45 --- core/res/res/values/config.xml | 3 +++ core/res/res/values/symbols.xml | 2 ++ .../android/server/am/ActivityManagerConstants.java | 19 +++++++++++++------ 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 8dfbdccf5706..23918ea4c46c 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -5042,4 +5042,7 @@ 1 + + + 32 diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 5d9fc0af5602..65c22b860fbc 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -4420,4 +4420,6 @@ + + diff --git a/services/core/java/com/android/server/am/ActivityManagerConstants.java b/services/core/java/com/android/server/am/ActivityManagerConstants.java index 530f918833ad..e7fbfed71b7b 100644 --- a/services/core/java/com/android/server/am/ActivityManagerConstants.java +++ b/services/core/java/com/android/server/am/ActivityManagerConstants.java @@ -506,6 +506,7 @@ final class ActivityManagerConstants extends ContentObserver { private final KeyValueListParser mParser = new KeyValueListParser(','); private int mOverrideMaxCachedProcesses = -1; + private final int mCustomizedMaxCachedProcesses; // The maximum number of cached processes we will keep around before killing them. // NOTE: this constant is *only* a control to not let us go too crazy with @@ -515,11 +516,12 @@ final class ActivityManagerConstants extends ContentObserver { // kill them. Also note that this limit only applies to cached background processes; // we have no limit on the number of service, visible, foreground, or other such // processes and the number of those processes does not count against the cached - // process limit. - public int CUR_MAX_CACHED_PROCESSES = DEFAULT_MAX_CACHED_PROCESSES; + // process limit. This will be initialized in the constructor. + public int CUR_MAX_CACHED_PROCESSES; - // The maximum number of empty app processes we will let sit around. - public int CUR_MAX_EMPTY_PROCESSES = computeEmptyProcessLimit(CUR_MAX_CACHED_PROCESSES); + // The maximum number of empty app processes we will let sit around. This will be + // initialized in the constructor. + public int CUR_MAX_EMPTY_PROCESSES; // The number of empty apps at which we don't consider it necessary to do // memory trimming. @@ -762,6 +764,10 @@ final class ActivityManagerConstants extends ContentObserver { context.getResources().getStringArray( com.android.internal.R.array.config_keep_warming_services)) .map(ComponentName::unflattenFromString).collect(Collectors.toSet())); + mCustomizedMaxCachedProcesses = context.getResources().getInteger( + com.android.internal.R.integer.config_customizedMaxCachedProcesses); + CUR_MAX_CACHED_PROCESSES = mCustomizedMaxCachedProcesses; + CUR_MAX_EMPTY_PROCESSES = computeEmptyProcessLimit(CUR_MAX_CACHED_PROCESSES); } public void start(ContentResolver resolver) { @@ -1105,13 +1111,13 @@ final class ActivityManagerConstants extends ContentObserver { try { CUR_MAX_CACHED_PROCESSES = mOverrideMaxCachedProcesses < 0 ? (TextUtils.isEmpty(maxCachedProcessesFlag) - ? DEFAULT_MAX_CACHED_PROCESSES : Integer.parseInt(maxCachedProcessesFlag)) + ? mCustomizedMaxCachedProcesses : Integer.parseInt(maxCachedProcessesFlag)) : mOverrideMaxCachedProcesses; } catch (NumberFormatException e) { // Bad flag value from Phenotype, revert to default. Slog.e(TAG, "Unable to parse flag for max_cached_processes: " + maxCachedProcessesFlag, e); - CUR_MAX_CACHED_PROCESSES = DEFAULT_MAX_CACHED_PROCESSES; + CUR_MAX_CACHED_PROCESSES = mCustomizedMaxCachedProcesses; } CUR_MAX_EMPTY_PROCESSES = computeEmptyProcessLimit(CUR_MAX_CACHED_PROCESSES); @@ -1288,6 +1294,7 @@ final class ActivityManagerConstants extends ContentObserver { if (mOverrideMaxCachedProcesses >= 0) { pw.print(" mOverrideMaxCachedProcesses="); pw.println(mOverrideMaxCachedProcesses); } + pw.print(" mCustomizedMaxCachedProcesses="); pw.println(mCustomizedMaxCachedProcesses); pw.print(" CUR_MAX_CACHED_PROCESSES="); pw.println(CUR_MAX_CACHED_PROCESSES); pw.print(" CUR_MAX_EMPTY_PROCESSES="); pw.println(CUR_MAX_EMPTY_PROCESSES); pw.print(" CUR_TRIM_EMPTY_PROCESSES="); pw.println(CUR_TRIM_EMPTY_PROCESSES); -- cgit v1.2.3 From 2a265c139dd8af5586dd123f7bd95720ad81e464 Mon Sep 17 00:00:00 2001 From: Kevin Han Date: Wed, 30 Jun 2021 21:37:15 -0700 Subject: Enable hibernation by default Enable hibernation by default Bug: 192397298 Test: forrest run Change-Id: I8465412fbe8c68958c58bb102eff5e4890d050c7 --- .../java/com/android/server/apphibernation/AppHibernationService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/apphibernation/AppHibernationService.java b/services/core/java/com/android/server/apphibernation/AppHibernationService.java index 7f1402d83a0c..db2ecc54dbfe 100644 --- a/services/core/java/com/android/server/apphibernation/AppHibernationService.java +++ b/services/core/java/com/android/server/apphibernation/AppHibernationService.java @@ -849,7 +849,7 @@ public final class AppHibernationService extends SystemService { return DeviceConfig.getBoolean( NAMESPACE_APP_HIBERNATION, KEY_APP_HIBERNATION_ENABLED, - false /* defaultValue */); + true /* defaultValue */); } /** -- cgit v1.2.3 From a22bfc3ce685118dae337f0c5cd5cfc486e50631 Mon Sep 17 00:00:00 2001 From: Galia Peycheva Date: Thu, 1 Jul 2021 17:39:54 +0200 Subject: Adjust usages of cross-window blur to new radius Bug: 192241610 Test: m Change-Id: Ifa34ce8abf4f4a8c8a341f0a27de2035b557c561 --- core/res/res/values/config.xml | 2 +- packages/SystemUI/res/values-land-television/dimens.xml | 2 +- packages/SystemUI/res/values-television/dimens.xml | 4 ++-- packages/SystemUI/res/values/dimens.xml | 2 +- packages/SystemUI/res/values/dimens_tv.xml | 4 ++-- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 7c7a89385c5e..3e280bbd8b1f 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -4785,7 +4785,7 @@ - 100dp + 31dp 1px - 72px + 23px 0px diff --git a/packages/SystemUI/res/values/dimens_tv.xml b/packages/SystemUI/res/values/dimens_tv.xml index 5bd95ebc1c41..3dbd9903b62e 100644 --- a/packages/SystemUI/res/values/dimens_tv.xml +++ b/packages/SystemUI/res/values/dimens_tv.xml @@ -16,5 +16,5 @@ --> 360dp - 100dp - \ No newline at end of file + 31dp + -- cgit v1.2.3 From 4c19a7cc2a5db090f113fa2ad4ad26acd5c7c1b8 Mon Sep 17 00:00:00 2001 From: George Mount Date: Wed, 30 Jun 2021 19:46:39 +0000 Subject: Limit overscroll stretch for animation Bug: 192465706 Stretch overscroll was allowing pull distances beyond 1, but the effect only applied until 1. This meant that as the stretch relaxed, it would appear stopped at 1 until it dropped below 1. This CL does two things. First, it limits the pull distance to 1, so that if it is pulled beyond 1, the distance remains 1 and the spring will immediately retract from 1 with onRelease(). Second, when the fling hits 1, it stops the fling animation and immediately begins retracting from a velocity of 0. Test: new tests and manual testing for visual effect Test: I23cd8990fff24dbef36a93c16c115948d774a557 Change-Id: I06f1533aed0ce24756c535789fdcc7e99c5bfb9b --- core/java/android/widget/EdgeEffect.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/core/java/android/widget/EdgeEffect.java b/core/java/android/widget/EdgeEffect.java index 472e3e72ab2f..c110ab956030 100644 --- a/core/java/android/widget/EdgeEffect.java +++ b/core/java/android/widget/EdgeEffect.java @@ -365,6 +365,10 @@ public class EdgeEffect { mDuration = PULL_TIME; mPullDistance += deltaDistance; + if (edgeEffectBehavior == TYPE_STRETCH) { + // Don't allow stretch beyond 1 + mPullDistance = Math.min(1f, mPullDistance); + } mDistance = Math.max(0f, mPullDistance); mVelocity = 0; @@ -783,6 +787,10 @@ public class EdgeEffect { + mDampedFreq * sinCoeff * Math.cos(mDampedFreq * deltaT)); mDistance = (float) distance / mHeight; mVelocity = (float) velocity; + if (mDistance > 1f) { + mDistance = 1f; + mVelocity = 0f; + } if (isAtEquilibrium()) { mDistance = 0; mVelocity = 0; -- cgit v1.2.3 From 79cb5468604619360dc0d06d26af90d02623ebf4 Mon Sep 17 00:00:00 2001 From: Dave Mankoff Date: Fri, 2 Jul 2021 15:29:05 -0400 Subject: Use DockManager instead of BatteryController for Falsing. Also, pause the proximity sensor directly when we dock/undock. This ensures that we don't wait for some other event to occur before changing the state of the proximity sensor. Fixes: 192670703 Test: atest SystemUITests Change-Id: If2b429639df76bbd4cf8adecc987dcf18ae45925 --- .../classifier/BrightLineFalsingManager.java | 9 ++-- .../systemui/classifier/FalsingCollectorImpl.java | 61 +++++++++++++++++++--- .../systemui/classifier/FalsingDataProvider.java | 20 ++++--- .../classifier/BrightLineClassifierTest.java | 6 +-- .../classifier/BrightLineFalsingManagerTest.java | 4 +- .../systemui/classifier/ClassifierTest.java | 23 ++++---- .../classifier/FalsingCollectorImplTest.java | 39 ++++++++++++-- .../classifier/FalsingDataProviderTest.java | 27 +++++++--- 8 files changed, 138 insertions(+), 51 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/classifier/BrightLineFalsingManager.java b/packages/SystemUI/src/com/android/systemui/classifier/BrightLineFalsingManager.java index 809e7a70d66c..37a6cfaabb5e 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/BrightLineFalsingManager.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/BrightLineFalsingManager.java @@ -33,7 +33,6 @@ import com.android.internal.logging.MetricsLogger; import com.android.systemui.classifier.FalsingDataProvider.SessionListener; import com.android.systemui.classifier.HistoryTracker.BeliefListener; import com.android.systemui.dagger.qualifiers.TestHarness; -import com.android.systemui.dock.DockManager; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.statusbar.policy.KeyguardStateController; @@ -66,7 +65,6 @@ public class BrightLineFalsingManager implements FalsingManager { private static final double FALSE_BELIEF_THRESHOLD = 0.9; private final FalsingDataProvider mDataProvider; - private final DockManager mDockManager; private final SingleTapClassifier mSingleTapClassifier; private final DoubleTapClassifier mDoubleTapClassifier; private final HistoryTracker mHistoryTracker; @@ -173,14 +171,13 @@ public class BrightLineFalsingManager implements FalsingManager { @Inject public BrightLineFalsingManager(FalsingDataProvider falsingDataProvider, - DockManager dockManager, MetricsLogger metricsLogger, + MetricsLogger metricsLogger, @Named(BRIGHT_LINE_GESTURE_CLASSIFERS) Set classifiers, SingleTapClassifier singleTapClassifier, DoubleTapClassifier doubleTapClassifier, HistoryTracker historyTracker, KeyguardStateController keyguardStateController, AccessibilityManager accessibilityManager, @TestHarness boolean testHarness) { mDataProvider = falsingDataProvider; - mDockManager = dockManager; mMetricsLogger = metricsLogger; mClassifiers = classifiers; mSingleTapClassifier = singleTapClassifier; @@ -332,7 +329,7 @@ public class BrightLineFalsingManager implements FalsingManager { || !mKeyguardStateController.isShowing() || mTestHarness || mDataProvider.isJustUnlockedWithFace() - || mDockManager.isDocked() + || mDataProvider.isDocked() || mAccessibilityManager.isEnabled(); } @@ -400,7 +397,7 @@ public class BrightLineFalsingManager implements FalsingManager { ipw.print("mJustUnlockedWithFace="); ipw.println(mDataProvider.isJustUnlockedWithFace() ? 1 : 0); ipw.print("isDocked="); - ipw.println(mDockManager.isDocked() ? 1 : 0); + ipw.println(mDataProvider.isDocked() ? 1 : 0); ipw.print("width="); ipw.println(mDataProvider.getWidthPixels()); ipw.print("height="); diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java index 969736910b5e..14e5991f35d2 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java @@ -16,6 +16,8 @@ package com.android.systemui.classifier; +import static com.android.systemui.dock.DockManager.DockEventListener; + import android.hardware.SensorManager; import android.hardware.biometrics.BiometricSourceType; import android.util.Log; @@ -25,9 +27,12 @@ import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; +import com.android.systemui.dock.DockManager; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.StatusBarState; +import com.android.systemui.statusbar.policy.BatteryController; +import com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.util.concurrency.DelayableExecutor; import com.android.systemui.util.sensors.ProximitySensor; @@ -53,6 +58,8 @@ class FalsingCollectorImpl implements FalsingCollector { private final ProximitySensor mProximitySensor; private final StatusBarStateController mStatusBarStateController; private final KeyguardStateController mKeyguardStateController; + private final BatteryController mBatteryController; + private final DockManager mDockManager; private final DelayableExecutor mMainExecutor; private final SystemClock mSystemClock; @@ -89,12 +96,46 @@ class FalsingCollectorImpl implements FalsingCollector { } }; + + private final BatteryStateChangeCallback mBatteryListener = new BatteryStateChangeCallback() { + @Override + public void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) { + } + + @Override + public void onWirelessChargingChanged(boolean isWirelessCharging) { + if (isWirelessCharging || mDockManager.isDocked()) { + mProximitySensor.pause(); + } else { + mProximitySensor.resume(); + } + } + }; + + private final DockEventListener mDockEventListener = new DockEventListener() { + @Override + public void onEvent(int event) { + if (event == DockManager.STATE_NONE && !mBatteryController.isWirelessCharging()) { + mProximitySensor.resume(); + } else { + mProximitySensor.pause(); + } + } + }; + @Inject - FalsingCollectorImpl(FalsingDataProvider falsingDataProvider, FalsingManager falsingManager, - KeyguardUpdateMonitor keyguardUpdateMonitor, HistoryTracker historyTracker, - ProximitySensor proximitySensor, StatusBarStateController statusBarStateController, + FalsingCollectorImpl( + FalsingDataProvider falsingDataProvider, + FalsingManager falsingManager, + KeyguardUpdateMonitor keyguardUpdateMonitor, + HistoryTracker historyTracker, + ProximitySensor proximitySensor, + StatusBarStateController statusBarStateController, KeyguardStateController keyguardStateController, - @Main DelayableExecutor mainExecutor, SystemClock systemClock) { + BatteryController batteryController, + DockManager dockManager, + @Main DelayableExecutor mainExecutor, + SystemClock systemClock) { mFalsingDataProvider = falsingDataProvider; mFalsingManager = falsingManager; mKeyguardUpdateMonitor = keyguardUpdateMonitor; @@ -102,10 +143,11 @@ class FalsingCollectorImpl implements FalsingCollector { mProximitySensor = proximitySensor; mStatusBarStateController = statusBarStateController; mKeyguardStateController = keyguardStateController; + mBatteryController = batteryController; + mDockManager = dockManager; mMainExecutor = mainExecutor; mSystemClock = systemClock; - mProximitySensor.setTag(PROXIMITY_SENSOR_TAG); mProximitySensor.setDelay(SensorManager.SENSOR_DELAY_GAME); @@ -113,6 +155,9 @@ class FalsingCollectorImpl implements FalsingCollector { mState = mStatusBarStateController.getState(); mKeyguardUpdateMonitor.registerCallback(mKeyguardUpdateCallback); + + mBatteryController.addCallback(mBatteryListener); + mDockManager.addListener(mDockEventListener); } @Override @@ -312,6 +357,8 @@ class FalsingCollectorImpl implements FalsingCollector { unregisterSensors(); mKeyguardUpdateMonitor.removeCallback(mKeyguardUpdateCallback); mStatusBarStateController.removeCallback(mStatusBarStateListener); + mBatteryController.removeCallback(mBatteryListener); + mDockManager.removeListener(mDockEventListener); } @Override @@ -351,9 +398,7 @@ class FalsingCollectorImpl implements FalsingCollector { } private void registerSensors() { - if (!mFalsingDataProvider.isWirelessCharging()) { - mProximitySensor.register(mSensorEventListener); - } + mProximitySensor.register(mSensorEventListener); } private void unregisterSensors() { diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingDataProvider.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingDataProvider.java index 2f688dd9d247..a3ecb0c0b273 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingDataProvider.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingDataProvider.java @@ -22,6 +22,7 @@ import android.view.MotionEvent.PointerCoords; import android.view.MotionEvent.PointerProperties; import com.android.systemui.dagger.SysUISingleton; +import com.android.systemui.dock.DockManager; import com.android.systemui.statusbar.policy.BatteryController; import java.util.ArrayList; @@ -40,7 +41,8 @@ public class FalsingDataProvider { private final int mWidthPixels; private final int mHeightPixels; - private final BatteryController mBatteryController; + private BatteryController mBatteryController; + private final DockManager mDockManager; private final float mXdpi; private final float mYdpi; private final List mSessionListeners = new ArrayList<>(); @@ -59,12 +61,16 @@ public class FalsingDataProvider { private boolean mJustUnlockedWithFace; @Inject - public FalsingDataProvider(DisplayMetrics displayMetrics, BatteryController batteryController) { + public FalsingDataProvider( + DisplayMetrics displayMetrics, + BatteryController batteryController, + DockManager dockManager) { mXdpi = displayMetrics.xdpi; mYdpi = displayMetrics.ydpi; mWidthPixels = displayMetrics.widthPixels; mHeightPixels = displayMetrics.heightPixels; mBatteryController = batteryController; + mDockManager = dockManager; FalsingClassifier.logInfo("xdpi, ydpi: " + getXdpi() + ", " + getYdpi()); FalsingClassifier.logInfo("width, height: " + getWidthPixels() + ", " + getHeightPixels()); @@ -219,11 +225,6 @@ public class FalsingDataProvider { return mLastMotionEvent.getY() < mFirstRecentMotionEvent.getY(); } - /** Returns true if phone is being charged without a cable. */ - public boolean isWirelessCharging() { - return mBatteryController.isWirelessCharging(); - } - private void recalculateData() { if (!mDirty) { return; @@ -357,6 +358,11 @@ public class FalsingDataProvider { mJustUnlockedWithFace = justUnlockedWithFace; } + /** Returns true if phone is sitting in a dock or is wirelessly charging. */ + public boolean isDocked() { + return mBatteryController.isWirelessCharging() || mDockManager.isDocked(); + } + /** Implement to be alerted abotu the beginning and ending of falsing tracking. */ public interface SessionListener { /** Called when the lock screen is shown and falsing-tracking begins. */ diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/BrightLineClassifierTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/BrightLineClassifierTest.java index 546038ec3030..b2a9e8209495 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/classifier/BrightLineClassifierTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/classifier/BrightLineClassifierTest.java @@ -39,7 +39,6 @@ import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.testing.FakeMetricsLogger; import com.android.systemui.SysuiTestCase; import com.android.systemui.classifier.FalsingDataProvider.GestureFinalizedListener; -import com.android.systemui.dock.DockManagerFake; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.util.concurrency.FakeExecutor; import com.android.systemui.util.time.FakeSystemClock; @@ -62,7 +61,6 @@ public class BrightLineClassifierTest extends SysuiTestCase { private BrightLineFalsingManager mBrightLineFalsingManager; @Mock private FalsingDataProvider mFalsingDataProvider; - private final DockManagerFake mDockManager = new DockManagerFake(); private final MetricsLogger mMetricsLogger = new FakeMetricsLogger(); private final Set mClassifiers = new HashSet<>(); @Mock @@ -102,7 +100,7 @@ public class BrightLineClassifierTest extends SysuiTestCase { mClassifiers.add(mClassifierB); when(mFalsingDataProvider.getRecentMotionEvents()).thenReturn(mMotionEventList); when(mKeyguardStateController.isShowing()).thenReturn(true); - mBrightLineFalsingManager = new BrightLineFalsingManager(mFalsingDataProvider, mDockManager, + mBrightLineFalsingManager = new BrightLineFalsingManager(mFalsingDataProvider, mMetricsLogger, mClassifiers, mSingleTapClassfier, mDoubleTapClassifier, mHistoryTracker, mKeyguardStateController, mAccessibilityManager, false); @@ -168,7 +166,7 @@ public class BrightLineClassifierTest extends SysuiTestCase { // Even when the classifiers report a false, we should allow. when(mClassifierA.classifyGesture(anyInt(), anyDouble(), anyDouble())) .thenReturn(mPassedResult); - mDockManager.setIsDocked(true); + when(mFalsingDataProvider.isDocked()).thenReturn(true); assertThat(mBrightLineFalsingManager.isFalseTouch(0)).isFalse(); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/BrightLineFalsingManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/BrightLineFalsingManagerTest.java index 86243b53804e..c4f480d7e7aa 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/classifier/BrightLineFalsingManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/classifier/BrightLineFalsingManagerTest.java @@ -32,7 +32,6 @@ import androidx.test.filters.SmallTest; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.testing.FakeMetricsLogger; import com.android.systemui.SysuiTestCase; -import com.android.systemui.dock.DockManagerFake; import com.android.systemui.statusbar.policy.KeyguardStateController; import org.junit.Before; @@ -52,7 +51,6 @@ public class BrightLineFalsingManagerTest extends SysuiTestCase { private BrightLineFalsingManager mBrightLineFalsingManager; @Mock private FalsingDataProvider mFalsingDataProvider; - private final DockManagerFake mDockManager = new DockManagerFake(); private final MetricsLogger mMetricsLogger = new FakeMetricsLogger(); private final Set mClassifiers = new HashSet<>(); @Mock @@ -84,7 +82,7 @@ public class BrightLineFalsingManagerTest extends SysuiTestCase { mClassifiers.add(mClassifierA); when(mFalsingDataProvider.getRecentMotionEvents()).thenReturn(mMotionEventList); when(mKeyguardStateController.isShowing()).thenReturn(true); - mBrightLineFalsingManager = new BrightLineFalsingManager(mFalsingDataProvider, mDockManager, + mBrightLineFalsingManager = new BrightLineFalsingManager(mFalsingDataProvider, mMetricsLogger, mClassifiers, mSingleTapClassifier, mDoubleTapClassifier, mHistoryTracker, mKeyguardStateController, mAccessibilityManager, false); diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/ClassifierTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/ClassifierTest.java index 7d6ff34bb954..5fa7214f07ff 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/classifier/ClassifierTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/classifier/ClassifierTest.java @@ -19,30 +19,35 @@ package com.android.systemui.classifier; import android.util.DisplayMetrics; import android.view.MotionEvent; -import com.android.systemui.utils.leaks.FakeBatteryController; -import com.android.systemui.utils.leaks.LeakCheckedTest; +import com.android.systemui.SysuiTestCase; +import com.android.systemui.dock.DockManagerFake; +import com.android.systemui.statusbar.policy.BatteryController; import org.junit.After; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; import java.util.ArrayList; import java.util.List; -public class ClassifierTest extends LeakCheckedTest { +public class ClassifierTest extends SysuiTestCase { private FalsingDataProvider mDataProvider; - private List mMotionEvents = new ArrayList<>(); + private final List mMotionEvents = new ArrayList<>(); private float mOffsetX = 0; private float mOffsetY = 0; - private FakeBatteryController mFakeBatteryController; + @Mock + private BatteryController mBatteryController; + private final DockManagerFake mDockManager = new DockManagerFake(); public void setup() { + MockitoAnnotations.initMocks(this); DisplayMetrics displayMetrics = new DisplayMetrics(); displayMetrics.xdpi = 100; displayMetrics.ydpi = 100; displayMetrics.widthPixels = 1000; displayMetrics.heightPixels = 1000; - mFakeBatteryController = new FakeBatteryController(getLeakCheck()); - mDataProvider = new FalsingDataProvider(displayMetrics, mFakeBatteryController); + mDataProvider = new FalsingDataProvider(displayMetrics, mBatteryController, mDockManager); } @After @@ -54,10 +59,6 @@ public class ClassifierTest extends LeakCheckedTest { return mDataProvider; } - FakeBatteryController getFakeBatteryController() { - return mFakeBatteryController; - } - protected void setOffsetX(float offsetX) { mOffsetX = offsetX; } diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingCollectorImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingCollectorImplTest.java index 3c41216949c2..d99a5531d353 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingCollectorImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingCollectorImplTest.java @@ -32,9 +32,12 @@ import androidx.test.filters.SmallTest; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.SysuiTestCase; +import com.android.systemui.dock.DockManager; +import com.android.systemui.dock.DockManagerFake; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.SysuiStatusBarStateController; +import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.util.concurrency.FakeExecutor; import com.android.systemui.util.sensors.ProximitySensor; @@ -67,6 +70,9 @@ public class FalsingCollectorImplTest extends SysuiTestCase { private SysuiStatusBarStateController mStatusBarStateController; @Mock private KeyguardStateController mKeyguardStateController; + @Mock + private BatteryController mBatteryController; + private final DockManagerFake mDockManager = new DockManagerFake(); private final FakeSystemClock mFakeSystemClock = new FakeSystemClock(); private final FakeExecutor mFakeExecutor = new FakeExecutor(mFakeSystemClock); @@ -79,8 +85,8 @@ public class FalsingCollectorImplTest extends SysuiTestCase { mFalsingCollector = new FalsingCollectorImpl(mFalsingDataProvider, mFalsingManager, mKeyguardUpdateMonitor, mHistoryTracker, mProximitySensor, - mStatusBarStateController, mKeyguardStateController, mFakeExecutor, - mFakeSystemClock); + mStatusBarStateController, mKeyguardStateController, mBatteryController, + mDockManager, mFakeExecutor, mFakeSystemClock); } @Test @@ -91,9 +97,32 @@ public class FalsingCollectorImplTest extends SysuiTestCase { @Test public void testNoProximityWhenWirelessCharging() { - when(mFalsingDataProvider.isWirelessCharging()).thenReturn(true); - mFalsingCollector.onScreenTurningOn(); - verify(mProximitySensor, never()).register(any(ThresholdSensor.Listener.class)); + ArgumentCaptor batteryCallbackCaptor = + ArgumentCaptor.forClass(BatteryController.BatteryStateChangeCallback.class); + verify(mBatteryController).addCallback(batteryCallbackCaptor.capture()); + batteryCallbackCaptor.getValue().onWirelessChargingChanged(true); + verify(mProximitySensor).pause(); + } + + @Test + public void testProximityWhenOffWirelessCharging() { + ArgumentCaptor batteryCallbackCaptor = + ArgumentCaptor.forClass(BatteryController.BatteryStateChangeCallback.class); + verify(mBatteryController).addCallback(batteryCallbackCaptor.capture()); + batteryCallbackCaptor.getValue().onWirelessChargingChanged(false); + verify(mProximitySensor).resume(); + } + + @Test + public void testNoProximityWhenDocked() { + mDockManager.setDockEvent(DockManager.STATE_DOCKED); + verify(mProximitySensor).pause(); + } + + @Test + public void testProximityWhenUndocked() { + mDockManager.setDockEvent(DockManager.STATE_NONE); + verify(mProximitySensor).resume(); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingDataProviderTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingDataProviderTest.java index 1fe694e97bcf..5dc607fd342b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingDataProviderTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingDataProviderTest.java @@ -22,6 +22,7 @@ import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import android.testing.AndroidTestingRunner; import android.util.DisplayMetrics; @@ -30,12 +31,15 @@ import android.view.MotionEvent; import androidx.test.filters.SmallTest; import com.android.systemui.classifier.FalsingDataProvider.GestureFinalizedListener; -import com.android.systemui.utils.leaks.FakeBatteryController; +import com.android.systemui.dock.DockManagerFake; +import com.android.systemui.statusbar.policy.BatteryController; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; import java.util.List; @@ -43,19 +47,21 @@ import java.util.List; @RunWith(AndroidTestingRunner.class) public class FalsingDataProviderTest extends ClassifierTest { - private FakeBatteryController mFakeBatteryController; private FalsingDataProvider mDataProvider; + @Mock + private BatteryController mBatteryController; + private final DockManagerFake mDockManager = new DockManagerFake(); @Before public void setup() { super.setup(); - mFakeBatteryController = new FakeBatteryController(getLeakCheck()); + MockitoAnnotations.initMocks(this); DisplayMetrics displayMetrics = new DisplayMetrics(); displayMetrics.xdpi = 100; displayMetrics.ydpi = 100; displayMetrics.widthPixels = 1000; displayMetrics.heightPixels = 1000; - mDataProvider = new FalsingDataProvider(displayMetrics, mFakeBatteryController); + mDataProvider = new FalsingDataProvider(displayMetrics, mBatteryController, mDockManager); } @After @@ -250,10 +256,17 @@ public class FalsingDataProviderTest extends ClassifierTest { @Test public void test_isWirelessCharging() { - assertThat(mDataProvider.isWirelessCharging()).isFalse(); + assertThat(mDataProvider.isDocked()).isFalse(); - mFakeBatteryController.setWirelessCharging(true); - assertThat(mDataProvider.isWirelessCharging()).isTrue(); + when(mBatteryController.isWirelessCharging()).thenReturn(true); + assertThat(mDataProvider.isDocked()).isTrue(); + } + + @Test + public void test_isDocked() { + assertThat(mDataProvider.isDocked()).isFalse(); + mDockManager.setIsDocked(true); + assertThat(mDataProvider.isDocked()).isTrue(); } @Test -- cgit v1.2.3 From 2f9963020744a58224a66d8e534a637de6acfdec Mon Sep 17 00:00:00 2001 From: Suprabh Shukla Date: Thu, 1 Jul 2021 19:35:18 -0700 Subject: Document the standby bucket guarantee Apps who hold SCHEDULE_EXACT_ALARM permission stay in WORKING_SET or better bucket. Test: make offline-sdk-docs Bug: 190625528 Change-Id: I981785cc21be90a58a8c0b31942139b5a64e9a85 --- core/res/AndroidManifest.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 14d200d00d56..7b97902da0b1 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -4053,6 +4053,9 @@ For more details, see Exact alarm permission. +

Apps who hold this permission and target API level 31 or above, always stay in the + {@link android.app.usage.UsageStatsManager#STANDBY_BUCKET_WORKING_SET WORKING_SET} or + lower standby bucket. Applications targeting API level 30 or below do not need this permission to use exact alarm APIs. --> -- cgit v1.2.3 From 907f3f5c2a703da81daa5a576ea1a7cc0e97161b Mon Sep 17 00:00:00 2001 From: Hasini Gunasinghe Date: Fri, 2 Jul 2021 23:17:36 +0000 Subject: Pull Keystore2CrashStats Atom. Ignore-AOSP-First: No mergepath to AOSP. Bug: 188590587 Test: statsd TestDrive script. Change-Id: I06b56eaa5a32317c22aa5abdb2adaff7593c7721 --- .../server/stats/pull/StatsPullAtomService.java | 26 ++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java index dda89614aba9..ce54e4c57150 100644 --- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java +++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java @@ -133,6 +133,7 @@ import android.os.storage.StorageManager; import android.os.storage.VolumeInfo; import android.provider.DeviceConfig; import android.provider.Settings; +import android.security.metrics.CrashStats; import android.security.metrics.IKeystoreMetrics; import android.security.metrics.KeyCreationWithAuthInfo; import android.security.metrics.KeyCreationWithGeneralInfo; @@ -731,6 +732,7 @@ public class StatsPullAtomService extends SystemService { case FrameworkStatsLog.KEYSTORE2_KEY_OPERATION_WITH_PURPOSE_AND_MODES_INFO: case FrameworkStatsLog.KEYSTORE2_KEY_OPERATION_WITH_GENERAL_INFO: case FrameworkStatsLog.RKP_ERROR_STATS: + case FrameworkStatsLog.KEYSTORE2_CRASH_STATS: return pullKeystoreAtoms(atomTag, data); default: throw new UnsupportedOperationException("Unknown tagId=" + atomTag); @@ -927,6 +929,7 @@ public class StatsPullAtomService extends SystemService { registerKeystoreKeyOperationWithPurposeAndModesInfo(); registerKeystoreKeyOperationWithGeneralInfo(); registerRkpErrorStats(); + registerKeystoreCrashStats(); } private void initAndRegisterNetworkStatsPullers() { @@ -4139,6 +4142,14 @@ public class StatsPullAtomService extends SystemService { mStatsCallbackImpl); } + private void registerKeystoreCrashStats() { + mStatsManager.setPullAtomCallback( + FrameworkStatsLog.KEYSTORE2_CRASH_STATS, + null, // use default PullAtomMetadata values, + DIRECT_EXECUTOR, + mStatsCallbackImpl); + } + int parseKeystoreStorageStats(KeystoreAtom[] atoms, List pulledData) { for (KeystoreAtom atomWrapper : atoms) { if (atomWrapper.payload.getTag() != KeystoreAtomPayload.storageStats) { @@ -4270,6 +4281,19 @@ public class StatsPullAtomService extends SystemService { return StatsManager.PULL_SUCCESS; } + int parseKeystoreCrashStats(KeystoreAtom[] atoms, + List pulledData) { + for (KeystoreAtom atomWrapper : atoms) { + if (atomWrapper.payload.getTag() != KeystoreAtomPayload.crashStats) { + return StatsManager.PULL_SKIP; + } + CrashStats atom = atomWrapper.payload.getCrashStats(); + pulledData.add(FrameworkStatsLog.buildStatsEvent( + FrameworkStatsLog.KEYSTORE2_CRASH_STATS, atom.count_of_crash_events)); + } + return StatsManager.PULL_SUCCESS; + } + int pullKeystoreAtoms(int atomTag, List pulledData) { IKeystoreMetrics keystoreMetricsService = getIKeystoreMetricsService(); if (keystoreMetricsService == null) { @@ -4298,6 +4322,8 @@ public class StatsPullAtomService extends SystemService { return parseKeystoreKeyOperationWithGeneralInfo(atoms, pulledData); case FrameworkStatsLog.RKP_ERROR_STATS: return parseRkpErrorStats(atoms, pulledData); + case FrameworkStatsLog.KEYSTORE2_CRASH_STATS: + return parseKeystoreCrashStats(atoms, pulledData); default: Slog.w(TAG, "Unsupported keystore atom: " + atomTag); return StatsManager.PULL_SKIP; -- cgit v1.2.3 From c4316e2f707a092d47414e36062669f57b3dfb04 Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Tue, 6 Jul 2021 19:32:59 +0200 Subject: Fixed an issue where the heads up were not rounded during bypass When huns are above the shelf, their rounding should not be modified Currently they are unrounded by the shelf in certain conditions which didn't unclude the bypass heads up. Fixes: 192057822 Test: add hun on lockscreen with bypass, observe no wrong rounding Change-Id: If7abe2417c40381c74e6ea3b802a6a3e144d45b6 --- .../SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java index baac2549055f..cd5cce4f3ee7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java @@ -367,6 +367,7 @@ public class NotificationShelf extends ActivatableNotificationView implements && !mHostLayoutController.isViewAffectedBySwipe(anv) && !isUnlockedHeadsUp && !isHunGoingToShade + && !anv.isAboveShelf() && !mAmbientState.isPulsing() && !mAmbientState.isDozing(); -- cgit v1.2.3 From 4611e1c3d37d761f516fdd0d08450f6dd075f0aa Mon Sep 17 00:00:00 2001 From: Cassie Date: Wed, 7 Jul 2021 14:45:56 -0700 Subject: Correct the flag in NetworkController. Bug: 191903788 Test: manual Change-Id: I32a62ae2039b7a5e84680e4e5a250a44e625d554 --- .../com/android/systemui/statusbar/policy/NetworkControllerImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java index d9a5269439e6..fa6111589bff 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java @@ -695,7 +695,7 @@ public class NetworkControllerImpl extends BroadcastReceiver cb.setIsAirplaneMode(new IconState(mAirplaneMode, TelephonyIcons.FLIGHT_MODE_ICON, R.string.accessibility_airplane_mode, mContext)); cb.setNoSims(mHasNoSubs, mSimDetected); - if (mProviderModelBehavior) { + if (mProviderModelSetting) { cb.setConnectivityStatus(mNoDefaultNetwork, !mInetCondition, mNoNetworksAvailable); } mWifiSignalController.notifyListeners(cb); -- cgit v1.2.3 From 9fd251e7cb3b4e3b575915d64c66620c5866e7f7 Mon Sep 17 00:00:00 2001 From: Kevin Jeon Date: Wed, 7 Jul 2021 21:58:47 +0000 Subject: Remove unnecessary log in CursorWindow.create This change removes an unneeded debug log in CursorWindow that uses 0.37% of gms.persistent CPU. Test: Build and flash Bug: 184541591 Change-Id: I95683af27904db8d5ec61761dfda6d6d53ddbbef --- libs/androidfw/CursorWindow.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/libs/androidfw/CursorWindow.cpp b/libs/androidfw/CursorWindow.cpp index 1b8db46c54b6..3527eeead1d5 100644 --- a/libs/androidfw/CursorWindow.cpp +++ b/libs/androidfw/CursorWindow.cpp @@ -62,7 +62,6 @@ status_t CursorWindow::create(const String8 &name, size_t inflatedSize, CursorWi window->clear(); window->updateSlotsData(); - LOG(DEBUG) << "Created: " << window->toString(); *outWindow = window; return OK; -- cgit v1.2.3 From ac4c63c682b311e47af8046054e2a67e34ea7107 Mon Sep 17 00:00:00 2001 From: Christopher Tate Date: Wed, 7 Jul 2021 17:44:59 -0700 Subject: Fix FGS notification mismatch Mistakenly matching against id alone, rather than the (id,tag) tuple, led to some notifications mistakenly being flagged as FGS-related. Bug: 191518901 Test: atest CtsAppTestCases:android.app.cts.ServiceTest Test: atest CtsAppTestCases:android.app.cts.NotificationManagerTest Test: manual Change-Id: I11c3993c13ded7859a5a860dcc99728f3db9809f --- core/java/android/app/ActivityManagerInternal.java | 2 +- .../java/com/android/server/am/ActiveServices.java | 27 ++++++++++++++++++---- .../android/server/am/ActivityManagerService.java | 4 ++-- .../notification/NotificationManagerService.java | 2 +- 4 files changed, 26 insertions(+), 9 deletions(-) diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java index b7d9d9b67758..0d68df48c316 100644 --- a/core/java/android/app/ActivityManagerInternal.java +++ b/core/java/android/app/ActivityManagerInternal.java @@ -486,7 +486,7 @@ public abstract class ActivityManagerInternal { * not associated with an FGS; ensure display; or only update if already displayed. */ public abstract ServiceNotificationPolicy applyForegroundServiceNotification( - Notification notification, int id, String pkg, @UserIdInt int userId); + Notification notification, String tag, int id, String pkg, @UserIdInt int userId); /** * Callback from the notification subsystem that the given FGS notification has diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index 875ef377f442..b5ead200cea5 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -32,11 +32,11 @@ import static android.os.PowerExemptionManager.REASON_ALLOWLISTED_PACKAGE; import static android.os.PowerExemptionManager.REASON_BACKGROUND_ACTIVITY_PERMISSION; import static android.os.PowerExemptionManager.REASON_BACKGROUND_FGS_PERMISSION; import static android.os.PowerExemptionManager.REASON_COMPANION_DEVICE_MANAGER; +import static android.os.PowerExemptionManager.REASON_CURRENT_INPUT_METHOD; import static android.os.PowerExemptionManager.REASON_DENIED; import static android.os.PowerExemptionManager.REASON_DEVICE_DEMO_MODE; import static android.os.PowerExemptionManager.REASON_DEVICE_OWNER; import static android.os.PowerExemptionManager.REASON_FGS_BINDING; -import static android.os.PowerExemptionManager.REASON_CURRENT_INPUT_METHOD; import static android.os.PowerExemptionManager.REASON_INSTR_BACKGROUND_ACTIVITY_PERMISSION; import static android.os.PowerExemptionManager.REASON_INSTR_BACKGROUND_FGS_PERMISSION; import static android.os.PowerExemptionManager.REASON_OPT_OUT_REQUESTED; @@ -1997,11 +1997,17 @@ public final class ActiveServices { } ServiceNotificationPolicy applyForegroundServiceNotificationLocked(Notification notification, - final int id, final String pkg, final int userId) { + final String tag, final int id, final String pkg, final int userId) { + // By nature of the FGS API, all FGS notifications have a null tag + if (tag != null) { + return ServiceNotificationPolicy.NOT_FOREGROUND_SERVICE; + } + if (DEBUG_FOREGROUND_SERVICE) { Slog.d(TAG_SERVICE, "Evaluating FGS policy for id=" + id + " pkg=" + pkg + " not=" + notification); } + // Is there an FGS using this notification? final ServiceMap smap = mServiceMap.get(userId); if (smap == null) { @@ -2483,7 +2489,7 @@ public final class ActiveServices { } private void cancelForegroundNotificationLocked(ServiceRecord r) { - if (r.foregroundId != 0) { + if (r.foregroundNoti != null) { // First check to see if this app has any other active foreground services // with the same notification ID. If so, we shouldn't actually cancel it, // because that would wipe away the notification that still needs to be shown @@ -2492,9 +2498,16 @@ public final class ActiveServices { if (sm != null) { for (int i = sm.mServicesByInstanceName.size() - 1; i >= 0; i--) { ServiceRecord other = sm.mServicesByInstanceName.valueAt(i); - if (other != r && other.foregroundId == r.foregroundId + if (other != r + && other.isForeground + && other.foregroundId == r.foregroundId && other.packageName.equals(r.packageName)) { - // Found one! Abort the cancel. + if (DEBUG_FOREGROUND_SERVICE) { + Slog.i(TAG_SERVICE, "FGS notification for " + r + + " shared by " + other + + " (isForeground=" + other.isForeground + ")" + + " - NOT cancelling"); + } return; } } @@ -4282,6 +4295,10 @@ public final class ActiveServices { } private void dropFgsNotificationStateLocked(ServiceRecord r) { + if (r.foregroundNoti == null) { + return; + } + // If this is the only FGS using this notification, clear its FGS flag boolean shared = false; final ServiceMap smap = mServiceMap.get(r.userId); diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 0d35bb180514..4ec5559a061d 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -16120,10 +16120,10 @@ public class ActivityManagerService extends IActivityManager.Stub @Override public ServiceNotificationPolicy applyForegroundServiceNotification( - Notification notification, int id, String pkg, int userId) { + Notification notification, String tag, int id, String pkg, int userId) { synchronized (ActivityManagerService.this) { return mServices.applyForegroundServiceNotificationLocked(notification, - id, pkg, userId); + tag, id, pkg, userId); } } diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 1bd5e72bdb15..bd08f108aab1 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -6206,7 +6206,7 @@ public class NotificationManagerService extends SystemService { // FGS-related situation up front, outside of any locks so it's safe to call into // the Activity Manager. final ServiceNotificationPolicy policy = mAmi.applyForegroundServiceNotification( - notification, id, pkg, userId); + notification, tag, id, pkg, userId); if (policy == ServiceNotificationPolicy.UPDATE_ONLY) { // Proceed if the notification is already showing/known, otherwise ignore // because the service lifecycle logic has retained responsibility for its -- cgit v1.2.3 From 3aafe19994584c293db4a764f2bda6594d2d9d89 Mon Sep 17 00:00:00 2001 From: Bill Lin Date: Fri, 2 Jul 2021 22:13:19 +0800 Subject: Improve SystemUIBootTiming performance in OneHandedController Fix race condition in SystemUIBootTiming issue. 1. Avoid updateOneHandedEnabled() called twice during init a. [O] come from setOneHandedEnabled() b. [X] come from setSwipeToNotificationEnabled() 2. Passively waiting shortcut enabled changed callback, and then query setting ACCESSIBILITY_BUTTON_TARGETS status. 3. Add a new flag isShortcutEnabled to cache shortcut enabled state. 4. By new OHM Settings UX design setSwipeToNotificationEnabled() should NOT setEnabledGesturalOverlay(). 5. Remove redundant auto enabled Toast and print in log instead. (In general case, user is not able to see the Toast) Test: atest google/perf/boottime/boottime-test Test: atest SystemUITests Test: atest WMShellTests Test: manual factory reboot, OHM should disabled by default Bug: 192612924 Change-Id: I8b24c99bc8bd5bfb17c73a6bb8494109d9a8170d --- .../wm/shell/onehanded/OneHandedController.java | 44 +++++++++++----------- .../wm/shell/onehanded/OneHandedSettingsUtil.java | 3 +- .../shell/onehanded/OneHandedControllerTest.java | 8 ++-- 3 files changed, 28 insertions(+), 27 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java index 1cc7ed3afcf7..54b81ad78256 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java @@ -43,7 +43,6 @@ import android.util.Slog; import android.view.Surface; import android.view.WindowManager; import android.view.accessibility.AccessibilityManager; -import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -79,6 +78,7 @@ public class OneHandedController implements RemoteCallable private volatile boolean mIsOneHandedEnabled; private volatile boolean mIsSwipeToNotificationEnabled; + private boolean mIsShortcutEnabled; private boolean mTaskChangeToExit; private boolean mLockedDisabled; private boolean mKeyguardShowing; @@ -143,6 +143,7 @@ public class OneHandedController implements RemoteCallable private final ContentObserver mTimeoutObserver; private final ContentObserver mTaskChangeExitObserver; private final ContentObserver mSwipeToNotificationEnabledObserver; + private final ContentObserver mShortcutEnabledObserver; private AccessibilityManager.AccessibilityStateChangeListener mAccessibilityStateChangeListener = @@ -174,13 +175,13 @@ public class OneHandedController implements RemoteCallable @Override public void onStartFinished(Rect bounds) { mState.setState(STATE_ACTIVE); - notifyShortcutState(STATE_ACTIVE); + notifyShortcutStateChanged(STATE_ACTIVE); } @Override public void onStopFinished(Rect bounds) { mState.setState(STATE_NONE); - notifyShortcutState(STATE_NONE); + notifyShortcutStateChanged(STATE_NONE); } }; @@ -295,6 +296,7 @@ public class OneHandedController implements RemoteCallable mTaskChangeExitObserver = getObserver(this::onTaskChangeExitSettingChanged); mSwipeToNotificationEnabledObserver = getObserver(this::onSwipeToNotificationEnabledChanged); + mShortcutEnabledObserver = getObserver(this::onShortcutEnabledChanged); mDisplayController.addDisplayChangingController(mRotationController); setupCallback(); @@ -349,11 +351,13 @@ public class OneHandedController implements RemoteCallable */ void setSwipeToNotificationEnabled(boolean enabled) { mIsSwipeToNotificationEnabled = enabled; - updateOneHandedEnabled(); } @VisibleForTesting - void notifyShortcutState(@OneHandedState.State int state) { + void notifyShortcutStateChanged(@OneHandedState.State int state) { + if (!isShortcutEnabled()) { + return; + } mOneHandedSettingsUtil.setOneHandedModeActivated( mContext.getContentResolver(), state == STATE_ACTIVE ? 1 : 0, mUserId); } @@ -443,6 +447,9 @@ public class OneHandedController implements RemoteCallable mOneHandedSettingsUtil.registerSettingsKeyObserver( Settings.Secure.SWIPE_BOTTOM_TO_NOTIFICATION_ENABLED, mContext.getContentResolver(), mSwipeToNotificationEnabledObserver, newUserId); + mOneHandedSettingsUtil.registerSettingsKeyObserver( + Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, + mContext.getContentResolver(), mShortcutEnabledObserver, newUserId); } private void unregisterSettingObservers() { @@ -454,6 +461,8 @@ public class OneHandedController implements RemoteCallable mTaskChangeExitObserver); mOneHandedSettingsUtil.unregisterSettingsKeyObserver(mContext.getContentResolver(), mSwipeToNotificationEnabledObserver); + mOneHandedSettingsUtil.unregisterSettingsKeyObserver(mContext.getContentResolver(), + mShortcutEnabledObserver); } private void updateSettings() { @@ -489,15 +498,6 @@ public class OneHandedController implements RemoteCallable } } - @VisibleForTesting - void notifyUserConfigChanged(boolean success) { - if (!success) { - return; - } - // TODO Check UX if popup Toast to notify user when auto-enabled one-handed is good option. - Toast.makeText(mContext, R.string.one_handed_tutorial_title, Toast.LENGTH_LONG).show(); - } - @VisibleForTesting void onActivatedActionChanged() { if (!isShortcutEnabled()) { @@ -508,7 +508,7 @@ public class OneHandedController implements RemoteCallable if (!isOneHandedEnabled()) { final boolean success = mOneHandedSettingsUtil.setOneHandedModeEnabled( mContext.getContentResolver(), 1 /* Enabled for shortcut */, mUserId); - notifyUserConfigChanged(success); + Slog.d(TAG, "Auto enabled One-handed mode by shortcut trigger, success=" + success); } if (isSwipeToNotificationEnabled()) { @@ -596,11 +596,11 @@ public class OneHandedController implements RemoteCallable mOneHandedUiEventLogger.writeEvent(enabled ? OneHandedUiEventLogger.EVENT_ONE_HANDED_SETTINGS_SHOW_NOTIFICATION_ENABLED_ON : OneHandedUiEventLogger.EVENT_ONE_HANDED_SETTINGS_SHOW_NOTIFICATION_ENABLED_OFF); + } - // Also checks one handed mode settings since they all need gesture overlay. - setEnabledGesturalOverlay( - enabled || mOneHandedSettingsUtil.getSettingsOneHandedModeEnabled( - mContext.getContentResolver(), mUserId), true /* DelayExecute */); + void onShortcutEnabledChanged() { + mIsShortcutEnabled = mOneHandedSettingsUtil.getShortcutEnabled( + mContext.getContentResolver(), mUserId); } private void setupTimeoutListener() { @@ -620,7 +620,7 @@ public class OneHandedController implements RemoteCallable @VisibleForTesting boolean isShortcutEnabled() { - return mOneHandedSettingsUtil.getShortcutEnabled(mContext.getContentResolver(), mUserId); + return mIsShortcutEnabled; } @VisibleForTesting @@ -634,9 +634,9 @@ public class OneHandedController implements RemoteCallable } // If setting is pull screen, notify shortcut one_handed_mode_activated to reset - // and align status with current mState when function enabled. + // and align status with current mState when one-handed gesture enabled. if (isOneHandedEnabled() && !isSwipeToNotificationEnabled()) { - notifyShortcutState(mState.getState()); + notifyShortcutStateChanged(mState.getState()); } mTouchHandler.onOneHandedEnabled(mIsOneHandedEnabled); 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 3baa69f0033a..5911f8d66b32 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 @@ -23,6 +23,7 @@ import android.content.ContentResolver; import android.database.ContentObserver; import android.net.Uri; import android.provider.Settings; +import android.text.TextUtils; import androidx.annotation.Nullable; @@ -170,7 +171,7 @@ public final class OneHandedSettingsUtil { public boolean getShortcutEnabled(ContentResolver resolver, int userId) { final String targets = Settings.Secure.getStringForUser(resolver, Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, userId); - return targets != null ? targets.contains(ONE_HANDED_MODE_TARGET_NAME) : false; + return TextUtils.isEmpty(targets) ? false : targets.contains(ONE_HANDED_MODE_TARGET_NAME); } /** diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedControllerTest.java index be786fb55b30..9ec7d304d520 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedControllerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedControllerTest.java @@ -26,6 +26,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; @@ -406,7 +407,7 @@ public class OneHandedControllerTest extends OneHandedTestCase { false); mSpiedOneHandedController.onActivatedActionChanged(); - verify(mSpiedOneHandedController).notifyUserConfigChanged(anyBoolean()); + verify(mMockSettingsUitl).setOneHandedModeEnabled(any(), eq(1), anyInt()); } @Test @@ -441,7 +442,7 @@ public class OneHandedControllerTest extends OneHandedTestCase { mSpiedOneHandedController.registerEventCallback(mMockEventCallback); mSpiedOneHandedController.setOneHandedEnabled(true); - verify(mSpiedOneHandedController).notifyShortcutState(anyInt()); + verify(mSpiedOneHandedController).notifyShortcutStateChanged(anyInt()); } @Test @@ -468,7 +469,7 @@ public class OneHandedControllerTest extends OneHandedTestCase { false /* To avoid test runner create Toast */); mSpiedOneHandedController.onActivatedActionChanged(); - verify(mSpiedOneHandedController).notifyUserConfigChanged(anyBoolean()); + verify(mMockSettingsUitl).setOneHandedModeEnabled(any(), eq(1), anyInt()); } @Test @@ -481,6 +482,5 @@ public class OneHandedControllerTest extends OneHandedTestCase { mSpiedOneHandedController.onActivatedActionChanged(); verify(mMockSettingsUitl, never()).setOneHandedModeEnabled(any(), anyInt(), anyInt()); - verify(mSpiedOneHandedController, never()).notifyUserConfigChanged(anyBoolean()); } } -- cgit v1.2.3 From b4eac9b5d69da171468288b8779d8577f0452afe Mon Sep 17 00:00:00 2001 From: Tiger Huang Date: Thu, 8 Jul 2021 17:32:28 +0800 Subject: Use the real behavior to decide the animation If the appearance or the behavior are not controlled by APIs, InsetsController will still return the default values, but the internal logic will access the real value. Fix: 192635471 Test: Open an app which hides system bars with SYSTEM_UI_FLAG_IMMERSIVE_STICKY, but not BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE. Change-Id: I1c2f947e3707fcb4c151c1ad19c9cd16527e11d9 --- core/java/android/view/InsetsController.java | 16 ++++++++++++++++ .../android/view/ViewRootInsetsControllerHost.java | 18 ++++++++++-------- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/core/java/android/view/InsetsController.java b/core/java/android/view/InsetsController.java index 145607ada4f4..6f915c9182d2 100644 --- a/core/java/android/view/InsetsController.java +++ b/core/java/android/view/InsetsController.java @@ -128,6 +128,10 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation */ @Appearance int getSystemBarsAppearance(); + default boolean isSystemBarsAppearanceControlled() { + return false; + } + /** * @see WindowInsetsController#setSystemBarsBehavior */ @@ -138,6 +142,10 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation */ @Behavior int getSystemBarsBehavior(); + default boolean isSystemBarsBehaviorControlled() { + return false; + } + /** * Releases a surface and ensure that this is done after {@link #applySurfaceParams} has * finished applying params. @@ -1520,6 +1528,10 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation @Override public @Appearance int getSystemBarsAppearance() { + if (!mHost.isSystemBarsAppearanceControlled()) { + // We only return the requested appearance, not the implied one. + return 0; + } return mHost.getSystemBarsAppearance(); } @@ -1544,6 +1556,10 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation @Override public @Behavior int getSystemBarsBehavior() { + if (!mHost.isSystemBarsBehaviorControlled()) { + // We only return the requested behavior, not the implied one. + return 0; + } return mHost.getSystemBarsBehavior(); } diff --git a/core/java/android/view/ViewRootInsetsControllerHost.java b/core/java/android/view/ViewRootInsetsControllerHost.java index 27821fd6608d..ce882da1a6da 100644 --- a/core/java/android/view/ViewRootInsetsControllerHost.java +++ b/core/java/android/view/ViewRootInsetsControllerHost.java @@ -180,13 +180,14 @@ public class ViewRootInsetsControllerHost implements InsetsController.Host { @Override public int getSystemBarsAppearance() { - if ((mViewRoot.mWindowAttributes.privateFlags & PRIVATE_FLAG_APPEARANCE_CONTROLLED) == 0) { - // We only return the requested appearance, not the implied one. - return 0; - } return mViewRoot.mWindowAttributes.insetsFlags.appearance; } + @Override + public boolean isSystemBarsAppearanceControlled() { + return (mViewRoot.mWindowAttributes.privateFlags & PRIVATE_FLAG_APPEARANCE_CONTROLLED) != 0; + } + @Override public void setSystemBarsBehavior(int behavior) { mViewRoot.mWindowAttributes.privateFlags |= PRIVATE_FLAG_BEHAVIOR_CONTROLLED; @@ -199,13 +200,14 @@ public class ViewRootInsetsControllerHost implements InsetsController.Host { @Override public int getSystemBarsBehavior() { - if ((mViewRoot.mWindowAttributes.privateFlags & PRIVATE_FLAG_BEHAVIOR_CONTROLLED) == 0) { - // We only return the requested behavior, not the implied one. - return 0; - } return mViewRoot.mWindowAttributes.insetsFlags.behavior; } + @Override + public boolean isSystemBarsBehaviorControlled() { + return (mViewRoot.mWindowAttributes.privateFlags & PRIVATE_FLAG_BEHAVIOR_CONTROLLED) != 0; + } + @Override public void releaseSurfaceControlFromRt(SurfaceControl surfaceControl) { -- cgit v1.2.3 From 6f657f8f5b7d41af426d6cd8d60bfda6e12057c0 Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Wed, 7 Jul 2021 16:19:44 -0400 Subject: Crash invalid FGS notifications Test: CTS, ActivityManagerProcessStateTest Fixes: 191981182 Change-Id: I13a0202b25c8118db47edba11a93c1939c94b392 --- .../com/android/server/notification/NotificationManagerService.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 1bd5e72bdb15..3f7316270ebe 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -6194,8 +6194,10 @@ public class NotificationManagerService extends SystemService { // Fix the notification as best we can. try { fixNotification(notification, pkg, tag, id, userId); - } catch (Exception e) { + if (notification.isForegroundService()) { + throw new SecurityException("Invalid FGS notification", e); + } Slog.e(TAG, "Cannot fix notification", e); return; } -- cgit v1.2.3 From 49ad566a9fbfb4cbe28597c6bb7c5905c244084f Mon Sep 17 00:00:00 2001 From: Beverly Date: Thu, 8 Jul 2021 11:16:00 -0400 Subject: NonBypass - enter device if user is attempting udfps auth Test: manual, atest BiometricUnlockControllerTest Bug: 192680255 Change-Id: Ide1d74a97e67b92200621c5a70ed883a2534835f --- .../systemui/biometrics/AuthController.java | 11 +++++++++ .../systemui/biometrics/UdfpsController.java | 4 ++++ .../statusbar/phone/BiometricUnlockController.java | 9 ++++++-- .../phone/BiometricsUnlockControllerTest.java | 26 +++++++++++++++++++++- 4 files changed, 47 insertions(+), 3 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java index 2a18055da232..badad9d86a0f 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java @@ -666,6 +666,17 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, mOrientationListener.disable(); } + /** + * Whether the user's finger is currently on udfps attempting to authenticate. + */ + public boolean isUdfpsFingerDown() { + if (mUdfpsController == null) { + return false; + } + + return mUdfpsController.isFingerDown(); + } + /** * Whether the passed userId has enrolled face auth. */ diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java index 81e60f316bbd..710aca038569 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java @@ -822,6 +822,10 @@ public class UdfpsController implements DozeReceiver { mIsAodInterruptActive = false; } + public boolean isFingerDown() { + return mOnFingerDown; + } + private void onFingerDown(int x, int y, float minor, float major) { mExecution.assertIsMainThread(); if (mView == null) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java index 20e6f60c9b17..d560c3bbd51d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java @@ -39,6 +39,7 @@ import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.keyguard.KeyguardViewController; import com.android.systemui.Dumpable; +import com.android.systemui.biometrics.AuthController; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dump.DumpManager; @@ -165,6 +166,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp private BiometricModeListener mBiometricModeListener; private final MetricsLogger mMetricsLogger; + private final AuthController mAuthController; private static final class PendingAuthenticated { public final int userId; @@ -254,7 +256,8 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp PowerManager powerManager, NotificationMediaManager notificationMediaManager, WakefulnessLifecycle wakefulnessLifecycle, - ScreenLifecycle screenLifecycle) { + ScreenLifecycle screenLifecycle, + AuthController authController) { mContext = context; mPowerManager = powerManager; mShadeController = shadeController; @@ -275,6 +278,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp mKeyguardBypassController = keyguardBypassController; mKeyguardBypassController.setUnlockController(this); mMetricsLogger = metricsLogger; + mAuthController = authController; dumpManager.registerDumpable(getClass().getName(), this); } @@ -595,7 +599,8 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp return MODE_DISMISS_BOUNCER; } } else if (unlockingAllowed) { - return bypass ? MODE_UNLOCK_FADING : MODE_NONE; + return bypass || mAuthController.isUdfpsFingerDown() + ? MODE_UNLOCK_FADING : MODE_NONE; } else { return bypass ? MODE_SHOW_BOUNCER : MODE_NONE; } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java index b54f9234188f..60f0b68acac3 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java @@ -40,6 +40,7 @@ import android.testing.TestableResources; import com.android.internal.logging.MetricsLogger; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.SysuiTestCase; +import com.android.systemui.biometrics.AuthController; import com.android.systemui.dump.DumpManager; import com.android.systemui.keyguard.KeyguardViewMediator; import com.android.systemui.keyguard.ScreenLifecycle; @@ -89,6 +90,8 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { @Mock private KeyguardBypassController mKeyguardBypassController; @Mock + private AuthController mAuthController; + @Mock private DozeParameters mDozeParameters; @Mock private MetricsLogger mMetricsLogger; @@ -109,6 +112,7 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { when(mKeyguardStateController.isFaceAuthEnabled()).thenReturn(true); when(mKeyguardBypassController.onBiometricAuthenticated(any(), anyBoolean())) .thenReturn(true); + when(mAuthController.isUdfpsFingerDown()).thenReturn(false); when(mKeyguardBypassController.canPlaySubtleWindowAnimations()).thenReturn(true); mContext.addMockSystemService(PowerManager.class, mPowerManager); mDependency.injectTestDependency(NotificationMediaManager.class, mMediaManager); @@ -118,7 +122,8 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { mNotificationShadeWindowController, mKeyguardStateController, mHandler, mUpdateMonitor, res.getResources(), mKeyguardBypassController, mDozeParameters, mMetricsLogger, mDumpManager, mPowerManager, - mNotificationMediaManager, mWakefulnessLifecycle, mScreenLifecycle); + mNotificationMediaManager, mWakefulnessLifecycle, mScreenLifecycle, + mAuthController); mBiometricUnlockController.setKeyguardViewController(mStatusBarKeyguardViewManager); mBiometricUnlockController.setBiometricModeListener(mBiometricModeListener); } @@ -228,6 +233,25 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { .isEqualTo(BiometricUnlockController.MODE_UNLOCK_FADING); } + @Test + public void onBiometricAuthenticated_whenFace_andNonBypassAndUdfps_dismissKeyguard() { + when(mKeyguardBypassController.getBypassEnabled()).thenReturn(false); + when(mAuthController.isUdfpsFingerDown()).thenReturn(true); + mBiometricUnlockController.setKeyguardViewController(mStatusBarKeyguardViewManager); + + when(mUpdateMonitor.isUnlockingWithBiometricAllowed(anyBoolean())).thenReturn(true); + // the value of isStrongBiometric doesn't matter here since we only care about the returned + // value of isUnlockingWithBiometricAllowed() + mBiometricUnlockController.onBiometricAuthenticated(UserHandle.USER_CURRENT, + BiometricSourceType.FACE, true /* isStrongBiometric */); + + verify(mShadeController, never()).animateCollapsePanels(anyInt(), anyBoolean(), + anyBoolean(), anyFloat()); + verify(mStatusBarKeyguardViewManager).notifyKeyguardAuthenticated(eq(false)); + assertThat(mBiometricUnlockController.getMode()) + .isEqualTo(BiometricUnlockController.MODE_UNLOCK_FADING); + } + @Test public void onBiometricAuthenticated_whenFace_andBypass_encrypted_showBouncer() { reset(mUpdateMonitor); -- cgit v1.2.3 From f8a26819a37d8c62719e7f0defcda8f658cc4860 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 8 Jul 2021 16:46:00 +0000 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Iec87d589eaaf3e4a320dbe637f8f032e46067226 --- 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 | 2 +- packages/SystemUI/res/values-ca/strings.xml | 2 +- packages/SystemUI/res/values-cs/strings.xml | 2 +- packages/SystemUI/res/values-da/strings.xml | 2 +- packages/SystemUI/res/values-de/strings.xml | 2 +- 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 | 8 +++----- 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 | 8 +++----- 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 | 8 +++----- 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 | 4 ++-- packages/SystemUI/res/values-te/strings.xml | 2 +- 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, 92 insertions(+), 98 deletions(-) diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index 7fc978bfb0a4..df9230f67c31 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -1044,7 +1044,7 @@ "Beweeg na rand en versteek" "Beweeg weg van rand en wys" "wissel" - "Huiskontroles" + "Toestelkontroles" "Kies program om kontroles by te voeg" %s kontroles bygevoeg. diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index 6b9e40d3cffa..d4ea169a9263 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -1044,7 +1044,7 @@ "ወደ ጠርዝ አንቀሳቅስ እና ደደብቅ" "ጠርዙን ወደ ውጭ አንቀሳቅስ እና አሳይ" "ቀያይር" - "የቤት ውስጥ ቁጥጥሮች" + "የመሣሪያ መቆጣጠሪያዎች" "መቆጣጠሪያዎችን ለማከል መተግበሪያ ይምረጡ" %s ቁጥጥሮች ታክለዋል። diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index c8aa73c2e33e..8d35188709e5 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -1064,7 +1064,7 @@ "نقله إلى الحافة وإخفاؤه" "نقله إلى خارج الحافة وإظهاره" "إيقاف/تفعيل" - "إدارة آلية للمنزل" + "أدوات التحكم بالأجهزة" "اختيار تطبيق لإضافة عناصر التحكّم" تمت إضافة %s عنصر تحكّم. diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index 64a466c6d7e8..880a088e3488 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -1044,7 +1044,7 @@ "কাষলৈ নিয়ক আৰু লুকুৱাওক" "কাষৰ বাহিৰলৈ নিয়ক আৰু দেখুৱাওক" "ট’গল কৰক" - "গৃহ নিয়ন্ত্ৰণ" + "ডিভাইচৰ নিয়ন্ত্ৰণসমূহ" "নিয়ন্ত্ৰণসমূহ যোগ কৰিবলৈ এপ্‌ বাছনি কৰক" %s টা নিয়ন্ত্ৰণ যোগ কৰা হ’ল। diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index 414351845844..96ab6e3482a4 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -1044,7 +1044,7 @@ "İçəri keçirib gizlədin" "Kənara daşıyıb göstərin" "keçirin" - "Əsas səhifə nizamlayıcıları" + "Cihaz kontrolları" "Kontrol əlavə etmək üçün tətbiq seçin" %s nizamlayıcı əlavə edilib. diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index a179b93ad4cf..8bd3b0a919b6 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -1049,7 +1049,7 @@ "Premesti do ivice i sakrij" "Premesti izvan ivice i prikaži" "uključite/isključite" - "Kontrole za dom" + "Kontrole uređaja" "Odaberite aplikaciju za dodavanje kontrola" %s kontrola je dodata. diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index 83fa2afb0033..9db9e68b4033 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -1054,7 +1054,7 @@ "Перамясціць на край і схаваць" "Перамясціць за край і паказаць" "уключыць/выключыць" - "Элементы кіравання домам" + "Элементы кіравання прыладай" "Выберыце праграму для дадавання элементаў кіравання" Дададзены %s элемент кіравання. diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index 6886ed4aba7c..e361feb9704e 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -1044,7 +1044,7 @@ "Преместване в края и скриване" "Преместване в края и показване" "превключване" - "Контроли за дома" + "Контроли за устройството" "Изберете приложение, за да добавите контроли" Добавени са %s контроли. diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index e8a7281a49dc..72eeab1a5b82 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -1044,7 +1044,7 @@ "প্রান্তে যান ও আড়াল করুন" "প্রান্ত থেকে সরান এবং দেখুন" "টগল করুন" - "হোম কন্ট্রোল" + "ডিভাইস কন্ট্রোল" "কন্ট্রোল যোগ করতে অ্যাপ বেছে নিন" %sটি কন্ট্রোল যোগ করা হয়েছে। diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index 47d07738c155..c4fbd99d0642 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -1049,7 +1049,7 @@ "Pomjeranje do ivice i sakrivanje" "Pomjeranje izvan ivice i prikaz" "aktiviranje/deaktiviranje" - "Kontrole doma" + "Kontrole uređaja" "Odaberite aplikaciju da dodate kontrole" Dodana je %s kontrola. diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index abcefec326ff..cba6e91f2319 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -1044,7 +1044,7 @@ "Mou dins de les vores i amaga" "Mou fora de les vores i mostra" "commuta" - "Domòtica" + "Controls de dispositius" "Selecciona l\'aplicació per afegir controls" S\'han afegit %s controls. diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index b90cff3772ae..93b635910a6a 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -1054,7 +1054,7 @@ "Přesunout k okraji a skrýt" "Přesunout okraj ven a zobrazit" "přepnout" - "Ovládání domácnosti" + "Ovládání zařízení" "Vyberte aplikaci, pro kterou chcete přidat ovládací prvky" Byly přidány %s ovládací prvky. diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index cb06aa76b184..341f06fb2bb1 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -1044,7 +1044,7 @@ "Flyt ud til kanten, og skjul" "Flyt ud til kanten, og vis" "slå til/fra" - "Styring af smartenheder" + "Enhedsstyring" "Vælg en app for at tilføje styring" %s styring er tilføjet. diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 36e837e02c9a..35b72fee0404 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -1044,7 +1044,7 @@ "An den Rand verschieben und verbergen" "Vom Rand verschieben und anzeigen" "Wechseln" - "Smart-Home-Steuerung" + "Gerätesteuerung" "App zum Hinzufügen von Steuerelementen auswählen" %s Steuerelemente hinzugefügt. diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index 04e69f10c83f..e53775aa7d8f 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -1044,7 +1044,7 @@ "Μετακίν. στο άκρο και απόκρυψη" "Μετακ. εκτός άκρου και εμφάν." "εναλλαγή" - "Οικιακοί έλεγχοι" + "Στοιχεία ελέγχου συσκευής" "Επιλογή εφαρμογής για προσθήκη στοιχείων ελέγχου" Προστέθηκαν %s στοιχεία ελέγχου. diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index 043c374496c5..111de11548e6 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -1044,7 +1044,7 @@ "Move to edge and hide" "Move out edge and show" "toggle" - "Home controls" + "Device controls" "Choose app to add controls" %s controls added. diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml index 514747ada968..6b4eaba47e51 100644 --- a/packages/SystemUI/res/values-en-rCA/strings.xml +++ b/packages/SystemUI/res/values-en-rCA/strings.xml @@ -1044,7 +1044,7 @@ "Move to edge and hide" "Move out edge and show" "toggle" - "Home controls" + "Device controls" "Choose app to add controls" %s controls added. diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index 043c374496c5..111de11548e6 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -1044,7 +1044,7 @@ "Move to edge and hide" "Move out edge and show" "toggle" - "Home controls" + "Device controls" "Choose app to add controls" %s controls added. diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index 043c374496c5..111de11548e6 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -1044,7 +1044,7 @@ "Move to edge and hide" "Move out edge and show" "toggle" - "Home controls" + "Device controls" "Choose app to add controls" %s controls added. diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml index 2c739667d252..7c1e09f319a0 100644 --- a/packages/SystemUI/res/values-en-rXC/strings.xml +++ b/packages/SystemUI/res/values-en-rXC/strings.xml @@ -1044,7 +1044,7 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‏‎‎‏‏‎‎‎‏‎‏‎‏‎‎‏‎‎‏‎‏‏‎‏‎‎‏‎‏‏‏‎‎‎‎‎‏‎‏‏‏‏‏‏‏‏‎‎‎‏‎‎‎‎‎‏‎‎Move to edge and hide‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‏‎‎‏‎‎‎‎‏‎‎‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‎‏‎‎‎‏‏‏‎‎‏‎‎‏‎‎‏‎‏‏‏‎‏‏‏‏‎‎Move out edge and show‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎‏‏‎‎‏‎‎‎‏‏‎‎‎‏‏‏‎‎‏‎‏‏‎‏‏‎‎‏‎‏‎‎‎‏‎‏‏‎‏‏‏‎‏‎‎‎‏‏‎‎‎‏‎‏‎toggle‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‏‏‎‏‏‎‏‏‎‎‎‏‎‎‏‏‎‎‎‏‏‎‏‏‎‎‏‏‎‎‏‏‎‎‎‏‎‏‏‎‎‎‎‎‏‏‎‎‎‏‏‏‏‎‎Home controls‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‏‏‎‏‎‎‏‎‏‏‎‎‏‎‎‎‏‏‏‏‏‏‏‎‎‎‏‏‎‎‎‎‏‎‏‏‏‏‎‏‏‎‏‏‎‎‏‏‎‎‎‎‎‎‏‎Device controls‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‏‎‏‏‏‏‎‎‏‏‏‎‏‏‏‏‏‏‎‏‏‏‎‎‎‏‎‏‎‎‎‎‏‎‎‏‏‏‎‏‎‎‏‏‏‏‏‏‎‏‎‎‎‎‎‎‎‎Choose app to add controls‎‏‎‎‏‎" ‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‎‏‎‏‎‏‏‎‎‎‏‏‏‎‏‎‎‎‏‎‎‎‎‎‎‎‏‎‎‏‏‏‎‏‏‎‎‏‎‎‏‏‏‏‎‎‏‏‎‎‎‎‏‎‏‎‎‎‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎ controls added.‎‏‎‎‏‎ diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index 0e1d014a9322..01a6f8d489a4 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -1044,7 +1044,7 @@ "Mover fuera de borde y ocultar" "Mover fuera de borde y mostrar" "activar o desactivar" - "Controles de la casa" + "Controles de dispositivos" "Elige la app para agregar los controles" Se agregaron %s controles. diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 6f23634469ef..4c43eadeb576 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -1044,7 +1044,7 @@ "Mover al borde y ocultar" "Mover al borde y mostrar" "activar/desactivar" - "Domótica" + "Control de dispositivos" "Elige una aplicación para añadir controles" Se han añadido %s controles. diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index d0d33e49e8f7..3d8659d1de7e 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -1044,7 +1044,7 @@ "Teisalda serva ja kuva" "Teisalda servast eemale ja kuva" "lülita" - "Kodu juhtelemendid" + "Seadmete juhikud" "Valige juhtelementide lisamiseks rakendus" Lisati %s juhtnuppu. diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index 734fb3e57d9e..d31157e5cd6c 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -1044,7 +1044,7 @@ "Eraman ertzera eta ezkutatu" "Atera ertzetik eta erakutsi" "aldatu" - "Etxeko gailuak kontrolatzeko aukerak" + "Gailuak kontrolatzeko widgetak" "Aukeratu aplikazio bat kontrolatzeko aukerak gehitzeko" %s kontrol-aukera gehitu dira. diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index d9744768fac3..3a4f87cbbfe0 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -1044,7 +1044,7 @@ "انتقال به لبه و پنهان کردن" "انتقال به خارج از لبه و نمایش" "روشن/ خاموش کردن" - "کنترل‌های لوازم خانگی" + "کنترل‌های دستگاه" "انتخاب برنامه برای افزودن کنترل‌ها" %s کنترل اضافه شده است. diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 98b9953ceee1..62ab1f4aa7ca 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -1044,7 +1044,7 @@ "Siirrä reunaan ja piilota" "Siirrä pois reunasta ja näytä" "vaihda" - "Kodin ohjaus" + "Laitteiden hallinta" "Valitse sovellus lisätäksesi säätimiä" %s säädintä lisätty diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index e5db4de17f2a..6c0839a92347 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -1044,7 +1044,7 @@ "Éloigner du bord et masquer" "Éloigner du bord et afficher" "basculer" - "Domotique" + "Commandes des appareils" "Sélectionnez l\'application pour laquelle ajouter des commandes" %s commande ajoutée. diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 6a0fc64bdb99..d898fcc16599 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -1044,7 +1044,7 @@ "Rapprocher du bord et masquer" "Éloigner du bord et afficher" "activer/désactiver" - "Commandes de la maison" + "Commandes des appareils" "Sélectionnez l\'appli pour laquelle ajouter des commandes" %s commande ajoutée. diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index 94fa675b3179..2d417a357ca2 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -1044,7 +1044,7 @@ "Mover ao bordo e ocultar" "Mover fóra do bordo e mostrar" "activar/desactivar" - "Controis domóticos" + "Control de dispositivos" "Escolle unha aplicación para engadir controis" Engadíronse %s controis. diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index ad3c6a8d64b5..f70bf301b337 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -1044,7 +1044,7 @@ "કિનારી પર ખસેડો અને છુપાવો" "કિનારીથી ખસેડો અને બતાવો" "ટૉગલ કરો" - "ઘરેલું સાધનોનાં નિયંત્રણો" + "ડિવાઇસનાં નિયંત્રણો" "નિયંત્રણો ઉમેરવા માટે ઍપ પસંદ કરો" %s નિયંત્રણ ઉમેર્યું. @@ -1146,11 +1146,9 @@ "તાજેતરના સંદેશા, ચૂકી ગયેલા કૉલ અને સ્ટેટસ અપડેટ જુઓ" "વાતચીત" "\'ખલેલ પાડશો નહીં\'ની સુવિધા દ્વારા થોભાવેલું" - - + "%1$s દ્વારા કોઈ સંદેશ મોકલવામાં આવ્યો: %2$s" "%1$s દ્વારા કોઈ છબી મોકલવામાં આવી" - - + "%1$s દ્વારા નવી સ્ટેટસ અપડેટ પોસ્ટ કરવામાં આવી: %2$s" "તમારું બૅટરી મીટર વાંચવામાં સમસ્યા આવી" "વધુ માહિતી માટે ટૅપ કરો" "કોઈ અલાર્મ સેટ નથી" diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index ff686998dff1..1d4e56623814 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -1044,7 +1044,7 @@ "एज पर ले जाएं और छिपाएं" "एज से निकालें और दिखाएं" "टॉगल करें" - "होम कंट्रोल" + "डिवाइस कंट्रोल" "कंट्रोल जोड़ने के लिए ऐप्लिकेशन चुनें" %s कंट्रोल जोड़ा गया. diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index a87790dc1af2..72ba16397312 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -1049,7 +1049,7 @@ "Premjesti na rub i sakrij" "Ukloni s ruba i prikaži" "promijeni" - "Upravljanje kuć. uređajima" + "Kontrole uređaja" "Odabir aplikacije za dodavanje kontrola" Dodana je %s kontrola. diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index f954f244ca4c..d394a848d0c7 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -1044,7 +1044,7 @@ "Áthelyezés a szélen kívül és elrejtés" "Áthelyezés a szélen kívül és mutatás" "váltás" - "Otthon vezérlése" + "Eszközvezérlők" "Válasszon alkalmazást a vezérlők hozzáadásához" %s vezérlő hozzáadva. diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index fd81c4fde903..ed07b4b48d2e 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -1044,7 +1044,7 @@ "Տեղափոխել եզրից դուրս և թաքցնել" "Տեղափոխել եզրից դուրս և ցուցադրել" "միացնել/անջատել" - "Խելացի տուն" + "Սարքերի կառավարման տարրեր" "Ընտրեք հավելված` կառավարման տարրեր ավելացնելու համար" Ավելացվեց կառավարման %s տարր։ diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index 220656f40981..11ca6c3e5738 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -1044,7 +1044,7 @@ "Pindahkan ke tepi dan sembunyikan" "Pindahkan dari tepi dan tampilkan" "alihkan" - "Kontrol rumah" + "Kontrol perangkat" "Pilih aplikasi untuk menambahkan kontrol" %s kontrol ditambahkan. diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index a0df4b980762..fda217ec08f3 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -1044,7 +1044,7 @@ "Færa að jaðri og fela" "Færa að jaðri og birta" "kveikja/slökkva" - "Heimastýringar" + "Tækjastjórnun" "Veldu forrit til að bæta við stýringum" %s stýringu bætt við. diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index 871a97c30214..b485091c6f35 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -1044,7 +1044,7 @@ "Sposta fino a bordo e nascondi" "Sposta fuori da bordo e mostra" "attiva/disattiva" - "Controlli della casa" + "Controllo dei dispositivi" "Scegli un\'app per aggiungere controlli" %s controlli aggiunti. diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index 3de805a4a428..7f7e2da41988 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -1054,7 +1054,7 @@ "העברה לשוליים והסתרה" "העברה מהשוליים והצגה" "החלפת מצב" - "פקדי הבית החכם" + "פקדי מכשירים" "יש לבחור אפליקציה כדי להוסיף פקדים" נוספו %s פקדים. diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index 9e3c6167eaf5..c4b5d1290e16 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -1044,7 +1044,7 @@ "端に移動して非表示" "端から移動して表示" "切り替え" - "ホーム コントロール" + "デバイス コントロール" "コントロールを追加するアプリの選択" %s 件のコントロールを追加しました。 diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml index a1a475d12303..bc214c7371a5 100644 --- a/packages/SystemUI/res/values-ka/strings.xml +++ b/packages/SystemUI/res/values-ka/strings.xml @@ -1044,7 +1044,7 @@ "კიდეში გადატანა და დამალვა" "კიდეში გადატანა და გამოჩენა" "გადართვა" - "სახლის მართვის საშუალებები" + "მოწყობილ. მართვის საშუალებები" "აირჩიეთ აპი მართვის საშუალებების დასამატებლად" დაემატა %s მართვის საშუალება. diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index 846dea950f91..775dea7e074f 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -1044,7 +1044,7 @@ "Шетке жылжыту және жасыру" "Шетке жылжыту және көрсету" "ауыстыру" - "Үйді басқару элементтері" + "Құрылғыны басқару элементтері" "Басқару элементтері қосылатын қолданбаны таңдаңыз" %s басқару элементі енгізілді. diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index 086ddf351bc2..265d8e27eb5d 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -1044,7 +1044,7 @@ "ផ្លាស់ទីទៅផ្នែកខាងចុង រួចលាក់" "ផ្លាស់ទីចេញពីផ្នែកខាងចុង រួចបង្ហាញ" "បិទ/បើក" - "ការគ្រប់គ្រង​ផ្ទះ" + "ផ្ទាំងគ្រប់គ្រងឧបករណ៍" "ជ្រើសរើស​កម្មវិធីដែលត្រូវបញ្ចូល​ផ្ទាំងគ្រប់គ្រង" បានបញ្ចូល​ការគ្រប់គ្រង %s diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index 38fc84e79939..c5bd9cda3299 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -1044,7 +1044,7 @@ "ಅಂಚಿಗೆ ಸರಿಸಿ ಮತ್ತು ಮರೆಮಾಡಿ" "ಅಂಚನ್ನು ಸರಿಸಿ ಮತ್ತು ತೋರಿಸಿ" "ಟಾಗಲ್ ಮಾಡಿ" - "ಹೋಮ್‌ ನಿಯಂತ್ರಣಗಳು" + "ಸಾಧನ ನಿಯಂತ್ರಣಗಳು" "ನಿಯಂತ್ರಣಗಳನ್ನು ಸೇರಿಸಲು ಆ್ಯಪ್ ಅನ್ನು ಆಯ್ಕೆಮಾಡಿ" %s ನಿಯಂತ್ರಣಗಳನ್ನು ಸೇರಿಸಲಾಗಿದೆ. diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index 2d07d946d09f..f43539c84b6a 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -1044,7 +1044,7 @@ "가장자리로 옮겨서 숨기기" "가장자리 바깥으로 옮겨서 표시" "전환" - "홈 컨트롤" + "기기 컨트롤" "컨트롤을 추가할 앱을 선택하세요" 제어 기능 %s개가 추가되었습니다. diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index ad244f124697..a029bbc9ca41 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -1044,7 +1044,7 @@ "Ичине жылдырып, көрсөтүңүз" "Сыртка жылдырып, көрсөтүңүз" "өчүрүү/күйгүзүү" - "Үйдү башкаруу элементтери" + "Түзмөктү башкаруу элементтери" "Башкаруу элементтери кошула турган колдонмону тандоо" %s башкаруу элементи кошулду. diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index f47b8e8a2dc2..826e45b94e1b 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -1044,7 +1044,7 @@ "ຍ້າຍອອກຂອບ ແລະ ເຊື່ອງ" "ຍ້າຍອອກຂອບ ແລະ ສະແດງ" "ສະຫຼັບ" - "ການຄວບຄຸມເຮືອນ" + "ການຄວບຄຸມອຸປະກອນ" "ເລືອກແອັບເພື່ອເພີ່ມການຄວບຄຸມ" ເພີ່ມ %s ການຄວບຄຸມແລ້ວ. diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index e12afb555a41..656d54cdef7e 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -1054,7 +1054,7 @@ "Perkelti į kraštą ir slėpti" "Perkelti iš krašto ir rodyti" "perjungti" - "Namų sistemos valdikliai" + "Įrenginio valdikliai" "Pasirinkite programą, kad pridėtumėte valdiklių" Pridėtas %s valdiklis. diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index 1d0b0fffb6b8..b4c615165168 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -1049,7 +1049,7 @@ "Pārvietot uz malu un paslēpt" "Pārvietot no malas un parādīt" "pārslēgt" - "Mājas kontrolierīces" + "Ierīču vadīklas" "Izvēlieties lietotni, lai pievienotu vadīklas" Pievienotas %s vadīklas. diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index 39db33948e81..0bead0f72273 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -1044,7 +1044,7 @@ "Премести до работ и сокриј" "Премести над работ и прикажи" "вклучување/исклучување" - "Контроли за домот" + "Контроли за уредите" "Изберете апликација за да додадете контроли" Додадена е %s контрола. diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index d72466a63f99..264d2bf36c6e 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -1044,7 +1044,7 @@ "എഡ്‌ജിലേക്ക് നീക്കി മറയ്‌ക്കുക" "എഡ്‌ജിൽ നിന്ന് നീക്കി കാണിക്കൂ" "മാറ്റുക" - "ഹോം കൺട്രോളുകൾ" + "ഉപകരണ നിയന്ത്രണങ്ങൾ" "നിയന്ത്രണങ്ങൾ ചേർക്കാൻ ആപ്പ് തിരഞ്ഞെടുക്കുക" %s നിയന്ത്രണങ്ങൾ ചേർത്തു. diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index 9fe4d0aab82a..94ffad5afaf0 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -1044,7 +1044,7 @@ "Ирмэг рүү зөөж, нуух" "Ирмэгээс гаргаж, харуулах" "асаах/унтраах" - "Гэрийн удирдлагууд" + "Төхөөрөмжийн хяналт" "Хяналтууд нэмэхийн тулд аппыг сонгоно уу" %s хяналтыг нэмлээ. diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index 5a4039e51920..1ed5458f44b1 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -1044,7 +1044,7 @@ "एजवर हलवा आणि लपवा" "एजवर हलवा आणि दाखवा" "टॉगल करा" - "होम कंट्रोल" + "डिव्हाइस नियंत्रणे" "नियंत्रणे जोडण्यासाठी ॲप निवडा" %s नियंत्रणे जोडली. @@ -1146,11 +1146,9 @@ "अलीकडील मेसेज, मिस्ड कॉल आणि स्टेटस अपडेट पाहा" "संभाषण" "व्यत्यय आणू नका द्वारे थांबवले गेले" - - + "%1$s यांनी मेसेज पाठवला: %2$s" "%1$s यांनी इमेज पाठवली" - - + "%1$s यांनी स्टेटस अपडेट केले: %2$s" "तुमचे बॅटरी मीटर वाचताना समस्या आली" "अधिक माहितीसाठी टॅप करा" "अलार्म सेट केला नाही" diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index 40913751ef78..f1ce8324e4cb 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -1044,7 +1044,7 @@ "Alihkan ke tepi dan sorokkan" "Alihkan ke tepi dan tunjukkan" "togol" - "Kawalan rumah" + "Kawalan peranti" "Pilih apl untuk menambahkan kawalan" %s kawalan ditambah. diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index 51c800f697e1..30efdb3ccacb 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -1044,7 +1044,7 @@ "အစွန်းသို့ရွှေ့ပြီး ဝှက်ရန်" "အစွန်းမှရွှေ့ပြီး ပြရန်" "ပြောင်းရန်" - "ပင်မ ထိန်းချုပ်မှုများ" + "စက်ထိန်းစနစ်" "ထိန်းချုပ်မှုများထည့်ရန် အက်ပ်ရွေးခြင်း" ခလုတ် %s ခု ထည့်လိုက်သည်။ diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index 69d636d1121c..75755c60f607 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -1044,7 +1044,7 @@ "Flytt til kanten og skjul" "Flytt ut kanten og vis" "slå av/på" - "Hjemkontroller" + "Enhetsstyring" "Velg en app for å legge til kontroller" %s kontroller er lagt til. diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index 8bb7d861e607..cace5b717efd 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -1044,7 +1044,7 @@ "किनारामा सार्नुहोस् र नदेखिने पार्नु…" "किनाराबाट सार्नुहोस् र देखिने पार्नु…" "टगल गर्नुहोस्" - "घरायसी उपकरणका नियन्त्रणहरू" + "डिभाइस नियन्त्रण गर्ने विजेटहरू" "कन्ट्रोल थप्नु पर्ने एप छान्नुहोस्" %s वटा नियन्त्र थपियो। diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index c9e869de871d..da221af43e0e 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -1044,7 +1044,7 @@ "Naar rand verplaatsen en verbergen" "Over rand verplaatsen en tonen" "schakelen" - "Bediening voor in huis" + "Apparaatbediening" "Kies de app waaraan je bedieningselementen wilt toevoegen" %s bedieningselementen toegevoegd. diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index a209581c50f4..53371ef149ce 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -1044,7 +1044,7 @@ "ଧାରକୁ ମୁଭ୍ କରି ଲୁଚାନ୍ତୁ" "ଧାର ବାହାରକୁ ମୁଭ୍ କରି ଦେଖାନ୍ତୁ" "ଟୋଗଲ୍ କରନ୍ତୁ" - "ହୋମ୍ କଣ୍ଟ୍ରୋଲ୍" + "ଡିଭାଇସ୍ ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକ" "ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକୁ ଯୋଗ କରିବାକୁ ଆପ୍ ବାଛନ୍ତୁ" %sଟି ନିୟନ୍ତ୍ରଣ ଯୋଗ କରାଯାଇଛି। diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index 49b1f9a54689..27cb319b32a0 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -1044,7 +1044,7 @@ "ਕਿਨਾਰੇ ਵਿੱਚ ਲਿਜਾ ਕੇ ਲੁਕਾਓ" "ਕਿਨਾਰੇ ਤੋਂ ਬਾਹਰ ਕੱਢ ਕੇ ਦਿਖਾਓ" "ਟੌਗਲ ਕਰੋ" - "ਹੋਮ ਕੰਟਰੋਲ" + "ਡੀਵਾਈਸ ਕੰਟਰੋਲ" "ਕੰਟਰੋਲ ਸ਼ਾਮਲ ਕਰਨ ਲਈ ਐਪ ਚੁਣੋ" %s ਕੰਟਰੋਲ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ। @@ -1146,11 +1146,9 @@ "ਹਾਲੀਆ ਸੁਨੇਹੇ, ਮਿਸ ਕਾਲਾਂ ਅਤੇ ਸਥਿਤੀ ਸੰਬੰਧੀ ਅੱਪਡੇਟ ਦੇਖੋ" "ਗੱਲਬਾਤ" "\'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਵਿਸ਼ੇਸ਼ਤਾ ਨੇ ਰੋਕ ਦਿੱਤਾ" - - + "%1$s ਨੇ ਸੁਨੇਹਾ ਭੇਜਿਆ: %2$s" "%1$s ਨੇ ਇੱਕ ਚਿੱਤਰ ਭੇਜਿਆ ਹੈ" - - + "%1$s ਨੇ ਸਥਿਤੀ ਅੱਪਡੇਟ ਕੀਤੀ ਹੈ: %2$s" "ਤੁਹਾਡੇ ਬੈਟਰੀ ਮੀਟਰ ਨੂੰ ਪੜ੍ਹਨ ਵਿੱਚ ਸਮੱਸਿਆ ਹੋ ਰਹੀ ਹੈ" "ਹੋਰ ਜਾਣਕਾਰੀ ਲਈ ਟੈਪ ਕਰੋ" "ਕੋਈ ਅਲਾਰਮ ਸੈੱਟ ਨਹੀਂ" diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index fb433c5b43ff..8005c8194737 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -1054,7 +1054,7 @@ "Przenieś do krawędzi i ukryj" "Przenieś poza krawędź i pokaż" "przełącz" - "Sterowanie domem" + "Sterowanie urządzeniami" "Wybierz aplikację, do której chcesz dodać elementy sterujące" Dodano %s elementy sterujące diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index e33c106c7420..b175fe628bf0 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -1044,7 +1044,7 @@ "Mover para a borda e ocultar" "Mover para fora da borda e exibir" "alternar" - "Automação residencial" + "Controles do dispositivo" "Escolha um app para adicionar controles" %s controle adicionado. diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index 2965cb7eb578..cb5903e9e0df 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -1044,7 +1044,7 @@ "Mover p/ extremidade e ocultar" "Retirar extremidade e mostrar" "ativar/desativar" - "Controlo casa" + "Controlos de dispositivos" "Escolha uma app para adicionar controlos" %s controlos adicionados. diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index e33c106c7420..b175fe628bf0 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -1044,7 +1044,7 @@ "Mover para a borda e ocultar" "Mover para fora da borda e exibir" "alternar" - "Automação residencial" + "Controles do dispositivo" "Escolha um app para adicionar controles" %s controle adicionado. diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index 90c76adc50c9..e0a2b9acc72a 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -1049,7 +1049,7 @@ "Mutați în afară și ascundeți" "Mutați în afară și afișați" "Activați / dezactivați" - "Comenzi pentru locuință" + "Comenzile dispozitivelor" "Alegeți aplicația pentru a adăuga comenzi" S-au adăugat %s comenzi. diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index 7f27437e5200..db487d47d00d 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -1054,7 +1054,7 @@ "Перенести к краю и скрыть" "Вернуть из-за края и показать" "включить или отключить" - "Автоматизация дома" + "Управление устройствами" "Чтобы добавить виджеты управления, выберите приложение" Добавлен %s элемент управления. diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index 79eb6baf867d..d2f56c906e90 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -1044,7 +1044,7 @@ "මායිමට ගෙන යන්න සහ සඟවන්න" "මායිමෙන් පිටට ගන්න සහ පෙන්වන්න" "ටොගල් කරන්න" - "නිවෙස් පාලන" + "උපාංග පාලන" "පාලන එක් කිරීමට යෙදුම තෝරා ගන්න" පාලන %sක් එක් කරන ලදී. diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index 0158d27f549b..cadf2b983b19 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -1054,7 +1054,7 @@ "Presunúť k okraju a skryť" "Presunúť z okraja a zobraziť" "prepínač" - "Ovládanie domácnosti" + "Ovládanie zariadení" "Vyberte aplikáciu, ktorej ovládače si chcete pridať" Boli pridané %s ovládacie prvky. diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index 1af9e029dd1f..82a34e1d2496 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -1054,7 +1054,7 @@ "Premakni na rob in skrij" "Premakni z roba in pokaži" "preklop" - "Kontrolniki za dom" + "Kontrolniki naprave" "Izberite aplikacijo za dodajanje kontrolnikov" %s kontrolnik dodan. diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index 78fbc1a6f573..77bf2a8c6dda 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -1044,7 +1044,7 @@ "Zhvendose te skaji dhe fshihe" "Zhvendose jashtë skajit dhe shfaqe" "aktivizo/çaktivizo" - "Kontrollet e shtëpisë" + "Kontrollet e pajisjes" "Zgjidh aplikacionin për të shtuar kontrollet" U shtuan %s kontrolle. diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index e9fbb78ccff3..592b90f89851 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -1049,7 +1049,7 @@ "Премести до ивице и сакриј" "Премести изван ивице и прикажи" "укључите/искључите" - "Контроле за дом" + "Контроле уређаја" "Одаберите апликацију за додавање контрола" %s контрола је додата. diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index bcead0b250d3..7045572457d9 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -1044,7 +1044,7 @@ "Flytta till kanten och dölj" "Flytta från kanten och visa" "aktivera och inaktivera" - "Hemstyrning" + "Enhetsstyrning" "Välj en app om du vill lägga till snabbkontroller" %s kontroller har lagts till. diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index 8fa401a9fe44..f8033021dd30 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -1044,7 +1044,7 @@ "Sogeza kwenye ukingo kisha ufiche" "Sogeza nje ya ukingo kisha uonyeshe" "geuza" - "Udhibiti wa vifaa nyumbani" + "Vidhibiti vya vifaa" "Chagua programu ili uweke vidhibiti" Umeweka vidhibiti %s. diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index 183b559941c0..2901f2902554 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -936,7 +936,7 @@ "லாக் ஸ்கிரீன்" "வெப்பத்தினால் ஃபோன் ஆஃப் செய்யப்பட்டது" "இப்போது உங்கள் மொபைல் இயல்புநிலையில் இயங்குகிறது.\nமேலும் தகவலுக்கு தட்டவும்" - "உங்கள் ஃபோன் அதிகமாகச் சூடானதால், அதன் சூட்டைக் குறைக்க, ஆஃப் செய்யப்பட்டது. இப்போது உங்கள் ஃபோன் இயல்புநிலையில் இயங்குகிறது.\n\nபின்வருவனவற்றைச் செய்தால், ஃபோன் சூடாகலாம்:\n • அதிகளவு தரவைப் பயன்படுத்தும் ஆப்ஸை (எ.கா: கேமிங், வீடியோ (அ) வழிகாட்டுதல் ஆப்ஸ்) பயன்படுத்துவது\n • பெரிய கோப்புகளைப் பதிவிறக்குவது/பதிவேற்றுவது\n • அதிக வெப்பநிலையில் ஃபோனைப் பயன்படுத்துவது" + "உங்கள் ஃபோன் அதிகமாகச் சூடானதால், அதன் சூட்டைக் குறைக்க, ஆஃப் செய்யப்பட்டது. இப்போது உங்கள் ஃபோன் இயல்புநிலையில் இயங்குகிறது.\n\nபின்வருவனவற்றைச் செய்தால், ஃபோன் சூடாகலாம்:\n • அதிகளவு தரவைப் பயன்படுத்தும் ஆப்ஸை (எ.கா: கேமிங், வீடியோ (அ) வழிகாட்டுதல் ஆப்ஸ்) பயன்படுத்துவது\n • பெரிய ஃபைல்களைப் பதிவிறக்குவது/பதிவேற்றுவது\n • அதிக வெப்பநிலையில் ஃபோனைப் பயன்படுத்துவது" "மேலும் விவரங்களுக்கு இதைப் பார்க்கவும்" "மொபைல் சூடாகிறது" "மொபைலின் வெப்ப அளவு குறையும் வரை சில அம்சங்களைப் பயன்படுத்த முடியாது.\nமேலும் தகவலுக்கு தட்டவும்" @@ -1044,7 +1044,7 @@ "ஓரத்திற்கு நகர்த்தி மறை" "ஓரத்திற்கு நகர்த்தி, காட்டு" "நிலைமாற்று" - "முகப்புக் கட்டுப்பாடுகள்" + "சாதனக் கட்டுப்பாடுகள்" "கட்டுப்பாடுகளைச் சேர்க்க வேண்டிய ஆப்ஸைத் தேர்ந்தெடுங்கள்" %s கட்டுப்பாடுகள் சேர்க்கப்பட்டன. diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index 778ed6471c3b..42e621ce90cb 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -1044,7 +1044,7 @@ "అంచుకు తరలించి దాచండి" "అంచుని తరలించి చూపించు" "టోగుల్ చేయి" - "హోమ్ కంట్రోల్స్" + "డివైజ్ కంట్రోల్స్" "కంట్రోల్స్‌ను యాడ్ చేయడానికి యాప్‌ను ఎంచుకోండి" %s కంట్రోల్‌లు యాడ్ అయ్యాయి. diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index 6ecb2b491cc1..37a5924d1274 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -1044,7 +1044,7 @@ "ย้ายไปที่ขอบและซ่อน" "ย้ายออกจากขอบและแสดง" "สลับ" - "ระบบควบคุมอุปกรณ์ในบ้าน" + "ระบบควบคุมอุปกรณ์" "เลือกแอปเพื่อเพิ่มตัวควบคุม" เพิ่มตัวควบคุม %s ตัวแล้ว diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index cf38fa20b705..adc9aa9d52ef 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -1044,7 +1044,7 @@ "Ilipat sa sulok at itago" "Alisin sa sulok at ipakita" "i-toggle" - "Mga Home control" + "Mga kontrol ng device" "Pumili ng app para magdagdag ng mga kontrol" %s kontrol ang naidagdag. diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 7308785a9d83..eed12221b1cc 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -1044,7 +1044,7 @@ "Kenara taşıyıp gizle" "Kenarın dışına taşıyıp göster" "değiştir" - "Ev kontrolleri" + "Cihaz denetimleri" "Denetim eklemek için uygulama seçin" %s kontrol eklendi. diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index bc62ea0f6eb2..947a597536a5 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -1054,7 +1054,7 @@ "Перемістити до краю, приховати" "Перемістити від краю, показати" "перемкнути" - "Автоматизація дому" + "Керування пристроями" "Виберіть, для якого додатка налаштувати елементи керування" Додано %s елемент керування. diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index 4baffd25f8d1..8ef84aa49f07 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -1044,7 +1044,7 @@ "‏EDGE پر لے جائیں اور چھپائیں" "‏EDGE اور شو سے باہر منتقل کریں" "ٹوگل کریں" - "ہوم کنٹرولز" + "آلہ کے کنٹرولز" "کنٹرولز شامل کرنے کے لیے ایپ منتخب کریں" %s کنٹرولز شامل کر دیے گئے۔ diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index c5442564c0ba..be7f45a3d6ec 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -1044,7 +1044,7 @@ "Chetiga olib borish va yashirish" "Chetidan qaytarish va koʻrsatish" "oʻzgartirish" - "Uy boshqaruvi" + "Qurilmalarni boshqarish" "Boshqaruv elementlarini kiritish uchun ilovani tanlang" %s ta nazorat kiritilgan. diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 46ebcb398eb6..53cc87b12b2c 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -1044,7 +1044,7 @@ "Chuyển đến cạnh và ẩn" "Chuyển ra xa cạnh và hiển thị" "bật/tắt" - "Điều khiển nhà" + "Điều khiển thiết bị" "Chọn ứng dụng để thêm các tùy chọn điều khiển" Đã thêm %s tùy chọn điều khiển. diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index f3fb2cff5460..ab3ed4a30d9f 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -1044,7 +1044,7 @@ "移至边缘并隐藏" "移至边缘以外并显示" "开启/关闭" - "家居控制" + "设备控制器" "选择要添加控制器的应用" 已添加 %s 个控件。 diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index 641c9b738d7c..cc13dd274cb0 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -1044,7 +1044,7 @@ "移到邊緣並隱藏" "從邊緣移出並顯示" "切換" - "智能家居" + "裝置控制" "選擇要新增控制項的應用程式" 已新增 %s 個控制項。 diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index e70a91135b73..aa80209050df 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -1044,7 +1044,7 @@ "移到邊緣並隱藏" "從邊緣移出並顯示" "切換" - "居家控制系統" + "裝置控制" "選擇應用程式以新增控制項" 已新增 %s 個控制項。 diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index 883c7466505c..1341f0943559 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -1044,7 +1044,7 @@ "Hamba onqenqemeni ufihle" "Phuma onqenqemeni ubonise" "guqula" - "Izilawuli zasekhaya" + "Izilawuli zezinsiza" "Khetha uhlelo lokusebenza ukwengeza izilawuli" %s ukulawulwa okwengeziwe. -- cgit v1.2.3 From 96e7cae3996873f00b4df8256136019eb1fb2227 Mon Sep 17 00:00:00 2001 From: Evan Severson Date: Fri, 2 Jul 2021 14:47:40 -0700 Subject: Persist the last time a sensor's privacy state changed Test: atest CtsSensorPrivacyTestCases SensorPrivacyServiceMockingTest Test: manually inspect sensor_privacy.xml Bug: 192269258 Change-Id: I38445a136682a9a60f229a007bc4eec12e3992f9 --- .../com/android/server/SensorPrivacyService.java | 99 +++++++++++++++++----- 1 file changed, 79 insertions(+), 20 deletions(-) diff --git a/services/core/java/com/android/server/SensorPrivacyService.java b/services/core/java/com/android/server/SensorPrivacyService.java index 4f3a38b6cdca..b54d9866c7a3 100644 --- a/services/core/java/com/android/server/SensorPrivacyService.java +++ b/services/core/java/com/android/server/SensorPrivacyService.java @@ -94,6 +94,7 @@ import android.os.RemoteException; import android.os.ResultReceiver; import android.os.ShellCallback; import android.os.ShellCommand; +import android.os.SystemClock; import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; @@ -162,6 +163,7 @@ public final class SensorPrivacyService extends SystemService { private static final String XML_ATTRIBUTE_PERSISTENCE_VERSION = "persistence-version"; private static final String XML_ATTRIBUTE_VERSION = "version"; private static final String XML_ATTRIBUTE_ENABLED = "enabled"; + private static final String XML_ATTRIBUTE_LAST_CHANGE = "last-change"; private static final String XML_ATTRIBUTE_SENSOR = "sensor"; private static final String SENSOR_PRIVACY_CHANNEL_ID = Context.SENSOR_PRIVACY_SERVICE; @@ -248,7 +250,7 @@ public final class SensorPrivacyService extends SystemService { @GuardedBy("mLock") private SparseBooleanArray mEnabled = new SparseBooleanArray(); @GuardedBy("mLock") - private SparseArray mIndividualEnabled = new SparseArray<>(); + private SparseArray> mIndividualEnabled = new SparseArray<>(); /** * Packages for which not to show sensor use reminders. @@ -262,6 +264,42 @@ public final class SensorPrivacyService extends SystemService { private final ArrayMap> mQueuedSensorUseReminderDialogs = new ArrayMap<>(); + private class SensorState { + private boolean mEnabled; + private long mLastChange; + + SensorState(boolean enabled) { + mEnabled = enabled; + mLastChange = getCurrentTimeMillis(); + } + + SensorState(boolean enabled, long lastChange) { + mEnabled = enabled; + if (lastChange < 0) { + mLastChange = getCurrentTimeMillis(); + } else { + mLastChange = lastChange; + } + } + + boolean setEnabled(boolean enabled) { + if (mEnabled != enabled) { + mEnabled = enabled; + mLastChange = getCurrentTimeMillis(); + return true; + } + return false; + } + + private long getCurrentTimeMillis() { + try { + return SystemClock.currentNetworkTimeMillis(); + } catch (Exception e) { + return System.currentTimeMillis(); + } + } + } + private class SensorUseReminderDialogInfo { private int mTaskId; private UserHandle mUser; @@ -680,9 +718,18 @@ public final class SensorPrivacyService extends SystemService { private void setIndividualSensorPrivacyUnchecked(int userId, int sensor, boolean enable) { synchronized (mLock) { - SparseBooleanArray userIndividualEnabled = mIndividualEnabled.get(userId, - new SparseBooleanArray()); - userIndividualEnabled.put(sensor, enable); + SparseArray userIndividualEnabled = mIndividualEnabled.get(userId, + new SparseArray<>()); + SensorState sensorState = userIndividualEnabled.get(sensor); + if (sensorState != null) { + if (!sensorState.setEnabled(enable)) { + // State not changing + return; + } + } else { + sensorState = new SensorState(enable); + userIndividualEnabled.put(sensor, sensorState); + } mIndividualEnabled.put(userId, userIndividualEnabled); if (!enable) { @@ -828,11 +875,15 @@ public final class SensorPrivacyService extends SystemService { public boolean isIndividualSensorPrivacyEnabled(@UserIdInt int userId, int sensor) { enforceObserveSensorPrivacyPermission(); synchronized (mLock) { - SparseBooleanArray states = mIndividualEnabled.get(userId); + SparseArray states = mIndividualEnabled.get(userId); if (states == null) { return false; } - return states.get(sensor, false); + SensorState state = states.get(sensor); + if (state == null) { + return false; + } + return state.mEnabled; } } @@ -857,7 +908,7 @@ public final class SensorPrivacyService extends SystemService { // these should never be changed even with refactorings. if (persistenceVersion == 0) { boolean enabled = parser.getAttributeBoolean(null, "enabled", false); - SparseBooleanArray individualEnabled = new SparseBooleanArray(); + SparseArray individualEnabled = new SparseArray<>(); version = 0; XmlUtils.nextElement(parser); @@ -867,7 +918,7 @@ public final class SensorPrivacyService extends SystemService { int sensor = XmlUtils.readIntAttribute(parser, "sensor"); boolean indEnabled = XmlUtils.readBooleanAttribute(parser, "enabled"); - individualEnabled.put(sensor, indEnabled); + individualEnabled.put(sensor, new SensorState(indEnabled)); XmlUtils.skipCurrentTag(parser); } else { XmlUtils.nextElement(parser); @@ -877,7 +928,8 @@ public final class SensorPrivacyService extends SystemService { map.put(VER0_INDIVIDUAL_ENABLED, individualEnabled); } else if (persistenceVersion == CURRENT_PERSISTENCE_VERSION) { SparseBooleanArray enabled = new SparseBooleanArray(); - SparseArray individualEnabled = new SparseArray<>(); + SparseArray> individualEnabled = + new SparseArray<>(); version = parser.getAttributeInt(null, XML_ATTRIBUTE_VERSION, 1); @@ -913,10 +965,13 @@ public final class SensorPrivacyService extends SystemService { int sensor = parser.getAttributeInt(null, XML_ATTRIBUTE_SENSOR); boolean isEnabled = parser.getAttributeBoolean(null, XML_ATTRIBUTE_ENABLED); - SparseBooleanArray userIndividualEnabled = individualEnabled.get( - currentUserId, new SparseBooleanArray()); + long lastChange = parser + .getAttributeLong(null, XML_ATTRIBUTE_LAST_CHANGE, -1); + SparseArray userIndividualEnabled = + individualEnabled.get(currentUserId, new SparseArray<>()); - userIndividualEnabled.put(sensor, isEnabled); + userIndividualEnabled + .put(sensor, new SensorState(isEnabled, lastChange)); individualEnabled.put(currentUserId, userIndividualEnabled); } } @@ -949,7 +1004,7 @@ public final class SensorPrivacyService extends SystemService { mEnabled = new SparseBooleanArray(); mIndividualEnabled = new SparseArray<>(); forAllUsers(userId -> mEnabled.put(userId, false)); - forAllUsers(userId -> mIndividualEnabled.put(userId, new SparseBooleanArray())); + forAllUsers(userId -> mIndividualEnabled.put(userId, new SparseArray<>())); return true; } boolean upgraded = false; @@ -986,7 +1041,7 @@ public final class SensorPrivacyService extends SystemService { if (version == CURRENT_VERSION) { mEnabled = (SparseBooleanArray) map.get(VER1_ENABLED); mIndividualEnabled = - (SparseArray) map.get(VER1_INDIVIDUAL_ENABLED); + (SparseArray>) map.get(VER1_INDIVIDUAL_ENABLED); } return upgraded; } @@ -1016,15 +1071,18 @@ public final class SensorPrivacyService extends SystemService { serializer.attributeBoolean( null, XML_ATTRIBUTE_ENABLED, isSensorPrivacyEnabled(userId)); - SparseBooleanArray individualEnabled = - mIndividualEnabled.get(userId, new SparseBooleanArray()); + SparseArray individualEnabled = + mIndividualEnabled.get(userId, new SparseArray<>()); int numIndividual = individualEnabled.size(); for (int i = 0; i < numIndividual; i++) { serializer.startTag(null, XML_TAG_INDIVIDUAL_SENSOR_PRIVACY); int sensor = individualEnabled.keyAt(i); - boolean enabled = individualEnabled.valueAt(i); + SensorState sensorState = individualEnabled.valueAt(i); + boolean enabled = sensorState.mEnabled; + long lastChange = sensorState.mLastChange; serializer.attributeInt(null, XML_ATTRIBUTE_SENSOR, sensor); serializer.attributeBoolean(null, XML_ATTRIBUTE_ENABLED, enabled); + serializer.attributeLong(null, XML_ATTRIBUTE_LAST_CHANGE, lastChange); serializer.endTag(null, XML_TAG_INDIVIDUAL_SENSOR_PRIVACY); } serializer.endTag(null, XML_TAG_USER); @@ -1229,7 +1287,7 @@ public final class SensorPrivacyService extends SystemService { dumpStream.write("is_enabled", SensorPrivacyUserProto.IS_ENABLED, mEnabled.get(userId, false)); - SparseBooleanArray individualEnabled = mIndividualEnabled.get(userId); + SparseArray individualEnabled = mIndividualEnabled.get(userId); if (individualEnabled != null) { int numIndividualEnabled = individualEnabled.size(); for (int i = 0; i < numIndividualEnabled; i++) { @@ -1241,7 +1299,8 @@ public final class SensorPrivacyService extends SystemService { individualEnabled.keyAt(i)); dumpStream.write("is_enabled", SensorPrivacyIndividualEnabledSensorProto.IS_ENABLED, - individualEnabled.valueAt(i)); + individualEnabled.valueAt(i).mEnabled); + // TODO dump last change dumpStream.end(individualToken); } @@ -1321,7 +1380,7 @@ public final class SensorPrivacyService extends SystemService { enforceManageSensorPrivacyPermission(); synchronized (mLock) { - SparseBooleanArray individualEnabled = + SparseArray individualEnabled = mIndividualEnabled.get(userId); if (individualEnabled != null) { individualEnabled.delete(sensor); -- cgit v1.2.3 From 16bfded1a54465cb54c76b486aa70d24e0fbaa56 Mon Sep 17 00:00:00 2001 From: Evan Severson Date: Wed, 7 Jul 2021 10:29:43 -0700 Subject: Log duration privacy toggle was in previous state Test: statsd_testdrive Bug: 192269258 Change-Id: If8da2ae56f2c82b96f0035d4955ac39787299098 --- .../com/android/server/SensorPrivacyService.java | 55 +++++++++++++--------- 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/services/core/java/com/android/server/SensorPrivacyService.java b/services/core/java/com/android/server/SensorPrivacyService.java index b54d9866c7a3..53ff8ff768de 100644 --- a/services/core/java/com/android/server/SensorPrivacyService.java +++ b/services/core/java/com/android/server/SensorPrivacyService.java @@ -148,6 +148,8 @@ import java.util.Objects; public final class SensorPrivacyService extends SystemService { private static final String TAG = SensorPrivacyService.class.getSimpleName(); + private static final boolean DEBUG = false; + private static final boolean DEBUG_LOGGING = false; /** Version number indicating compatibility parsing the persisted file */ private static final int CURRENT_PERSISTENCE_VERSION = 1; @@ -290,14 +292,6 @@ public final class SensorPrivacyService extends SystemService { } return false; } - - private long getCurrentTimeMillis() { - try { - return SystemClock.currentNetworkTimeMillis(); - } catch (Exception e) { - return System.currentTimeMillis(); - } - } } private class SensorUseReminderDialogInfo { @@ -364,11 +358,11 @@ public final class SensorPrivacyService extends SystemService { // Reset sensor privacy when restriction is added if (!prevRestrictions.getBoolean(UserManager.DISALLOW_CAMERA_TOGGLE) && newRestrictions.getBoolean(UserManager.DISALLOW_CAMERA_TOGGLE)) { - setIndividualSensorPrivacyUnchecked(userId, CAMERA, false); + setIndividualSensorPrivacyUnchecked(userId, OTHER, CAMERA, false); } if (!prevRestrictions.getBoolean(UserManager.DISALLOW_MICROPHONE_TOGGLE) && newRestrictions.getBoolean(UserManager.DISALLOW_MICROPHONE_TOGGLE)) { - setIndividualSensorPrivacyUnchecked(userId, MICROPHONE, false); + setIndividualSensorPrivacyUnchecked(userId, OTHER, MICROPHONE, false); } } @@ -709,29 +703,33 @@ public final class SensorPrivacyService extends SystemService { return; } - if (userId == mUserManagerInternal.getProfileParentId(userId)) { - logSensorPrivacyToggle(source, sensor, enable); - } - - setIndividualSensorPrivacyUnchecked(userId, sensor, enable); + setIndividualSensorPrivacyUnchecked(userId, source, sensor, enable); } - private void setIndividualSensorPrivacyUnchecked(int userId, int sensor, boolean enable) { + private void setIndividualSensorPrivacyUnchecked(int userId, int source, int sensor, + boolean enable) { synchronized (mLock) { SparseArray userIndividualEnabled = mIndividualEnabled.get(userId, new SparseArray<>()); SensorState sensorState = userIndividualEnabled.get(sensor); + long lastChange; if (sensorState != null) { + lastChange = sensorState.mLastChange; if (!sensorState.setEnabled(enable)) { // State not changing return; } } else { sensorState = new SensorState(enable); + lastChange = sensorState.mLastChange; userIndividualEnabled.put(sensor, sensorState); } mIndividualEnabled.put(userId, userIndividualEnabled); + if (userId == mUserManagerInternal.getProfileParentId(userId)) { + logSensorPrivacyToggle(source, sensor, sensorState.mEnabled, lastChange); + } + if (!enable) { long token = Binder.clearCallingIdentity(); try { @@ -775,12 +773,12 @@ public final class SensorPrivacyService extends SystemService { return true; } - private void logSensorPrivacyToggle(int source, int sensor, boolean enable) { - long logMins = 0L; - //(TODO:pyuli) : Add timestamp after persistent storage for timestamp is done. + private void logSensorPrivacyToggle(int source, int sensor, boolean enabled, + long lastChange) { + long logMins = Math.max(0, (getCurrentTimeMillis() - lastChange) / (1000 * 60)); int logAction = -1; - if (enable) { + if (enabled) { logAction = PRIVACY_SENSOR_TOGGLE_INTERACTION__ACTION__TOGGLE_OFF; } else { logAction = PRIVACY_SENSOR_TOGGLE_INTERACTION__ACTION__TOGGLE_ON; @@ -813,6 +811,11 @@ public final class SensorPrivacyService extends SystemService { logSource = PRIVACY_SENSOR_TOGGLE_INTERACTION__SOURCE__SOURCE_UNKNOWN; } + if (DEBUG || DEBUG_LOGGING) { + Log.d(TAG, "Logging sensor toggle interaction:" + " logSensor=" + logSensor + + " logAction=" + logAction + " logSource=" + logSource + " logMins=" + + logMins); + } write(PRIVACY_SENSOR_TOGGLE_INTERACTION, logSensor, logAction, logSource, logMins); } @@ -1741,7 +1744,7 @@ public final class SensorPrivacyService extends SystemService { if (mSensorPrivacyServiceImpl .isIndividualSensorPrivacyEnabled(getCurrentUser(), MICROPHONE)) { mSensorPrivacyServiceImpl.setIndividualSensorPrivacyUnchecked( - getCurrentUser(), MICROPHONE, false); + getCurrentUser(), OTHER, MICROPHONE, false); mMicUnmutedForEmergencyCall = true; } else { mMicUnmutedForEmergencyCall = false; @@ -1756,11 +1759,19 @@ public final class SensorPrivacyService extends SystemService { mIsInEmergencyCall = false; if (mMicUnmutedForEmergencyCall) { mSensorPrivacyServiceImpl.setIndividualSensorPrivacyUnchecked( - getCurrentUser(), MICROPHONE, true); + getCurrentUser(), OTHER, MICROPHONE, true); mMicUnmutedForEmergencyCall = false; } } } } } + + private static long getCurrentTimeMillis() { + try { + return SystemClock.currentNetworkTimeMillis(); + } catch (Exception e) { + return System.currentTimeMillis(); + } + } } -- cgit v1.2.3 From 1093f7c370adfb3ac05913fc22d66c79a6e48bbf Mon Sep 17 00:00:00 2001 From: Beverly Date: Thu, 8 Jul 2021 13:46:03 -0400 Subject: Only hide udfps bouncer when transitioning TO doze If we're transitioning OUT of doze, we should continue to show the udfps bouncer. For example, this can happen if a user taps on a notification in AOD2. Test: manual Fixes: 192416569 Change-Id: Ia5928022333ba860abdff841f0acc92af27a562f --- .../android/systemui/biometrics/UdfpsKeyguardViewController.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java index 819de538c840..073e8861aa1e 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java @@ -66,6 +66,7 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController

This method is called by most of logToWestworldLocked functions to reduce code + *

This method is called by most of logStatsImplLocked functions to reduce code * duplication. */ // TODO(b/173532925) Once we add CTS test for logging atoms and can inspect the result, we can -- cgit v1.2.3 From 88bac9ca54ecc166fb9fde13f4628b083b32b896 Mon Sep 17 00:00:00 2001 From: Anna Zappone Date: Thu, 8 Jul 2021 22:41:53 +0100 Subject: Add available description for talkback Bug: 189908609 Test: PeopleTileViewHelperTest and local Change-Id: I5b00dfdb8aa04b84aa71d37adfbd06f134bcf5a9 --- packages/SystemUI/res/values/strings.xml | 2 ++ .../src/com/android/systemui/people/PeopleTileViewHelper.java | 2 ++ .../src/com/android/systemui/people/PeopleTileViewHelperTest.java | 4 ++++ 3 files changed, 8 insertions(+) diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 542182bc3762..c4e9ff818df1 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -2956,6 +2956,8 @@ %1$s sent an image %1$s has a status update: %2$s + + Available diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java b/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java index 7ab4b6f200ed..335ebca37bf0 100644 --- a/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java +++ b/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java @@ -501,6 +501,8 @@ public class PeopleTileViewHelper { views.setViewVisibility(R.id.availability, View.VISIBLE); startPadding = mContext.getResources().getDimensionPixelSize( R.dimen.availability_dot_shown_padding); + views.setContentDescription(R.id.availability, + mContext.getString(R.string.person_available)); } else { views.setViewVisibility(R.id.availability, View.GONE); startPadding = mContext.getResources().getDimensionPixelSize( diff --git a/packages/SystemUI/tests/src/com/android/systemui/people/PeopleTileViewHelperTest.java b/packages/SystemUI/tests/src/com/android/systemui/people/PeopleTileViewHelperTest.java index c818da8d029f..b4b459752bc2 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/people/PeopleTileViewHelperTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/people/PeopleTileViewHelperTest.java @@ -289,6 +289,8 @@ public class PeopleTileViewHelperTest extends SysuiTestCase { assertEquals(View.GONE, result.findViewById(R.id.last_interaction).getVisibility()); // Has availability. assertEquals(View.VISIBLE, result.findViewById(R.id.availability).getVisibility()); + assertEquals(result.findViewById(R.id.availability).getContentDescription(), + mContext.getString(R.string.person_available)); // Has person icon. assertEquals(View.VISIBLE, result.findViewById(R.id.person_icon).getVisibility()); // No status. @@ -334,6 +336,8 @@ public class PeopleTileViewHelperTest extends SysuiTestCase { assertEquals(View.GONE, largeResult.findViewById(R.id.last_interaction).getVisibility()); // Has availability. assertEquals(View.VISIBLE, largeResult.findViewById(R.id.availability).getVisibility()); + assertEquals(largeResult.findViewById(R.id.availability).getContentDescription(), + mContext.getString(R.string.person_available)); // Shows person icon. assertEquals(View.VISIBLE, largeResult.findViewById(R.id.person_icon).getVisibility()); // No status. -- cgit v1.2.3 From c608dd0cddcac3a6bba8ef76eb28844f4ec33f8a Mon Sep 17 00:00:00 2001 From: Peter Kalauskas Date: Wed, 7 Jul 2021 16:22:36 -0700 Subject: Use FalsingManager for QS user switcher Bug: 192013256 Test: atest SystemUITests:com.android.systemui.qs.QSFragmentTest Test: atest SystemUITests:com.android.systemui.qs.QSDetailTest Change-Id: I9587aa375e8f9e5ef7d696fcb3f0904cf546c0cc Merged-In: I9587aa375e8f9e5ef7d696fcb3f0904cf546c0cc --- .../src/com/android/systemui/qs/QSDetail.java | 23 +++++++++++++++------- .../src/com/android/systemui/qs/QSFragment.java | 8 ++++++-- .../android/systemui/qs/tiles/UserDetailView.java | 2 +- .../statusbar/policy/UserSwitcherController.java | 14 +++++++++++++ .../src/com/android/systemui/qs/QSDetailTest.java | 4 +++- .../com/android/systemui/qs/QSFragmentTest.java | 6 +++++- 6 files changed, 45 insertions(+), 12 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java b/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java index bcce87a51097..1d6c7c94dcc3 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java @@ -44,6 +44,7 @@ import com.android.systemui.Dependency; import com.android.systemui.FontSizeUtils; import com.android.systemui.R; import com.android.systemui.plugins.ActivityStarter; +import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.qs.DetailAdapter; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.phone.NotificationsQuickSettingsContainer; @@ -57,6 +58,7 @@ public class QSDetail extends LinearLayout { private final UiEventLogger mUiEventLogger = QSEvents.INSTANCE.getQsUiEventsLogger(); private ViewGroup mDetailContent; + private FalsingManager mFalsingManager; protected TextView mDetailSettingsButton; protected TextView mDetailDoneButton; @VisibleForTesting @@ -124,12 +126,13 @@ public class QSDetail extends LinearLayout { /** */ public void setQsPanel(QSPanelController panelController, QuickStatusBarHeader header, - QSFooter footer) { + QSFooter footer, FalsingManager falsingManager) { mQsPanelController = panelController; mHeader = header; mFooter = footer; mHeader.setCallback(mQsPanelCallback); mQsPanelController.setCallback(mQsPanelCallback); + mFalsingManager = falsingManager; } public void setHost(QSTileHost host) { @@ -273,6 +276,9 @@ public class QSDetail extends LinearLayout { final Intent settingsIntent = adapter.getSettingsIntent(); mDetailSettingsButton.setVisibility(settingsIntent != null ? VISIBLE : GONE); mDetailSettingsButton.setOnClickListener(v -> { + if (mFalsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) { + return; + } Dependency.get(MetricsLogger.class).action(ACTION_QS_MORE_SETTINGS, adapter.getMetricsCategory()); mUiEventLogger.log(adapter.moreSettingsEvent()); @@ -280,6 +286,9 @@ public class QSDetail extends LinearLayout { .postStartActivityDismissingKeyguard(settingsIntent, 0); }); mDetailDoneButton.setOnClickListener(v -> { + if (mFalsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) { + return; + } announceForAccessibility( mContext.getString(R.string.accessibility_desc_quick_settings)); if (!adapter.onDoneButtonClicked()) { @@ -301,13 +310,13 @@ public class QSDetail extends LinearLayout { mQsDetailHeaderSwitch.setVisibility(VISIBLE); handleToggleStateChanged(toggleState, adapter.getToggleEnabled()); mQsDetailHeader.setClickable(true); - mQsDetailHeader.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - boolean checked = !mQsDetailHeaderSwitch.isChecked(); - mQsDetailHeaderSwitch.setChecked(checked); - adapter.setToggleState(checked); + mQsDetailHeader.setOnClickListener(v -> { + if (mFalsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) { + return; } + boolean checked = !mQsDetailHeaderSwitch.isChecked(); + mQsDetailHeaderSwitch.setChecked(checked); + adapter.setToggleState(checked); }); } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java index 0d91f29b5b2e..9b2eebf33f86 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java @@ -39,6 +39,7 @@ import androidx.annotation.VisibleForTesting; import com.android.systemui.R; import com.android.systemui.animation.Interpolators; import com.android.systemui.media.MediaHost; +import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.qs.QS; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.qs.customize.QSCustomizerController; @@ -67,6 +68,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca private final Rect mQsBounds = new Rect(); private final StatusBarStateController mStatusBarStateController; + private final FalsingManager mFalsingManager; private boolean mQsExpanded; private boolean mHeaderAnimating; private boolean mStackScrollerOverscrolling; @@ -133,7 +135,8 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca StatusBarStateController statusBarStateController, CommandQueue commandQueue, QSDetailDisplayer qsDetailDisplayer, @Named(QS_PANEL) MediaHost qsMediaHost, @Named(QUICK_QS_PANEL) MediaHost qqsMediaHost, - QSFragmentComponent.Factory qsComponentFactory, FeatureFlags featureFlags) { + QSFragmentComponent.Factory qsComponentFactory, FeatureFlags featureFlags, + FalsingManager falsingManager) { mRemoteInputQuickSettingsDisabler = remoteInputQsDisabler; mInjectionInflater = injectionInflater; mCommandQueue = commandQueue; @@ -144,6 +147,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca commandQueue.observe(getLifecycle(), this); mHost = qsTileHost; mFeatureFlags = featureFlags; + mFalsingManager = falsingManager; mStatusBarStateController = statusBarStateController; } @@ -190,7 +194,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca mQSContainerImplController.init(); mContainer = mQSContainerImplController.getView(); - mQSDetail.setQsPanel(mQSPanelController, mHeader, mFooter); + mQSDetail.setQsPanel(mQSPanelController, mHeader, mFooter, mFalsingManager); mQSAnimator = qsFragmentComponent.getQSAnimator(); mQSCustomizerController = qsFragmentComponent.getQSCustomizerController(); diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/UserDetailView.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/UserDetailView.java index a9723341e787..04437ea14bb3 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/UserDetailView.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/UserDetailView.java @@ -146,7 +146,7 @@ public class UserDetailView extends PseudoGridView { @Override public void onClick(View view) { - if (mFalsingManager.isFalseTap(FalsingManager.MODERATE_PENALTY)) { + if (mFalsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) { return; } 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 e2b6895e7039..4e921a036b36 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java @@ -67,6 +67,7 @@ import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dagger.qualifiers.UiBackground; import com.android.systemui.plugins.ActivityStarter; +import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.qs.DetailAdapter; import com.android.systemui.qs.QSUserSwitcherEvent; import com.android.systemui.qs.tiles.UserDetailView; @@ -131,6 +132,7 @@ public class UserSwitcherController implements Dumpable { private final Executor mUiBgExecutor; private final boolean mGuestUserAutoCreated; private final AtomicBoolean mGuestCreationScheduled; + private FalsingManager mFalsingManager; @Inject public UserSwitcherController(Context context, @@ -139,6 +141,7 @@ public class UserSwitcherController implements Dumpable { ActivityStarter activityStarter, BroadcastDispatcher broadcastDispatcher, UiEventLogger uiEventLogger, + FalsingManager falsingManager, TelephonyListenerManager telephonyListenerManager, IActivityTaskManager activityTaskManager, UserDetailAdapter userDetailAdapter, @@ -148,6 +151,7 @@ public class UserSwitcherController implements Dumpable { mTelephonyListenerManager = telephonyListenerManager; mActivityTaskManager = activityTaskManager; mUiEventLogger = uiEventLogger; + mFalsingManager = falsingManager; mGuestResumeSessionReceiver = new GuestResumeSessionReceiver(this, mUiEventLogger); mUserDetailAdapter = userDetailAdapter; mUiBgExecutor = uiBgExecutor; @@ -1031,6 +1035,11 @@ public class UserSwitcherController implements Dumpable { @Override public void onClick(DialogInterface dialog, int which) { + int penalty = which == BUTTON_NEGATIVE ? FalsingManager.NO_PENALTY + : FalsingManager.HIGH_PENALTY; + if (mFalsingManager.isFalseTap(penalty)) { + return; + } if (which == BUTTON_NEGATIVE) { cancel(); } else { @@ -1057,6 +1066,11 @@ public class UserSwitcherController implements Dumpable { @Override public void onClick(DialogInterface dialog, int which) { + int penalty = which == BUTTON_NEGATIVE ? FalsingManager.NO_PENALTY + : FalsingManager.MODERATE_PENALTY; + if (mFalsingManager.isFalseTap(penalty)) { + return; + } if (which == BUTTON_NEGATIVE) { cancel(); } else { diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSDetailTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSDetailTest.java index 75cf8550518b..c2bd024f0375 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSDetailTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSDetailTest.java @@ -41,6 +41,7 @@ import com.android.internal.logging.testing.UiEventLoggerFake; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.ActivityStarter; +import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.qs.DetailAdapter; import org.junit.After; @@ -76,7 +77,8 @@ public class QSDetailTest extends SysuiTestCase { mQsPanelController = mock(QSPanelController.class); mQuickHeader = mock(QuickStatusBarHeader.class); - mQsDetail.setQsPanel(mQsPanelController, mQuickHeader, mock(QSFooter.class)); + mQsDetail.setQsPanel(mQsPanelController, mQuickHeader, mock(QSFooter.class), + mock(FalsingManager.class)); mQsDetail.mClipper = mock(QSDetailClipper.class); mMockDetailAdapter = mock(DetailAdapter.class); diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java index 2ae4cbe17ac6..c40977b31e73 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java @@ -44,6 +44,7 @@ import com.android.systemui.SysuiBaseFragmentTest; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dump.DumpManager; import com.android.systemui.media.MediaHost; +import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.qs.dagger.QSFragmentComponent; import com.android.systemui.qs.external.CustomTileStatePersister; @@ -92,6 +93,8 @@ public class QSFragmentTest extends SysuiBaseFragmentTest { private MediaHost mQQSMediaHost; @Mock private FeatureFlags mFeatureFlags; + @Mock + private FalsingManager mFalsingManager; public QSFragmentTest() { super(QSFragment.class); @@ -182,6 +185,7 @@ public class QSFragmentTest extends SysuiBaseFragmentTest { mQSMediaHost, mQQSMediaHost, mQsComponentFactory, - mFeatureFlags); + mFeatureFlags, + mFalsingManager); } } -- cgit v1.2.3 From 65eb22cc56d06bd0524801109f5eabfa3ace103c Mon Sep 17 00:00:00 2001 From: Nikita Ioffe Date: Fri, 9 Jul 2021 00:08:29 +0100 Subject: Grant INSTALL_PACKAGE_UPDATES permission to Shell Bug: 188062003 Test: m Change-Id: I342f64e666afa4202b8af69f04d64b05d40fac40 --- data/etc/privapp-permissions-platform.xml | 1 + packages/Shell/AndroidManifest.xml | 1 + 2 files changed, 2 insertions(+) diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml index 6385952fe884..813b7995fe89 100644 --- a/data/etc/privapp-permissions-platform.xml +++ b/data/etc/privapp-permissions-platform.xml @@ -315,6 +315,7 @@ applications that come with the platform + diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml index bc1d420eaa3d..1581e240e1d7 100644 --- a/packages/Shell/AndroidManifest.xml +++ b/packages/Shell/AndroidManifest.xml @@ -161,6 +161,7 @@ + -- cgit v1.2.3 From 5605cec3cd5fe35ff22768595061279073a6e374 Mon Sep 17 00:00:00 2001 From: Pyuli Naithani Date: Fri, 9 Jul 2021 00:12:46 +0000 Subject: Add logs for sensor privacy enable dialog. BUG: 192269258 Test: statsd_testdrive 382 Change-Id: I0a0a01ad013586c84ccf85cd7ef867c70a0a70cb --- .../systemui/sensorprivacy/SensorUseStartedActivity.kt | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/packages/SystemUI/src/com/android/systemui/sensorprivacy/SensorUseStartedActivity.kt b/packages/SystemUI/src/com/android/systemui/sensorprivacy/SensorUseStartedActivity.kt index 24775344240a..ef18df5706ad 100644 --- a/packages/SystemUI/src/com/android/systemui/sensorprivacy/SensorUseStartedActivity.kt +++ b/packages/SystemUI/src/com/android/systemui/sensorprivacy/SensorUseStartedActivity.kt @@ -38,6 +38,10 @@ import com.android.systemui.statusbar.phone.KeyguardDismissUtil import com.android.systemui.statusbar.policy.IndividualSensorPrivacyController import com.android.systemui.statusbar.policy.KeyguardStateController import javax.inject.Inject +import com.android.internal.util.FrameworkStatsLog.PRIVACY_TOGGLE_DIALOG_INTERACTION +import com.android.internal.util.FrameworkStatsLog.PRIVACY_TOGGLE_DIALOG_INTERACTION__ACTION__ENABLE +import com.android.internal.util.FrameworkStatsLog.PRIVACY_TOGGLE_DIALOG_INTERACTION__ACTION__CANCEL +import com.android.internal.util.FrameworkStatsLog.write /** * Dialog to be shown on top of apps that are attempting to use a sensor (e.g. microphone) which is @@ -185,16 +189,25 @@ class SensorUseStartedActivity @Inject constructor( keyguardDismissUtil.executeWhenUnlocked({ bgHandler.postDelayed({ disableSensorPrivacy() + write(PRIVACY_TOGGLE_DIALOG_INTERACTION, + PRIVACY_TOGGLE_DIALOG_INTERACTION__ACTION__ENABLE, + sensorUsePackageName) }, UNLOCK_DELAY_MILLIS) false }, false, true) } else { disableSensorPrivacy() + write(PRIVACY_TOGGLE_DIALOG_INTERACTION, + PRIVACY_TOGGLE_DIALOG_INTERACTION__ACTION__ENABLE, + sensorUsePackageName) } } BUTTON_NEGATIVE -> { unsuppressImmediately = false + write(PRIVACY_TOGGLE_DIALOG_INTERACTION, + PRIVACY_TOGGLE_DIALOG_INTERACTION__ACTION__CANCEL, + sensorUsePackageName) } } -- cgit v1.2.3 From 07d35cb7dcb6e078968f72c831de555b060424a3 Mon Sep 17 00:00:00 2001 From: Siarhei Vishniakou Date: Sat, 3 Jul 2021 02:22:12 +0000 Subject: Properly protect mFrameMetricsReporter This field actually requires a special lock, mFrameMetricsReporterMutex. But there isn't a GUARDED_BY annotation for it. And even if there was, the compiler feature of -Wthread-safety was not active in this code, so this error would not have been caught. To fix this, enable the compiler annotation and add GUARDED_BY annotation to mFrameMetricsReporter. And finally, use this lock to properly protect this field. Bug: 192330836 Test: atest hwui_unit_tests Change-Id: I76950bfa01bbd7ccdc54c4e8c114430b5aeddf1a --- libs/hwui/Android.bp | 1 + libs/hwui/JankTracker.cpp | 6 ++--- libs/hwui/JankTracker.h | 2 +- libs/hwui/ProfileDataContainer.cpp | 2 +- libs/hwui/ProfileDataContainer.h | 5 ++-- libs/hwui/renderthread/CanvasContext.cpp | 40 ++++++++++++++++++++------------ libs/hwui/renderthread/CanvasContext.h | 8 +++++-- 7 files changed, 40 insertions(+), 24 deletions(-) diff --git a/libs/hwui/Android.bp b/libs/hwui/Android.bp index 0a232d6272bd..2c299fa32315 100644 --- a/libs/hwui/Android.bp +++ b/libs/hwui/Android.bp @@ -47,6 +47,7 @@ cc_defaults { "-DATRACE_TAG=ATRACE_TAG_VIEW", "-DLOG_TAG=\"OpenGLRenderer\"", "-Wall", + "-Wthread-safety", "-Wno-unused-parameter", "-Wunreachable-code", "-Werror", diff --git a/libs/hwui/JankTracker.cpp b/libs/hwui/JankTracker.cpp index dd977c32f531..34e5577066f9 100644 --- a/libs/hwui/JankTracker.cpp +++ b/libs/hwui/JankTracker.cpp @@ -99,7 +99,7 @@ JankTracker::JankTracker(ProfileDataContainer* globalData) mFrameIntervalLegacy = frameIntervalNanos; } -void JankTracker::calculateLegacyJank(FrameInfo& frame) { +void JankTracker::calculateLegacyJank(FrameInfo& frame) REQUIRES(mDataMutex) { // Fast-path for jank-free frames int64_t totalDuration = frame.duration(sFrameStart, FrameInfoIndex::SwapBuffersCompleted); if (mDequeueTimeForgivenessLegacy && frame[FrameInfoIndex::DequeueBufferDuration] > 500_us) { @@ -257,7 +257,7 @@ void JankTracker::finishFrame(FrameInfo& frame, std::unique_ptrreset(); (*mGlobalData)->reset(); diff --git a/libs/hwui/JankTracker.h b/libs/hwui/JankTracker.h index 0d2574cb8640..bdb784dc8747 100644 --- a/libs/hwui/JankTracker.h +++ b/libs/hwui/JankTracker.h @@ -62,7 +62,7 @@ public: // Calculates the 'legacy' jank information, i.e. with outdated refresh rate information and // without GPU completion or deadlined information. void calculateLegacyJank(FrameInfo& frame); - void dumpStats(int fd) { dumpData(fd, &mDescription, mData.get()); } + void dumpStats(int fd) NO_THREAD_SAFETY_ANALYSIS { dumpData(fd, &mDescription, mData.get()); } void dumpFrames(int fd); void reset(); diff --git a/libs/hwui/ProfileDataContainer.cpp b/libs/hwui/ProfileDataContainer.cpp index 41afc0e04c8b..dd78847bdcd8 100644 --- a/libs/hwui/ProfileDataContainer.cpp +++ b/libs/hwui/ProfileDataContainer.cpp @@ -27,7 +27,7 @@ namespace android { namespace uirenderer { -void ProfileDataContainer::freeData() { +void ProfileDataContainer::freeData() REQUIRES(mJankDataMutex) { if (mIsMapped) { munmap(mData, sizeof(ProfileData)); } else { diff --git a/libs/hwui/ProfileDataContainer.h b/libs/hwui/ProfileDataContainer.h index a61b8dcf390e..7d1b46c3d678 100644 --- a/libs/hwui/ProfileDataContainer.h +++ b/libs/hwui/ProfileDataContainer.h @@ -37,8 +37,9 @@ public: void rotateStorage(); void switchStorageToAshmem(int ashmemfd); - ProfileData* get() { return mData; } - ProfileData* operator->() { return mData; } + ProfileData* get() NO_THREAD_SAFETY_ANALYSIS { return mData; } + + ProfileData* operator->() NO_THREAD_SAFETY_ANALYSIS { return mData; } std::mutex& getDataMutex() { return mJankDataMutex; } diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index 81cee6103d22..adea4184c4fd 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -614,6 +614,7 @@ nsecs_t CanvasContext::draw() { mCurrentFrameInfo->markFrameCompleted(); mCurrentFrameInfo->set(FrameInfoIndex::GpuCompleted) = mCurrentFrameInfo->get(FrameInfoIndex::FrameCompleted); + std::scoped_lock lock(mFrameMetricsReporterMutex); mJankTracker.finishFrame(*mCurrentFrameInfo, mFrameMetricsReporter); } } @@ -638,9 +639,12 @@ void CanvasContext::cleanupResources() { } void CanvasContext::reportMetricsWithPresentTime() { - if (mFrameMetricsReporter == nullptr) { - return; - } + { // acquire lock + std::scoped_lock lock(mFrameMetricsReporterMutex); + if (mFrameMetricsReporter == nullptr) { + return; + } + } // release lock if (mNativeSurface == nullptr) { return; } @@ -665,7 +669,22 @@ void CanvasContext::reportMetricsWithPresentTime() { nullptr /*outReleaseTime*/); forthBehind->set(FrameInfoIndex::DisplayPresentTime) = presentTime; - mFrameMetricsReporter->reportFrameMetrics(forthBehind->data(), true /*hasPresentTime*/); + { // acquire lock + std::scoped_lock lock(mFrameMetricsReporterMutex); + if (mFrameMetricsReporter != nullptr) { + mFrameMetricsReporter->reportFrameMetrics(forthBehind->data(), true /*hasPresentTime*/); + } + } // release lock +} + +FrameInfo* CanvasContext::getFrameInfoFromLast4(uint64_t frameNumber) { + std::scoped_lock lock(mLast4FrameInfosMutex); + for (size_t i = 0; i < mLast4FrameInfos.size(); i++) { + if (mLast4FrameInfos[i].second == frameNumber) { + return mLast4FrameInfos[i].first; + } + } + return nullptr; } void CanvasContext::onSurfaceStatsAvailable(void* context, ASurfaceControl* control, @@ -679,22 +698,13 @@ void CanvasContext::onSurfaceStatsAvailable(void* context, ASurfaceControl* cont nsecs_t gpuCompleteTime = functions.getAcquireTimeFunc(stats); uint64_t frameNumber = functions.getFrameNumberFunc(stats); - FrameInfo* frameInfo = nullptr; - { - std::lock_guard(instance->mLast4FrameInfosMutex); - for (size_t i = 0; i < instance->mLast4FrameInfos.size(); i++) { - if (instance->mLast4FrameInfos[i].second == frameNumber) { - frameInfo = instance->mLast4FrameInfos[i].first; - break; - } - } - } + FrameInfo* frameInfo = instance->getFrameInfoFromLast4(frameNumber); if (frameInfo != nullptr) { frameInfo->set(FrameInfoIndex::FrameCompleted) = std::max(gpuCompleteTime, frameInfo->get(FrameInfoIndex::SwapBuffersCompleted)); frameInfo->set(FrameInfoIndex::GpuCompleted) = gpuCompleteTime; - std::lock_guard(instance->mFrameMetricsReporterMutex); + std::scoped_lock lock(instance->mFrameMetricsReporterMutex); instance->mJankTracker.finishFrame(*frameInfo, instance->mFrameMetricsReporter); } } diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h index 85af3e4fb0b6..6dbfcc349d50 100644 --- a/libs/hwui/renderthread/CanvasContext.h +++ b/libs/hwui/renderthread/CanvasContext.h @@ -160,6 +160,7 @@ public: void setContentDrawBounds(const Rect& bounds) { mContentDrawBounds = bounds; } void addFrameMetricsObserver(FrameMetricsObserver* observer) { + std::scoped_lock lock(mFrameMetricsReporterMutex); if (mFrameMetricsReporter.get() == nullptr) { mFrameMetricsReporter.reset(new FrameMetricsReporter()); } @@ -168,10 +169,10 @@ public: } void removeFrameMetricsObserver(FrameMetricsObserver* observer) { + std::scoped_lock lock(mFrameMetricsReporterMutex); if (mFrameMetricsReporter.get() != nullptr) { mFrameMetricsReporter->removeObserver(observer); if (!mFrameMetricsReporter->hasObservers()) { - std::lock_guard lock(mFrameMetricsReporterMutex); mFrameMetricsReporter.reset(nullptr); } } @@ -245,6 +246,8 @@ private: */ void reportMetricsWithPresentTime(); + FrameInfo* getFrameInfoFromLast4(uint64_t frameNumber); + // The same type as Frame.mWidth and Frame.mHeight int32_t mLastFrameWidth = 0; int32_t mLastFrameHeight = 0; @@ -305,7 +308,8 @@ private: std::string mName; JankTracker mJankTracker; FrameInfoVisualizer mProfiler; - std::unique_ptr mFrameMetricsReporter; + std::unique_ptr mFrameMetricsReporter + GUARDED_BY(mFrameMetricsReporterMutex); std::mutex mFrameMetricsReporterMutex; std::set mPrefetchedLayers; -- cgit v1.2.3 From c158aae0aba22cdd94cbd5e92bb10e208057d674 Mon Sep 17 00:00:00 2001 From: Nikita Ioffe Date: Fri, 9 Jul 2021 01:58:39 +0100 Subject: Drop prebuilt files to android source tree. CtsShim.apk package: name=com.android.cts.ctsshim versionCode=31 versionName=12-7533747 platformBuildVersionName=12 compileSdkVersion=31 compileSdkVersionCodename=12 sdkVersion:24 targetSdkVersion:28 CtsShimPriv.apk package: name=com.android.cts.priv.ctsshim versionCode=31 versionName=12-7533747 platformBuildVersionName=12 compileSdkVersion=31 compileSdkVersionCodename=12 sdkVersion:24 targetSdkVersion:28 CtsShim.apk package: name=com.android.cts.ctsshim versionCode=31 versionName=12-7533747 platformBuildVersionName=12 compileSdkVersion=31 compileSdkVersionCodename=12 sdkVersion:24 targetSdkVersion:28 CtsShimPriv.apk package: name=com.android.cts.priv.ctsshim versionCode=31 versionName=12-7533747 platformBuildVersionName=12 compileSdkVersion=31 compileSdkVersionCodename=12 sdkVersion:24 targetSdkVersion:28 Built here: ab/7533747 This build IS suitable for public release. The change is generated with prebuilt drop tool. Test: presubmit Bug: 188062003 Change-Id: Ib94d2f69593e34bbe7115f974bd5385003d1af4c --- ...ackages_CtsShim_apk__arm_CtsShimPriv_apk.asciipb | 2 +- ...fo_packages_CtsShim_apk__arm_CtsShim_apk.asciipb | 2 +- ...ackages_CtsShim_apk__x86_CtsShimPriv_apk.asciipb | 2 +- ...fo_packages_CtsShim_apk__x86_CtsShim_apk.asciipb | 2 +- packages/CtsShim/apk/arm/CtsShim.apk | Bin 5489 -> 5490 bytes packages/CtsShim/apk/arm/CtsShimPriv.apk | Bin 31623 -> 31631 bytes packages/CtsShim/apk/x86/CtsShim.apk | Bin 5489 -> 5490 bytes packages/CtsShim/apk/x86/CtsShimPriv.apk | Bin 24261 -> 24252 bytes 8 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.prebuilt_info/prebuilt_info_packages_CtsShim_apk__arm_CtsShimPriv_apk.asciipb b/.prebuilt_info/prebuilt_info_packages_CtsShim_apk__arm_CtsShimPriv_apk.asciipb index 78c48200cfc5..3258514cb6d7 100644 --- a/.prebuilt_info/prebuilt_info_packages_CtsShim_apk__arm_CtsShimPriv_apk.asciipb +++ b/.prebuilt_info/prebuilt_info_packages_CtsShim_apk__arm_CtsShimPriv_apk.asciipb @@ -1,6 +1,6 @@ drops { android_build_drop { - build_id: "7471822" + build_id: "7533747" target: "CtsShim" source_file: "aosp_arm64/CtsShimPriv.apk" } diff --git a/.prebuilt_info/prebuilt_info_packages_CtsShim_apk__arm_CtsShim_apk.asciipb b/.prebuilt_info/prebuilt_info_packages_CtsShim_apk__arm_CtsShim_apk.asciipb index a9632ad05ac0..4fb50e22989c 100644 --- a/.prebuilt_info/prebuilt_info_packages_CtsShim_apk__arm_CtsShim_apk.asciipb +++ b/.prebuilt_info/prebuilt_info_packages_CtsShim_apk__arm_CtsShim_apk.asciipb @@ -1,6 +1,6 @@ drops { android_build_drop { - build_id: "7471822" + build_id: "7533747" target: "CtsShim" source_file: "aosp_arm64/CtsShim.apk" } diff --git a/.prebuilt_info/prebuilt_info_packages_CtsShim_apk__x86_CtsShimPriv_apk.asciipb b/.prebuilt_info/prebuilt_info_packages_CtsShim_apk__x86_CtsShimPriv_apk.asciipb index df3a0bbe9f2c..1a0e3185665a 100644 --- a/.prebuilt_info/prebuilt_info_packages_CtsShim_apk__x86_CtsShimPriv_apk.asciipb +++ b/.prebuilt_info/prebuilt_info_packages_CtsShim_apk__x86_CtsShimPriv_apk.asciipb @@ -1,6 +1,6 @@ drops { android_build_drop { - build_id: "7471822" + build_id: "7533747" target: "CtsShim" source_file: "aosp_x86_64/CtsShimPriv.apk" } diff --git a/.prebuilt_info/prebuilt_info_packages_CtsShim_apk__x86_CtsShim_apk.asciipb b/.prebuilt_info/prebuilt_info_packages_CtsShim_apk__x86_CtsShim_apk.asciipb index 1bc6cb8706f2..d72f62e52148 100644 --- a/.prebuilt_info/prebuilt_info_packages_CtsShim_apk__x86_CtsShim_apk.asciipb +++ b/.prebuilt_info/prebuilt_info_packages_CtsShim_apk__x86_CtsShim_apk.asciipb @@ -1,6 +1,6 @@ drops { android_build_drop { - build_id: "7471822" + build_id: "7533747" target: "CtsShim" source_file: "aosp_x86_64/CtsShim.apk" } diff --git a/packages/CtsShim/apk/arm/CtsShim.apk b/packages/CtsShim/apk/arm/CtsShim.apk index da4ae568d713..e88e1ba97ca7 100644 Binary files a/packages/CtsShim/apk/arm/CtsShim.apk and b/packages/CtsShim/apk/arm/CtsShim.apk differ diff --git a/packages/CtsShim/apk/arm/CtsShimPriv.apk b/packages/CtsShim/apk/arm/CtsShimPriv.apk index 214d5c2465da..f35732cec024 100644 Binary files a/packages/CtsShim/apk/arm/CtsShimPriv.apk and b/packages/CtsShim/apk/arm/CtsShimPriv.apk differ diff --git a/packages/CtsShim/apk/x86/CtsShim.apk b/packages/CtsShim/apk/x86/CtsShim.apk index da4ae568d713..e88e1ba97ca7 100644 Binary files a/packages/CtsShim/apk/x86/CtsShim.apk and b/packages/CtsShim/apk/x86/CtsShim.apk differ diff --git a/packages/CtsShim/apk/x86/CtsShimPriv.apk b/packages/CtsShim/apk/x86/CtsShimPriv.apk index b4c625f36510..3d9f749f4e48 100644 Binary files a/packages/CtsShim/apk/x86/CtsShimPriv.apk and b/packages/CtsShim/apk/x86/CtsShimPriv.apk differ -- cgit v1.2.3 From 84f80d152d681d393aa81374ddfd5ad24c59e608 Mon Sep 17 00:00:00 2001 From: Mark Renouf Date: Thu, 8 Jul 2021 12:43:06 -0400 Subject: Quiet down long screenshots logcat output With this change, a long screen shot flow generates only the following log entries: D Screenshot: ScrollCapture: connected to window [com.example/.ExampleActivity] D Screenshot: onCaptureStarted D Screenshot: end() I Screenshot: Completed: LongScreenshot{w=1080, h=5339} Tags covered: LongScreenshotActivity Screenshot ScrollCaptureConnection ScrollCaptureInternal ScrollCaptureViewSupport ScrollCaptureController ViewRenderer Bug: 190399332 Test: observe logcat during long screenshot Change-Id: Ia2b018224897ad1ca153967ff9f60340a64f4815 --- .../internal/view/RecyclerViewCaptureHelper.java | 27 +------- .../internal/view/ScrollCaptureInternal.java | 2 +- .../android/systemui/screenshot/ImageTileSet.java | 2 - .../screenshot/LongScreenshotActivity.java | 23 +------ .../screenshot/ScrollCaptureController.java | 71 ++++++++++++++-------- 5 files changed, 53 insertions(+), 72 deletions(-) diff --git a/core/java/com/android/internal/view/RecyclerViewCaptureHelper.java b/core/java/com/android/internal/view/RecyclerViewCaptureHelper.java index 848a5ba77317..d14adf6f3c20 100644 --- a/core/java/com/android/internal/view/RecyclerViewCaptureHelper.java +++ b/core/java/com/android/internal/view/RecyclerViewCaptureHelper.java @@ -16,11 +16,6 @@ package com.android.internal.view; -import static com.android.internal.view.ScrollCaptureViewSupport.computeScrollAmount; -import static com.android.internal.view.ScrollCaptureViewSupport.findScrollingReferenceView; -import static com.android.internal.view.ScrollCaptureViewSupport.transformFromContainerToRequest; -import static com.android.internal.view.ScrollCaptureViewSupport.transformFromRequestToContainer; - import android.annotation.NonNull; import android.graphics.Rect; import android.util.Log; @@ -43,6 +38,7 @@ import android.view.ViewParent; */ public class RecyclerViewCaptureHelper implements ScrollCaptureViewHelper { private static final String TAG = "RVCaptureHelper"; + private int mScrollDelta; private boolean mScrollBarWasEnabled; private int mOverScrollMode; @@ -66,7 +62,6 @@ public class RecyclerViewCaptureHelper implements ScrollCaptureViewHelper run(ScrollCaptureResponse response) { - Log.d(TAG, "run: " + response); return CallbackToFutureAdapter.getFuture(completer -> { - Log.d(TAG, "getFuture(ImageTileSet) "); mCaptureCompleter = completer; mBgExecutor.execute(() -> { - Log.d(TAG, "bgExecutor.execute"); float maxPages = Settings.Secure.getFloat(mContext.getContentResolver(), SETTING_KEY_MAX_PAGES, MAX_PAGES_DEFAULT); - Log.d(TAG, "client start, maxPages=" + maxPages); mSessionFuture = mClient.start(response, maxPages); mSessionFuture.addListener(this::onStartComplete, mContext.getMainExecutor()); }); @@ -172,21 +170,27 @@ public class ScrollCaptureController { private void onStartComplete() { try { mSession = mSessionFuture.get(); - Log.d(TAG, "got session " + mSession); + if (LogConfig.DEBUG_SCROLL) { + Log.d(TAG, "got session " + mSession); + } requestNextTile(0); } catch (InterruptedException | ExecutionException e) { // Failure to start, propagate to caller - Log.d(TAG, "session start failed!"); + Log.e(TAG, "session start failed!"); mCaptureCompleter.setException(e); } } private void requestNextTile(int topPx) { - Log.d(TAG, "requestNextTile: " + topPx); + if (LogConfig.DEBUG_SCROLL) { + Log.d(TAG, "requestNextTile: " + topPx); + } mTileFuture = mSession.requestTile(topPx); mTileFuture.addListener(() -> { try { - Log.d(TAG, "onCaptureResult"); + if (LogConfig.DEBUG_SCROLL) { + Log.d(TAG, "onCaptureResult"); + } onCaptureResult(mTileFuture.get()); } catch (InterruptedException | ExecutionException e) { Log.e(TAG, "requestTile failed!", e); @@ -196,14 +200,18 @@ public class ScrollCaptureController { } private void onCaptureResult(CaptureResult result) { - Log.d(TAG, "onCaptureResult: " + result + " scrolling " + (mScrollingUp ? "UP" : "DOWN") - + " finish on boundary: " + mFinishOnBoundary); + if (LogConfig.DEBUG_SCROLL) { + Log.d(TAG, "onCaptureResult: " + result + " scrolling " + (mScrollingUp ? "UP" : "DOWN") + + " finish on boundary: " + mFinishOnBoundary); + } boolean emptyResult = result.captured.height() == 0; if (emptyResult) { // Potentially reached a vertical boundary. Extend in the other direction. if (mFinishOnBoundary) { - Log.d(TAG, "Empty: finished!"); + if (LogConfig.DEBUG_SCROLL) { + Log.d(TAG, "Empty: finished!"); + } finishCapture(); return; } else { @@ -212,13 +220,17 @@ public class ScrollCaptureController { mImageTileSet.clear(); mFinishOnBoundary = true; mScrollingUp = !mScrollingUp; - Log.d(TAG, "Empty: cleared, switch direction to finish"); + if (LogConfig.DEBUG_SCROLL) { + Log.d(TAG, "Empty: cleared, switch direction to finish"); + } } } else { // Got a non-empty result, but may already have enough bitmap data now int expectedTiles = mImageTileSet.size() + 1; if (expectedTiles >= mSession.getMaxTiles()) { - Log.d(TAG, "Hit max tiles: finished"); + if (LogConfig.DEBUG_SCROLL) { + Log.d(TAG, "Hit max tiles: finished"); + } // If we ever hit the max tiles, we've got enough bitmap data to finish // (even if we weren't sure we'd finish on this pass). finishCapture(); @@ -229,7 +241,9 @@ public class ScrollCaptureController { // by IDEAL_PORTION_ABOVE. if (mImageTileSet.getHeight() + result.captured.height() >= mSession.getTargetHeight() * IDEAL_PORTION_ABOVE) { - Log.d(TAG, "Hit ideal portion above: clear and switch direction"); + if (LogConfig.DEBUG_SCROLL) { + Log.d(TAG, "Hit ideal portion above: clear and switch direction"); + } // We got enough above the start point, now see how far down it can go. mImageTileSet.clear(); mScrollingUp = false; @@ -241,20 +255,25 @@ public class ScrollCaptureController { if (!emptyResult) { mImageTileSet.addTile(new ImageTile(result.image, result.captured)); } - - Log.d(TAG, "bounds: " + mImageTileSet.getLeft() + "," + mImageTileSet.getTop() - + " - " + mImageTileSet.getRight() + "," + mImageTileSet.getBottom() - + " (" + mImageTileSet.getWidth() + "x" + mImageTileSet.getHeight() + ")"); + if (LogConfig.DEBUG_SCROLL) { + Log.d(TAG, "bounds: " + mImageTileSet.getLeft() + "," + mImageTileSet.getTop() + + " - " + mImageTileSet.getRight() + "," + mImageTileSet.getBottom() + + " (" + mImageTileSet.getWidth() + "x" + mImageTileSet.getHeight() + ")"); + } Rect gapBounds = mImageTileSet.getGaps(); if (!gapBounds.isEmpty()) { - Log.d(TAG, "Found gaps in tileset: " + gapBounds + ", requesting " + gapBounds.top); + if (LogConfig.DEBUG_SCROLL) { + Log.d(TAG, "Found gaps in tileset: " + gapBounds + ", requesting " + gapBounds.top); + } requestNextTile(gapBounds.top); return; } if (mImageTileSet.getHeight() >= mSession.getTargetHeight()) { - Log.d(TAG, "Target height reached."); + if (LogConfig.DEBUG_SCROLL) { + Log.d(TAG, "Target height reached."); + } finishCapture(); return; } @@ -275,10 +294,14 @@ public class ScrollCaptureController { } private void finishCapture() { - Log.d(TAG, "finishCapture()"); + if (LogConfig.DEBUG_SCROLL) { + Log.d(TAG, "finishCapture()"); + } mEndFuture = mSession.end(); mEndFuture.addListener(() -> { - Log.d(TAG, "endCapture completed"); + if (LogConfig.DEBUG_SCROLL) { + Log.d(TAG, "endCapture completed"); + } // Provide result to caller and complete the top-level future // Caller is responsible for releasing this resource (ImageReader/HardwareBuffers) mCaptureCompleter.set(new LongScreenshot(mSession, mImageTileSet)); -- cgit v1.2.3 From b5ce699d0d52735eae0dee301b8a0e672482d5be Mon Sep 17 00:00:00 2001 From: Arthur Hung Date: Fri, 2 Jul 2021 16:08:51 +0800 Subject: Allow double tap power to trigger camera during device is sleeping In previous patch (ag/14791880), we fixed double tap power to launch camera by returning the 'MaxMultiPressPowerCount' value, that would tell the single key detector to detect a single tap or multi taps by the timeout (MULTI_PRESS_TIMEOUT=300ms), that would defer the screen off action cause user feel the suspend response time is worse than before. This CL would allow the action of triggering camera by double tap when device is going to sleep started in first tap, then it could wake the device when receive 'screenTurnedOff'. It would also fix the single key detector that process the power key for single tap and multi taps and make sure that are runing at policy thread. Bug: 191214622 Test: manual with the combinations of screen on/off, aod, security keyguard, double tap/single tap power. Change-Id: I6ec73818adbd4eff91500460df7337fdf61ac08b --- .../com/android/server/GestureLauncherService.java | 9 ----- .../android/server/policy/PhoneWindowManager.java | 44 ++++++++++------------ .../server/policy/SingleKeyGestureDetector.java | 11 +++--- 3 files changed, 25 insertions(+), 39 deletions(-) diff --git a/services/core/java/com/android/server/GestureLauncherService.java b/services/core/java/com/android/server/GestureLauncherService.java index 50b27a0f3b3d..d04698cb5aeb 100644 --- a/services/core/java/com/android/server/GestureLauncherService.java +++ b/services/core/java/com/android/server/GestureLauncherService.java @@ -519,15 +519,6 @@ public class GestureLauncherService extends SystemService { // user has completed setup. return intercept && isUserSetupComplete(); } - - public boolean isCameraDoubleTapPowerEnabled() { - return mCameraDoubleTapPowerEnabled; - } - - public boolean isEmergencyGestureEnabled() { - return mEmergencyGestureEnabled; - } - /** * @return true if camera was launched, false otherwise. */ diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index e6adeb3abab8..fb4d96e305fc 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -904,7 +904,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } else { // handled by single key or another power key policy. - mSingleKeyGestureDetector.reset(); + if (!mSingleKeyGestureDetector.isKeyIntercepted(KEYCODE_POWER)) { + mSingleKeyGestureDetector.reset(); + } } finishPowerKeyPress(); @@ -918,7 +920,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { } private void powerPress(long eventTime, int count, boolean beganFromNonInteractive) { - mCameraGestureTriggered = false; if (mDefaultDisplayPolicy.isScreenOnEarly() && !mDefaultDisplayPolicy.isScreenOnFully()) { Slog.i(TAG, "Suppressed redundant power key press while " + "already in the process of turning the screen on."); @@ -1068,24 +1069,18 @@ public class PhoneWindowManager implements WindowManagerPolicy { } private int getMaxMultiPressPowerCount() { - // GestureLauncherService could handle power multi tap gesture. - if (mGestureLauncherService != null - && mGestureLauncherService.isEmergencyGestureEnabled()) { - return 5; // EMERGENCY_GESTURE_POWER_TAP_COUNT_THRESHOLD - } - + // The actual max power button press count is 5 + // (EMERGENCY_GESTURE_POWER_TAP_COUNT_THRESHOLD), which is coming from + // GestureLauncherService. + // To speed up the handling of single-press of power button inside SingleKeyGestureDetector, + // however, we limit the max count to the number of button presses actually handled by the + // SingleKeyGestureDetector. if (mTriplePressOnPowerBehavior != MULTI_PRESS_POWER_NOTHING) { return 3; } if (mDoublePressOnPowerBehavior != MULTI_PRESS_POWER_NOTHING) { return 2; } - - if (mGestureLauncherService != null - && mGestureLauncherService.isCameraDoubleTapPowerEnabled()) { - return 2; // CAMERA_POWER_TAP_COUNT_THRESHOLD - } - return 1; } @@ -1972,7 +1967,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { void onPress(long downTime) { powerPress(downTime, 1 /*count*/, mSingleKeyGestureDetector.beganFromNonInteractive()); - finishPowerKeyPress(); } @Override @@ -1995,7 +1989,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { @Override void onMultiPress(long downTime, int count) { powerPress(downTime, count, mSingleKeyGestureDetector.beganFromNonInteractive()); - finishPowerKeyPress(); } } @@ -3849,17 +3842,17 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (mGestureLauncherService == null) { return false; } - + mCameraGestureTriggered = false; final MutableBoolean outLaunched = new MutableBoolean(false); - final boolean gesturedServiceIntercepted = mGestureLauncherService.interceptPowerKeyDown( - event, interactive, outLaunched); - if (outLaunched.value) { - mCameraGestureTriggered = true; + mGestureLauncherService.interceptPowerKeyDown(event, interactive, outLaunched); + if (!outLaunched.value) { + return false; } - if (outLaunched.value && mRequestedOrSleepingDefaultDisplay) { + mCameraGestureTriggered = true; + if (mRequestedOrSleepingDefaultDisplay) { mCameraGestureTriggeredDuringGoingToSleep = true; } - return gesturedServiceIntercepted; + return true; } /** @@ -4232,7 +4225,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { mDefaultDisplayRotation.updateOrientationListener(); if (mKeyguardDelegate != null) { - mKeyguardDelegate.onFinishedGoingToSleep(pmSleepReason, mCameraGestureTriggered); + mKeyguardDelegate.onFinishedGoingToSleep(pmSleepReason, + mCameraGestureTriggeredDuringGoingToSleep); } if (mDisplayFoldController != null) { mDisplayFoldController.finishedGoingToSleep(); @@ -4428,6 +4422,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { // Called on the DisplayManager's DisplayPowerController thread. @Override public void screenTurnedOn(int displayId) { + if (DEBUG_WAKEUP) Slog.i(TAG, "Display " + displayId + " turned on..."); + if (displayId != DEFAULT_DISPLAY) { return; } diff --git a/services/core/java/com/android/server/policy/SingleKeyGestureDetector.java b/services/core/java/com/android/server/policy/SingleKeyGestureDetector.java index 3f4d920754ce..1ef2bf9151e0 100644 --- a/services/core/java/com/android/server/policy/SingleKeyGestureDetector.java +++ b/services/core/java/com/android/server/policy/SingleKeyGestureDetector.java @@ -272,8 +272,10 @@ public final class SingleKeyGestureDetector { if (DEBUG) { Log.i(TAG, "press key " + KeyEvent.keyCodeToString(event.getKeyCode())); } - mActiveRule.onPress(downTime); - reset(); + Message msg = mHandler.obtainMessage(MSG_KEY_DELAYED_PRESS, mActiveRule.mKeyCode, + 1, downTime); + msg.setAsynchronous(true); + mHandler.sendMessage(msg); return true; } @@ -316,10 +318,7 @@ public final class SingleKeyGestureDetector { } boolean isKeyIntercepted(int keyCode) { - if (mActiveRule != null && mActiveRule.shouldInterceptKey(keyCode)) { - return mHandledByLongPress; - } - return false; + return mActiveRule != null && mActiveRule.shouldInterceptKey(keyCode); } boolean beganFromNonInteractive() { -- cgit v1.2.3 From f3e53d082c1ea71dd2778c1ff98e9252f70bdd8c Mon Sep 17 00:00:00 2001 From: Henry Fang Date: Thu, 8 Jul 2021 14:31:03 -0700 Subject: fix memory leak in initilization and finalization bug: 193107250 Test: Manual Change-Id: I5b57ee6467d39765fab15d7a2b4b8e7c09ad8f3a --- media/jni/android_media_tv_Tuner.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp index 657c9eff1034..3cf9b0370823 100644 --- a/media/jni/android_media_tv_Tuner.cpp +++ b/media/jni/android_media_tv_Tuner.cpp @@ -339,6 +339,12 @@ MediaEvent::~MediaEvent() { if (pC2Buffer != NULL) { pC2Buffer->unregisterOnDestroyNotify(&DestroyCallback, this); } + + if (mLinearBlockObj != NULL) { + env->DeleteWeakGlobalRef(mLinearBlockObj); + mLinearBlockObj = NULL; + } + mFilterClient = NULL; } @@ -2450,7 +2456,10 @@ static sp setTuner(JNIEnv *env, jobject thiz, const sp &tuner) { if (old != NULL) { old->decStrong(thiz); } - env->SetLongField(thiz, gFields.tunerContext, (jlong)tuner.get()); + + if (tuner != NULL) { + env->SetLongField(thiz, gFields.tunerContext, (jlong)tuner.get()); + } return old; } @@ -4042,6 +4051,7 @@ static jint android_media_tv_Tuner_open_demux(JNIEnv* env, jobject thiz, jint ha static jint android_media_tv_Tuner_close_tuner(JNIEnv* env, jobject thiz) { sp tuner = getTuner(env, thiz); + setTuner(env, thiz, NULL); return (jint) tuner->close(); } -- cgit v1.2.3 From 97b75f09ed73a9ae2c883ee001a769d534cc1d43 Mon Sep 17 00:00:00 2001 From: Jason Chang Date: Mon, 5 Jul 2021 17:30:28 +0800 Subject: Add metrics log for One-handed mode Shortcut toggle switch To write metrics log for One-handed mode Shortcut toggle switch state. Bug: 192641587 Test: Local add logs to verify before writing metrics logs API call Test: atest SystemUITests Test: atest WMShellTests Change-Id: I02fda724bf2960355d78f1a26ac6d65225687176 --- .../wm/shell/onehanded/OneHandedController.java | 4 ++++ .../wm/shell/onehanded/OneHandedUiEventLogger.java | 22 ++++++++++++++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java index 54b81ad78256..2054a7d361c1 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java @@ -601,6 +601,10 @@ public class OneHandedController implements RemoteCallable void onShortcutEnabledChanged() { mIsShortcutEnabled = mOneHandedSettingsUtil.getShortcutEnabled( mContext.getContentResolver(), mUserId); + + mOneHandedUiEventLogger.writeEvent(mIsShortcutEnabled + ? OneHandedUiEventLogger.EVENT_ONE_HANDED_SETTINGS_SHORTCUT_ENABLED_ON + : OneHandedUiEventLogger.EVENT_ONE_HANDED_SETTINGS_SHORTCUT_ENABLED_OFF); } private void setupTimeoutListener() { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedUiEventLogger.java b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedUiEventLogger.java index 4e610fad05ae..1cf408075c9d 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedUiEventLogger.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedUiEventLogger.java @@ -52,6 +52,8 @@ public class OneHandedUiEventLogger { public static final int EVENT_ONE_HANDED_SETTINGS_TIMEOUT_SECONDS_12 = 17; public static final int EVENT_ONE_HANDED_SETTINGS_SHOW_NOTIFICATION_ENABLED_ON = 18; public static final int EVENT_ONE_HANDED_SETTINGS_SHOW_NOTIFICATION_ENABLED_OFF = 19; + public static final int EVENT_ONE_HANDED_SETTINGS_SHORTCUT_ENABLED_ON = 20; + public static final int EVENT_ONE_HANDED_SETTINGS_SHORTCUT_ENABLED_OFF = 21; private static final String[] EVENT_TAGS = { "one_handed_trigger_gesture_in", @@ -73,7 +75,9 @@ public class OneHandedUiEventLogger { "one_handed_settings_timeout_seconds_8", "one_handed_settings_timeout_seconds_12", "one_handed_settings_show_notification_enabled_on", - "one_handed_settings_show_notification_enabled_off" + "one_handed_settings_show_notification_enabled_off", + "one_handed_settings_shortcut_enabled_on", + "one_handed_settings_shortcut_enabled_off" }; public OneHandedUiEventLogger(UiEventLogger uiEventLogger) { @@ -162,7 +166,13 @@ public class OneHandedUiEventLogger { ONE_HANDED_SETTINGS_TOGGLES_SHOW_NOTIFICATION_ENABLED_ON(847), @UiEvent(doc = "One-Handed mode show notification toggle off") - ONE_HANDED_SETTINGS_TOGGLES_SHOW_NOTIFICATION_ENABLED_OFF(848); + ONE_HANDED_SETTINGS_TOGGLES_SHOW_NOTIFICATION_ENABLED_OFF(848), + + @UiEvent(doc = "One-Handed mode shortcut toggle on") + ONE_HANDED_SETTINGS_TOGGLES_SHORTCUT_ENABLED_ON(870), + + @UiEvent(doc = "One-Handed mode shortcut toggle off") + ONE_HANDED_SETTINGS_TOGGLES_SHORTCUT_ENABLED_OFF(871); private final int mId; @@ -265,6 +275,14 @@ public class OneHandedUiEventLogger { mUiEventLogger.log(OneHandedSettingsTogglesEvent .ONE_HANDED_SETTINGS_TOGGLES_SHOW_NOTIFICATION_ENABLED_OFF); break; + case EVENT_ONE_HANDED_SETTINGS_SHORTCUT_ENABLED_ON: + mUiEventLogger.log(OneHandedSettingsTogglesEvent + .ONE_HANDED_SETTINGS_TOGGLES_SHORTCUT_ENABLED_ON); + break; + case EVENT_ONE_HANDED_SETTINGS_SHORTCUT_ENABLED_OFF: + mUiEventLogger.log(OneHandedSettingsTogglesEvent + .ONE_HANDED_SETTINGS_TOGGLES_SHORTCUT_ENABLED_OFF); + break; default: // Do nothing break; -- cgit v1.2.3 From 980807a40a67f14a14478e832cfebe623ad1db1a Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 9 Jul 2021 06:19:49 +0000 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I307bbf6400f26475ceb324c5c022e4adaed2946d --- packages/SettingsLib/res/values-pl/strings.xml | 28 +++++++++++++------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml index 49dd07e83416..fea9601952e9 100644 --- a/packages/SettingsLib/res/values-pl/strings.xml +++ b/packages/SettingsLib/res/values-pl/strings.xml @@ -235,8 +235,8 @@ "Sparuj urządzenia przez Wi-Fi, skanując kod QR" "Połącz się z siecią Wi-Fi" "adb, debug, dev" - "Skrót do zgłoszenia błędu" - "Pokaż w menu zasilania przycisk zgłaszania błędu" + "Skrót do zgłaszania błędów" + "Pokazuj w menu zasilania przycisk zgłaszania błędów" "Pozostaw włączony ekran" "Ekran nie będzie gaszony podczas ładowania telefonu" "Włącz dziennik snoop Bluetooth HCI" @@ -249,7 +249,7 @@ "Nie ustawiono aplikacji do pozorowania lokalizacji" "Aplikacja do pozorowania lokalizacji: %1$s" "Sieci" - "Wyświetlacz bezprzewodowy" + "Certyfikacja wyświetlacza bezprzewodowego" "Szczegółowy dziennik Wi-Fi" "Ograniczanie skanowania Wi-Fi" "Nietrwała randomizacja adresów MAC w sieci Wi-Fi" @@ -281,7 +281,7 @@ "Nazwa hosta dostawcy prywatnego DNS" "Wpisz nazwę hosta dostawcy DNS" "Nie udało się połączyć" - "Pokaż opcje certyfikacji wyświetlacza bezprzewodowego" + "Pokazuj opcje certyfikacji wyświetlacza bezprzewodowego" "Zwiększ poziom rejestrowania Wi‑Fi, pokazuj według RSSI SSID w selektorze Wi‑Fi" "Zmniejsza zużycie baterii i zwiększa wydajność sieci" "Kiedy ten tryb jest włączony, to adres MAC tego urządzenia może zmieniać się za każdym razem, kiedy urządzenie połączy się z siecią, która ma włączoną opcję randomizacji MAC" @@ -297,9 +297,9 @@ "Wybierz konfigurację USB" "Pozorowanie lokalizacji" "Zezwalaj na pozorowanie lokalizacji" - "Inspekcja wyświetlania atrybutu" + "Inspekcja atrybutu wyświetlania" "Nie wyłączaj transmisji danych przez sieć komórkową, nawet gdy aktywne jest połączenie Wi-Fi (aby szybko przełączać sieci)" - "Użyj akceleracji sprzętowej tetheringu, jeśli jest dostępna" + "Używaj akceleracji sprzętowej tetheringu, jeśli jest dostępna" "Czy zezwalać na debugowanie USB?" "Debugowanie USB jest przeznaczone wyłącznie do celów programistycznych. Może służyć do kopiowania danych między komputerem a urządzeniem, instalowania aplikacji na urządzeniu bez powiadamiania, a także odczytu danych dziennika." "Zezwalać na debugowanie bezprzewodowe?" @@ -307,8 +307,8 @@ "Odwołać dostęp wszystkich poprzednio autoryzowanych komputerów do debugowania USB?" "Zezwolić na ustawienia programistyczne?" "Te ustawienia są przeznaczone wyłącznie dla programistów. Ich użycie może spowodować uszkodzenie lub nieprawidłowe działanie urządzenia i zainstalowanych na nim aplikacji." - "Zweryfikuj aplikacje przez USB" - "Sprawdź, czy aplikacje zainstalowane przez ADB/ADT nie zachowują się w szkodliwy sposób" + "Weryfikuj aplikacje przez USB" + "Sprawdzaj, czy aplikacje zainstalowane przez ADB/ADT nie zachowują się w szkodliwy sposób" "Urządzenia Bluetooth będą wyświetlane bez nazw (tylko adresy MAC)" "Wyłącza Głośność bezwzględną Bluetooth, jeśli występują problemy z urządzeniami zdalnymi, np. zbyt duża głośność lub brak kontroli" "Włącza funkcje Bluetooth Gabeldorsche" @@ -349,17 +349,17 @@ "Włącz śledzenie OpenGL" "Wyłącz kierowanie dźwiękowe USB" "Wyłącz autokierowanie do urządzeń peryferyjnych audio USB" - "Pokaż granice układu" - "Pokaż granice przycięcia, marginesy itd." + "Pokazuj granice układu" + "Pokazuj granice przycięcia, marginesy itd." "Układ od prawej do lewej" - "Wymuś wszędzie układ ekranu od prawej do lewej" + "Wymuszaj układ ekranu od prawej do lewej dla wszystkich języków" "Zezwól na rozmycie na poziomie okna" - "Wymuś 4x MSAA" - "Włącz 4x MSAA w aplikacjach OpenGL ES 2.0" + "Wymuszaj 4x MSAA" + "Włączaj 4x MSAA w aplikacjach OpenGL ES 2.0" "Debuguj operacje przycinania nieprostokątnego" "Profil renderowania HWUI" "Warstwy debugowania GPU" - "Zezwól na ładowanie warstw debugowania GPU" + "Zezwalaj na ładowanie warstw debugowania GPU" "Włącz szczegółowe rejestrowanie dostawcy" "Dołączaj do raportów o błędach dodatkowe dane dostawcy dotyczące konkretnego urządzenia, które mogą zawierać dane prywatne oraz wykorzystywać więcej baterii lub pamięci." "Skala animacji okna" -- cgit v1.2.3 From 6c3d9953362260bff56bcf65dc14b9bb54d58947 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 9 Jul 2021 07:13:58 +0000 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I8c1d1996a32657801a4cfdfa9ed8647d5f9f874f --- core/res/res/values-fr-rCA/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index ea160bc335c8..860e10bcff4d 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -541,10 +541,10 @@ "Permet à l\'application d\'envoyer des annonces aux appareils Bluetooth à proximité" "déterminer la position relative entre des appareils à bande ultralarge à proximité" "Autorisez l\'application à déterminer la position relative entre des appareils à bande ultralarge à proximité" - "Information sur le service préféré de paiement NFC" - "Permet à l\'application d\'obtenir de l\'information sur le service préféré de paiement NFC comme les aides enregistrées et la route de destination." + "Information sur le service préféré de paiement CCP" + "Permet à l\'application d\'obtenir de l\'information sur le service préféré de paiement CCP comme les aides enregistrées et la route de destination." "gérer la communication en champ proche" - "Permet à l\'application de communiquer avec des bornes, des cartes et des lecteurs compatibles avec la technologie NFC (communication en champ proche)." + "Permet à l\'application de communiquer avec des bornes, des cartes et des lecteurs compatibles avec la technologie CCP (communication en champ proche)." "désactiver le verrouillage de l\'écran" "Permet à l\'application de désactiver le verrouillage des touches et toute mesure de sécurité par mot de passe associée. Par exemple, votre téléphone désactive le verrouillage des touches lorsque vous recevez un appel, puis le réactive lorsque vous raccrochez." "demander la complexité du verrouillage d\'écran" @@ -1511,7 +1511,7 @@ "Touchez pour quitter l\'application de conduite." "Précédent" "Suivante" - "Passer" + "Ignorer" "Aucune partie" "Rechercher sur la page" -- cgit v1.2.3 From 7d80fc90a218f09405241bf36c6a3679c53bd7bb Mon Sep 17 00:00:00 2001 From: Bernardo Rufino Date: Tue, 6 Jul 2021 16:21:21 +0100 Subject: Also check for home activity in BAL This is a CP from ag/15216475, see b/189896361#comment25 for details -- Original message Since checking for home process can fail if lancher has been killed but we still want to allow launcher to start activities. Bug: 189896361 Test: 1. Set app 1 as launcher, give PI for random activity to app 2 2. With app 2 in fg, kill app 1 3. Launch PI, verify it launches Change-Id: Ia5eb5bfcf239b6dd2f732516edeac29a77c8a478 Merged-In: Ia5eb5bfcf239b6dd2f732516edeac29a77c8a478 (cherry picked from commit 6771862788360b6f2c9d91792840fc1cb4158efc) --- .../java/com/android/server/wm/ActivityStarter.java | 17 ++++++++++++++++- .../src/com/android/server/wm/ActivityStarterTests.java | 1 + 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index e2ef82b81a18..a9a25fc2d272 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -86,6 +86,7 @@ import android.app.IApplicationThread; import android.app.PendingIntent; import android.app.ProfilerInfo; import android.app.WaitResult; +import android.content.ComponentName; import android.content.IIntentSender; import android.content.Intent; import android.content.IntentSender; @@ -1221,6 +1222,20 @@ class ActivityStarter { mController.onExecutionComplete(this); } + private boolean isHomeApp(int uid, @Nullable String packageName) { + if (mService.mHomeProcess != null) { + // Fast check + return uid == mService.mHomeProcess.mUid; + } + if (packageName == null) { + return false; + } + ComponentName activity = + mService.getPackageManagerInternalLocked().getDefaultHomeActivity( + UserHandle.getUserId(uid)); + return activity != null && packageName.equals(activity.getPackageName()); + } + boolean shouldAbortBackgroundActivityStart(int callingUid, int callingPid, final String callingPackage, int realCallingUid, int realCallingPid, WindowProcessController callerApp, PendingIntentRecord originatingPendingIntent, @@ -1236,7 +1251,7 @@ class ActivityStarter { } // Always allow home application to start activities. - if (mService.mHomeProcess != null && callingUid == mService.mHomeProcess.mUid) { + if (isHomeApp(callingUid, callingPackage)) { if (DEBUG_ACTIVITY_STARTS) { Slog.d(TAG, "Activity start allowed for home app callingUid (" + callingUid + ")"); } diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java index 0a36af2d586a..d0588a30ca67 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java @@ -348,6 +348,7 @@ public class ActivityStarterTests extends WindowTestsBase { invocation -> { throw new RuntimeException("Not stubbed"); }); + doReturn(null).when(mMockPackageManager).getDefaultHomeActivity(anyInt()); doReturn(mMockPackageManager).when(mAtm).getPackageManagerInternalLocked(); doReturn(false).when(mMockPackageManager).isInstantAppInstallerComponent(any()); doReturn(null).when(mMockPackageManager).resolveIntent(any(), any(), anyInt(), anyInt(), -- cgit v1.2.3 From bf0d8be298e3e7f7b06430481c1e29da1d883e74 Mon Sep 17 00:00:00 2001 From: George Chang Date: Fri, 9 Jul 2021 11:19:25 +0800 Subject: Remove @TestApi and @Readable for NFC_PAYMENT_DEFAULT_COMPONENT Remove @Readable for security vulnerability. Remove @TestApi since there's no exceptions in ReadSettingsFieldsTest Bug: 191519696 Bug: 174151290 Test: atest CtsNfcTestCases Test: atest android.appsecurity.cts.ReadableSettingsFieldsTest Test: atest CtsQuickAccessWalletTestCases Test: make RunSettingsRoboTests -j Test: atest QuickAccessWalletTileTest Merged-In: I13c038753d3acf3f3b651af3cd22ff55cd464cb1 Change-Id: I13c038753d3acf3f3b651af3cd22ff55cd464cb1 --- core/api/test-current.txt | 1 - core/java/android/provider/Settings.java | 2 -- 2 files changed, 3 deletions(-) diff --git a/core/api/test-current.txt b/core/api/test-current.txt index a90a0a4ff28a..3be40042ad58 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -2166,7 +2166,6 @@ package android.provider { field @Deprecated public static final String ENABLED_NOTIFICATION_POLICY_ACCESS_PACKAGES = "enabled_notification_policy_access_packages"; field public static final String ENABLED_VR_LISTENERS = "enabled_vr_listeners"; field public static final String IMMERSIVE_MODE_CONFIRMATIONS = "immersive_mode_confirmations"; - field public static final String NFC_PAYMENT_DEFAULT_COMPONENT = "nfc_payment_default_component"; field public static final String NOTIFICATION_BADGING = "notification_badging"; field public static final String NOTIFICATION_BUBBLES = "notification_bubbles"; field public static final String POWER_MENU_LOCKED_SHOW_CONTENT = "power_menu_locked_show_content"; diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 6b2123dfbeeb..b191dfc561aa 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -8747,8 +8747,6 @@ public final class Settings { * @hide */ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) - @TestApi - @Readable public static final String NFC_PAYMENT_DEFAULT_COMPONENT = "nfc_payment_default_component"; /** -- cgit v1.2.3 From 477c88a7d5bf239a90203f47315adbd67ebffd7d Mon Sep 17 00:00:00 2001 From: Bill Lin Date: Fri, 2 Jul 2021 10:26:27 +0800 Subject: Redesign One-haned tutorial UX behavior - Always show tutorial for user to know device state is in One-handed mode. - Clean the redundant params from ctor Test: manual trigger OHM Test: atest WMShellUnitTests Bug: 192648901 Change-Id: I10c3f3f29190b672fb88471df3cf374a994cdaa7 --- .../wm/shell/onehanded/OneHandedController.java | 2 +- .../shell/onehanded/OneHandedTutorialHandler.java | 75 +++++++--------------- .../onehanded/OneHandedTutorialHandlerTest.java | 21 ++---- 3 files changed, 30 insertions(+), 68 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java index 54b81ad78256..ce972c69b10b 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java @@ -225,7 +225,7 @@ public class OneHandedController implements RemoteCallable OneHandedTimeoutHandler timeoutHandler = new OneHandedTimeoutHandler(mainExecutor); OneHandedState transitionState = new OneHandedState(); OneHandedTutorialHandler tutorialHandler = new OneHandedTutorialHandler(context, - displayLayout, windowManager, settingsUtil, mainExecutor); + windowManager); OneHandedAnimationController animationController = new OneHandedAnimationController(context); OneHandedTouchHandler touchHandler = new OneHandedTouchHandler(timeoutHandler, diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedTutorialHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedTutorialHandler.java index 6cee404758ec..0f6c4b081cb7 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedTutorialHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedTutorialHandler.java @@ -16,7 +16,7 @@ package com.android.wm.shell.onehanded; -import static android.os.UserHandle.myUserId; +import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; import static com.android.wm.shell.onehanded.OneHandedState.STATE_ACTIVE; import static com.android.wm.shell.onehanded.OneHandedState.STATE_ENTERING; @@ -24,7 +24,6 @@ import static com.android.wm.shell.onehanded.OneHandedState.STATE_EXITING; import static com.android.wm.shell.onehanded.OneHandedState.STATE_NONE; import android.annotation.Nullable; -import android.content.ContentResolver; import android.content.Context; import android.graphics.PixelFormat; import android.graphics.Rect; @@ -41,7 +40,6 @@ import androidx.annotation.NonNull; import com.android.internal.annotations.VisibleForTesting; import com.android.wm.shell.R; import com.android.wm.shell.common.DisplayLayout; -import com.android.wm.shell.common.ShellExecutor; import java.io.PrintWriter; @@ -56,57 +54,44 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback, private static final String TAG = "OneHandedTutorialHandler"; private static final String ONE_HANDED_MODE_OFFSET_PERCENTAGE = "persist.debug.one_handed_offset_percentage"; - private static final int MAX_TUTORIAL_SHOW_COUNT = 2; private final float mTutorialHeightRatio; private final WindowManager mWindowManager; - private final OneHandedSettingsUtil mSettingsUtil; - private final ShellExecutor mShellExecutor; - private boolean mCanShow; + private boolean mIsShowing; private @OneHandedState.State int mCurrentState; - private int mShownCounts; private int mTutorialAreaHeight; private Context mContext; - private ContentResolver mContentResolver; private Rect mDisplayBounds; private @Nullable View mTutorialView; private @Nullable ViewGroup mTargetViewContainer; - private final OneHandedAnimationCallback mAnimationCallback = new OneHandedAnimationCallback() { - @Override - public void onAnimationUpdate(float xPos, float yPos) { - if (!canShowTutorial()) { - return; - } - mTargetViewContainer.setTransitionGroup(true); - mTargetViewContainer.setTranslationY(yPos - mTargetViewContainer.getHeight()); - } - }; + private final OneHandedAnimationCallback mAnimationCallback; - public OneHandedTutorialHandler(Context context, DisplayLayout displayLayout, - WindowManager windowManager, OneHandedSettingsUtil settingsUtil, - ShellExecutor mainExecutor) { + public OneHandedTutorialHandler(Context context, WindowManager windowManager) { mContext = context; - mContentResolver = context.getContentResolver(); mWindowManager = windowManager; - mSettingsUtil = settingsUtil; - mShellExecutor = mainExecutor; final float offsetPercentageConfig = context.getResources().getFraction( R.fraction.config_one_handed_offset, 1, 1); final int sysPropPercentageConfig = SystemProperties.getInt( ONE_HANDED_MODE_OFFSET_PERCENTAGE, Math.round(offsetPercentageConfig * 100.0f)); mTutorialHeightRatio = sysPropPercentageConfig / 100.0f; - mShownCounts = mSettingsUtil.getTutorialShownCounts(mContentResolver, myUserId()); + mAnimationCallback = new OneHandedAnimationCallback() { + @Override + public void onAnimationUpdate(float xPos, float yPos) { + if (!isShowing()) { + return; + } + mTargetViewContainer.setTransitionGroup(true); + mTargetViewContainer.setTranslationY(yPos - mTargetViewContainer.getHeight()); + } + }; } @Override public void onStateChanged(int newState) { mCurrentState = newState; - if (!canShowTutorial()) { - return; - } switch (newState) { case STATE_ENTERING: createViewAndAttachToWindow(mContext); @@ -139,7 +124,7 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback, @VisibleForTesting void createViewAndAttachToWindow(Context context) { - if (!canShowTutorial()) { + if (isShowing()) { return; } mTutorialView = LayoutInflater.from(context).inflate(R.layout.one_handed_tutorial, null); @@ -150,15 +135,6 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback, attachTargetToWindow(); } - @VisibleForTesting - boolean setTutorialShownCountIncrement() { - if (!canShowTutorial()) { - return false; - } - mShownCounts += 1; - return mSettingsUtil.setTutorialShownCounts(mContentResolver, mShownCounts, myUserId()); - } - /** * Adds the tutorial target view to the WindowManager and update its layout. */ @@ -166,6 +142,7 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback, if (!mTargetViewContainer.isAttachedToWindow()) { try { mWindowManager.addView(mTargetViewContainer, getTutorialTargetLayoutParams()); + mIsShowing = true; } catch (IllegalStateException e) { // This shouldn't happen, but if the target is already added, just update its // layout params. @@ -179,14 +156,12 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback, void removeTutorialFromWindowManager(boolean increment) { if (mTargetViewContainer != null && mTargetViewContainer.isAttachedToWindow()) { mWindowManager.removeViewImmediate(mTargetViewContainer); - if (increment) { - setTutorialShownCountIncrement(); - } + mIsShowing = false; } } @Nullable OneHandedAnimationCallback getAnimationCallback() { - return canShowTutorial() ? mAnimationCallback : null /* Disabled */; + return isShowing() ? mAnimationCallback : null /* Disabled */; } /** @@ -200,6 +175,7 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback, | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT); lp.gravity = Gravity.TOP | Gravity.LEFT; + lp.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; lp.privateFlags |= WindowManager.LayoutParams.SYSTEM_FLAG_SHOW_FOR_ALL_USERS; lp.setFitInsetsTypes(0 /* types */); lp.setTitle("one-handed-tutorial-overlay"); @@ -207,17 +183,14 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback, } @VisibleForTesting - boolean canShowTutorial() { - return mCanShow = mShownCounts < MAX_TUTORIAL_SHOW_COUNT; + boolean isShowing() { + return mIsShowing; } /** * onConfigurationChanged events for updating tutorial text. */ public void onConfigurationChanged() { - if (!canShowTutorial()) { - return; - } removeTutorialFromWindowManager(false /* increment */); if (mCurrentState == STATE_ENTERING || mCurrentState == STATE_ACTIVE) { createViewAndAttachToWindow(mContext); @@ -227,14 +200,12 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback, void dump(@NonNull PrintWriter pw) { final String innerPrefix = " "; pw.println(TAG); - pw.print(innerPrefix + "mCanShow="); - pw.println(mCanShow); + pw.print(innerPrefix + "mIsShowing="); + pw.println(mIsShowing); pw.print(innerPrefix + "mCurrentState="); pw.println(mCurrentState); pw.print(innerPrefix + "mDisplayBounds="); pw.println(mDisplayBounds); - pw.print(innerPrefix + "mShownCounts="); - pw.println(mShownCounts); pw.print(innerPrefix + "mTutorialAreaHeight="); pw.println(mTutorialAreaHeight); } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedTutorialHandlerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedTutorialHandlerTest.java index 1bc2a0823ff7..25bdb8ef9263 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedTutorialHandlerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedTutorialHandlerTest.java @@ -19,8 +19,6 @@ package com.android.wm.shell.onehanded; import static com.android.wm.shell.onehanded.OneHandedState.STATE_ENTERING; import static com.android.wm.shell.onehanded.OneHandedState.STATE_NONE; -import static com.google.common.truth.Truth.assertThat; - import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.never; @@ -68,17 +66,10 @@ public class OneHandedTutorialHandlerTest extends OneHandedTestCase { mDisplayLayout = new DisplayLayout(mContext, mDisplay); mSpiedTransitionState = spy(new OneHandedState()); mSpiedTutorialHandler = spy( - new OneHandedTutorialHandler(mContext, mDisplayLayout, mMockWindowManager, - mMockSettingsUtil, mMockShellMainExecutor)); + new OneHandedTutorialHandler(mContext, mMockWindowManager)); mTimeoutHandler = new OneHandedTimeoutHandler(mMockShellMainExecutor); } - @Test - public void testDefaultZeroShownCounts_canShowTutorial() { - assertThat(mSpiedTutorialHandler.canShowTutorial()).isTrue(); - verify(mMockShellMainExecutor, never()).execute(any()); - } - @Test public void testDefaultZeroShownCounts_doNotAttachWindow() { verify(mMockShellMainExecutor, never()).execute(any()); @@ -86,7 +77,7 @@ public class OneHandedTutorialHandlerTest extends OneHandedTestCase { @Test public void testOnStateChangedEntering_createViewAndAttachToWindow() { - when(mSpiedTutorialHandler.canShowTutorial()).thenReturn(true); + when(mSpiedTutorialHandler.isShowing()).thenReturn(true); try { mSpiedTutorialHandler.onStateChanged(STATE_ENTERING); } catch (ClassCastException e) { @@ -98,7 +89,7 @@ public class OneHandedTutorialHandlerTest extends OneHandedTestCase { @Test public void testOnStateChangedNone_removeViewAndAttachToWindow() { - when(mSpiedTutorialHandler.canShowTutorial()).thenReturn(true); + when(mSpiedTutorialHandler.isShowing()).thenReturn(true); try { mSpiedTutorialHandler.onStateChanged(STATE_NONE); } catch (ClassCastException e) { @@ -110,19 +101,19 @@ public class OneHandedTutorialHandlerTest extends OneHandedTestCase { @Test public void testOnStateChangedNone_shouldNotAttachWindow() { - when(mSpiedTutorialHandler.canShowTutorial()).thenReturn(true); + when(mSpiedTutorialHandler.isShowing()).thenReturn(true); try { mSpiedTutorialHandler.onStateChanged(STATE_NONE); } catch (ClassCastException e) { // no-op, just assert setTutorialShownCountIncrement() never be called } - verify(mSpiedTutorialHandler, never()).setTutorialShownCountIncrement(); + verify(mSpiedTutorialHandler, never()).createViewAndAttachToWindow(any()); } @Test public void testOnConfigurationChanged_shouldUpdateViewContent() { - when(mSpiedTutorialHandler.canShowTutorial()).thenReturn(true); + when(mSpiedTutorialHandler.isShowing()).thenReturn(true); try { mSpiedTutorialHandler.onStateChanged(STATE_ENTERING); } catch (ClassCastException e) { -- cgit v1.2.3 From 76761e8b6baffbc1c7e3a99eb3c87fc817732144 Mon Sep 17 00:00:00 2001 From: Lais Andrade Date: Fri, 9 Jul 2021 12:10:06 +0100 Subject: Fix concurrent external vibrations on ExternalVibratorService The ongoing external vibration should be muted via IExternalVibrationController and the service should not set external control on the vibrator more than once. Fix service to mute ongoing external vibration at the time it's cancelled and to skip calls to setExternalControl when it's already set. Fix: 193127756 Test: VibratorManagerServiceTest Change-Id: If61f5fd2c41dc6d15655d9ce537c858caaf530c6 --- .../server/vibrator/VibratorManagerService.java | 32 ++++++---- .../vibrator/FakeVibratorControllerProvider.java | 7 +++ .../vibrator/VibratorManagerServiceTest.java | 73 ++++++++++++++++++++++ 3 files changed, 100 insertions(+), 12 deletions(-) diff --git a/services/core/java/com/android/server/vibrator/VibratorManagerService.java b/services/core/java/com/android/server/vibrator/VibratorManagerService.java index fb8498ec73c1..2a47512bb147 100644 --- a/services/core/java/com/android/server/vibrator/VibratorManagerService.java +++ b/services/core/java/com/android/server/vibrator/VibratorManagerService.java @@ -1301,7 +1301,8 @@ public class VibratorManagerService extends IVibratorManagerService.Stub { } /** Implementation of {@link IExternalVibratorService} to be triggered on external control. */ - private final class ExternalVibratorService extends IExternalVibratorService.Stub { + @VisibleForTesting + final class ExternalVibratorService extends IExternalVibratorService.Stub { ExternalVibrationDeathRecipient mCurrentExternalDeathRecipient; @Override @@ -1332,6 +1333,7 @@ public class VibratorManagerService extends IVibratorManagerService.Stub { return vibHolder.scale; } + ExternalVibrationHolder cancelingExternalVibration = null; VibrationThread cancelingVibration = null; int scale; synchronized (mLock) { @@ -1350,16 +1352,18 @@ public class VibratorManagerService extends IVibratorManagerService.Stub { cancelingVibration = mCurrentVibration; } } else { + // At this point we have an externally controlled vibration playing already. + // Since the interface defines that only one externally controlled vibration can + // play at a time, we need to first mute the ongoing vibration and then return + // a scale from this function for the new one. Ee can be assured that the + // ongoing it will be muted in favor of the new vibration. + // + // Note that this doesn't support multiple concurrent external controls, as we + // would need to mute the old one still if it came from a different controller. + mCurrentExternalVibration.externalVibration.mute(); endVibrationLocked(mCurrentExternalVibration, Vibration.Status.CANCELLED); + cancelingExternalVibration = mCurrentExternalVibration; } - // At this point we either have an externally controlled vibration playing, or - // no vibration playing. Since the interface defines that only one externally - // controlled vibration can play at a time, by returning something other than - // SCALE_MUTE from this function we can be assured that if we are currently - // playing vibration, it will be muted in favor of the new vibration. - // - // Note that this doesn't support multiple concurrent external controls, as we - // would need to mute the old one still if it came from a different controller. mCurrentExternalVibration = new ExternalVibrationHolder(vib); mCurrentExternalDeathRecipient = new ExternalVibrationDeathRecipient(); vib.linkToDeath(mCurrentExternalDeathRecipient); @@ -1376,10 +1380,14 @@ public class VibratorManagerService extends IVibratorManagerService.Stub { + "external control", e); } } - if (DEBUG) { - Slog.d(TAG, "Vibrator going under external control."); + if (cancelingExternalVibration == null) { + // We only need to set external control if it was not already set by another + // external vibration. + if (DEBUG) { + Slog.d(TAG, "Vibrator going under external control."); + } + setExternalControl(true); } - setExternalControl(true); if (DEBUG) { Slog.e(TAG, "Playing external vibration: " + vib); } diff --git a/services/tests/servicestests/src/com/android/server/vibrator/FakeVibratorControllerProvider.java b/services/tests/servicestests/src/com/android/server/vibrator/FakeVibratorControllerProvider.java index 0449e4450d06..75f8a44c6f86 100644 --- a/services/tests/servicestests/src/com/android/server/vibrator/FakeVibratorControllerProvider.java +++ b/services/tests/servicestests/src/com/android/server/vibrator/FakeVibratorControllerProvider.java @@ -46,6 +46,7 @@ final class FakeVibratorControllerProvider { private final List mEffectSegments = new ArrayList<>(); private final List mBraking = new ArrayList<>(); private final List mAmplitudes = new ArrayList<>(); + private final List mExternalControlStates = new ArrayList<>(); private final Handler mHandler; private final FakeNativeWrapper mNativeWrapper; @@ -139,6 +140,7 @@ final class FakeVibratorControllerProvider { @Override public void setExternalControl(boolean enabled) { + mExternalControlStates.add(enabled); } @Override @@ -301,6 +303,11 @@ final class FakeVibratorControllerProvider { return new ArrayList<>(mEffectSegments); } + /** Return list of states set for external control to the fake vibrator hardware. */ + public List getExternalControlStates() { + return mExternalControlStates; + } + /** * Return the {@link PrebakedSegment} effect enabled with given id, or {@code null} if * missing or disabled. diff --git a/services/tests/servicestests/src/com/android/server/vibrator/VibratorManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/vibrator/VibratorManagerServiceTest.java index 77003b2e091a..5a00e0d6530d 100644 --- a/services/tests/servicestests/src/com/android/server/vibrator/VibratorManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/vibrator/VibratorManagerServiceTest.java @@ -35,6 +35,7 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import android.app.AppOpsManager; @@ -50,8 +51,11 @@ import android.hardware.vibrator.IVibratorManager; import android.media.AudioAttributes; import android.media.AudioManager; import android.os.CombinedVibration; +import android.os.ExternalVibration; import android.os.Handler; import android.os.IBinder; +import android.os.IExternalVibrationController; +import android.os.IExternalVibratorService; import android.os.IVibratorStateListener; import android.os.Looper; import android.os.PowerManager; @@ -108,6 +112,8 @@ public class VibratorManagerServiceTest { private static final PowerSaveState NORMAL_POWER_STATE = new PowerSaveState.Builder().build(); private static final PowerSaveState LOW_POWER_STATE = new PowerSaveState.Builder() .setBatterySaverEnabled(true).build(); + private static final AudioAttributes AUDIO_ATTRS = + new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_ALARM).build(); private static final VibrationAttributes ALARM_ATTRS = new VibrationAttributes.Builder().setUsage(VibrationAttributes.USAGE_ALARM).build(); private static final VibrationAttributes HAPTIC_FEEDBACK_ATTRS = @@ -136,6 +142,7 @@ public class VibratorManagerServiceTest { private TestLooper mTestLooper; private FakeVibrator mVibrator; private PowerManagerInternal.LowPowerModeListener mRegisteredPowerModeListener; + private VibratorManagerService.ExternalVibratorService mExternalVibratorService; @Before public void setUp() throws Exception { @@ -208,6 +215,9 @@ public class VibratorManagerServiceTest { @Override void addService(String name, IBinder service) { + Object serviceInstance = service; + mExternalVibratorService = + (VibratorManagerService.ExternalVibratorService) serviceInstance; } }); } @@ -967,6 +977,69 @@ public class VibratorManagerServiceTest { assertTrue(waitUntil(s -> !s.isVibrating(1), service, TEST_TIMEOUT_MILLIS)); } + @Test + public void onExternalVibration_setsExternalControl() { + mockVibrators(1); + mVibratorProviders.get(1).setCapabilities(IVibrator.CAP_EXTERNAL_CONTROL); + createSystemReadyService(); + + ExternalVibration externalVibration = new ExternalVibration(UID, PACKAGE_NAME, AUDIO_ATTRS, + mock(IExternalVibrationController.class)); + int scale = mExternalVibratorService.onExternalVibrationStart(externalVibration); + mExternalVibratorService.onExternalVibrationStop(externalVibration); + + assertEquals(IExternalVibratorService.SCALE_NONE, scale); + assertEquals(Arrays.asList(true, false), + mVibratorProviders.get(1).getExternalControlStates()); + } + + @Test + public void onExternalVibration_withOngoingExternalVibration_mutesPreviousVibration() + throws Exception { + mockVibrators(1); + mVibratorProviders.get(1).setCapabilities(IVibrator.CAP_EXTERNAL_CONTROL); + createSystemReadyService(); + + IExternalVibrationController firstController = mock(IExternalVibrationController.class); + IExternalVibrationController secondController = mock(IExternalVibrationController.class); + ExternalVibration firstVibration = new ExternalVibration(UID, PACKAGE_NAME, AUDIO_ATTRS, + firstController); + int firstScale = mExternalVibratorService.onExternalVibrationStart(firstVibration); + + ExternalVibration secondVibration = new ExternalVibration(UID, PACKAGE_NAME, AUDIO_ATTRS, + secondController); + int secondScale = mExternalVibratorService.onExternalVibrationStart(secondVibration); + + assertEquals(IExternalVibratorService.SCALE_NONE, firstScale); + assertEquals(IExternalVibratorService.SCALE_NONE, secondScale); + verify(firstController).mute(); + verifyNoMoreInteractions(secondController); + // Set external control called only once. + assertEquals(Arrays.asList(true), mVibratorProviders.get(1).getExternalControlStates()); + } + + @Test + public void onExternalVibration_withOngoingVibration_cancelsOngoingVibrationImmediately() + throws Exception { + mockVibrators(1); + mVibratorProviders.get(1).setCapabilities(IVibrator.CAP_EXTERNAL_CONTROL, + IVibrator.CAP_AMPLITUDE_CONTROL); + VibratorManagerService service = createSystemReadyService(); + + VibrationEffect effect = VibrationEffect.createOneShot(10 * TEST_TIMEOUT_MILLIS, 100); + vibrate(service, effect, HAPTIC_FEEDBACK_ATTRS); + assertTrue(waitUntil(s -> s.isVibrating(1), service, TEST_TIMEOUT_MILLIS)); + + ExternalVibration externalVibration = new ExternalVibration(UID, PACKAGE_NAME, AUDIO_ATTRS, + mock(IExternalVibrationController.class)); + int scale = mExternalVibratorService.onExternalVibrationStart(externalVibration); + assertEquals(IExternalVibratorService.SCALE_NONE, scale); + + // Vibration is cancelled. + assertTrue(waitUntil(s -> !s.isVibrating(1), service, TEST_TIMEOUT_MILLIS)); + assertEquals(Arrays.asList(true), mVibratorProviders.get(1).getExternalControlStates()); + } + private VibrationEffectSegment expectedPrebaked(int effectId) { return new PrebakedSegment(effectId, false, VibrationEffect.EFFECT_STRENGTH_MEDIUM); } -- cgit v1.2.3 From 5ba3e1fec4e23dcf700c6f259a052bfa8aa0ab16 Mon Sep 17 00:00:00 2001 From: Santos Cordon Date: Mon, 21 Jun 2021 17:54:38 +0100 Subject: Add limitations to HDR. 1. Only allow HDR if HDR takes up more than 50% of the screen. 2. Scale normal brightness range to HDR levels. To do this, we now keep the normal brightness range when HDR is enabled and scale the brightness value to the higher HBM range. This allows HDR to scale as it did previous as well as function as expected when automatic-brightness is off. 3. Add more logging to HBMController dumpsys. Bug: 187804126 Bug: 188479946 Bug: 189384189 Test: atest com.android.server.display Change-Id: I515a9ee7ca16bcf8070b1cdab09943b68f038949 --- .../display/AutomaticBrightnessController.java | 1 - .../server/display/DisplayManagerService.java | 10 +- .../server/display/DisplayPowerController.java | 24 +++-- .../display/HighBrightnessModeController.java | 114 +++++++++++++++------ .../display/HighBrightnessModeControllerTest.java | 36 ++++--- 5 files changed, 121 insertions(+), 64 deletions(-) diff --git a/services/core/java/com/android/server/display/AutomaticBrightnessController.java b/services/core/java/com/android/server/display/AutomaticBrightnessController.java index a4a5f96c7358..cb2cd140677e 100644 --- a/services/core/java/com/android/server/display/AutomaticBrightnessController.java +++ b/services/core/java/com/android/server/display/AutomaticBrightnessController.java @@ -778,7 +778,6 @@ class AutomaticBrightnessController { mScreenBrightnessThresholds.getBrighteningThreshold(newScreenAutoBrightness)); mScreenDarkeningThreshold = clampScreenBrightness( mScreenBrightnessThresholds.getDarkeningThreshold(newScreenAutoBrightness)); - mHbmController.onAutoBrightnessChanged(mScreenAutoBrightness); if (sendUpdate) { mCallbacks.updateBrightness(); diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java index 9d8ca9a2c26a..0038523fa43a 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -1281,6 +1281,11 @@ public final class DisplayManagerService extends SystemService { sendDisplayEventLocked(displayId, DisplayManagerGlobal.EVENT_DISPLAY_CHANGED); scheduleTraversalLocked(false); mPersistentDataStore.saveIfNeeded(); + + DisplayPowerController dpc = mDisplayPowerControllers.get(displayId); + if (dpc != null) { + dpc.onDisplayChanged(); + } } private void handleLogicalDisplayFrameRateOverridesChangedLocked( @@ -1312,11 +1317,6 @@ public final class DisplayManagerService extends SystemService { if (work != null) { mHandler.post(work); } - final int displayId = display.getDisplayIdLocked(); - DisplayPowerController dpc = mDisplayPowerControllers.get(displayId); - if (dpc != null) { - dpc.onDisplayChanged(); - } handleLogicalDisplayChangedLocked(display); } diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index 20d364ea16e2..8102f5dfce8b 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController.java +++ b/services/core/java/com/android/server/display/DisplayPowerController.java @@ -511,7 +511,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mSkipScreenOnBrightnessRamp = resources.getBoolean( com.android.internal.R.bool.config_skipScreenOnBrightnessRamp); - mHbmController = createHbmController(); + mHbmController = createHbmControllerLocked(); // Seed the cached brightness saveBrightnessInfo(getScreenBrightnessSetting()); @@ -717,6 +717,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call final String uniqueId = device.getUniqueId(); final DisplayDeviceConfig config = device.getDisplayDeviceConfig(); final IBinder token = device.getDisplayTokenLocked(); + final DisplayDeviceInfo info = device.getDisplayDeviceInfoLocked(); mHandler.post(() -> { if (mDisplayDevice == device) { return; @@ -724,7 +725,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mDisplayDevice = device; mUniqueDisplayId = uniqueId; mDisplayDeviceConfig = config; - loadFromDisplayDeviceConfig(token); + loadFromDisplayDeviceConfig(token, info); }); } @@ -765,7 +766,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call } } - private void loadFromDisplayDeviceConfig(IBinder token) { + private void loadFromDisplayDeviceConfig(IBinder token, DisplayDeviceInfo info) { // All properties that depend on the associated DisplayDevice and the DDC must be // updated here. loadAmbientLightSensor(); @@ -774,7 +775,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call loadNitsRange(mContext.getResources()); setUpAutoBrightness(mContext.getResources(), mHandler); reloadReduceBrightColours(); - mHbmController.resetHbmData(token, mDisplayDeviceConfig.getHighBrightnessModeData()); + mHbmController.resetHbmData(info.width, info.height, token, + mDisplayDeviceConfig.getHighBrightnessModeData(), mBrightnessSetting); } private void sendUpdatePowerState() { @@ -1343,6 +1345,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call if (mHbmController.getHighBrightnessMode() == BrightnessInfo.HIGH_BRIGHTNESS_MODE_HDR && ((mBrightnessReason.modifier & BrightnessReason.MODIFIER_DIMMED) == 0 || (mBrightnessReason.modifier & BrightnessReason.MODIFIER_LOW_POWER) == 0)) { + // We want to scale HDR brightness level with the SDR level animateValue = mHbmController.getHdrBrightnessValue(); } @@ -1514,21 +1517,22 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call } } - private HighBrightnessModeController createHbmController() { - final DisplayDeviceConfig ddConfig = - mLogicalDisplay.getPrimaryDisplayDeviceLocked().getDisplayDeviceConfig(); + private HighBrightnessModeController createHbmControllerLocked() { + final DisplayDevice device = mLogicalDisplay.getPrimaryDisplayDeviceLocked(); + final DisplayDeviceConfig ddConfig = device.getDisplayDeviceConfig(); final IBinder displayToken = mLogicalDisplay.getPrimaryDisplayDeviceLocked().getDisplayTokenLocked(); final DisplayDeviceConfig.HighBrightnessModeData hbmData = ddConfig != null ? ddConfig.getHighBrightnessModeData() : null; - return new HighBrightnessModeController(mHandler, displayToken, PowerManager.BRIGHTNESS_MIN, - PowerManager.BRIGHTNESS_MAX, hbmData, + final DisplayDeviceInfo info = device.getDisplayDeviceInfoLocked(); + return new HighBrightnessModeController(mHandler, info.width, info.height, displayToken, + PowerManager.BRIGHTNESS_MIN, PowerManager.BRIGHTNESS_MAX, hbmData, () -> { sendUpdatePowerStateLocked(); mHandler.post(mOnBrightnessChangeRunnable); // TODO(b/192258832): Switch the HBMChangeCallback to a listener pattern. mAutomaticBrightnessController.update(); - }, mContext); + }, mContext, mBrightnessSetting); } private void blockScreenOn() { diff --git a/services/core/java/com/android/server/display/HighBrightnessModeController.java b/services/core/java/com/android/server/display/HighBrightnessModeController.java index d6294223556d..e0b4d47de0ee 100644 --- a/services/core/java/com/android/server/display/HighBrightnessModeController.java +++ b/services/core/java/com/android/server/display/HighBrightnessModeController.java @@ -31,11 +31,13 @@ import android.os.SystemClock; import android.os.Temperature; import android.os.UserHandle; import android.provider.Settings; +import android.util.MathUtils; import android.util.Slog; import android.util.TimeUtils; import android.view.SurfaceControlHdrLayerInfoListener; import com.android.internal.annotations.VisibleForTesting; +import com.android.server.display.BrightnessSetting.BrightnessSettingListener; import com.android.server.display.DisplayDeviceConfig.HighBrightnessModeData; import com.android.server.display.DisplayManagerService.Clock; @@ -56,6 +58,8 @@ class HighBrightnessModeController { private static final boolean DEBUG = false; + private static final float HDR_PERCENT_OF_SCREEN_REQUIRED = 0.50f; + private final float mBrightnessMin; private final float mBrightnessMax; private final Handler mHandler; @@ -66,6 +70,7 @@ class HighBrightnessModeController { private final Context mContext; private final SettingsObserver mSettingsObserver; private final Injector mInjector; + private final BrightnessSettingListener mBrightnessSettingListener = this::onBrightnessChanged; private SurfaceControlHdrLayerInfoListener mHdrListener; private HighBrightnessModeData mHbmData; @@ -74,11 +79,15 @@ class HighBrightnessModeController { private boolean mIsInAllowedAmbientRange = false; private boolean mIsTimeAvailable = false; private boolean mIsAutoBrightnessEnabled = false; - private float mAutoBrightness; + private float mBrightness; private int mHbmMode = BrightnessInfo.HIGH_BRIGHTNESS_MODE_OFF; private boolean mIsHdrLayerPresent = false; private boolean mIsThermalStatusWithinLimit = true; private boolean mIsBlockedByLowPowerMode = false; + private int mWidth; + private int mHeight; + private BrightnessSetting mBrightnessSetting; + private float mAmbientLux; /** * If HBM is currently running, this is the start time for the current HBM session. @@ -92,30 +101,32 @@ class HighBrightnessModeController { */ private LinkedList mEvents = new LinkedList<>(); - HighBrightnessModeController(Handler handler, IBinder displayToken, float brightnessMin, - float brightnessMax, HighBrightnessModeData hbmData, Runnable hbmChangeCallback, - Context context) { - this(new Injector(), handler, displayToken, brightnessMin, brightnessMax, - hbmData, hbmChangeCallback, context); + HighBrightnessModeController(Handler handler, int width, int height, IBinder displayToken, + float brightnessMin, float brightnessMax, HighBrightnessModeData hbmData, + Runnable hbmChangeCallback, Context context, BrightnessSetting brightnessSetting) { + this(new Injector(), handler, width, height, displayToken, brightnessMin, brightnessMax, + hbmData, hbmChangeCallback, context, brightnessSetting); } @VisibleForTesting - HighBrightnessModeController(Injector injector, Handler handler, IBinder displayToken, - float brightnessMin, float brightnessMax, HighBrightnessModeData hbmData, - Runnable hbmChangeCallback, Context context) { + HighBrightnessModeController(Injector injector, Handler handler, int width, int height, + IBinder displayToken, float brightnessMin, float brightnessMax, + HighBrightnessModeData hbmData, Runnable hbmChangeCallback, + Context context, BrightnessSetting brightnessSetting) { mInjector = injector; + mContext = context; mClock = injector.getClock(); mHandler = handler; mBrightnessMin = brightnessMin; mBrightnessMax = brightnessMax; + mBrightness = brightnessSetting.getBrightness(); mHbmChangeCallback = hbmChangeCallback; - mContext = context; - mAutoBrightness = PowerManager.BRIGHTNESS_INVALID_FLOAT; - mRecalcRunnable = this::recalculateTimeAllowance; - mHdrListener = new HdrListener(); mSkinThermalStatusObserver = new SkinThermalStatusObserver(mInjector, mHandler); mSettingsObserver = new SettingsObserver(mHandler); - resetHbmData(displayToken, hbmData); + mRecalcRunnable = this::recalculateTimeAllowance; + mHdrListener = new HdrListener(); + + resetHbmData(width, height, displayToken, hbmData, brightnessSetting); } void setAutoBrightnessEnabled(boolean isEnabled) { @@ -123,7 +134,7 @@ class HighBrightnessModeController { return; } if (DEBUG) { - Slog.d(TAG, "setAutoBrightness( " + isEnabled + " )"); + Slog.d(TAG, "setAutoBrightnessEnabled( " + isEnabled + " )"); } mIsAutoBrightnessEnabled = isEnabled; mIsInAllowedAmbientRange = false; // reset when auto-brightness switches @@ -147,11 +158,22 @@ class HighBrightnessModeController { } } + float getNormalBrightnessMax() { + return deviceSupportsHbm() ? mHbmData.transitionPoint : mBrightnessMax; + } + float getHdrBrightnessValue() { - return mBrightnessMax; + // For HDR brightness, we take the current brightness and scale it to the max. The reason + // we do this is because we want brightness to go to HBM max when it would normally go + // to normal max, meaning it should not wait to go to 10000 lux (or whatever the transition + // point happens to be) in order to go full HDR. Likewise, HDR on manual brightness should + // automatically scale the brightness without forcing the user to adjust to higher values. + return MathUtils.map(getCurrentBrightnessMin(), getCurrentBrightnessMax(), + mBrightnessMin, mBrightnessMax, mBrightness); } void onAmbientLuxChange(float ambientLux) { + mAmbientLux = ambientLux; if (!deviceSupportsHbm() || !mIsAutoBrightnessEnabled) { return; } @@ -163,17 +185,17 @@ class HighBrightnessModeController { } } - void onAutoBrightnessChanged(float autoBrightness) { + @VisibleForTesting + void onBrightnessChanged(float brightness) { if (!deviceSupportsHbm()) { return; } - final float oldAutoBrightness = mAutoBrightness; - mAutoBrightness = autoBrightness; + mBrightness = brightness; // If we are starting or ending a high brightness mode session, store the current // session in mRunningStartTimeMillis, or the old one in mEvents. final boolean wasHbmDrainingAvailableTime = mRunningStartTimeMillis != -1; - final boolean shouldHbmDrainAvailableTime = mAutoBrightness > mHbmData.transitionPoint + final boolean shouldHbmDrainAvailableTime = mBrightness > mHbmData.transitionPoint && !mIsHdrLayerPresent; if (wasHbmDrainingAvailableTime != shouldHbmDrainAvailableTime) { final long currentTime = mClock.uptimeMillis(); @@ -202,8 +224,12 @@ class HighBrightnessModeController { mSettingsObserver.stopObserving(); } - void resetHbmData(IBinder displayToken, HighBrightnessModeData hbmData) { + void resetHbmData(int width, int height, IBinder displayToken, HighBrightnessModeData hbmData, + BrightnessSetting brightnessSetting) { + mWidth = width; + mHeight = height; mHbmData = hbmData; + resetBrightnessSetting(brightnessSetting); unregisterHdrListener(); mSkinThermalStatusObserver.stopObserving(); mSettingsObserver.stopObserving(); @@ -227,21 +253,23 @@ class HighBrightnessModeController { private void dumpLocal(PrintWriter pw) { pw.println("HighBrightnessModeController:"); + pw.println(" mBrightness=" + mBrightness); pw.println(" mCurrentMin=" + getCurrentBrightnessMin()); pw.println(" mCurrentMax=" + getCurrentBrightnessMax()); pw.println(" mHbmMode=" + BrightnessInfo.hbmToString(mHbmMode)); - pw.println(" remainingTime=" + calculateRemainingTime(mClock.uptimeMillis())); pw.println(" mHbmData=" + mHbmData); + pw.println(" mAmbientLux=" + mAmbientLux); pw.println(" mIsInAllowedAmbientRange=" + mIsInAllowedAmbientRange); - pw.println(" mIsTimeAvailable= " + mIsTimeAvailable); pw.println(" mIsAutoBrightnessEnabled=" + mIsAutoBrightnessEnabled); - pw.println(" mAutoBrightness=" + mAutoBrightness); pw.println(" mIsHdrLayerPresent=" + mIsHdrLayerPresent); pw.println(" mBrightnessMin=" + mBrightnessMin); pw.println(" mBrightnessMax=" + mBrightnessMax); + pw.println(" remainingTime=" + calculateRemainingTime(mClock.uptimeMillis())); + pw.println(" mIsTimeAvailable= " + mIsTimeAvailable); pw.println(" mRunningStartTimeMillis=" + TimeUtils.formatUptime(mRunningStartTimeMillis)); pw.println(" mIsThermalStatusWithinLimit=" + mIsThermalStatusWithinLimit); pw.println(" mIsBlockedByLowPowerMode=" + mIsBlockedByLowPowerMode); + pw.println(" width*height=" + mWidth + "*" + mHeight); pw.println(" mEvents="); final long currentTime = mClock.uptimeMillis(); long lastStartTime = currentTime; @@ -268,9 +296,26 @@ class HighBrightnessModeController { return event.startTimeMillis; } + private void resetBrightnessSetting(BrightnessSetting brightnessSetting) { + if (mBrightnessSetting != null) { + mBrightnessSetting.unregisterListener(mBrightnessSettingListener); + } + mBrightnessSetting = brightnessSetting; + if (mBrightnessSetting != null) { + mBrightnessSetting.registerListener(mBrightnessSettingListener); + } + } + private boolean isCurrentlyAllowed() { - return mIsHdrLayerPresent - || (mIsAutoBrightnessEnabled && mIsTimeAvailable && mIsInAllowedAmbientRange + // Returns true if HBM is allowed (above the ambient lux threshold) and there's still + // time within the current window for additional HBM usage. We return false if there is an + // HDR layer because we don't want the brightness MAX to change for HDR, which has its + // brightness scaled in a different way than sunlight HBM that doesn't require changing + // the MAX. HDR also needs to work under manual brightness which never adjusts the + // brightness maximum; so we implement HDR-HBM in a way that doesn't adjust the max. + // See {@link #getHdrBrightnessValue}. + return !mIsHdrLayerPresent + && (mIsAutoBrightnessEnabled && mIsTimeAvailable && mIsInAllowedAmbientRange && mIsThermalStatusWithinLimit && !mIsBlockedByLowPowerMode); } @@ -334,13 +379,13 @@ class HighBrightnessModeController { // or if brightness is already in the high range, if there is any time left at all. final boolean isAllowedWithoutRestrictions = remainingTime >= mHbmData.timeMinMillis; final boolean isOnlyAllowedToStayOn = !isAllowedWithoutRestrictions - && remainingTime > 0 && mAutoBrightness > mHbmData.transitionPoint; + && remainingTime > 0 && mBrightness > mHbmData.transitionPoint; mIsTimeAvailable = isAllowedWithoutRestrictions || isOnlyAllowedToStayOn; // Calculate the time at which we want to recalculate mIsTimeAvailable in case a lux or // brightness change doesn't happen before then. long nextTimeout = -1; - if (mAutoBrightness > mHbmData.transitionPoint) { + if (mBrightness > mHbmData.transitionPoint) { // if we're in high-lux now, timeout when we run out of allowed time. nextTimeout = currentTime + remainingTime; } else if (!mIsTimeAvailable && mEvents.size() > 0) { @@ -370,7 +415,7 @@ class HighBrightnessModeController { + ", mIsInAllowedAmbientRange: " + mIsInAllowedAmbientRange + ", mIsThermalStatusWithinLimit: " + mIsThermalStatusWithinLimit + ", mIsBlockedByLowPowerMode: " + mIsBlockedByLowPowerMode - + ", brightness: " + mAutoBrightness + + ", mBrightness: " + mBrightness + ", RunningStartTimeMillis: " + mRunningStartTimeMillis + ", nextTimeout: " + (nextTimeout != -1 ? (nextTimeout - currentTime) : -1) + ", events: " + mEvents); @@ -447,11 +492,12 @@ class HighBrightnessModeController { public void onHdrInfoChanged(IBinder displayToken, int numberOfHdrLayers, int maxW, int maxH, int flags) { mHandler.post(() -> { - mIsHdrLayerPresent = numberOfHdrLayers > 0; - // Calling the auto-brightness update so that we can recalculate - // auto-brightness with HDR in mind. When HDR layers are present, - // we don't limit auto-brightness' HBM time limits. - onAutoBrightnessChanged(mAutoBrightness); + mIsHdrLayerPresent = numberOfHdrLayers > 0 + && (float) (maxW * maxH) + >= ((float) (mWidth * mHeight) * HDR_PERCENT_OF_SCREEN_REQUIRED); + // Calling the brightness update so that we can recalculate + // brightness with HDR in mind. + onBrightnessChanged(mBrightness); }); } } diff --git a/services/tests/servicestests/src/com/android/server/display/HighBrightnessModeControllerTest.java b/services/tests/servicestests/src/com/android/server/display/HighBrightnessModeControllerTest.java index fbcf53d3bd4a..7243947db944 100644 --- a/services/tests/servicestests/src/com/android/server/display/HighBrightnessModeControllerTest.java +++ b/services/tests/servicestests/src/com/android/server/display/HighBrightnessModeControllerTest.java @@ -74,6 +74,9 @@ public class HighBrightnessModeControllerTest { private static final float DEFAULT_MIN = 0.01f; private static final float DEFAULT_MAX = 0.80f; + private static final int DISPLAY_WIDTH = 900; + private static final int DISPLAY_HEIGHT = 1600; + private static final float EPSILON = 0.000001f; private OffsettableClock mClock; @@ -90,6 +93,8 @@ public class HighBrightnessModeControllerTest { @Captor ArgumentCaptor mThermalEventListenerCaptor; + @Mock private BrightnessSetting mBrightnessSetting; + private static final HighBrightnessModeData DEFAULT_HBM_DATA = new HighBrightnessModeData(MINIMUM_LUX, TRANSITION_POINT, TIME_WINDOW_MILLIS, TIME_ALLOWED_IN_WINDOW_MILLIS, TIME_MINIMUM_AVAILABLE_TO_ENABLE_MILLIS, @@ -98,6 +103,8 @@ public class HighBrightnessModeControllerTest { @Before public void setUp() { MockitoAnnotations.initMocks(this); + mClock = new OffsettableClock.Stopped(); + mTestLooper = new TestLooper(mClock::now); mDisplayToken = null; mContextSpy = spy(new ContextWrapper(ApplicationProvider.getApplicationContext())); final MockContentResolver resolver = mSettingsProviderRule.mockContentResolver(mContextSpy); @@ -114,8 +121,8 @@ public class HighBrightnessModeControllerTest { public void testNoHbmData() { initHandler(null); final HighBrightnessModeController hbmc = new HighBrightnessModeController( - mInjectorMock, mHandler, mDisplayToken, DEFAULT_MIN, DEFAULT_MAX, null, - () -> {}, mContextSpy); + mInjectorMock, mHandler, DISPLAY_WIDTH, DISPLAY_HEIGHT, mDisplayToken, DEFAULT_MIN, + DEFAULT_MAX, null, () -> {}, mContextSpy, mBrightnessSetting); assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_OFF); } @@ -123,8 +130,8 @@ public class HighBrightnessModeControllerTest { public void testNoHbmData_Enabled() { initHandler(null); final HighBrightnessModeController hbmc = new HighBrightnessModeController( - mInjectorMock, mHandler, mDisplayToken, DEFAULT_MIN, DEFAULT_MAX, null, - () -> {}, mContextSpy); + mInjectorMock, mHandler, DISPLAY_WIDTH, DISPLAY_HEIGHT, mDisplayToken, DEFAULT_MIN, + DEFAULT_MAX, null, () -> {}, mContextSpy, mBrightnessSetting); hbmc.setAutoBrightnessEnabled(true); hbmc.onAmbientLuxChange(MINIMUM_LUX - 1); // below allowed range assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_OFF); @@ -180,7 +187,7 @@ public class HighBrightnessModeControllerTest { hbmc.setAutoBrightnessEnabled(true); hbmc.onAmbientLuxChange(MINIMUM_LUX + 1); - hbmc.onAutoBrightnessChanged(TRANSITION_POINT + 0.01f); + hbmc.onBrightnessChanged(TRANSITION_POINT + 0.01f); // Verify we are in HBM assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_SUNLIGHT); @@ -212,7 +219,7 @@ public class HighBrightnessModeControllerTest { hbmc.setAutoBrightnessEnabled(true); hbmc.onAmbientLuxChange(MINIMUM_LUX + 1); - hbmc.onAutoBrightnessChanged(TRANSITION_POINT + 0.01f); + hbmc.onBrightnessChanged(TRANSITION_POINT + 0.01f); // Verify we are in HBM assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_SUNLIGHT); @@ -237,18 +244,18 @@ public class HighBrightnessModeControllerTest { hbmc.setAutoBrightnessEnabled(true); hbmc.onAmbientLuxChange(MINIMUM_LUX + 1); - hbmc.onAutoBrightnessChanged(TRANSITION_POINT + 0.01f); + hbmc.onBrightnessChanged(TRANSITION_POINT + 0.01f); advanceTime(TIME_ALLOWED_IN_WINDOW_MILLIS / 2); // Verify we are in HBM assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_SUNLIGHT); - hbmc.onAutoBrightnessChanged(TRANSITION_POINT - 0.01f); + hbmc.onBrightnessChanged(TRANSITION_POINT - 0.01f); advanceTime(1); assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_SUNLIGHT); - hbmc.onAutoBrightnessChanged(TRANSITION_POINT + 0.01f); + hbmc.onBrightnessChanged(TRANSITION_POINT + 0.01f); advanceTime(TIME_ALLOWED_IN_WINDOW_MILLIS / 2); assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_SUNLIGHT); @@ -267,13 +274,13 @@ public class HighBrightnessModeControllerTest { hbmc.onAmbientLuxChange(MINIMUM_LUX + 1); // Go into HBM for half the allowed window - hbmc.onAutoBrightnessChanged(TRANSITION_POINT + 0.01f); + hbmc.onBrightnessChanged(TRANSITION_POINT + 0.01f); advanceTime(TIME_ALLOWED_IN_WINDOW_MILLIS / 2); assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_SUNLIGHT); // Move lux below threshold (ending first event); hbmc.onAmbientLuxChange(MINIMUM_LUX - 1); - hbmc.onAutoBrightnessChanged(TRANSITION_POINT); + hbmc.onBrightnessChanged(TRANSITION_POINT); assertState(hbmc, DEFAULT_MIN, TRANSITION_POINT, HIGH_BRIGHTNESS_MODE_OFF); // Move up some amount of time so that there's still time in the window even after a @@ -283,7 +290,7 @@ public class HighBrightnessModeControllerTest { // Go into HBM for just under the second half of allowed window hbmc.onAmbientLuxChange(MINIMUM_LUX + 1); - hbmc.onAutoBrightnessChanged(TRANSITION_POINT + 1); + hbmc.onBrightnessChanged(TRANSITION_POINT + 1); advanceTime((TIME_ALLOWED_IN_WINDOW_MILLIS / 2) - 1); assertState(hbmc, DEFAULT_MIN, DEFAULT_MAX, HIGH_BRIGHTNESS_MODE_SUNLIGHT); @@ -355,8 +362,9 @@ public class HighBrightnessModeControllerTest { // Creates instance with standard initialization values. private HighBrightnessModeController createDefaultHbm(OffsettableClock clock) { initHandler(clock); - return new HighBrightnessModeController(mInjectorMock, mHandler, mDisplayToken, DEFAULT_MIN, - DEFAULT_MAX, DEFAULT_HBM_DATA, () -> {}, mContextSpy); + return new HighBrightnessModeController(mInjectorMock, mHandler, DISPLAY_WIDTH, + DISPLAY_HEIGHT, mDisplayToken, DEFAULT_MIN, DEFAULT_MAX, DEFAULT_HBM_DATA, () -> {}, + mContextSpy, mBrightnessSetting); } private void initHandler(OffsettableClock clock) { -- cgit v1.2.3 From 80b340a9aabcf6588b0f0fbc2c240e8f2cd99d3f Mon Sep 17 00:00:00 2001 From: Bill Lin Date: Fri, 9 Jul 2021 20:40:49 +0800 Subject: Improve SystemUIBootiming_StartServices_avg Previously, we tried to tuning boottime of SysUI See go/systemuiboottiming_ohm - Reduce access setting provide at SysUI start-up - Remove unused obervers 1. Timeout 2. TapAppExit - Update mShortcutEnabled state at ctor Test: manual enable OHM shortcut, rebot make sure shortcut function works Test: atest WMShellUnitTests Test: asit/perf/boottime_test Bug: 193225130 Change-Id: I2753f8b1e47622c00b9c6d2f4cd319c6e43634ea --- .../wm/shell/onehanded/OneHandedController.java | 53 +--------------------- .../shell/onehanded/OneHandedControllerTest.java | 7 --- 2 files changed, 1 insertion(+), 59 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java index 54b81ad78256..81cfb2dff211 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java @@ -140,8 +140,6 @@ public class OneHandedController implements RemoteCallable private final ContentObserver mActivatedObserver; private final ContentObserver mEnabledObserver; - private final ContentObserver mTimeoutObserver; - private final ContentObserver mTaskChangeExitObserver; private final ContentObserver mSwipeToNotificationEnabledObserver; private final ContentObserver mShortcutEnabledObserver; @@ -292,8 +290,6 @@ public class OneHandedController implements RemoteCallable mActivatedObserver = getObserver(this::onActivatedActionChanged); mEnabledObserver = getObserver(this::onEnabledSettingChanged); - mTimeoutObserver = getObserver(this::onTimeoutSettingChanged); - mTaskChangeExitObserver = getObserver(this::onTaskChangeExitSettingChanged); mSwipeToNotificationEnabledObserver = getObserver(this::onSwipeToNotificationEnabledChanged); mShortcutEnabledObserver = getObserver(this::onShortcutEnabledChanged); @@ -440,10 +436,6 @@ public class OneHandedController implements RemoteCallable mContext.getContentResolver(), mActivatedObserver, newUserId); mOneHandedSettingsUtil.registerSettingsKeyObserver(Settings.Secure.ONE_HANDED_MODE_ENABLED, mContext.getContentResolver(), mEnabledObserver, newUserId); - mOneHandedSettingsUtil.registerSettingsKeyObserver(Settings.Secure.ONE_HANDED_MODE_TIMEOUT, - mContext.getContentResolver(), mTimeoutObserver, newUserId); - mOneHandedSettingsUtil.registerSettingsKeyObserver(Settings.Secure.TAPS_APP_TO_EXIT, - mContext.getContentResolver(), mTaskChangeExitObserver, newUserId); mOneHandedSettingsUtil.registerSettingsKeyObserver( Settings.Secure.SWIPE_BOTTOM_TO_NOTIFICATION_ENABLED, mContext.getContentResolver(), mSwipeToNotificationEnabledObserver, newUserId); @@ -455,10 +447,6 @@ public class OneHandedController implements RemoteCallable private void unregisterSettingObservers() { mOneHandedSettingsUtil.unregisterSettingsKeyObserver(mContext.getContentResolver(), mEnabledObserver); - mOneHandedSettingsUtil.unregisterSettingsKeyObserver(mContext.getContentResolver(), - mTimeoutObserver); - mOneHandedSettingsUtil.unregisterSettingsKeyObserver(mContext.getContentResolver(), - mTaskChangeExitObserver); mOneHandedSettingsUtil.unregisterSettingsKeyObserver(mContext.getContentResolver(), mSwipeToNotificationEnabledObserver); mOneHandedSettingsUtil.unregisterSettingsKeyObserver(mContext.getContentResolver(), @@ -474,6 +462,7 @@ public class OneHandedController implements RemoteCallable .getSettingsTapsAppToExit(mContext.getContentResolver(), mUserId)); setSwipeToNotificationEnabled(mOneHandedSettingsUtil .getSettingsSwipeToNotificationEnabled(mContext.getContentResolver(), mUserId)); + onShortcutEnabledChanged(); } private void updateDisplayLayout(int displayId) { @@ -546,46 +535,6 @@ public class OneHandedController implements RemoteCallable mContext.getContentResolver(), mUserId), true /* DelayExecute */); } - @VisibleForTesting - void onTimeoutSettingChanged() { - final int newTimeout = mOneHandedSettingsUtil.getSettingsOneHandedModeTimeout( - mContext.getContentResolver(), mUserId); - int metricsId = OneHandedUiEventLogger.OneHandedSettingsTogglesEvent.INVALID.getId(); - switch (newTimeout) { - case OneHandedSettingsUtil.ONE_HANDED_TIMEOUT_NEVER: - metricsId = OneHandedUiEventLogger.EVENT_ONE_HANDED_SETTINGS_TIMEOUT_SECONDS_NEVER; - break; - case OneHandedSettingsUtil.ONE_HANDED_TIMEOUT_SHORT_IN_SECONDS: - metricsId = OneHandedUiEventLogger.EVENT_ONE_HANDED_SETTINGS_TIMEOUT_SECONDS_4; - break; - case OneHandedSettingsUtil.ONE_HANDED_TIMEOUT_MEDIUM_IN_SECONDS: - metricsId = OneHandedUiEventLogger.EVENT_ONE_HANDED_SETTINGS_TIMEOUT_SECONDS_8; - break; - case OneHandedSettingsUtil.ONE_HANDED_TIMEOUT_LONG_IN_SECONDS: - metricsId = OneHandedUiEventLogger.EVENT_ONE_HANDED_SETTINGS_TIMEOUT_SECONDS_12; - break; - default: - // do nothing - break; - } - mOneHandedUiEventLogger.writeEvent(metricsId); - - if (mTimeoutHandler != null) { - mTimeoutHandler.setTimeout(newTimeout); - } - } - - @VisibleForTesting - void onTaskChangeExitSettingChanged() { - final boolean enabled = mOneHandedSettingsUtil.getSettingsTapsAppToExit( - mContext.getContentResolver(), mUserId); - mOneHandedUiEventLogger.writeEvent(enabled - ? OneHandedUiEventLogger.EVENT_ONE_HANDED_SETTINGS_APP_TAPS_EXIT_ON - : OneHandedUiEventLogger.EVENT_ONE_HANDED_SETTINGS_APP_TAPS_EXIT_OFF); - - setTaskChangeToExit(enabled); - } - @VisibleForTesting void onSwipeToNotificationEnabledChanged() { final boolean enabled = diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedControllerTest.java index 9ec7d304d520..b224ae6a19b5 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedControllerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedControllerTest.java @@ -237,13 +237,6 @@ public class OneHandedControllerTest extends OneHandedTestCase { verify(mSpiedOneHandedController).setOneHandedEnabled(anyBoolean()); } - @Test - public void testSettingsObserverUpdateTimeout() { - mSpiedOneHandedController.onTimeoutSettingChanged(); - - verify(mSpiedTimeoutHandler, atLeastOnce()).setTimeout(anyInt()); - } - @Test public void testSettingsObserverUpdateSwipeToNotification() { mSpiedOneHandedController.onSwipeToNotificationEnabledChanged(); -- cgit v1.2.3 From 25fd67372ebc10a03ba587332687b596affdfcf2 Mon Sep 17 00:00:00 2001 From: Michael Wright Date: Wed, 7 Jul 2021 15:04:59 +0100 Subject: Use exact brightnesses values for comparison. Using BrightnessSynchronizer introduced an epsilon value in the comparison. This meant it was possible for brightness changes to never reach min or max if they were made in sufficiently small steps. Given: 1) The need to reach both min and max brightnesses. 2) The increased resolution of brightness controls on devices. 3) The desire to make the framework as independent as possible of brightness resolution. we no longer allow for an epsilon delta. Fixes: 191935286 Test: manual Change-Id: Ie4872fa81aa6f23799cd6b4dfdbfd2a61ec6ce7a --- .../server/display/DisplayManagerService.java | 6 ++---- .../server/display/DisplayPowerController.java | 20 +++++++++--------- .../android/server/display/DisplayPowerState.java | 24 +++++++++------------- .../server/display/LocalDisplayAdapter.java | 12 +++++------ .../com/android/server/display/RampAnimator.java | 6 ++---- 5 files changed, 29 insertions(+), 39 deletions(-) diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java index 79ea108a75d5..fce52bef45f7 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -708,10 +708,8 @@ public final class DisplayManagerService extends SystemService { final BrightnessPair brightnessPair = index < 0 ? null : mDisplayBrightnesses.valueAt(index); if (index < 0 || (mDisplayStates.valueAt(index) == state - && BrightnessSynchronizer.floatEquals( - brightnessPair.brightness, brightnessState) - && BrightnessSynchronizer.floatEquals( - brightnessPair.sdrBrightness, sdrBrightnessState))) { + && brightnessPair.brightness == brightnessState + && brightnessPair.sdrBrightness == sdrBrightnessState)) { return; // Display no longer exists or no change. } diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index 8396f664146d..f7b6e8a9e0d9 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController.java +++ b/services/core/java/com/android/server/display/DisplayPowerController.java @@ -1341,9 +1341,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call final float currentBrightness = mPowerState.getScreenBrightness(); final float currentSdrBrightness = mPowerState.getSdrScreenBrightness(); if (isValidBrightnessValue(animateValue) - && (!BrightnessSynchronizer.floatEquals(animateValue, currentBrightness) - || !BrightnessSynchronizer.floatEquals( - sdrAnimateValue, currentSdrBrightness))) { + && (animateValue != currentBrightness + || sdrAnimateValue != currentSdrBrightness)) { if (initialRampSkip || hasBrightnessBuckets || wasOrWillBeInVr || !isDisplayContentVisible || brightnessIsTemporary) { animateScreenBrightness(animateValue, sdrAnimateValue, @@ -1672,11 +1671,10 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mHbmController.getCurrentBrightnessMin(), mHbmController.getCurrentBrightnessMax()); } - // Checks whether the brightness is within the valid brightness range, not including the off or - // invalid states. - private boolean isValidBrightnessValue(float brightnessState) { - return brightnessState >= PowerManager.BRIGHTNESS_MIN - && brightnessState <= PowerManager.BRIGHTNESS_MAX; + // Checks whether the brightness is within the valid brightness range, not including off. + private boolean isValidBrightnessValue(float brightness) { + return brightness >= PowerManager.BRIGHTNESS_MIN + && brightness <= PowerManager.BRIGHTNESS_MAX; } private void animateScreenBrightness(float target, float sdrTarget, float rate) { @@ -2006,6 +2004,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call } private void putScreenBrightnessSetting(float brightnessValue, boolean updateCurrent) { + if (!isValidBrightnessValue(brightnessValue)) { + return; + } if (updateCurrent) { setCurrentScreenBrightness(brightnessValue); } @@ -2046,8 +2047,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call || mPendingScreenBrightnessSetting < 0.0f)) { return false; } - if (BrightnessSynchronizer.floatEquals( - mCurrentScreenBrightnessSetting, mPendingScreenBrightnessSetting)) { + if (mCurrentScreenBrightnessSetting == mPendingScreenBrightnessSetting) { mPendingScreenBrightnessSetting = PowerManager.BRIGHTNESS_INVALID_FLOAT; mTemporaryScreenBrightness = PowerManager.BRIGHTNESS_INVALID_FLOAT; return false; diff --git a/services/core/java/com/android/server/display/DisplayPowerState.java b/services/core/java/com/android/server/display/DisplayPowerState.java index b58dd38348aa..6af192371e3d 100644 --- a/services/core/java/com/android/server/display/DisplayPowerState.java +++ b/services/core/java/com/android/server/display/DisplayPowerState.java @@ -26,8 +26,6 @@ import android.util.Slog; import android.view.Choreographer; import android.view.Display; -import com.android.internal.display.BrightnessSynchronizer; - import java.io.PrintWriter; /** @@ -166,10 +164,11 @@ final class DisplayPowerState { /** * Sets the display's SDR brightness. * - * @param brightness The brightness, ranges from 0.0f (minimum / off) to 1.0f (brightest). + * @param brightness The brightness, ranges from 0.0f (minimum) to 1.0f (brightest), or is -1f + * (off). */ public void setSdrScreenBrightness(float brightness) { - if (!BrightnessSynchronizer.floatEquals(mSdrScreenBrightness, brightness)) { + if (mSdrScreenBrightness != brightness) { if (DEBUG) { Slog.d(TAG, "setSdrScreenBrightness: brightness=" + brightness); } @@ -192,10 +191,11 @@ final class DisplayPowerState { /** * Sets the display brightness. * - * @param brightness The brightness, ranges from 0.0f (minimum / off) to 1.0f (brightest). + * @param brightness The brightness, ranges from 0.0f (minimum) to 1.0f (brightest), or is -1f + * (off). */ public void setScreenBrightness(float brightness) { - if (!BrightnessSynchronizer.floatEquals(mScreenBrightness, brightness)) { + if (mScreenBrightness != brightness) { if (DEBUG) { Slog.d(TAG, "setScreenBrightness: brightness=" + brightness); } @@ -432,10 +432,8 @@ final class DisplayPowerState { public boolean setState(int state, float brightnessState, float sdrBrightnessState) { synchronized (mLock) { boolean stateChanged = state != mPendingState; - boolean backlightChanged = - !BrightnessSynchronizer.floatEquals(brightnessState, mPendingBacklight) - || !BrightnessSynchronizer.floatEquals( - sdrBrightnessState, mPendingSdrBacklight); + boolean backlightChanged = brightnessState != mPendingBacklight + || sdrBrightnessState != mPendingSdrBacklight; if (stateChanged || backlightChanged) { if (DEBUG) { Slog.d(TAG, "Requesting new screen state: state=" @@ -486,10 +484,8 @@ final class DisplayPowerState { stateChanged = (state != mActualState); brightnessState = mPendingBacklight; sdrBrightnessState = mPendingSdrBacklight; - backlightChanged = - !BrightnessSynchronizer.floatEquals(brightnessState, mActualBacklight) - || !BrightnessSynchronizer.floatEquals( - sdrBrightnessState, mActualSdrBacklight); + backlightChanged = brightnessState != mActualBacklight + || sdrBrightnessState != mActualSdrBacklight; if (!stateChanged) { // State changed applied, notify outer class. postScreenUpdateThreadSafe(); diff --git a/services/core/java/com/android/server/display/LocalDisplayAdapter.java b/services/core/java/com/android/server/display/LocalDisplayAdapter.java index 2f17481f7487..f953cc8c8a27 100644 --- a/services/core/java/com/android/server/display/LocalDisplayAdapter.java +++ b/services/core/java/com/android/server/display/LocalDisplayAdapter.java @@ -648,12 +648,11 @@ final class LocalDisplayAdapter extends DisplayAdapter { public Runnable requestDisplayStateLocked(final int state, final float brightnessState, final float sdrBrightnessState) { // Assume that the brightness is off if the display is being turned off. - assert state != Display.STATE_OFF || BrightnessSynchronizer.floatEquals( - brightnessState, PowerManager.BRIGHTNESS_OFF_FLOAT); + assert state != Display.STATE_OFF + || brightnessState == PowerManager.BRIGHTNESS_OFF_FLOAT; final boolean stateChanged = (mState != state); - final boolean brightnessChanged = - !(BrightnessSynchronizer.floatEquals(mBrightnessState, brightnessState) - && BrightnessSynchronizer.floatEquals(mSdrBrightnessState, sdrBrightnessState)); + final boolean brightnessChanged = mBrightnessState != brightnessState + || mSdrBrightnessState != sdrBrightnessState; if (stateChanged || brightnessChanged) { final long physicalDisplayId = mPhysicalDisplayId; final IBinder token = getDisplayTokenLocked(); @@ -807,8 +806,7 @@ final class LocalDisplayAdapter extends DisplayAdapter { } private float brightnessToBacklight(float brightness) { - if (BrightnessSynchronizer.floatEquals( - brightness, PowerManager.BRIGHTNESS_OFF_FLOAT)) { + if (brightness == PowerManager.BRIGHTNESS_OFF_FLOAT) { return PowerManager.BRIGHTNESS_OFF_FLOAT; } else { return getDisplayDeviceConfig().getBacklightFromBrightness(brightness); diff --git a/services/core/java/com/android/server/display/RampAnimator.java b/services/core/java/com/android/server/display/RampAnimator.java index 20feafa2d19c..ed3b15fb2661 100644 --- a/services/core/java/com/android/server/display/RampAnimator.java +++ b/services/core/java/com/android/server/display/RampAnimator.java @@ -20,8 +20,6 @@ import android.animation.ValueAnimator; import android.util.FloatProperty; import android.view.Choreographer; -import com.android.internal.display.BrightnessSynchronizer; - /** * A custom animator that progressively updates a property value at * a given variable rate until it reaches a particular target value. @@ -157,10 +155,10 @@ class RampAnimator { } final float oldCurrentValue = mCurrentValue; mCurrentValue = mAnimatedValue; - if (!BrightnessSynchronizer.floatEquals(oldCurrentValue, mCurrentValue)) { + if (oldCurrentValue != mCurrentValue) { mProperty.setValue(mObject, mCurrentValue); } - if (!BrightnessSynchronizer.floatEquals(mTargetValue, mCurrentValue)) { + if (mTargetValue != mCurrentValue) { postAnimationCallback(); } else { mAnimating = false; -- cgit v1.2.3 From 4f83d813d6251900a726c37b1408aaf7c063a493 Mon Sep 17 00:00:00 2001 From: Rucha Katakwar Date: Fri, 9 Jul 2021 06:30:55 +0000 Subject: Revert "Camera: Restore FastNative annotation." Bug: 193176503 This reverts commit 99ebd95ef140a14185b729e419abe19c6dc0a678. Reason for revert: Recent flakiness as mentioned in b/193176503.This cl was merged in build:7532561. Any test failures post this build shows exception linked to CameraMetadataNative.Reverting this cl to find and fix the issue. Change-Id: If9fe3ce69f013b842a47745d976942aa71dfb8f6 --- .../camera2/impl/CameraMetadataNative.java | 36 ++++++++-------------- 1 file changed, 12 insertions(+), 24 deletions(-) diff --git a/core/java/android/hardware/camera2/impl/CameraMetadataNative.java b/core/java/android/hardware/camera2/impl/CameraMetadataNative.java index 09fe1020ea59..6cbe107c96f5 100644 --- a/core/java/android/hardware/camera2/impl/CameraMetadataNative.java +++ b/core/java/android/hardware/camera2/impl/CameraMetadataNative.java @@ -1869,40 +1869,28 @@ public class CameraMetadataNative implements Parcelable { @FastNative private static native void nativeUpdate(long dst, long src); - @FastNative - private static native void nativeWriteToParcel(Parcel dest, long ptr); - @FastNative - private static native void nativeReadFromParcel(Parcel source, long ptr); - @FastNative - private static native void nativeSwap(long ptr, long otherPtr) + private static synchronized native void nativeWriteToParcel(Parcel dest, long ptr); + private static synchronized native void nativeReadFromParcel(Parcel source, long ptr); + private static synchronized native void nativeSwap(long ptr, long otherPtr) throws NullPointerException; @FastNative - private static native void nativeClose(long ptr); - @FastNative - private static native boolean nativeIsEmpty(long ptr); - @FastNative - private static native int nativeGetEntryCount(long ptr); - @FastNative - private static native long nativeGetBufferSize(long ptr); - @FastNative private static native void nativeSetVendorId(long ptr, long vendorId); + private static synchronized native void nativeClose(long ptr); + private static synchronized native boolean nativeIsEmpty(long ptr); + private static synchronized native int nativeGetEntryCount(long ptr); + private static synchronized native long nativeGetBufferSize(long ptr); @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) - @FastNative - private static native byte[] nativeReadValues(int tag, long ptr); - @FastNative - private static native void nativeWriteValues(int tag, byte[] src, long ptr); + private static synchronized native byte[] nativeReadValues(int tag, long ptr); + private static synchronized native void nativeWriteValues(int tag, byte[] src, long ptr); private static synchronized native void nativeDump(long ptr) throws IOException; // dump to LOGD - @FastNative - private static native ArrayList nativeGetAllVendorKeys(long ptr, Class keyClass); + private static synchronized native ArrayList nativeGetAllVendorKeys(long ptr, Class keyClass); @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) - @FastNative - private static native int nativeGetTagFromKeyLocal(long ptr, String keyName) + private static synchronized native int nativeGetTagFromKeyLocal(long ptr, String keyName) throws IllegalArgumentException; @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) - @FastNative - private static native int nativeGetTypeFromTagLocal(long ptr, int tag) + private static synchronized native int nativeGetTypeFromTagLocal(long ptr, int tag) throws IllegalArgumentException; @FastNative private static native int nativeGetTagFromKey(String keyName, long vendorId) -- cgit v1.2.3 From 6a5274513a1fbbf728bf81caf09184d1233d554a Mon Sep 17 00:00:00 2001 From: Hans Boehm Date: Thu, 8 Jul 2021 17:21:20 -0700 Subject: Add System.runFinalization() call Lone calls to System.gc() generally don't do anything. Runtime.getRuntime().gc() would force a GC, but it would be ineffective without waiting for reference processing and finalization to complete. Adding the runFinalization() call implicitly makes the preceding GC call effective. Bug: 183912710 Test: Treehugger Change-Id: I0f4806b8e3f9ca898eb7ea1b1c8de14aa94e2646 Merged-In: I0f4806b8e3f9ca898eb7ea1b1c8de14aa94e2646 --- services/java/com/android/server/SystemServer.java | 1 + 1 file changed, 1 insertion(+) diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index d487483cfb56..91d4f7e2a24d 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -552,6 +552,7 @@ public final class SystemServer implements Dumpable { if (maxFd > enableThreshold) { // Do a manual GC to clean up fds that are hanging around as garbage. System.gc(); + System.runFinalization(); maxFd = getMaxFd(); } -- cgit v1.2.3 From 24e3ed6e783d1444ac815b7174840aaedd4730bb Mon Sep 17 00:00:00 2001 From: Nikita Ioffe Date: Fri, 9 Jul 2021 18:25:57 +0100 Subject: Treat APEX installs as upgrades It's not allowed to install a completely new APEX, hence APEX installations should be treated as upgrades. This change allows holders of INSTALL_PACKAGE_UPDATES permission to silently install APEX upgrades. Bug: 193085724 Bug: 190802380 Test: atest StagedInstallInternalTest Change-Id: Idde7644122eeae6c444e3520f66ab1546ba7fdf6 --- .../android/server/pm/PackageInstallerSession.java | 2 +- tests/StagedInstallTest/Android.bp | 3 ++ .../StagedInstallInternalTest.java | 34 ++++++++++++++++++++++ .../host/StagedInstallInternalTest.java | 15 +++++++--- 4 files changed, 49 insertions(+), 5 deletions(-) diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index acc83cfd05b6..6adde9ad25fd 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -957,7 +957,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { android.Manifest.permission.UPDATE_PACKAGES_WITHOUT_USER_ACTION, mInstallerUid) == PackageManager.PERMISSION_GRANTED); final int targetPackageUid = mPm.getPackageUid(packageName, 0, userId); - final boolean isUpdate = targetPackageUid != -1; + final boolean isUpdate = targetPackageUid != -1 || isApexSession(); final InstallSourceInfo existingInstallSourceInfo = isUpdate ? mPm.getInstallSourceInfo(packageName) : null; diff --git a/tests/StagedInstallTest/Android.bp b/tests/StagedInstallTest/Android.bp index c563e06ab528..1aa04996f682 100644 --- a/tests/StagedInstallTest/Android.bp +++ b/tests/StagedInstallTest/Android.bp @@ -33,6 +33,8 @@ android_test_helper_app { java_resources: [ ":com.android.apex.apkrollback.test_v2", ":StagedInstallTestApexV2_WrongSha", + ":test.rebootless_apex_v1", + ":test.rebootless_apex_v2", ], } @@ -54,6 +56,7 @@ java_test_host { ":com.android.apex.cts.shim.v2_prebuilt", ":StagedInstallTestApexV2_WrongSha", ":TestAppAv1", + ":test.rebootless_apex_v1", ], test_suites: ["general-tests"], test_config: "StagedInstallInternalTest.xml", diff --git a/tests/StagedInstallTest/app/src/com/android/tests/stagedinstallinternal/StagedInstallInternalTest.java b/tests/StagedInstallTest/app/src/com/android/tests/stagedinstallinternal/StagedInstallInternalTest.java index 6a62304f9af7..d6b3c27b4b09 100644 --- a/tests/StagedInstallTest/app/src/com/android/tests/stagedinstallinternal/StagedInstallInternalTest.java +++ b/tests/StagedInstallTest/app/src/com/android/tests/stagedinstallinternal/StagedInstallInternalTest.java @@ -23,7 +23,10 @@ import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertWithMessage; import android.Manifest; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageInfo; import android.content.pm.PackageInstaller; +import android.content.pm.PackageManager; import androidx.test.platform.app.InstrumentationRegistry; @@ -192,6 +195,37 @@ public class StagedInstallInternalTest { assertSessionFailedWithMessage(sessionId, "has unexpected SHA512 hash"); } + @Test + public void testRebootlessUpdates() throws Exception { + InstallUtils.dropShellPermissionIdentity(); + InstallUtils.adoptShellPermissionIdentity(Manifest.permission.INSTALL_PACKAGE_UPDATES); + + final PackageManager pm = + InstrumentationRegistry.getInstrumentation().getContext().getPackageManager(); + { + PackageInfo apex = pm.getPackageInfo("test.apex.rebootless", PackageManager.MATCH_APEX); + assertThat(apex.getLongVersionCode()).isEqualTo(1); + assertThat(apex.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) + .isEqualTo(ApplicationInfo.FLAG_SYSTEM); + assertThat(apex.applicationInfo.flags & ApplicationInfo.FLAG_INSTALLED) + .isEqualTo(ApplicationInfo.FLAG_INSTALLED); + assertThat(apex.applicationInfo.sourceDir).startsWith("/system/apex"); + } + + TestApp apex2 = new TestApp("TestRebootlessApexV1", "test.apex.rebootless", 2, + /* isApex= */ true, "test.rebootless_apex_v2.apex"); + Install.single(apex2).commit(); + + { + PackageInfo apex = pm.getPackageInfo("test.apex.rebootless", PackageManager.MATCH_APEX); + assertThat(apex.getLongVersionCode()).isEqualTo(2); + assertThat(apex.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM).isEqualTo(0); + assertThat(apex.applicationInfo.flags & ApplicationInfo.FLAG_INSTALLED) + .isEqualTo(ApplicationInfo.FLAG_INSTALLED); + assertThat(apex.applicationInfo.sourceDir).startsWith("/data/apex/active"); + } + } + private static void assertSessionFailedWithMessage(int sessionId, String msg) { assertSessionState(sessionId, (session) -> { assertThat(session.isStagedSessionFailed()).isTrue(); diff --git a/tests/StagedInstallTest/src/com/android/tests/stagedinstallinternal/host/StagedInstallInternalTest.java b/tests/StagedInstallTest/src/com/android/tests/stagedinstallinternal/host/StagedInstallInternalTest.java index 5d7fdd183dec..e19f97b6c045 100644 --- a/tests/StagedInstallTest/src/com/android/tests/stagedinstallinternal/host/StagedInstallInternalTest.java +++ b/tests/StagedInstallTest/src/com/android/tests/stagedinstallinternal/host/StagedInstallInternalTest.java @@ -85,7 +85,9 @@ public class StagedInstallInternalTest extends BaseHostJUnit4Test { } deleteFiles("/system/apex/" + APK_IN_APEX_TESTAPEX_NAME + "*.apex", "/data/apex/active/" + APK_IN_APEX_TESTAPEX_NAME + "*.apex", - "/data/apex/active/" + SHIM_APEX_PACKAGE_NAME + "*.apex"); + "/data/apex/active/" + SHIM_APEX_PACKAGE_NAME + "*.apex", + "/system/apex/test.rebootless_apex_v1.apex", + "/data/apex/active/test.apex.rebootless*.apex"); } @Before @@ -124,9 +126,8 @@ public class StagedInstallInternalTest extends BaseHostJUnit4Test { } } - private void pushTestApex() throws Exception { + private void pushTestApex(String fileName) throws Exception { CompatibilityBuildHelper buildHelper = new CompatibilityBuildHelper(getBuild()); - final String fileName = APK_IN_APEX_TESTAPEX_NAME + "_v1.apex"; final File apex = buildHelper.getTestFile(fileName); if (!getDevice().isAdbRoot()) { getDevice().enableAdbRoot(); @@ -142,7 +143,7 @@ public class StagedInstallInternalTest extends BaseHostJUnit4Test { @Test @LargeTest public void testDuplicateApkInApexShouldFail() throws Exception { - pushTestApex(); + pushTestApex(APK_IN_APEX_TESTAPEX_NAME + "_v1.apex"); runPhase("testDuplicateApkInApexShouldFail_Commit"); getDevice().reboot(); runPhase("testDuplicateApkInApexShouldFail_Verify"); @@ -344,6 +345,12 @@ public class StagedInstallInternalTest extends BaseHostJUnit4Test { runPhase("testApexActivationFailureIsCapturedInSession_Verify"); } + @Test + public void testRebootlessUpdates() throws Exception { + pushTestApex("test.rebootless_apex_v1.apex"); + runPhase("testRebootlessUpdates"); + } + private List getStagingDirectories() throws DeviceNotAvailableException { String baseDir = "/data/app-staging"; try { -- cgit v1.2.3 From b90494d2a15bc89ba558c25e6145b3a46d950761 Mon Sep 17 00:00:00 2001 From: Beverly Date: Fri, 9 Jul 2021 13:22:20 -0400 Subject: Don't animate weight to 0 on face unlock bypass The transition happens so fast, you can barely see the weight animation, so let's not animate it. Test: manual Fixes: 192352151 Change-Id: Ie7430d6ab3ab0675826005125f87db03886ddc48 --- .../android/keyguard/AnimatableClockController.java | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/packages/SystemUI/src/com/android/keyguard/AnimatableClockController.java b/packages/SystemUI/src/com/android/keyguard/AnimatableClockController.java index fcf4e4703ed3..c89cda98c8a5 100644 --- a/packages/SystemUI/src/com/android/keyguard/AnimatableClockController.java +++ b/packages/SystemUI/src/com/android/keyguard/AnimatableClockController.java @@ -21,7 +21,6 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.graphics.Color; -import android.hardware.biometrics.BiometricSourceType; import android.icu.text.NumberFormat; import com.android.settingslib.Utils; @@ -94,9 +93,7 @@ public class AnimatableClockController extends ViewController { - return mStatusBarStateController.isDozing(); - }); + mView.animateCharge(mStatusBarStateController::isDozing); } mIsCharging = charging; } @@ -126,22 +123,11 @@ public class AnimatableClockController extends ViewController Date: Thu, 8 Jul 2021 17:38:49 -0400 Subject: Update udfps fade + padding - Make sure udfps doesn't overlap notification shade by giving it a 48dp buffer from the notification shade - Start fading out the udfps icon faster when swiping up to the bouncer - Include now playing text in the buffer for the lock icon position Test: manual Bug: 192926771 Fixes: 193193900 Change-Id: I3faf73548c9990886237c28d28e7e8b0f9e8686e --- packages/SystemUI/res/values/dimens.xml | 3 +++ .../src/com/android/keyguard/LockIconViewController.java | 16 +++++++++++++--- .../systemui/biometrics/UdfpsKeyguardViewController.java | 8 +++++--- .../statusbar/phone/NotificationPanelViewController.java | 5 ++++- 4 files changed, 25 insertions(+), 7 deletions(-) diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 18388a95fac6..0a3e0c8c351e 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -681,6 +681,9 @@ 2dp + + 48dp + 0dp diff --git a/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java b/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java index 62cb4b9a33f5..7bbb63f02f14 100644 --- a/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java @@ -98,7 +98,8 @@ public class LockIconViewController extends ViewController impleme private float mHeightPixels; private float mWidthPixels; private float mDensity; - private int mKgBottomAreaHeight; + private int mAmbientIndicationHeight; // in pixels + private int mKgIndicationHeight; // in pixels private boolean mShowUnlockIcon; private boolean mShowLockIcon; @@ -280,7 +281,7 @@ public class LockIconViewController extends ViewController impleme mWidthPixels = metrics.widthPixels; mHeightPixels = metrics.heightPixels; mDensity = metrics.density; - mKgBottomAreaHeight = mView.getContext().getResources().getDimensionPixelSize( + mKgIndicationHeight = mView.getContext().getResources().getDimensionPixelSize( R.dimen.keyguard_indication_margin_bottom) + mView.getContext().getResources().getDimensionPixelSize( R.dimen.keyguard_indication_bottom_padding); @@ -295,15 +296,24 @@ public class LockIconViewController extends ViewController impleme } else { final float distAboveKgBottomArea = 12 * mDensity; final float radius = 36 * mDensity; + final int kgBottomAreaHeight = Math.max(mKgIndicationHeight, mAmbientIndicationHeight); mView.setCenterLocation( new PointF(mWidthPixels / 2, - mHeightPixels - mKgBottomAreaHeight - distAboveKgBottomArea + mHeightPixels - kgBottomAreaHeight - distAboveKgBottomArea - radius / 2), (int) radius); } mView.getHitRect(mSensorTouchLocation); } + /** + * Set the location of ambient indication if showing (ie: now playing) + */ + public void setAmbientIndicationBottomPadding(int ambientIndicationBottomPadding) { + mAmbientIndicationHeight = ambientIndicationBottomPadding; + updateLockIconLocation(); + } + @Override public void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter pw, @NonNull String[] args) { pw.println("mUdfpsEnrolled: " + mUdfpsEnrolled); diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java index 073e8861aa1e..51124fb28ad1 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java @@ -41,6 +41,7 @@ import com.android.systemui.util.concurrency.DelayableExecutor; import java.io.FileDescriptor; import java.io.PrintWriter; + /** * Class that coordinates non-HBM animations during keyguard authentication. * @@ -207,7 +208,7 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController Date: Fri, 9 Jul 2021 05:47:24 +0000 Subject: Revert "Enable orientation listener at all times." This reverts commit 7efc7a91719dbcccccedf48e80bf169808c5f6a2. Reason for revert: seems to causing PTS PowerTest (pts/device-presubmit-power) failure - b/193195601 Bug: 193195601 Change-Id: Ie5d25787bfff3e1f0bb7afc73ed580012eea66ae --- .../com/android/systemui/biometrics/AuthController.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java index 2aa89e86d5c8..2a18055da232 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java @@ -121,15 +121,11 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, } private class BiometricOrientationEventListener extends OrientationEventListener { - @Surface.Rotation private int mLastRotation = ORIENTATION_UNKNOWN; + @Surface.Rotation private int mLastRotation; BiometricOrientationEventListener(Context context) { super(context); - - final Display display = context.getDisplay(); - if (display != null) { - mLastRotation = display.getRotation(); - } + mLastRotation = context.getDisplay().getRotation(); } @Override @@ -204,6 +200,7 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, Log.w(TAG, "ACTION_CLOSE_SYSTEM_DIALOGS received"); mCurrentDialog.dismissWithoutCallback(true /* animate */); mCurrentDialog = null; + mOrientationListener.disable(); try { if (mReceiver != null) { @@ -232,6 +229,7 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, Log.w(TAG, "Evicting client due to: " + topPackage); mCurrentDialog.dismissWithoutCallback(true /* animate */); mCurrentDialog = null; + mOrientationListener.disable(); if (mReceiver != null) { mReceiver.onDialogDismissed( @@ -471,7 +469,6 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, mSidefpsControllerFactory = sidefpsControllerFactory; mWindowManager = windowManager; mOrientationListener = new BiometricOrientationEventListener(context); - mOrientationListener.enable(); mFaceProps = mFaceManager != null ? mFaceManager.getSensorPropertiesInternal() : null; @@ -666,6 +663,7 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, // BiometricService will have already sent the callback to the client in this case. // This avoids a round trip to SystemUI. So, just dismiss the dialog and we're done. mCurrentDialog = null; + mOrientationListener.disable(); } /** @@ -737,6 +735,7 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, mReceiver = (IBiometricSysuiReceiver) args.arg2; mCurrentDialog = newDialog; mCurrentDialog.show(mWindowManager, savedState); + mOrientationListener.enable(); } private void onDialogDismissed(@DismissedReason int reason) { @@ -746,6 +745,7 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, } mReceiver = null; mCurrentDialog = null; + mOrientationListener.disable(); } @Override @@ -758,6 +758,7 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, mCurrentDialog.onSaveState(savedState); mCurrentDialog.dismissWithoutCallback(false /* animate */); mCurrentDialog = null; + mOrientationListener.disable(); // Only show the dialog if necessary. If it was animating out, the dialog is supposed // to send its pending callback immediately. -- cgit v1.2.3 From 6b33f9659158d94bfa09e00f30731937839349ed Mon Sep 17 00:00:00 2001 From: Peter Kalauskas Date: Thu, 8 Jul 2021 13:32:35 -0700 Subject: Fix user icon visibility bugs Remove call that made user icon VISIBLE whenever view was attached. This fixes issue where lock screen user icon was shown in QS after phone was unlocked. Also, remove call that made user icon GONE whenever the current user is null. This could cause the user switcher icon to erroneously disappear. Instead, handle the null case by drawing a default user icon. Additionally, - Remove unused dependency on UserManager - Add fallback TalkBack announcement if current user is null so it does not announce "unlabeled, double-tap to choose user." Instead it will now announce "Switch user, double-tap to choose user." - Remove redundant/unnecessary calls in getCurrentUserIcon - mCurrentUser.isCurrentUser is redundant - mCurrentUser.isSwitchToEnabled should not affect how icon is drawn - Call to mAdapter.getIconDrawable is unnecessary because all it does is check for whether it should drawn an "Add user" icon, but the lock screen user icon should never be an "Add user" icon Test: With config_keyguard_user_switch_opens_qs_details=true, disable lock screen for owner, then run adb shell am restart. Open QS, ensure that user icon isn't shown in the upper right. Fixes: 190062147 Change-Id: Ieb9a9274af452b69c0a916afb3ef0e177cab8d0d --- .../policy/KeyguardQsUserSwitchController.java | 45 ++++++++-------------- 1 file changed, 17 insertions(+), 28 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardQsUserSwitchController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardQsUserSwitchController.java index 1f1817cd29f0..5e70d0dbc418 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardQsUserSwitchController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardQsUserSwitchController.java @@ -21,7 +21,7 @@ import android.content.res.Resources; import android.database.DataSetObserver; import android.graphics.drawable.Drawable; import android.graphics.drawable.LayerDrawable; -import android.os.UserManager; +import android.os.UserHandle; import android.text.TextUtils; import android.util.Log; import android.view.View; @@ -76,7 +76,6 @@ public class KeyguardQsUserSwitchController extends ViewController Date: Fri, 9 Jul 2021 10:39:30 -0700 Subject: Increase max allowed min update jitter to 30s Observed some coarse location deliveries (every 10m) that failed due to being over the max allowed jitter. Bug: 193245605 Test: presubmits Change-Id: Ib0bb1c90edd7687fa95d6af7b366eb6d6ca9e3e8 --- .../com/android/server/location/provider/LocationProviderManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/location/provider/LocationProviderManager.java b/services/core/java/com/android/server/location/provider/LocationProviderManager.java index 43886f7cb87b..58726f4e149e 100644 --- a/services/core/java/com/android/server/location/provider/LocationProviderManager.java +++ b/services/core/java/com/android/server/location/provider/LocationProviderManager.java @@ -155,7 +155,7 @@ public class LocationProviderManager extends private static final float FASTEST_INTERVAL_JITTER_PERCENTAGE = .10f; // max absolute jitter allowed for min update interval evaluation - private static final int MAX_FASTEST_INTERVAL_JITTER_MS = 5 * 1000; + private static final int MAX_FASTEST_INTERVAL_JITTER_MS = 30 * 1000; // minimum amount of request delay in order to respect the delay, below this value the request // will just be scheduled immediately -- cgit v1.2.3 From 87ab9d9f5e081350f5ff47392eedcf837addb3ce Mon Sep 17 00:00:00 2001 From: Nate Myren Date: Fri, 9 Jul 2021 10:55:46 -0700 Subject: Make AttributedOpEntry gracefully handle empty array The inProgress/paused inProgress arraymaps should be null when empty. However, if they are not, the code should handle this gracefully. Test: presubmit Fixes: 191392370 Change-Id: I7cddd5ff5452611cb067b1c77ea85dd534b360da --- .../com/android/server/appop/AppOpsService.java | 35 ++++++++++++---------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java index 7789d604461c..33bc212fb9c0 100644 --- a/services/core/java/com/android/server/appop/AppOpsService.java +++ b/services/core/java/com/android/server/appop/AppOpsService.java @@ -1090,8 +1090,7 @@ public class AppOpsService extends IAppOpsService.Stub { */ private void finishOrPause(@NonNull IBinder clientId, boolean triggerCallbackIfNeeded, boolean isPausing) { - int indexOfToken = mInProgressEvents != null - ? mInProgressEvents.indexOfKey(clientId) : -1; + int indexOfToken = isRunning() ? mInProgressEvents.indexOfKey(clientId) : -1; if (indexOfToken < 0) { finishPossiblyPaused(clientId, isPausing); return; @@ -1145,7 +1144,7 @@ public class AppOpsService extends IAppOpsService.Stub { // Finish or pause (no-op) an already paused op private void finishPossiblyPaused(@NonNull IBinder clientId, boolean isPausing) { - if (mPausedInProgressEvents == null) { + if (!isPaused()) { Slog.wtf(TAG, "No ops running or paused"); return; } @@ -1186,7 +1185,7 @@ public class AppOpsService extends IAppOpsService.Stub { * Pause all currently started ops. This will create a HistoricalRegistry */ public void pause() { - if (mInProgressEvents == null) { + if (!isRunning()) { return; } @@ -1211,7 +1210,7 @@ public class AppOpsService extends IAppOpsService.Stub { * times, but keep all other values the same */ public void resume() { - if (mPausedInProgressEvents == null) { + if (!isPaused()) { return; } @@ -1245,7 +1244,7 @@ public class AppOpsService extends IAppOpsService.Stub { */ void onClientDeath(@NonNull IBinder clientId) { synchronized (AppOpsService.this) { - if (mInProgressEvents == null && mPausedInProgressEvents == null) { + if (!isPaused() && !isRunning()) { return; } @@ -1266,7 +1265,7 @@ public class AppOpsService extends IAppOpsService.Stub { * @param newState The new state */ public void onUidStateChanged(@AppOpsManager.UidState int newState) { - if (mInProgressEvents == null && mPausedInProgressEvents == null) { + if (!isPaused() && !isRunning()) { return; } @@ -1350,12 +1349,15 @@ public class AppOpsService extends IAppOpsService.Stub { * @param opToAdd The op to add */ public void add(@NonNull AttributedOp opToAdd) { - if (opToAdd.mInProgressEvents != null) { - Slog.w(TAG, "Ignoring " + opToAdd.mInProgressEvents.size() + " running app-ops"); + if (opToAdd.isRunning() || opToAdd.isPaused()) { + ArrayMap ignoredEvents = opToAdd.isRunning() + ? opToAdd.mInProgressEvents : opToAdd.mPausedInProgressEvents; + Slog.w(TAG, "Ignoring " + ignoredEvents.size() + " app-ops, running: " + + opToAdd.isRunning()); - int numInProgressEvents = opToAdd.mInProgressEvents.size(); + int numInProgressEvents = ignoredEvents.size(); for (int i = 0; i < numInProgressEvents; i++) { - InProgressStartOpEvent event = opToAdd.mInProgressEvents.valueAt(i); + InProgressStartOpEvent event = ignoredEvents.valueAt(i); event.finish(); mInProgressStartOpEventPool.release(event); @@ -1367,11 +1369,11 @@ public class AppOpsService extends IAppOpsService.Stub { } public boolean isRunning() { - return mInProgressEvents != null; + return mInProgressEvents != null && !mInProgressEvents.isEmpty(); } public boolean isPaused() { - return mPausedInProgressEvents != null; + return mPausedInProgressEvents != null && !mPausedInProgressEvents.isEmpty(); } boolean hasAnyTime() { @@ -1401,7 +1403,7 @@ public class AppOpsService extends IAppOpsService.Stub { LongSparseArray accessEvents = deepClone(mAccessEvents); // Add in progress events as access events - if (mInProgressEvents != null) { + if (isRunning()) { long now = SystemClock.elapsedRealtime(); int numInProgressEvents = mInProgressEvents.size(); @@ -2041,9 +2043,12 @@ public class AppOpsService extends IAppOpsService.Stub { attributionNum++) { AttributedOp attributedOp = op.mAttributions.valueAt(attributionNum); - while (attributedOp.mInProgressEvents != null) { + while (attributedOp.isRunning()) { attributedOp.finished(attributedOp.mInProgressEvents.keyAt(0)); } + while (attributedOp.isPaused()) { + attributedOp.finished(attributedOp.mPausedInProgressEvents.keyAt(0)); + } } } } -- cgit v1.2.3 From eb505a200cf04c9459ccd45caadffaad560bc0ea Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Fri, 9 Jul 2021 13:05:29 -0400 Subject: Guard against NPE Test: atest; manually ensure that icons still work when using SystemUI's context Fixes: 192575971 Change-Id: I3c93d4898a6995148606b15fc8bd98d465741c0a --- .../android/systemui/statusbar/StatusBarIconView.java | 10 ++++++---- .../systemui/statusbar/StatusBarIconViewTest.java | 16 ++++++++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java index a00d01427ebc..5302188ccb31 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java @@ -416,10 +416,12 @@ public class StatusBarIconView extends AnimatedImageView implements StatusIconDi return mIcon.icon; } - private Drawable getIcon(StatusBarIcon icon) { - Context notifContext = mNotification != null ? - mNotification.getPackageContext(getContext()) : getContext(); - return getIcon(getContext(), notifContext, icon); + Drawable getIcon(StatusBarIcon icon) { + Context notifContext = getContext(); + if (mNotification != null) { + notifContext = mNotification.getPackageContext(getContext()); + } + return getIcon(getContext(), notifContext != null ? notifContext : getContext(), icon); } /** diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java index 7c819f5c5ba4..85ea52b6af6a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarIconViewTest.java @@ -39,6 +39,7 @@ import android.graphics.Bitmap; import android.graphics.Color; import android.graphics.drawable.Icon; import android.os.UserHandle; +import android.service.notification.StatusBarNotification; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; @@ -131,4 +132,19 @@ public class StatusBarIconViewTest extends SysuiTestCase { icon, 0, 0, ""); assertFalse(mIconView.set(largeIcon)); } + + @Test + public void testNullNotifInfo() { + Bitmap bitmap = Bitmap.createBitmap(60, 60, Bitmap.Config.ARGB_8888); + Icon icon = Icon.createWithBitmap(bitmap); + StatusBarIcon largeIcon = new StatusBarIcon(UserHandle.ALL, "mockPackage", + icon, 0, 0, ""); + mIconView.setNotification(mock(StatusBarNotification.class)); + mIconView.getIcon(largeIcon); + // no crash? good + + mIconView.setNotification(null); + mIconView.getIcon(largeIcon); + // no crash? good + } } \ No newline at end of file -- cgit v1.2.3 From da0e9a9b37558bbbf4b1e7e3c249f22c8b474db1 Mon Sep 17 00:00:00 2001 From: Terry Wang Date: Thu, 1 Jul 2021 19:11:39 -0700 Subject: Add check for optimize after each mutation operation. Optimize is an important job for AppSearch to work properly. It could collect garbage and release resources. Without it, the garbage resource will last forever and the device's space will be fulled up by zombie documents. The algorithm to trigger optimize is: 1: Query garbage resource info after a batch of mutation operations. 2: Only trigger optimize if there are enough resource could be released. The behavior exists in AppSearch Jetpack for a while and working properly for our Jetpack dogfooders. Bug: 175255572 Test: FrameworkOptimizeStrategyTest Test: AppSearchConfigTest Test: AppSearchImplTest Change-Id: Ib7ae475cc035d1b69969df1e22ac409895e0e3fa --- .../android/server/appsearch/AppSearchConfig.java | 72 +++++++++++++++++++ .../server/appsearch/AppSearchManagerService.java | 34 +++++++++ .../appsearch/AppSearchUserInstanceManager.java | 3 +- .../appsearch/FrameworkOptimizeStrategy.java | 48 +++++++++++++ .../localstorage/FrameworkOptimizeStrategy.java | 44 ------------ .../server/appsearch/AppSearchConfigTest.java | 81 ++++++++++++++++++++-- .../appsearch/FrameworkOptimizeStrategyTest.java | 70 +++++++++++++++++++ .../FrameworkOptimizeStrategyTest.java | 68 ------------------ 8 files changed, 301 insertions(+), 119 deletions(-) create mode 100644 apex/appsearch/service/java/com/android/server/appsearch/FrameworkOptimizeStrategy.java delete mode 100644 apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/FrameworkOptimizeStrategy.java create mode 100644 services/tests/servicestests/src/com/android/server/appsearch/FrameworkOptimizeStrategyTest.java delete mode 100644 services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/FrameworkOptimizeStrategyTest.java diff --git a/apex/appsearch/service/java/com/android/server/appsearch/AppSearchConfig.java b/apex/appsearch/service/java/com/android/server/appsearch/AppSearchConfig.java index 689aa1fcd371..c44fd40617a1 100644 --- a/apex/appsearch/service/java/com/android/server/appsearch/AppSearchConfig.java +++ b/apex/appsearch/service/java/com/android/server/appsearch/AppSearchConfig.java @@ -64,6 +64,12 @@ public final class AppSearchConfig implements AutoCloseable { static final int DEFAULT_LIMIT_CONFIG_MAX_DOCUMENT_SIZE_BYTES = 512 * 1024; // 512KiB @VisibleForTesting static final int DEFAULT_LIMIT_CONFIG_MAX_DOCUMENT_COUNT = 20_000; + @VisibleForTesting + static final int DEFAULT_BYTES_OPTIMIZE_THRESHOLD = 1 * 1024 * 1024; // 1 MiB + @VisibleForTesting + static final int DEFAULT_TIME_OPTIMIZE_THRESHOLD_MILLIS = Integer.MAX_VALUE; + @VisibleForTesting + static final int DEFAULT_DOC_COUNT_OPTIMIZE_THRESHOLD = 10_000; /* * Keys for ALL the flags stored in DeviceConfig. @@ -79,6 +85,9 @@ public final class AppSearchConfig implements AutoCloseable { "limit_config_max_document_size_bytes"; public static final String KEY_LIMIT_CONFIG_MAX_DOCUMENT_COUNT = "limit_config_max_document_docunt"; + public static final String KEY_BYTES_OPTIMIZE_THRESHOLD = "bytes_optimize_threshold"; + public static final String KEY_TIME_OPTIMIZE_THRESHOLD_MILLIS = "time_optimize_threshold"; + public static final String KEY_DOC_COUNT_OPTIMIZE_THRESHOLD = "doc_count_optimize_threshold"; // Array contains all the corresponding keys for the cached values. private static final String[] KEYS_TO_ALL_CACHED_VALUES = { @@ -88,6 +97,9 @@ public final class AppSearchConfig implements AutoCloseable { KEY_SAMPLING_INTERVAL_FOR_PUT_DOCUMENT_STATS, KEY_LIMIT_CONFIG_MAX_DOCUMENT_SIZE_BYTES, KEY_LIMIT_CONFIG_MAX_DOCUMENT_COUNT, + KEY_BYTES_OPTIMIZE_THRESHOLD, + KEY_TIME_OPTIMIZE_THRESHOLD_MILLIS, + KEY_DOC_COUNT_OPTIMIZE_THRESHOLD }; // Lock needed for all the operations in this class. @@ -251,6 +263,48 @@ public final class AppSearchConfig implements AutoCloseable { } } + /** + * Returns the cached optimize byte size threshold. + * + * An AppSearch Optimize job will be triggered if the bytes size of garbage resource exceeds + * this threshold. + */ + int getCachedBytesOptimizeThreshold() { + synchronized (mLock) { + throwIfClosedLocked(); + return mBundleLocked.getInt(KEY_BYTES_OPTIMIZE_THRESHOLD, + DEFAULT_BYTES_OPTIMIZE_THRESHOLD); + } + } + + /** + * Returns the cached optimize time interval threshold. + * + * An AppSearch Optimize job will be triggered if the time since last optimize job exceeds + * this threshold. + */ + int getCachedTimeOptimizeThresholdMs() { + synchronized (mLock) { + throwIfClosedLocked(); + return mBundleLocked.getInt(KEY_TIME_OPTIMIZE_THRESHOLD_MILLIS, + DEFAULT_TIME_OPTIMIZE_THRESHOLD_MILLIS); + } + } + + /** + * Returns the cached optimize document count threshold threshold. + * + * An AppSearch Optimize job will be triggered if the number of document of garbage resource + * exceeds this threshold. + */ + int getCachedDocCountOptimizeThreshold() { + synchronized (mLock) { + throwIfClosedLocked(); + return mBundleLocked.getInt(KEY_DOC_COUNT_OPTIMIZE_THRESHOLD, + DEFAULT_DOC_COUNT_OPTIMIZE_THRESHOLD); + } + } + @GuardedBy("mLock") private void throwIfClosedLocked() { if (mIsClosedLocked) { @@ -307,6 +361,24 @@ public final class AppSearchConfig implements AutoCloseable { properties.getInt(key, DEFAULT_LIMIT_CONFIG_MAX_DOCUMENT_COUNT)); } break; + case KEY_BYTES_OPTIMIZE_THRESHOLD: + synchronized (mLock) { + mBundleLocked.putInt(key, properties.getInt(key, + DEFAULT_BYTES_OPTIMIZE_THRESHOLD)); + } + break; + case KEY_TIME_OPTIMIZE_THRESHOLD_MILLIS: + synchronized (mLock) { + mBundleLocked.putInt(key, properties.getInt(key, + DEFAULT_TIME_OPTIMIZE_THRESHOLD_MILLIS)); + } + break; + case KEY_DOC_COUNT_OPTIMIZE_THRESHOLD: + synchronized (mLock) { + mBundleLocked.putInt(key, properties.getInt(key, + DEFAULT_DOC_COUNT_OPTIMIZE_THRESHOLD)); + } + break; default: break; } diff --git a/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java b/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java index ec37c3f68aaa..edd0786b0a8e 100644 --- a/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java +++ b/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java @@ -364,6 +364,12 @@ public class AppSearchManagerService extends SystemService { ++operationSuccessCount; invokeCallbackOnResult(callback, AppSearchResult.newSuccessfulResult(setSchemaResponse.getBundle())); + + // setSchema will sync the schemas in the request to AppSearch, any existing + // schemas which is not included in the request will be delete if we force + // override incompatible schemas. And all documents of these types will be + // deleted as well. We should checkForOptimize for these deletion. + checkForOptimize(instance); } catch (Throwable t) { ++operationFailureCount; statusCode = throwableToFailedResult(t).getResultCode(); @@ -505,6 +511,10 @@ public class AppSearchManagerService extends SystemService { // Now that the batch has been written. Persist the newly written data. instance.getAppSearchImpl().persistToDisk(PersistType.Code.LITE); invokeCallbackOnResult(callback, resultBuilder.build()); + + // The existing documents with same ID will be deleted, so there may be some + // resources that could be released after optimize(). + checkForOptimize(instance, /*mutateBatchSize=*/ documentBundles.size()); } catch (Throwable t) { ++operationFailureCount; statusCode = throwableToFailedResult(t).getResultCode(); @@ -1023,6 +1033,8 @@ public class AppSearchManagerService extends SystemService { // Now that the batch has been written. Persist the newly written data. instance.getAppSearchImpl().persistToDisk(PersistType.Code.LITE); invokeCallbackOnResult(callback, resultBuilder.build()); + + checkForOptimize(instance, ids.size()); } catch (Throwable t) { ++operationFailureCount; statusCode = throwableToFailedResult(t).getResultCode(); @@ -1092,6 +1104,8 @@ public class AppSearchManagerService extends SystemService { instance.getAppSearchImpl().persistToDisk(PersistType.Code.LITE); ++operationSuccessCount; invokeCallbackOnResult(callback, AppSearchResult.newSuccessfulResult(null)); + + checkForOptimize(instance); } catch (Throwable t) { ++operationFailureCount; statusCode = throwableToFailedResult(t).getResultCode(); @@ -1472,4 +1486,24 @@ public class AppSearchManagerService extends SystemService { } } } + + private void checkForOptimize(AppSearchUserInstance instance, int mutateBatchSize) { + EXECUTOR.execute(() -> { + try { + instance.getAppSearchImpl().checkForOptimize(mutateBatchSize); + } catch (AppSearchException e) { + Log.w(TAG, "Error occurred when check for optimize", e); + } + }); + } + + private void checkForOptimize(AppSearchUserInstance instance) { + EXECUTOR.execute(() -> { + try { + instance.getAppSearchImpl().checkForOptimize(); + } catch (AppSearchException e) { + Log.w(TAG, "Error occurred when check for optimize", e); + } + }); + } } diff --git a/apex/appsearch/service/java/com/android/server/appsearch/AppSearchUserInstanceManager.java b/apex/appsearch/service/java/com/android/server/appsearch/AppSearchUserInstanceManager.java index d0d2e8964cf0..4c2135f9ed1a 100644 --- a/apex/appsearch/service/java/com/android/server/appsearch/AppSearchUserInstanceManager.java +++ b/apex/appsearch/service/java/com/android/server/appsearch/AppSearchUserInstanceManager.java @@ -27,7 +27,6 @@ import android.util.Log; import com.android.internal.annotations.GuardedBy; import com.android.server.appsearch.external.localstorage.AppSearchImpl; -import com.android.server.appsearch.external.localstorage.FrameworkOptimizeStrategy; import com.android.server.appsearch.external.localstorage.stats.InitializeStats; import com.android.server.appsearch.stats.PlatformLogger; import com.android.server.appsearch.visibilitystore.VisibilityStoreImpl; @@ -177,7 +176,7 @@ public final class AppSearchUserInstanceManager { icingDir, new FrameworkLimitConfig(config), initStatsBuilder, - new FrameworkOptimizeStrategy()); + new FrameworkOptimizeStrategy(config)); long prepareVisibilityStoreLatencyStartMillis = SystemClock.elapsedRealtime(); VisibilityStoreImpl visibilityStore = diff --git a/apex/appsearch/service/java/com/android/server/appsearch/FrameworkOptimizeStrategy.java b/apex/appsearch/service/java/com/android/server/appsearch/FrameworkOptimizeStrategy.java new file mode 100644 index 000000000000..d9344493ac34 --- /dev/null +++ b/apex/appsearch/service/java/com/android/server/appsearch/FrameworkOptimizeStrategy.java @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.server.appsearch; + +import android.annotation.NonNull; + +import com.android.server.appsearch.external.localstorage.AppSearchImpl; +import com.android.server.appsearch.external.localstorage.OptimizeStrategy; + +import com.google.android.icing.proto.GetOptimizeInfoResultProto; + +import java.util.Objects; + +/** + * An implementation of {@link OptimizeStrategy} will determine when to trigger {@link + * AppSearchImpl#optimize()} in Jetpack environment. + * + * @hide + */ +public class FrameworkOptimizeStrategy implements OptimizeStrategy { + private final AppSearchConfig mAppSearchConfig; + FrameworkOptimizeStrategy(@NonNull AppSearchConfig config) { + mAppSearchConfig = Objects.requireNonNull(config); + } + + @Override + public boolean shouldOptimize(@NonNull GetOptimizeInfoResultProto optimizeInfo) { + return optimizeInfo.getOptimizableDocs() + >= mAppSearchConfig.getCachedDocCountOptimizeThreshold() + || optimizeInfo.getEstimatedOptimizableBytes() + >= mAppSearchConfig.getCachedBytesOptimizeThreshold() + || optimizeInfo.getTimeSinceLastOptimizeMs() + >= mAppSearchConfig.getCachedTimeOptimizeThresholdMs(); + } +} diff --git a/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/FrameworkOptimizeStrategy.java b/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/FrameworkOptimizeStrategy.java deleted file mode 100644 index 8ec30e186306..000000000000 --- a/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/FrameworkOptimizeStrategy.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.android.server.appsearch.external.localstorage; - -import android.annotation.NonNull; - -import com.android.internal.annotations.VisibleForTesting; - -import com.google.android.icing.proto.GetOptimizeInfoResultProto; - -/** - * An implementation of {@link OptimizeStrategy} will determine when to trigger {@link - * AppSearchImpl#optimize()} in Jetpack environment. - * - * @hide - */ -public class FrameworkOptimizeStrategy implements OptimizeStrategy { - - @VisibleForTesting static final int DOC_COUNT_OPTIMIZE_THRESHOLD = 100_000; - @VisibleForTesting static final int BYTES_OPTIMIZE_THRESHOLD = 1 * 1024 * 1024 * 1024; // 1GB - - @VisibleForTesting - static final long TIME_OPTIMIZE_THRESHOLD_MILLIS = 7 * 24 * 60 * 60 * 1000; // 1 week - - @Override - public boolean shouldOptimize(@NonNull GetOptimizeInfoResultProto optimizeInfo) { - return optimizeInfo.getOptimizableDocs() >= DOC_COUNT_OPTIMIZE_THRESHOLD - || optimizeInfo.getEstimatedOptimizableBytes() >= BYTES_OPTIMIZE_THRESHOLD - || optimizeInfo.getTimeSinceLastOptimizeMs() >= TIME_OPTIMIZE_THRESHOLD_MILLIS; - } -} diff --git a/services/tests/mockingservicestests/src/com/android/server/appsearch/AppSearchConfigTest.java b/services/tests/mockingservicestests/src/com/android/server/appsearch/AppSearchConfigTest.java index ffb1dd9c7e78..8336663d4dd1 100644 --- a/services/tests/mockingservicestests/src/com/android/server/appsearch/AppSearchConfigTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/appsearch/AppSearchConfigTest.java @@ -54,6 +54,12 @@ public class AppSearchConfigTest { AppSearchConfig.DEFAULT_LIMIT_CONFIG_MAX_DOCUMENT_SIZE_BYTES); assertThat(appSearchConfig.getCachedLimitConfigMaxDocumentCount()).isEqualTo( AppSearchConfig.DEFAULT_LIMIT_CONFIG_MAX_DOCUMENT_COUNT); + assertThat(appSearchConfig.getCachedBytesOptimizeThreshold()).isEqualTo( + AppSearchConfig.DEFAULT_BYTES_OPTIMIZE_THRESHOLD); + assertThat(appSearchConfig.getCachedTimeOptimizeThresholdMs()).isEqualTo( + AppSearchConfig.DEFAULT_TIME_OPTIMIZE_THRESHOLD_MILLIS); + assertThat(appSearchConfig.getCachedDocCountOptimizeThreshold()).isEqualTo( + AppSearchConfig.DEFAULT_DOC_COUNT_OPTIMIZE_THRESHOLD); } @Test @@ -163,10 +169,8 @@ public class AppSearchConfigTest { /** * Tests if we fall back to {@link AppSearchConfig#DEFAULT_SAMPLING_INTERVAL} if both default - * sampling - * interval and custom value are not set in DeviceConfig, and there is some other sampling - * interval - * set. + * sampling interval and custom value are not set in DeviceConfig, and there is some other + * sampling interval set. */ @Test public void testFallbackToDefaultSamplingValue_useHardCodedDefault() { @@ -269,7 +273,7 @@ public class AppSearchConfigTest { } @Test - public void testCustomizedValue() { + public void testCustomizedValue_maxDocument() { DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH, AppSearchConfig.KEY_LIMIT_CONFIG_MAX_DOCUMENT_SIZE_BYTES, Integer.toString(2001), @@ -284,6 +288,64 @@ public class AppSearchConfigTest { assertThat(appSearchConfig.getCachedLimitConfigMaxDocumentCount()).isEqualTo(2002); } + @Test + public void testCustomizedValue_optimizeThreshold() { + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH, + AppSearchConfig.KEY_BYTES_OPTIMIZE_THRESHOLD, + Integer.toString(147147), + false); + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH, + AppSearchConfig.KEY_TIME_OPTIMIZE_THRESHOLD_MILLIS, + Integer.toString(258258), + false); + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH, + AppSearchConfig.KEY_DOC_COUNT_OPTIMIZE_THRESHOLD, + Integer.toString(369369), + false); + + AppSearchConfig appSearchConfig = AppSearchConfig.create(DIRECT_EXECUTOR); + + assertThat(appSearchConfig.getCachedBytesOptimizeThreshold()).isEqualTo(147147); + assertThat(appSearchConfig.getCachedTimeOptimizeThresholdMs()).isEqualTo(258258); + assertThat(appSearchConfig.getCachedDocCountOptimizeThreshold()).isEqualTo(369369); + } + + @Test + public void testCustomizedValueOverride_optimizeThreshold() { + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH, + AppSearchConfig.KEY_BYTES_OPTIMIZE_THRESHOLD, + Integer.toString(147147), + false); + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH, + AppSearchConfig.KEY_TIME_OPTIMIZE_THRESHOLD_MILLIS, + Integer.toString(258258), + false); + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH, + AppSearchConfig.KEY_DOC_COUNT_OPTIMIZE_THRESHOLD, + Integer.toString(369369), + false); + + AppSearchConfig appSearchConfig = AppSearchConfig.create(DIRECT_EXECUTOR); + + // Override + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH, + AppSearchConfig.KEY_BYTES_OPTIMIZE_THRESHOLD, + Integer.toString(741741), + false); + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH, + AppSearchConfig.KEY_TIME_OPTIMIZE_THRESHOLD_MILLIS, + Integer.toString(852852), + false); + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_APPSEARCH, + AppSearchConfig.KEY_DOC_COUNT_OPTIMIZE_THRESHOLD, + Integer.toString(963963), + false); + + assertThat(appSearchConfig.getCachedBytesOptimizeThreshold()).isEqualTo(741741); + assertThat(appSearchConfig.getCachedTimeOptimizeThresholdMs()).isEqualTo(852852); + assertThat(appSearchConfig.getCachedDocCountOptimizeThreshold()).isEqualTo(963963); + } + @Test public void testNotUsable_afterClose() { AppSearchConfig appSearchConfig = AppSearchConfig.create(DIRECT_EXECUTOR); @@ -302,5 +364,14 @@ public class AppSearchConfigTest { Assert.assertThrows("Trying to use a closed AppSearchConfig instance.", IllegalStateException.class, () -> appSearchConfig.getCachedSamplingIntervalForPutDocumentStats()); + Assert.assertThrows("Trying to use a closed AppSearchConfig instance.", + IllegalStateException.class, + () -> appSearchConfig.getCachedBytesOptimizeThreshold()); + Assert.assertThrows("Trying to use a closed AppSearchConfig instance.", + IllegalStateException.class, + () -> appSearchConfig.getCachedTimeOptimizeThresholdMs()); + Assert.assertThrows("Trying to use a closed AppSearchConfig instance.", + IllegalStateException.class, + () -> appSearchConfig.getCachedDocCountOptimizeThreshold()); } } diff --git a/services/tests/servicestests/src/com/android/server/appsearch/FrameworkOptimizeStrategyTest.java b/services/tests/servicestests/src/com/android/server/appsearch/FrameworkOptimizeStrategyTest.java new file mode 100644 index 000000000000..8389c85477ea --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/appsearch/FrameworkOptimizeStrategyTest.java @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.server.appsearch; + +import static com.android.internal.util.ConcurrentUtils.DIRECT_EXECUTOR; + +import static com.google.common.truth.Truth.assertThat; + +import com.android.server.appsearch.icing.proto.GetOptimizeInfoResultProto; +import com.android.server.appsearch.icing.proto.StatusProto; + +import org.junit.Test; + +public class FrameworkOptimizeStrategyTest { + AppSearchConfig mAppSearchConfig = AppSearchConfig.create(DIRECT_EXECUTOR); + FrameworkOptimizeStrategy mFrameworkOptimizeStrategy = + new FrameworkOptimizeStrategy(mAppSearchConfig); + + @Test + public void testShouldOptimize_byteThreshold() { + GetOptimizeInfoResultProto optimizeInfo = + GetOptimizeInfoResultProto.newBuilder() + .setTimeSinceLastOptimizeMs(0) + .setEstimatedOptimizableBytes( + mAppSearchConfig.getCachedBytesOptimizeThreshold()) + .setOptimizableDocs(0) + .setStatus(StatusProto.newBuilder().setCode(StatusProto.Code.OK).build()) + .build(); + assertThat(mFrameworkOptimizeStrategy.shouldOptimize(optimizeInfo)).isTrue(); + } + + @Test + public void testShouldNotOptimize_timeThreshold() { + GetOptimizeInfoResultProto optimizeInfo = + GetOptimizeInfoResultProto.newBuilder() + .setTimeSinceLastOptimizeMs( + mAppSearchConfig.getCachedTimeOptimizeThresholdMs()) + .setEstimatedOptimizableBytes(0) + .setOptimizableDocs(0) + .setStatus(StatusProto.newBuilder().setCode(StatusProto.Code.OK).build()) + .build(); + assertThat(mFrameworkOptimizeStrategy.shouldOptimize(optimizeInfo)).isTrue(); + } + + @Test + public void testShouldOptimize_docCountThreshold() { + GetOptimizeInfoResultProto optimizeInfo = + GetOptimizeInfoResultProto.newBuilder() + .setTimeSinceLastOptimizeMs(0) + .setEstimatedOptimizableBytes(0) + .setOptimizableDocs( + mAppSearchConfig.getCachedDocCountOptimizeThreshold()) + .setStatus(StatusProto.newBuilder().setCode(StatusProto.Code.OK).build()) + .build(); + assertThat(mFrameworkOptimizeStrategy.shouldOptimize(optimizeInfo)).isTrue(); + } +} diff --git a/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/FrameworkOptimizeStrategyTest.java b/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/FrameworkOptimizeStrategyTest.java deleted file mode 100644 index de71d21e6eb1..000000000000 --- a/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/FrameworkOptimizeStrategyTest.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.server.appsearch.external.localstorage; - -import static com.android.server.appsearch.external.localstorage.FrameworkOptimizeStrategy.BYTES_OPTIMIZE_THRESHOLD; -import static com.android.server.appsearch.external.localstorage.FrameworkOptimizeStrategy.DOC_COUNT_OPTIMIZE_THRESHOLD; -import static com.android.server.appsearch.external.localstorage.FrameworkOptimizeStrategy.TIME_OPTIMIZE_THRESHOLD_MILLIS; - -import static com.google.common.truth.Truth.assertThat; - -import com.android.server.appsearch.icing.proto.GetOptimizeInfoResultProto; -import com.android.server.appsearch.icing.proto.StatusProto; - -import org.junit.Test; - -public class FrameworkOptimizeStrategyTest { - FrameworkOptimizeStrategy mFrameworkOptimizeStrategy = new FrameworkOptimizeStrategy(); - - @Test - public void testShouldOptimize_docCountThreshold() { - GetOptimizeInfoResultProto optimizeInfo = - GetOptimizeInfoResultProto.newBuilder() - .setTimeSinceLastOptimizeMs(0) - .setEstimatedOptimizableBytes(BYTES_OPTIMIZE_THRESHOLD) - .setOptimizableDocs(0) - .setStatus(StatusProto.newBuilder().setCode(StatusProto.Code.OK).build()) - .build(); - assertThat(mFrameworkOptimizeStrategy.shouldOptimize(optimizeInfo)).isTrue(); - } - - @Test - public void testShouldOptimize_byteThreshold() { - GetOptimizeInfoResultProto optimizeInfo = - GetOptimizeInfoResultProto.newBuilder() - .setTimeSinceLastOptimizeMs(TIME_OPTIMIZE_THRESHOLD_MILLIS) - .setEstimatedOptimizableBytes(0) - .setOptimizableDocs(0) - .setStatus(StatusProto.newBuilder().setCode(StatusProto.Code.OK).build()) - .build(); - assertThat(mFrameworkOptimizeStrategy.shouldOptimize(optimizeInfo)).isTrue(); - } - - @Test - public void testShouldNotOptimize_timeThreshold() { - GetOptimizeInfoResultProto optimizeInfo = - GetOptimizeInfoResultProto.newBuilder() - .setTimeSinceLastOptimizeMs(0) - .setEstimatedOptimizableBytes(0) - .setOptimizableDocs(DOC_COUNT_OPTIMIZE_THRESHOLD) - .setStatus(StatusProto.newBuilder().setCode(StatusProto.Code.OK).build()) - .build(); - assertThat(mFrameworkOptimizeStrategy.shouldOptimize(optimizeInfo)).isTrue(); - } -} -- cgit v1.2.3 From 8d6f3cc158e75a104304c62532c708c7efaeabc7 Mon Sep 17 00:00:00 2001 From: Jeff DeCew Date: Fri, 9 Jul 2021 13:21:20 -0400 Subject: Use SRC_ATOP instead of SRC_IN for blending the NotificationExpandButton Bug: 191969252 Bug: 193157438 Test: check for number of layers in the scene Change-Id: I65bd80c71b55582347da1559cf707e9d023b7f13 --- core/java/android/app/Notification.java | 9 +++++---- .../com/android/internal/widget/NotificationExpandButton.java | 7 ++----- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 6454d2027f58..9d149cf340e2 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -5380,14 +5380,15 @@ public class Notification implements Parcelable private void bindExpandButton(RemoteViews contentView, StandardTemplateParams p) { // set default colors - int textColor = getPrimaryTextColor(p); - int pillColor = getColors(p).getProtectionColor(); + int bgColor = getBackgroundColor(p); + int pillColor = Colors.flattenAlpha(getColors(p).getProtectionColor(), bgColor); + int textColor = Colors.flattenAlpha(getPrimaryTextColor(p), pillColor); contentView.setInt(R.id.expand_button, "setDefaultTextColor", textColor); contentView.setInt(R.id.expand_button, "setDefaultPillColor", pillColor); // Use different highlighted colors for conversations' unread count if (p.mHighlightExpander) { - textColor = getBackgroundColor(p); - pillColor = getPrimaryAccentColor(p); + pillColor = Colors.flattenAlpha(getPrimaryAccentColor(p), bgColor); + textColor = Colors.flattenAlpha(bgColor, pillColor); } contentView.setInt(R.id.expand_button, "setHighlightTextColor", textColor); contentView.setInt(R.id.expand_button, "setHighlightPillColor", pillColor); diff --git a/core/java/com/android/internal/widget/NotificationExpandButton.java b/core/java/com/android/internal/widget/NotificationExpandButton.java index 1974b0c2e5fc..07ee9b5d2ff1 100644 --- a/core/java/com/android/internal/widget/NotificationExpandButton.java +++ b/core/java/com/android/internal/widget/NotificationExpandButton.java @@ -20,7 +20,6 @@ import android.annotation.ColorInt; import android.annotation.Nullable; import android.content.Context; import android.content.res.ColorStateList; -import android.graphics.PorterDuff; import android.graphics.Rect; import android.util.AttributeSet; import android.view.RemotableViewMethod; @@ -159,8 +158,7 @@ public class NotificationExpandButton extends FrameLayout { if (mHighlightPillColor != 0) { mPillView.setBackgroundTintList(ColorStateList.valueOf(mHighlightPillColor)); } - mPillView.setBackgroundTintMode(PorterDuff.Mode.SRC_IN); - mIconView.setColorFilter(mHighlightTextColor, PorterDuff.Mode.SRC_IN); + mIconView.setColorFilter(mHighlightTextColor); if (mHighlightTextColor != 0) { mNumberView.setTextColor(mHighlightTextColor); } @@ -168,8 +166,7 @@ public class NotificationExpandButton extends FrameLayout { if (mDefaultPillColor != 0) { mPillView.setBackgroundTintList(ColorStateList.valueOf(mDefaultPillColor)); } - mPillView.setBackgroundTintMode(PorterDuff.Mode.SRC_IN); - mIconView.setColorFilter(mDefaultTextColor, PorterDuff.Mode.SRC_IN); + mIconView.setColorFilter(mDefaultTextColor); if (mDefaultTextColor != 0) { mNumberView.setTextColor(mDefaultTextColor); } -- cgit v1.2.3 From 690aad0676535b3f22d696bef8325e9a4c100f45 Mon Sep 17 00:00:00 2001 From: Matt Casey Date: Fri, 9 Jul 2021 19:43:04 +0000 Subject: Revert "Replace cancel button with a delete icon." This reverts commit 02afe9b974b810b8641e845245c5e3397d134bdd. Reason for revert: Delete flow needed polish and ran into some unresolved bugs. Bug: 191889955 Bug: 193246084 Change-Id: I1c1f4dd6d3e9cc0fd3d4642651f679618723404b --- packages/SystemUI/res/layout/long_screenshot.xml | 25 +++++++++++----------- .../screenshot/LongScreenshotActivity.java | 17 ++------------- .../systemui/screenshot/ScreenshotController.java | 6 +----- 3 files changed, 15 insertions(+), 33 deletions(-) diff --git a/packages/SystemUI/res/layout/long_screenshot.xml b/packages/SystemUI/res/layout/long_screenshot.xml index 5a33046f49dc..8a2c8f09948d 100644 --- a/packages/SystemUI/res/layout/long_screenshot.xml +++ b/packages/SystemUI/res/layout/long_screenshot.xml @@ -38,21 +38,20 @@ app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toTopOf="@id/preview" /> - + app:layout_constraintBottom_toTopOf="@id/preview" + /> finishAndRemoveTask()); + mSave.setOnClickListener(this::onClicked); mEdit.setOnClickListener(this::onClicked); mShare.setOnClickListener(this::onClicked); - // Only show the delete button if we have something to delete (should typically be the case) - if (getIntent().getData() != null) { - mDelete.setOnClickListener(this::onClicked); - } else { - mDelete.setVisibility(View.GONE); - } - mPreview.addOnLayoutChangeListener( (v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> updateImageDimensions()); @@ -328,7 +321,6 @@ public class LongScreenshotActivity extends Activity { mSave.setEnabled(enabled); mEdit.setEnabled(enabled); mShare.setEnabled(enabled); - mDelete.setEnabled(enabled); } private void doEdit(Uri uri) { @@ -376,11 +368,6 @@ public class LongScreenshotActivity extends Activity { } else if (id == R.id.share) { mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_LONG_SCREENSHOT_SHARE); startExport(PendingAction.SHARE); - } else if (id == R.id.delete) { - mBackgroundExecutor.execute(() -> { - getContentResolver().delete(getIntent().getData(), null); - finishAndRemoveTask(); - }); } } diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java index cf898e0afdf4..5a3d3f9c6f3e 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java @@ -264,7 +264,6 @@ public class ScreenshotController { private Animator mScreenshotAnimation; private RequestCallback mCurrentRequestCallback; - private Uri mLatestUriSaved; private final Handler mScreenshotHandler = new Handler(Looper.getMainLooper()) { @Override @@ -547,6 +546,7 @@ public class ScreenshotController { mAccessibilityManager.sendAccessibilityEvent(event); } + if (mScreenshotView.isAttachedToWindow()) { // if we didn't already dismiss for another reason if (!mScreenshotView.isDismissing()) { @@ -563,7 +563,6 @@ public class ScreenshotController { .getWindowInsets().getDisplayCutout()); mScreenBitmap = screenshot; - mLatestUriSaved = null; if (!isUserSetupComplete()) { Log.w(TAG, "User setup not complete, displaying toast only"); @@ -694,7 +693,6 @@ public class ScreenshotController { longScreenshot)); final Intent intent = new Intent(mContext, LongScreenshotActivity.class); - intent.setData(mLatestUriSaved); intent.setFlags( Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); @@ -884,8 +882,6 @@ public class ScreenshotController { resetTimeout(); - mLatestUriSaved = imageData.uri; - if (imageData.uri != null) { mScreenshotHandler.post(() -> { if (mScreenshotAnimation != null && mScreenshotAnimation.isRunning()) { -- cgit v1.2.3 From d277f5069d0f2d82c60fe76960faebdecc162d5d Mon Sep 17 00:00:00 2001 From: Jeff DeCew Date: Fri, 2 Jul 2021 17:03:03 -0400 Subject: Ensure stackHeight accounts for pulseHeight and dozeAmount where we used to use innerHeight. Fixes: 192679392 Test: bypass unlock from pulse Change-Id: I9c29c1b220344a9aa73caae5acf79b169e4bcfc4 --- .../notification/dagger/NotificationsModule.java | 5 ++++ .../statusbar/notification/stack/AmbientState.java | 22 ++++++++++++++++- .../notification/stack/StackScrollAlgorithm.java | 28 ++++++++++++++++++---- .../statusbar/phone/KeyguardBypassController.kt | 6 ++++- .../stack/NotificationStackScrollLayoutTest.java | 4 +++- 5 files changed, 58 insertions(+), 7 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java index a32b7e3b2836..6964838e7e41 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java @@ -70,6 +70,7 @@ import com.android.systemui.statusbar.notification.row.NotificationGutsManager; import com.android.systemui.statusbar.notification.row.OnUserInteractionCallback; import com.android.systemui.statusbar.notification.stack.NotificationSectionsManager; import com.android.systemui.statusbar.notification.stack.StackScrollAlgorithm; +import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.ShadeController; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.policy.HeadsUpManager; @@ -93,6 +94,10 @@ public interface NotificationsModule { StackScrollAlgorithm.SectionProvider bindSectionProvider( NotificationSectionsManager impl); + @Binds + StackScrollAlgorithm.BypassController bindBypassController( + KeyguardBypassController impl); + /** Provides an instance of {@link NotificationEntryManager} */ @SysUISingleton @Provides diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java index 197920f7be19..9846b28ba5f9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java @@ -29,6 +29,7 @@ import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.row.ActivatableNotificationView; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; import com.android.systemui.statusbar.notification.row.ExpandableView; +import com.android.systemui.statusbar.notification.stack.StackScrollAlgorithm.BypassController; import com.android.systemui.statusbar.notification.stack.StackScrollAlgorithm.SectionProvider; import javax.inject.Inject; @@ -43,6 +44,7 @@ public class AmbientState { private static final boolean NOTIFICATIONS_HAVE_SHADOWS = false; private final SectionProvider mSectionProvider; + private final BypassController mBypassController; private int mScrollY; private boolean mDimmed; private ActivatableNotificationView mActivatedChild; @@ -152,14 +154,25 @@ public class AmbientState { return mStackHeight; } + /** + * @return Height of notifications panel, with the animation from pulseHeight accounted for. + */ + // TODO(b/192348384): move this logic to getStackHeight, and remove this and getInnerHeight + public float getPulseStackHeight() { + float pulseHeight = Math.min(mPulseHeight, mStackHeight); + return MathUtils.lerp(mStackHeight, pulseHeight, mDozeAmount); + } + /** Tracks the state from AlertingNotificationManager#hasNotifications() */ private boolean mHasAlertEntries; @Inject public AmbientState( Context context, - @NonNull SectionProvider sectionProvider) { + @NonNull SectionProvider sectionProvider, + @NonNull BypassController bypassController) { mSectionProvider = sectionProvider; + mBypassController = bypassController; reload(context); } @@ -297,6 +310,13 @@ public class AmbientState { } } + /** + * Is bypass currently enabled? + */ + public boolean isBypassEnabled() { + return mBypassController.isBypassEnabled(); + } + public float getOverScrollAmount(boolean top) { return top ? mOverScrollTopAmount : mOverScrollBottomAmount; } 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 3fc8b8d9aef1..e65038b32bf0 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 @@ -421,10 +421,20 @@ public class StackScrollAlgorithm { // When pulsing (incoming notification on AOD), innerHeight is 0; clamp all // to shelf start, thereby hiding all notifications (except the first one, which // we later unhide in updatePulsingState) - final int stackBottom = - !ambientState.isShadeExpanded() || ambientState.isDozing() - ? ambientState.getInnerHeight() - : (int) ambientState.getStackHeight(); + // TODO(b/192348384): merge InnerHeight with StackHeight + final int stackBottom; + if (ambientState.isBypassEnabled()) { + // We want to use the stackHeight when pulse expanding, since the animation + // isn't currently optimized if the pulseHeight is continuously changing + // Let's improve this when we're merging the heights above + stackBottom = ambientState.isPulseExpanding() + ? (int) ambientState.getStackHeight() + : ambientState.getInnerHeight(); + } else { + stackBottom = !ambientState.isShadeExpanded() || ambientState.isDozing() + ? ambientState.getInnerHeight() + : (int) ambientState.getPulseStackHeight(); + } final int shelfStart = stackBottom - ambientState.getShelf().getIntrinsicHeight(); viewState.yTranslation = Math.min(viewState.yTranslation, shelfStart); @@ -742,4 +752,14 @@ public class StackScrollAlgorithm { */ boolean beginsSection(@NonNull View view, @Nullable View previous); } + + /** + * Interface for telling the StackScrollAlgorithm information about the bypass state + */ + public interface BypassController { + /** + * True if bypass is enabled. Note that this is always false if face auth is not enabled. + */ + boolean isBypassEnabled(); + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt index c9d08427c8ca..2cb0a3a28901 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt @@ -28,6 +28,7 @@ import com.android.systemui.dump.DumpManager import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.statusbar.NotificationLockscreenUserManager import com.android.systemui.statusbar.StatusBarState +import com.android.systemui.statusbar.notification.stack.StackScrollAlgorithm import com.android.systemui.statusbar.policy.KeyguardStateController import com.android.systemui.tuner.TunerService import java.io.FileDescriptor @@ -35,7 +36,7 @@ import java.io.PrintWriter import javax.inject.Inject @SysUISingleton -open class KeyguardBypassController : Dumpable { +open class KeyguardBypassController : Dumpable, StackScrollAlgorithm.BypassController { private val mKeyguardStateController: KeyguardStateController private val statusBarStateController: StatusBarStateController @@ -67,6 +68,9 @@ open class KeyguardBypassController : Dumpable { lateinit var unlockController: BiometricUnlockController var isPulseExpanding = false + /** delegates to [bypassEnabled] but conforms to [StackScrollAlgorithm.BypassController] */ + override fun isBypassEnabled() = bypassEnabled + /** * If face unlock dismisses the lock screen or keeps user on keyguard for the current user. */ diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java index 04d7b7261ba7..b03df880f0ba 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java @@ -64,6 +64,7 @@ import com.android.systemui.statusbar.notification.collection.legacy.Notificatio import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; import com.android.systemui.statusbar.notification.row.FooterView; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout.KeyguardBypassEnabledProvider; +import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.ShadeController; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.UnlockedScreenOffAnimationController; @@ -101,6 +102,7 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { @Mock private RemoteInputController mRemoteInputController; @Mock private NotificationRoundnessManager mNotificationRoundnessManager; @Mock private KeyguardBypassEnabledProvider mKeyguardBypassEnabledProvider; + @Mock private KeyguardBypassController mBypassController; @Mock private NotificationSectionsManager mNotificationSectionsManager; @Mock private NotificationSection mNotificationSection; @Mock private SysuiStatusBarStateController mStatusBarStateController; @@ -132,7 +134,7 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { when(mRemoteInputManager.getController()).thenReturn(mRemoteInputController); // Interact with real instance of AmbientState. - mAmbientState = new AmbientState(mContext, mNotificationSectionsManager); + mAmbientState = new AmbientState(mContext, mNotificationSectionsManager, mBypassController); // The actual class under test. You may need to work with this class directly when // testing anonymous class members of mStackScroller, like mMenuEventListener, -- cgit v1.2.3 From 85d7336db0ddc1833dbb7566e9fb7c25f45d5a6a Mon Sep 17 00:00:00 2001 From: Evan Severson Date: Fri, 9 Jul 2021 13:36:13 -0700 Subject: Update the sensor use dialog if more sensors are accessed If another sensor is accessed after the dialog has been shown we now update the dialog to reflect all accessed sensors. Test: Wrote app which opens mic/cam at different times Fixes: 187139024 Fixes: 187132341 Change-Id: I178bb4f6ea1913e3ee0e2153cf8ac3b2f24e4623 --- .../android/hardware/ISensorPrivacyManager.aidl | 2 +- .../android/hardware/SensorPrivacyManager.java | 8 ++-- packages/SystemUI/AndroidManifest.xml | 1 + .../sensorprivacy/SensorUseStartedActivity.kt | 26 +++++++++--- .../policy/IndividualSensorPrivacyController.java | 2 +- .../IndividualSensorPrivacyControllerImpl.java | 4 +- .../com/android/server/SensorPrivacyService.java | 48 ++++++++++++++-------- 7 files changed, 61 insertions(+), 30 deletions(-) diff --git a/core/java/android/hardware/ISensorPrivacyManager.aidl b/core/java/android/hardware/ISensorPrivacyManager.aidl index 6105c26dc651..debc074ea21a 100644 --- a/core/java/android/hardware/ISensorPrivacyManager.aidl +++ b/core/java/android/hardware/ISensorPrivacyManager.aidl @@ -46,6 +46,6 @@ interface ISensorPrivacyManager { void setIndividualSensorPrivacyForProfileGroup(int userId, int source, int sensor, boolean enable); // =============== End of transactions used on native side as well ============================ - void suppressIndividualSensorPrivacyReminders(int userId, String packageName, IBinder token, + void suppressIndividualSensorPrivacyReminders(int userId, int sensor, IBinder token, boolean suppress); } \ No newline at end of file diff --git a/core/java/android/hardware/SensorPrivacyManager.java b/core/java/android/hardware/SensorPrivacyManager.java index c392fbb52de0..b7d95e7dea74 100644 --- a/core/java/android/hardware/SensorPrivacyManager.java +++ b/core/java/android/hardware/SensorPrivacyManager.java @@ -461,9 +461,9 @@ public final class SensorPrivacyManager { * @hide */ @RequiresPermission(Manifest.permission.MANAGE_SENSOR_PRIVACY) - public void suppressSensorPrivacyReminders(@NonNull String packageName, + public void suppressSensorPrivacyReminders(int sensor, boolean suppress) { - suppressSensorPrivacyReminders(packageName, suppress, mContext.getUserId()); + suppressSensorPrivacyReminders(sensor, suppress, mContext.getUserId()); } /** @@ -476,10 +476,10 @@ public final class SensorPrivacyManager { * @hide */ @RequiresPermission(Manifest.permission.MANAGE_SENSOR_PRIVACY) - public void suppressSensorPrivacyReminders(@NonNull String packageName, + public void suppressSensorPrivacyReminders(int sensor, boolean suppress, @UserIdInt int userId) { try { - mService.suppressIndividualSensorPrivacyReminders(userId, packageName, + mService.suppressIndividualSensorPrivacyReminders(userId, sensor, token, suppress); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index 8963ddaece35..1b2aefcd6ff0 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -451,6 +451,7 @@ diff --git a/packages/SystemUI/src/com/android/systemui/sensorprivacy/SensorUseStartedActivity.kt b/packages/SystemUI/src/com/android/systemui/sensorprivacy/SensorUseStartedActivity.kt index 24775344240a..7d0fdd62e6d3 100644 --- a/packages/SystemUI/src/com/android/systemui/sensorprivacy/SensorUseStartedActivity.kt +++ b/packages/SystemUI/src/com/android/systemui/sensorprivacy/SensorUseStartedActivity.kt @@ -17,6 +17,7 @@ package com.android.systemui.sensorprivacy import android.content.DialogInterface +import android.content.Intent import android.content.Intent.EXTRA_PACKAGE_NAME import android.content.pm.PackageManager import android.content.res.Resources @@ -174,7 +175,7 @@ class SensorUseStartedActivity @Inject constructor( override fun onStart() { super.onStart() - sensorPrivacyController.suppressSensorPrivacyReminders(sensorUsePackageName, true) + setSuppressed(true) unsuppressImmediately = false } @@ -205,12 +206,10 @@ class SensorUseStartedActivity @Inject constructor( super.onStop() if (unsuppressImmediately) { - sensorPrivacyController - .suppressSensorPrivacyReminders(sensorUsePackageName, false) + setSuppressed(false) } else { bgHandler.postDelayed({ - sensorPrivacyController - .suppressSensorPrivacyReminders(sensorUsePackageName, false) + setSuppressed(false) }, SUPPRESS_REMINDERS_REMOVAL_DELAY_MILLIS) } } @@ -224,6 +223,11 @@ class SensorUseStartedActivity @Inject constructor( // do not allow backing out } + override fun onNewIntent(intent: Intent?) { + setIntent(intent) + recreate() + } + private fun disableSensorPrivacy() { if (sensor == ALL_SENSORS) { sensorPrivacyController.setSensorBlocked(DIALOG, MICROPHONE, false) @@ -234,4 +238,16 @@ class SensorUseStartedActivity @Inject constructor( unsuppressImmediately = true setResult(RESULT_OK) } + + private fun setSuppressed(suppressed: Boolean) { + if (sensor == ALL_SENSORS) { + sensorPrivacyController + .suppressSensorPrivacyReminders(MICROPHONE, suppressed) + sensorPrivacyController + .suppressSensorPrivacyReminders(CAMERA, suppressed) + } else { + sensorPrivacyController + .suppressSensorPrivacyReminders(sensor, suppressed) + } + } } \ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/IndividualSensorPrivacyController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/IndividualSensorPrivacyController.java index acfdda4cea49..e01b95e81da8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/IndividualSensorPrivacyController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/IndividualSensorPrivacyController.java @@ -29,7 +29,7 @@ public interface IndividualSensorPrivacyController extends void setSensorBlocked(@Source int source, @Sensor int sensor, boolean blocked); - void suppressSensorPrivacyReminders(String packageName, boolean suppress); + void suppressSensorPrivacyReminders(int sensor, boolean suppress); interface Callback { void onSensorBlockedChanged(@Sensor int sensor, boolean blocked); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/IndividualSensorPrivacyControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/IndividualSensorPrivacyControllerImpl.java index 9807165f69d0..1d71301c7454 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/IndividualSensorPrivacyControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/IndividualSensorPrivacyControllerImpl.java @@ -68,8 +68,8 @@ public class IndividualSensorPrivacyControllerImpl implements IndividualSensorPr } @Override - public void suppressSensorPrivacyReminders(String packageName, boolean suppress) { - mSensorPrivacyManager.suppressSensorPrivacyReminders(packageName, suppress); + public void suppressSensorPrivacyReminders(int sensor, boolean suppress) { + mSensorPrivacyManager.suppressSensorPrivacyReminders(sensor, suppress); } @Override diff --git a/services/core/java/com/android/server/SensorPrivacyService.java b/services/core/java/com/android/server/SensorPrivacyService.java index 4f3a38b6cdca..feddc3105c8c 100644 --- a/services/core/java/com/android/server/SensorPrivacyService.java +++ b/services/core/java/com/android/server/SensorPrivacyService.java @@ -256,7 +256,7 @@ public final class SensorPrivacyService extends SystemService { * -> list of suppressor tokens */ @GuardedBy("mLock") - private ArrayMap, ArrayList> mSuppressReminders = + private ArrayMap, ArrayList> mSuppressReminders = new ArrayMap<>(); private final ArrayMap> @@ -391,7 +391,7 @@ public final class SensorPrivacyService extends SystemService { } synchronized (mLock) { - if (mSuppressReminders.containsKey(new Pair<>(packageName, user))) { + if (mSuppressReminders.containsKey(new Pair<>(sensor, user))) { Log.d(TAG, "Suppressed sensor privacy reminder for " + packageName + "/" + user); return; @@ -418,14 +418,22 @@ public final class SensorPrivacyService extends SystemService { for (int taskNum = 0; taskNum < numTasks; taskNum++) { RunningTaskInfo task = tasks.get(taskNum); - if (task.isVisible && task.topActivity.getPackageName().equals(packageName)) { - if (task.isFocused) { - // There is the one focused activity - enqueueSensorUseReminderDialogAsync(task.taskId, user, packageName, sensor); - return; - } + if (task.isVisible) { + if (task.topActivity.getPackageName().equals(packageName)) { + if (task.isFocused) { + // There is the one focused activity + enqueueSensorUseReminderDialogAsync(task.taskId, user, packageName, + sensor); + return; + } - tasksOfPackageUsingSensor.add(task); + tasksOfPackageUsingSensor.add(task); + } else if (task.topActivity.flattenToString().equals(mContext.getResources() + .getString(R.string.config_sensorUseStartedActivity)) + && task.isFocused) { + enqueueSensorUseReminderDialogAsync(task.taskId, user, packageName, + sensor); + } } } @@ -518,8 +526,15 @@ public final class SensorPrivacyService extends SystemService { SensorUseReminderDialogInfo info = new SensorUseReminderDialogInfo(taskId, user, packageName); if (!mQueuedSensorUseReminderDialogs.containsKey(info)) { - ArraySet sensors = new ArraySet(); - sensors.add(sensor); + ArraySet sensors = new ArraySet<>(); + if (sensor == MICROPHONE && mSuppressReminders.containsKey(new Pair<>(CAMERA, user)) + || sensor == CAMERA && mSuppressReminders + .containsKey(new Pair<>(MICROPHONE, user))) { + sensors.add(MICROPHONE); + sensors.add(CAMERA); + } else { + sensors.add(sensor); + } mQueuedSensorUseReminderDialogs.put(info, sensors); mHandler.sendMessageDelayed( PooledLambda.obtainMessage(this::showSensorUserReminderDialog, info), @@ -1100,13 +1115,12 @@ public final class SensorPrivacyService extends SystemService { } @Override - public void suppressIndividualSensorPrivacyReminders(int userId, String packageName, + public void suppressIndividualSensorPrivacyReminders(int userId, int sensor, IBinder token, boolean suppress) { enforceManageSensorPrivacyPermission(); - Objects.requireNonNull(packageName); Objects.requireNonNull(token); - Pair key = new Pair<>(packageName, UserHandle.of(userId)); + Pair key = new Pair<>(sensor, UserHandle.of(userId)); synchronized (mLock) { if (suppress) { @@ -1136,7 +1150,7 @@ public final class SensorPrivacyService extends SystemService { * @param key Key the token is in * @param token The token to remove */ - private void removeSuppressPackageReminderToken(@NonNull Pair key, + private void removeSuppressPackageReminderToken(@NonNull Pair key, @NonNull IBinder token) { synchronized (mLock) { ArrayList suppressPackageReminderTokens = @@ -1168,7 +1182,7 @@ public final class SensorPrivacyService extends SystemService { @Override public void binderDied(@NonNull IBinder token) { synchronized (mLock) { - for (Pair key : mSuppressReminders.keySet()) { + for (Pair key : mSuppressReminders.keySet()) { removeSuppressPackageReminderToken(key, token); } } @@ -1495,7 +1509,7 @@ public final class SensorPrivacyService extends SystemService { listeners.finishBroadcast(); } - public void removeSuppressPackageReminderToken(Pair key, + public void removeSuppressPackageReminderToken(Pair key, IBinder token) { sendMessage(PooledLambda.obtainMessage( SensorPrivacyServiceImpl::removeSuppressPackageReminderToken, -- cgit v1.2.3 From 34a6c46d1dd8ce3c7e05fde4dfa2153ceb411784 Mon Sep 17 00:00:00 2001 From: Joe Bolinger Date: Fri, 9 Jul 2021 14:16:25 -0700 Subject: Add orientation listener to all biometric overlays. Listener is only active when the overlays are showing (see Icce7846c5637711d8abad1121095fd7a25ed644f). Fix: 186372522 Test: atest SidefpsControllerTest UdfpsControllerTest AuthControllerTest Test: manual (Settings -> enroll fingerprint, flip device in all orientations) Change-Id: I9981aecd08decf03336caccc313a86aead441797 --- .../systemui/biometrics/AuthController.java | 55 +++------- .../BiometricOrientationEventListener.kt | 60 +++++++++++ .../systemui/biometrics/SidefpsController.java | 18 +++- .../systemui/biometrics/UdfpsController.java | 13 ++- .../systemui/biometrics/AuthControllerTest.java | 16 ++- .../systemui/biometrics/SidefpsControllerTest.kt | 117 +++++++++++++++++++++ .../systemui/biometrics/UdfpsControllerTest.java | 18 ++++ 7 files changed, 251 insertions(+), 46 deletions(-) create mode 100644 packages/SystemUI/src/com/android/systemui/biometrics/BiometricOrientationEventListener.kt create mode 100644 packages/SystemUI/tests/src/com/android/systemui/biometrics/SidefpsControllerTest.kt diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java index badad9d86a0f..71e2bb657de4 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java @@ -48,10 +48,7 @@ import android.os.Handler; import android.os.Looper; import android.os.RemoteException; import android.util.Log; -import android.view.Display; import android.view.MotionEvent; -import android.view.OrientationEventListener; -import android.view.Surface; import android.view.WindowManager; import com.android.internal.R; @@ -72,6 +69,8 @@ import java.util.Set; import javax.inject.Inject; import javax.inject.Provider; +import kotlin.Unit; + /** * Receives messages sent from {@link com.android.server.biometrics.BiometricService} and shows the * appropriate biometric UI (e.g. BiometricDialogView). @@ -107,7 +106,8 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, TaskStackListener mTaskStackListener; @VisibleForTesting IBiometricSysuiReceiver mReceiver; - @NonNull private final BiometricOrientationEventListener mOrientationListener; + @VisibleForTesting + @NonNull final BiometricOrientationEventListener mOrientationListener; @Nullable private final List mFaceProps; @Nullable private List mFpProps; @Nullable private List mUdfpsProps; @@ -120,42 +120,6 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, } } - private class BiometricOrientationEventListener extends OrientationEventListener { - @Surface.Rotation private int mLastRotation; - - BiometricOrientationEventListener(Context context) { - super(context); - mLastRotation = context.getDisplay().getRotation(); - } - - @Override - public void onOrientationChanged(int orientation) { - if (orientation == ORIENTATION_UNKNOWN) { - return; - } - - final Display display = mContext.getDisplay(); - if (display == null) { - return; - } - - final int rotation = display.getRotation(); - if (mLastRotation != rotation) { - mLastRotation = rotation; - - if (mCurrentDialog != null) { - mCurrentDialog.onOrientationChanged(); - } - if (mUdfpsController != null) { - mUdfpsController.onOrientationChanged(); - } - if (mSidefpsController != null) { - mSidefpsController.onOrientationChanged(); - } - } - } - } - @NonNull private final IFingerprintAuthenticatorsRegisteredCallback mFingerprintAuthenticatorsRegisteredCallback = @@ -468,7 +432,10 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, mUdfpsControllerFactory = udfpsControllerFactory; mSidefpsControllerFactory = sidefpsControllerFactory; mWindowManager = windowManager; - mOrientationListener = new BiometricOrientationEventListener(context); + mOrientationListener = new BiometricOrientationEventListener(context, () -> { + onOrientationChanged(); + return Unit.INSTANCE; + }); mFaceProps = mFaceManager != null ? mFaceManager.getSensorPropertiesInternal() : null; @@ -790,6 +757,12 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, } } + private void onOrientationChanged() { + if (mCurrentDialog != null) { + mCurrentDialog.onOrientationChanged(); + } + } + protected AuthDialog buildDialog(PromptInfo promptInfo, boolean requireConfirmation, int userId, int[] sensorIds, boolean credentialAllowed, String opPackageName, boolean skipIntro, long operationId, diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricOrientationEventListener.kt b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricOrientationEventListener.kt new file mode 100644 index 000000000000..08ea857eb208 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricOrientationEventListener.kt @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.biometrics + +import android.content.Context +import android.view.OrientationEventListener + +/** + * An [OrientationEventListener] that invokes the [onOrientationChanged] callback whenever + * the orientation of the device has changed in order to keep overlays for biometric sensors + * aligned with the device's screen. + */ +class BiometricOrientationEventListener( + private val context: Context, + private val onOrientationChanged: () -> Unit +) : OrientationEventListener(context) { + + /** If actively listening (not available in base class). */ + var enabled: Boolean = false + private set + + private var lastRotation = context.display?.rotation ?: ORIENTATION_UNKNOWN + + override fun onOrientationChanged(orientation: Int) { + if (orientation == ORIENTATION_UNKNOWN) { + return + } + + val rotation = context.display?.rotation ?: return + if (lastRotation != rotation) { + lastRotation = rotation + + onOrientationChanged() + } + } + + override fun enable() { + enabled = true + super.enable() + } + + override fun disable() { + enabled = false + super.disable() + } +} diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/SidefpsController.java b/packages/SystemUI/src/com/android/systemui/biometrics/SidefpsController.java index 436e1e4e3116..a51c2b802b91 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/SidefpsController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/SidefpsController.java @@ -41,6 +41,8 @@ import com.android.systemui.util.concurrency.DelayableExecutor; import javax.inject.Inject; +import kotlin.Unit; + /** * Shows and hides the side fingerprint sensor (side-fps) overlay and handles side fps touch events. */ @@ -52,6 +54,8 @@ public class SidefpsController { private final FingerprintManager mFingerprintManager; private final WindowManager mWindowManager; private final DelayableExecutor mFgExecutor; + @VisibleForTesting @NonNull final BiometricOrientationEventListener mOrientationListener; + // TODO: update mDisplayHeight and mDisplayWidth for multi-display devices private final int mDisplayHeight; private final int mDisplayWidth; @@ -95,6 +99,10 @@ public class SidefpsController { mFingerprintManager = checkNotNull(fingerprintManager); mWindowManager = windowManager; mFgExecutor = fgExecutor; + mOrientationListener = new BiometricOrientationEventListener(context, () -> { + onOrientationChanged(); + return Unit.INSTANCE; + }); mSensorProps = findFirstSidefps(); checkArgument(mSensorProps != null); @@ -119,14 +127,15 @@ public class SidefpsController { mFingerprintManager.setSidefpsController(mSidefpsControllerImpl); } - void show() { + private void show() { mView = (SidefpsView) mInflater.inflate(R.layout.sidefps_view, null, false); mView.setSensorProperties(mSensorProps); mWindowManager.addView(mView, computeLayoutParams()); + mOrientationListener.enable(); } - void hide() { + private void hide() { if (mView != null) { mWindowManager.removeView(mView); mView.setOnTouchListener(null); @@ -135,13 +144,16 @@ public class SidefpsController { } else { Log.v(TAG, "hideUdfpsOverlay | the overlay is already hidden"); } + + mOrientationListener.disable(); } - void onOrientationChanged() { + private void onOrientationChanged() { // If mView is null or if view is hidden, then return. if (mView == null || !mIsVisible) { return; } + // If the overlay needs to be displayed with a new configuration, destroy the current // overlay, and re-create and show the overlay with the updated LayoutParams. hide(); diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java index 710aca038569..f9103b56200b 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java @@ -79,6 +79,8 @@ import java.util.Optional; import javax.inject.Inject; +import kotlin.Unit; + /** * Shows and hides the under-display fingerprint sensor (UDFPS) overlay, handles UDFPS touch events, * and coordinates triggering of the high-brightness mode (HBM). @@ -118,6 +120,7 @@ public class UdfpsController implements DozeReceiver { @NonNull private final AccessibilityManager mAccessibilityManager; @NonNull private final LockscreenShadeTransitionController mLockscreenShadeTransitionController; @Nullable private final UdfpsHbmProvider mHbmProvider; + @VisibleForTesting @NonNull final BiometricOrientationEventListener mOrientationListener; // Currently the UdfpsController supports a single UDFPS sensor. If devices have multiple // sensors, this, in addition to a lot of the code here, will be updated. @VisibleForTesting final FingerprintSensorPropertiesInternal mSensorProps; @@ -511,6 +514,10 @@ public class UdfpsController implements DozeReceiver { mHbmProvider = hbmProvider.orElse(null); screenLifecycle.addObserver(mScreenObserver); mScreenOn = screenLifecycle.getScreenState() == ScreenLifecycle.SCREEN_ON; + mOrientationListener = new BiometricOrientationEventListener(context, () -> { + onOrientationChanged(); + return Unit.INSTANCE; + }); mSensorProps = findFirstUdfps(); // At least one UDFPS sensor exists @@ -650,7 +657,7 @@ public class UdfpsController implements DozeReceiver { return mCoreLayoutParams; } - void onOrientationChanged() { + private void onOrientationChanged() { // When the configuration changes it's almost always necessary to destroy and re-create // the overlay's window to pass it the new LayoutParams. // Hiding the overlay will destroy its window. It's safe to hide the overlay regardless @@ -668,6 +675,7 @@ public class UdfpsController implements DozeReceiver { if (mView == null) { try { Log.v(TAG, "showUdfpsOverlay | adding window reason=" + reason); + mView = (UdfpsView) mInflater.inflate(R.layout.udfps_view, null, false); mOnFingerDown = false; mView.setSensorProperties(mSensorProps); @@ -675,6 +683,7 @@ public class UdfpsController implements DozeReceiver { UdfpsAnimationViewController animation = inflateUdfpsAnimation(reason); animation.init(); mView.setAnimationViewController(animation); + mOrientationListener.enable(); // This view overlaps the sensor area, so prevent it from being selectable // during a11y. @@ -768,6 +777,8 @@ public class UdfpsController implements DozeReceiver { } else { Log.v(TAG, "hideUdfpsOverlay | the overlay is already hidden"); } + + mOrientationListener.disable(); } /** diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java index bfcd1310acc2..e94f836337a9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java @@ -20,7 +20,9 @@ import static android.hardware.biometrics.BiometricManager.Authenticators; import static android.hardware.biometrics.BiometricManager.BIOMETRIC_MULTI_SENSOR_FACE_THEN_FINGERPRINT; import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertNull; +import static junit.framework.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; @@ -55,12 +57,13 @@ import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; import android.hardware.fingerprint.IFingerprintAuthenticatorsRegisteredCallback; import android.os.Bundle; import android.os.RemoteException; -import android.test.suitebuilder.annotation.SmallTest; import android.testing.AndroidTestingRunner; import android.testing.TestableContext; import android.testing.TestableLooper.RunWithLooper; import android.view.WindowManager; +import androidx.test.filters.SmallTest; + import com.android.internal.R; import com.android.systemui.SysuiTestCase; import com.android.systemui.statusbar.CommandQueue; @@ -539,6 +542,17 @@ public class AuthControllerTest extends SysuiTestCase { verify(mUdfpsController).onAodInterrupt(eq(pos), eq(pos), eq(majorMinor), eq(majorMinor)); } + @Test + public void testSubscribesToOrientationChangesWhenShowingDialog() { + assertFalse(mAuthController.mOrientationListener.getEnabled()); + + showDialog(new int[]{1} /* sensorIds */, false /* credentialAllowed */); + assertTrue(mAuthController.mOrientationListener.getEnabled()); + + mAuthController.hideAuthenticationDialog(); + assertFalse(mAuthController.mOrientationListener.getEnabled()); + } + // Helpers private void showDialog(int[] sensorIds, boolean credentialAllowed) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/SidefpsControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/SidefpsControllerTest.kt new file mode 100644 index 000000000000..7019a4bbb08c --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/SidefpsControllerTest.kt @@ -0,0 +1,117 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.biometrics + +import android.hardware.biometrics.SensorProperties +import android.hardware.display.DisplayManagerGlobal +import android.hardware.fingerprint.FingerprintManager +import android.hardware.fingerprint.FingerprintSensorProperties +import android.hardware.fingerprint.FingerprintSensorPropertiesInternal +import android.hardware.fingerprint.ISidefpsController +import android.testing.AndroidTestingRunner +import android.testing.TestableLooper +import android.view.Display +import android.view.DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS +import android.view.DisplayInfo +import android.view.LayoutInflater +import android.view.WindowManager +import androidx.test.filters.SmallTest +import com.android.systemui.R +import com.android.systemui.SysuiTestCase +import com.android.systemui.util.concurrency.FakeExecutor +import com.android.systemui.util.time.FakeSystemClock +import com.google.common.truth.Truth.assertThat +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.ArgumentCaptor +import org.mockito.Mock +import org.mockito.Mockito.`when` +import org.mockito.Mockito.verify +import org.mockito.junit.MockitoJUnit + +private const val DISPLAY_ID = 2 +private const val SENSOR_ID = 1 + +@SmallTest +@RunWith(AndroidTestingRunner::class) +@TestableLooper.RunWithLooper +class SidefpsControllerTest : SysuiTestCase() { + + @JvmField @Rule + var rule = MockitoJUnit.rule() + + @Mock + lateinit var layoutInflater: LayoutInflater + @Mock + lateinit var fingerprintManager: FingerprintManager + @Mock + lateinit var windowManager: WindowManager + @Mock + lateinit var sidefpsView: SidefpsView + + private val executor = FakeExecutor(FakeSystemClock()) + private lateinit var overlayController: ISidefpsController + private lateinit var sideFpsController: SidefpsController + + @Before + fun setup() { + `when`(layoutInflater.inflate(R.layout.sidefps_view, null, false)).thenReturn(sidefpsView) + `when`(fingerprintManager.sensorPropertiesInternal).thenReturn( + listOf( + FingerprintSensorPropertiesInternal( + SENSOR_ID, + SensorProperties.STRENGTH_STRONG, + 5 /* maxEnrollmentsPerUser */, + listOf() /* componentInfo */, + FingerprintSensorProperties.TYPE_POWER_BUTTON, + true /* resetLockoutRequiresHardwareAuthToken */ + ) + ) + ) + `when`(windowManager.defaultDisplay).thenReturn( + Display( + DisplayManagerGlobal.getInstance(), + DISPLAY_ID, + DisplayInfo(), + DEFAULT_DISPLAY_ADJUSTMENTS + ) + ) + + sideFpsController = SidefpsController( + mContext, layoutInflater, fingerprintManager, windowManager, executor + ) + + overlayController = ArgumentCaptor.forClass(ISidefpsController::class.java).apply { + verify(fingerprintManager).setSidefpsController(capture()) + }.value + } + + @Test + fun testSubscribesToOrientationChangesWhenShowingOverlay() { + assertThat(sideFpsController.mOrientationListener.enabled).isFalse() + + overlayController.show() + executor.runAllReady() + assertThat(sideFpsController.mOrientationListener.enabled).isTrue() + + overlayController.hide() + executor.runAllReady() + assertThat(sideFpsController.mOrientationListener.enabled).isFalse() + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java index 25722e1c956b..d8d3676d4fa2 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java @@ -17,6 +17,8 @@ package com.android.systemui.biometrics; import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertFalse; +import static junit.framework.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyFloat; @@ -235,6 +237,22 @@ public class UdfpsControllerTest extends SysuiTestCase { verify(mWindowManager).removeView(eq(mUdfpsView)); } + @Test + public void testSubscribesToOrientationChangesWhenShowingOverlay() throws Exception { + assertFalse(mUdfpsController.mOrientationListener.getEnabled()); + + mOverlayController.showUdfpsOverlay(TEST_UDFPS_SENSOR_ID, + IUdfpsOverlayController.REASON_AUTH_FPM_KEYGUARD, mUdfpsOverlayControllerCallback); + mFgExecutor.runAllReady(); + + assertTrue(mUdfpsController.mOrientationListener.getEnabled()); + + mOverlayController.hideUdfpsOverlay(TEST_UDFPS_SENSOR_ID); + mFgExecutor.runAllReady(); + + assertFalse(mUdfpsController.mOrientationListener.getEnabled()); + } + @Test public void fingerDown() throws RemoteException { // Configure UdfpsView to accept the ACTION_DOWN event -- cgit v1.2.3 From 6054148ef9a0a8ea5f14aa302c679952937cb911 Mon Sep 17 00:00:00 2001 From: Christopher Tate Date: Fri, 9 Jul 2021 14:19:47 -0700 Subject: Remove isAppStartModeDisabled binder entry point Obsolete: the use cases for which it was introduced now have a clean internal API layer to use instead, and this reduces informational exposure about package presence & states. Bug: 185513355 Test: atest SyncManagerTest Test: atest CtsSyncManagerTest Change-Id: I4aa1848950061dce3a1378f7d0117364e62ba59f --- core/java/android/app/IActivityManager.aidl | 1 - .../java/com/android/server/content/SyncManager.java | 19 +++++++++---------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl index 313a34067cd0..b90b9a11611e 100644 --- a/core/java/android/app/IActivityManager.aidl +++ b/core/java/android/app/IActivityManager.aidl @@ -508,7 +508,6 @@ interface IActivityManager { boolean stopBinderTrackingAndDump(in ParcelFileDescriptor fd); @UnsupportedAppUsage(maxTargetSdk = 30, trackingBug = 170729553) void suppressResizeConfigChanges(boolean suppress); - boolean isAppStartModeDisabled(int uid, in String packageName); @UnsupportedAppUsage(maxTargetSdk = 30, trackingBug = 170729553) boolean unlockUser(int userid, in byte[] token, in byte[] secret, in IProgressListener listener); diff --git a/services/core/java/com/android/server/content/SyncManager.java b/services/core/java/com/android/server/content/SyncManager.java index fb919fbe0a3d..53c13c7a1268 100644 --- a/services/core/java/com/android/server/content/SyncManager.java +++ b/services/core/java/com/android/server/content/SyncManager.java @@ -28,7 +28,7 @@ import android.accounts.AccountManagerInternal; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UserIdInt; -import android.app.ActivityManager; +import android.app.ActivityManagerInternal; import android.app.AppGlobals; import android.app.Notification; import android.app.NotificationManager; @@ -323,6 +323,8 @@ public class SyncManager { private final PackageManagerInternal mPackageManagerInternal; + private final ActivityManagerInternal mAmi; + private List getAllUsers() { return mUserManager.getUsers(); } @@ -643,6 +645,7 @@ public class SyncManager { mAccountManager = (AccountManager) mContext.getSystemService(Context.ACCOUNT_SERVICE); mAccountManagerInternal = LocalServices.getService(AccountManagerInternal.class); mPackageManagerInternal = LocalServices.getService(PackageManagerInternal.class); + mAmi = LocalServices.getService(ActivityManagerInternal.class); mAccountManagerInternal.addOnAppPermissionChangeListener((Account account, int uid) -> { // If the UID gained access to the account kick-off syncs lacking account access @@ -1115,15 +1118,11 @@ public class SyncManager { } final int owningUid = syncAdapterInfo.uid; final String owningPackage = syncAdapterInfo.componentName.getPackageName(); - try { - if (ActivityManager.getService().isAppStartModeDisabled(owningUid, owningPackage)) { - Slog.w(TAG, "Not scheduling job " + syncAdapterInfo.uid + ":" - + syncAdapterInfo.componentName - + " -- package not allowed to start"); - return AuthorityInfo.NOT_SYNCABLE; - } - } catch (RemoteException e) { - /* ignore - local call */ + if (mAmi.isAppStartModeDisabled(owningUid, owningPackage)) { + Slog.w(TAG, "Not scheduling job " + syncAdapterInfo.uid + ":" + + syncAdapterInfo.componentName + + " -- package not allowed to start"); + return AuthorityInfo.NOT_SYNCABLE; } if (checkAccountAccess && !canAccessAccount(account, owningPackage, owningUid)) { Log.w(TAG, "Access to " + logSafe(account) + " denied for package " -- cgit v1.2.3 From 0f3339cfc299fc908aad61152734ac0290b5c0e3 Mon Sep 17 00:00:00 2001 From: jiabin Date: Fri, 9 Jul 2021 11:50:07 -0700 Subject: Cache weak reference for static context. Use weak reference to cache static context to avoid leak. Test: atest RingtoneManagerTest Test: atest RequestPinItemTest Bug: 192995480 Change-Id: Idbfc9bd0c93ddb40693989c0d09719af24363f1d --- media/java/android/media/AudioManager.java | 33 +++++++++++++++++------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java index 09ebb40e7ad7..bd3ca5a80f96 100644 --- a/media/java/android/media/AudioManager.java +++ b/media/java/android/media/AudioManager.java @@ -73,6 +73,7 @@ import com.android.internal.util.Preconditions; import java.io.IOException; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -103,7 +104,7 @@ public class AudioManager { private static final AudioVolumeGroupChangeHandler sAudioAudioVolumeGroupChangedHandler = new AudioVolumeGroupChangeHandler(); - private static Context sContext; + private static WeakReference sContext; /** * Broadcast intent, a hint for applications that audio is about to become @@ -800,7 +801,7 @@ public class AudioManager { } else { mOriginalContext = context; } - sContext = context; + sContext = new WeakReference<>(context); } @UnsupportedAppUsage @@ -7256,23 +7257,27 @@ public class AudioManager { */ public static boolean hasHapticChannels(@Nullable Context context, @NonNull Uri uri) { Objects.requireNonNull(uri); + if (context != null) { return hasHapticChannelsImpl(context, uri); - } else if (sContext != null) { + } + + Context cachedContext = sContext.get(); + if (cachedContext != null) { if (DEBUG) { Log.d(TAG, "Try to use static context to query if having haptic channels"); } - return hasHapticChannelsImpl(sContext, uri); - } else { - // Try with audio service context, this may fail to get correct result. - if (DEBUG) { - Log.d(TAG, "Try to use audio service context to query if having haptic channels"); - } - try { - return getService().hasHapticChannels(uri); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } + return hasHapticChannelsImpl(cachedContext, uri); + } + + // Try with audio service context, this may fail to get correct result. + if (DEBUG) { + Log.d(TAG, "Try to use audio service context to query if having haptic channels"); + } + try { + return getService().hasHapticChannels(uri); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } } -- cgit v1.2.3 From 7bcba747a9d7073381635f86bb0129a6050ca3b7 Mon Sep 17 00:00:00 2001 From: Peiyong Lin Date: Fri, 2 Jul 2021 20:25:45 +0000 Subject: Avoid print stack trace. It is common that when DeviceConfig is updated, some packages are not installed. Hence they can not be found. Avoid printing the stack trace. Minor: register receiver for all users. Fixes: b/191063620 Test: atest GameManagerServiceTests Change-Id: Id799bd81bcb1997ed71168e221f75e2626110977 --- .../com/android/server/app/GameManagerService.java | 62 +++++++++++++++++----- 1 file changed, 48 insertions(+), 14 deletions(-) diff --git a/services/core/java/com/android/server/app/GameManagerService.java b/services/core/java/com/android/server/app/GameManagerService.java index ae1cd51e11f0..af8d7a6a282b 100644 --- a/services/core/java/com/android/server/app/GameManagerService.java +++ b/services/core/java/com/android/server/app/GameManagerService.java @@ -37,6 +37,7 @@ import static com.android.server.wm.CompatModePackages.DOWNSCALE_90; import android.Manifest; import android.annotation.NonNull; +import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.app.ActivityManager; import android.app.GameManager; @@ -73,6 +74,7 @@ import com.android.internal.compat.CompatibilityOverrideConfig; import com.android.internal.compat.IPlatformCompat; import com.android.server.ServiceThread; import com.android.server.SystemService; +import com.android.server.SystemService.TargetUser; import java.io.FileDescriptor; import java.util.List; @@ -196,6 +198,7 @@ public final class GameManagerService extends IGameManagerService.Stub { final int userId = (int) msg.obj; final String[] packageNames = getInstalledGamePackageNames(userId); updateConfigsForUser(userId, packageNames); + break; } } } @@ -212,7 +215,7 @@ public final class GameManagerService extends IGameManagerService.Stub { @Override public void onPropertiesChanged(Properties properties) { final String[] packageNames = properties.getKeyset().toArray(new String[0]); - updateConfigsForUser(mContext.getUserId(), packageNames); + updateConfigsForUser(ActivityManager.getCurrentUser(), packageNames); } @Override @@ -496,6 +499,11 @@ public final class GameManagerService extends IGameManagerService.Stub { public void onUserStopping(@NonNull TargetUser user) { mService.onUserStopping(user.getUserIdentifier()); } + + @Override + public void onUserSwitching(@Nullable TargetUser from, @NonNull TargetUser to) { + mService.onUserSwitching(from, to.getUserIdentifier()); + } } private boolean isValidPackageName(String packageName, int userId) { @@ -503,7 +511,6 @@ public final class GameManagerService extends IGameManagerService.Stub { return mPackageManager.getPackageUidAsUser(packageName, userId) == Binder.getCallingUid(); } catch (PackageManager.NameNotFoundException e) { - e.printStackTrace(); return false; } } @@ -567,7 +574,6 @@ public final class GameManagerService extends IGameManagerService.Stub { return GameManager.GAME_MODE_UNSUPPORTED; } } catch (PackageManager.NameNotFoundException e) { - e.printStackTrace(); return GameManager.GAME_MODE_UNSUPPORTED; } @@ -606,7 +612,6 @@ public final class GameManagerService extends IGameManagerService.Stub { return; } } catch (PackageManager.NameNotFoundException e) { - e.printStackTrace(); return; } @@ -639,14 +644,12 @@ public final class GameManagerService extends IGameManagerService.Stub { void onUserStarting(int userId) { synchronized (mLock) { - if (mSettings.containsKey(userId)) { - return; + if (!mSettings.containsKey(userId)) { + GameManagerSettings userSettings = + new GameManagerSettings(Environment.getDataSystemDeDirectory(userId)); + mSettings.put(userId, userSettings); + userSettings.readPersistentDataLocked(); } - - GameManagerSettings userSettings = - new GameManagerSettings(Environment.getDataSystemDeDirectory(userId)); - mSettings.put(userId, userSettings); - userSettings.readPersistentDataLocked(); } final Message msg = mHandler.obtainMessage(POPULATE_GAME_MODE_SETTINGS); msg.obj = userId; @@ -664,6 +667,22 @@ public final class GameManagerService extends IGameManagerService.Stub { } } + void onUserSwitching(TargetUser from, int toUserId) { + if (from != null) { + synchronized (mLock) { + final int fromUserId = from.getUserIdentifier(); + if (mSettings.containsKey(fromUserId)) { + final Message msg = mHandler.obtainMessage(REMOVE_SETTINGS); + msg.obj = fromUserId; + mHandler.sendMessage(msg); + } + } + } + final Message msg = mHandler.obtainMessage(POPULATE_GAME_MODE_SETTINGS); + msg.obj = toUserId; + mHandler.sendMessage(msg); + } + /** * @hide */ @@ -856,11 +875,25 @@ public final class GameManagerService extends IGameManagerService.Stub { public void onReceive(@NonNull final Context context, @NonNull final Intent intent) { final Uri data = intent.getData(); try { + final int userId = getSendingUserId(); + if (userId != ActivityManager.getCurrentUser()) { + return; + } final String packageName = data.getSchemeSpecificPart(); + try { + final ApplicationInfo applicationInfo = mPackageManager + .getApplicationInfoAsUser( + packageName, PackageManager.MATCH_ALL, userId); + if (applicationInfo.category != ApplicationInfo.CATEGORY_GAME) { + return; + } + } catch (PackageManager.NameNotFoundException e) { + // Ignore the exception. + } switch (intent.getAction()) { case ACTION_PACKAGE_ADDED: case ACTION_PACKAGE_CHANGED: - updateConfigsForUser(mContext.getUserId(), packageName); + updateConfigsForUser(userId, packageName); break; case ACTION_PACKAGE_REMOVED: disableCompatScale(packageName); @@ -873,11 +906,12 @@ public final class GameManagerService extends IGameManagerService.Stub { break; } } catch (NullPointerException e) { - Slog.e(TAG, "Failed to get package name for new package", e); + Slog.e(TAG, "Failed to get package name for new package"); } } }; - mContext.registerReceiver(packageReceiver, packageFilter); + mContext.registerReceiverForAllUsers(packageReceiver, packageFilter, + /* broadcastPermission= */ null, /* scheduler= */ null); } private void registerDeviceConfigListener() { -- cgit v1.2.3 From 879d02e0dc989cb98eeb445b0621649173ee66f8 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 9 Jul 2021 22:43:59 +0000 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I0dd7ab2dff6316d407aa3e2ee489477f073335e5 --- core/res/res/values-is/strings.xml | 2 +- core/res/res/values-ko/strings.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml index 5b390a3fa549..667dd9c46055 100644 --- a/core/res/res/values-is/strings.xml +++ b/core/res/res/values-is/strings.xml @@ -617,7 +617,7 @@ "Taktu símann úr lás með því að horfa á hann" "Settu upp fleiri leiðir til að taka úr lás" "Ýttu til að bæta við fingrafari" - "Fingrafarsopnun" + "Fingrafarskenni" "Ekki er hægt að nota fingrafaralesara" "Þú verður að fara á verkstæði." "Nákvæm andlitsgögn fengust ekki. Reyndu aftur." diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index d9fd1037c902..f5d16fcb3f7f 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -579,7 +579,7 @@ "지문의 일부만 감지됨" "지문을 인식할 수 없습니다. 다시 시도해 주세요." "센서 닦기" - "조금 더 오래 기다려 주세요." + "조금 더 길게 터치하세요." "손가락을 너무 느리게 움직였습니다. 다시 시도해 주세요." "다른 지문으로 시도" "너무 밝음" -- cgit v1.2.3 From 04b409790fa0caa7df9efb77287b88a7dfa50738 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 9 Jul 2021 23:17:01 +0000 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ie11080ee2df1a23295c7c07843d4f1927f64e48a --- 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 | 6 +++--- packages/SystemUI/res/values-bs/strings.xml | 2 ++ packages/SystemUI/res/values-ca/strings.xml | 2 ++ packages/SystemUI/res/values-cs/strings.xml | 2 ++ packages/SystemUI/res/values-da/strings.xml | 2 ++ packages/SystemUI/res/values-de/strings.xml | 2 ++ 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 | 10 ++++++---- 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 | 2 ++ 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, 175 insertions(+), 7 deletions(-) diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index df9230f67c31..6d08b0548da4 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -1149,6 +1149,8 @@ "%1$s het \'n boodskap gestuur: %2$s" "%1$s het \'n prent gestuur" "%1$s het \'n statusopdatering: %2$s" + + "Kon nie jou batterymeter lees nie" "Tik vir meer inligting" "Geen wekker nie" diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index d4ea169a9263..d9a3da392fc5 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -1149,6 +1149,8 @@ "%1$s መልዕክት ልከዋል፦ %2$s" "%1$s ምስል ልኳል" "%1$s የሁኔታ ዝማኔ አለው፦ %2$s" + + "የባትሪ መለኪያዎን የማንበብ ችግር" "ለበለጠ መረጃ መታ ያድርጉ" "ምንም ማንቂያ አልተቀናበረም" diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 8d35188709e5..bfcfd9bd41d5 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -1173,6 +1173,8 @@ "تم إرسال رسالة من %1$s: %2$s" "تم إرسال صورة من %1$s." "تم تعديل حالة %1$s: %2$s" + + "حدثت مشكلة أثناء قراءة مقياس مستوى شحن البطارية." "انقر للحصول على مزيد من المعلومات." "لم يتم ضبط منبّه." diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index 880a088e3488..316c87b18df0 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -1149,6 +1149,8 @@ "%1$sএ এটা বাৰ্তা পঠিয়াইছে: %2$s" "%1$sএ এখন প্ৰতিচ্ছবি পঠিয়াইছে" "%1$sৰ এটা স্থিতিৰ আপডে’ট আছে: %2$s" + + "আপোনাৰ বেটাৰী মিটাৰ পঢ়োঁতে সমস্যা হৈছে" "অধিক তথ্যৰ বাবে টিপক" "কোনো এলাৰ্ম ছেট কৰা হোৱা নাই" diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index 96ab6e3482a4..ede3b1697fd7 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -1149,6 +1149,8 @@ "%1$s mesaj göndərdi: %2$s" "%1$s şəkil göndərdi" "%1$s status güncəlləməsi edib: %2$s" + + "Batareya ölçüsünü oxuyarkən problem yarandı" "Ətraflı məlumat üçün toxunun" "Siqnal ayarlanmayıb" diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index 8bd3b0a919b6..611d7ee861ac 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -1155,6 +1155,8 @@ "%1$s je poslao/la poruku: %2$s" "%1$s šalje sliku" "%1$s ima ažuriranje statusa: %2$s" + + "Problem sa očitavanjem merača baterije" "Dodirnite za više informacija" "Alarm nije podešen" diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index 9db9e68b4033..8cbc8bd31e41 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -1161,6 +1161,8 @@ "Карыстальнік %1$s прыслаў паведамленне: %2$s" "Карыстальнік %1$s адправіў відарыс" "Карыстальнік %1$s абнавіў стан: %2$s" + + "Праблема з чытаннем індыкатара зараду акумулятара" "Націсніце, каб убачыць больш" "Няма будзільнікаў" diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index e361feb9704e..7bc56694e1d2 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -1149,6 +1149,8 @@ "%1$s изпрати съобщение: %2$s" "%1$s изпрати изображение" "%1$s има актуализация на състоянието: %2$s" + + "Възникна проблем при четенето на данните за нивото на батерията" "Докоснете за още информация" "Няма зададен будилник" diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index 72eeab1a5b82..2fe583a6abc7 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -1146,10 +1146,10 @@ "সাম্প্রতিক মেসেজ, মিসড কল এবং স্ট্যাটাস সংক্রান্ত আপডেট দেখুন" "কথোপকথন" "\'বিরক্ত করবে না\' মোডের মাধ্যমে পজ করা আছে" - - + "%1$s একটি মেসেজ পাঠিয়েছেন: %2$s" "%1$s একটি ছবি পাঠিয়েছেন" - + "%1$s একটি স্ট্যাটাস আপডেট করেছেন: %2$s" + "ব্যাটারির মিটারের রিডিং নেওয়ার সময় সমস্যা হয়েছে" "আরও তথ্যের জন্য ট্যাপ করুন" diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index c4fbd99d0642..7b27a7ed3f75 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -1155,6 +1155,8 @@ "%1$s je poslao/la poruku: %2$s" "%1$s je poslao/la sliku" "%1$s je ažurirao/la status: %2$s" + + "Došlo je do problema prilikom očitavanja mjerača stanja baterije" "Dodirnite za više informacija" "Nije postavljen alarm" diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index cba6e91f2319..abd4fddaee25 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -1149,6 +1149,8 @@ "%1$s ha enviat un missatge: %2$s" "%1$s ha enviat una imatge" "%1$s té una actualització d\'estat: %2$s" + + "Hi ha hagut un problema en llegir el mesurador de la bateria" "Toca per obtenir més informació" "Cap alarma configurada" diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index 93b635910a6a..3a3089b3d632 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -1161,6 +1161,8 @@ "%1$s posílá zprávu: %2$s" "%1$s posílá obrázek" "%1$s má aktualizaci stavu: %2$s" + + "Problém s načtením měřiče baterie" "Klepnutím zobrazíte další informace" "Budík nenastaven" diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index 341f06fb2bb1..06f6a35199e4 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -1149,6 +1149,8 @@ "%1$s har sendt en besked: %2$s" "%1$s har sendt et billede" "%1$s har opdateret sin status: %2$s" + + "Der er problemer med at aflæse dit batteriniveau" "Tryk for at få flere oplysninger" "Ingen alarm er indstillet" diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 35b72fee0404..99bb779ff1bc 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -1149,6 +1149,8 @@ "%1$s hat eine Nachricht gesendet: %2$s" "%1$s hat ein Bild gesendet" "%1$s hat den Status aktualisiert: %2$s" + + "Problem beim Lesen des Akkustands" "Für weitere Informationen tippen" "Kein Wecker gestellt" diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index e53775aa7d8f..0e602645c1f7 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -1149,6 +1149,8 @@ "Ο χρήστης %1$s έστειλε ένα μήνυμα: %2$s" "Ο χρήστης %1$s έστειλε μια εικόνα" "Ο χρήστης %1$s έχει μια ενημέρωση κατάστασης: %2$s" + + "Υπάρχει κάποιο πρόβλημα με την ανάγνωση του μετρητή μπαταρίας" "Πατήστε για περισσότερες πληροφορίες." "Δεν ορίστηκε ξυπνητ." diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index 111de11548e6..6454a8b028a1 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -1149,6 +1149,8 @@ "%1$s sent a message: %2$s" "%1$s sent an image" "%1$s has a status update: %2$s" + + "Problem reading your battery meter" "Tap for more information" "No alarm set" diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml index 6b4eaba47e51..8b8cbd13adeb 100644 --- a/packages/SystemUI/res/values-en-rCA/strings.xml +++ b/packages/SystemUI/res/values-en-rCA/strings.xml @@ -1149,6 +1149,8 @@ "%1$s sent a message: %2$s" "%1$s sent an image" "%1$s has a status update: %2$s" + + "Problem reading your battery meter" "Tap for more information" "No alarm set" diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index 111de11548e6..6454a8b028a1 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -1149,6 +1149,8 @@ "%1$s sent a message: %2$s" "%1$s sent an image" "%1$s has a status update: %2$s" + + "Problem reading your battery meter" "Tap for more information" "No alarm set" diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index 111de11548e6..6454a8b028a1 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -1149,6 +1149,8 @@ "%1$s sent a message: %2$s" "%1$s sent an image" "%1$s has a status update: %2$s" + + "Problem reading your battery meter" "Tap for more information" "No alarm set" diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml index 7c1e09f319a0..3e9c075b67bc 100644 --- a/packages/SystemUI/res/values-en-rXC/strings.xml +++ b/packages/SystemUI/res/values-en-rXC/strings.xml @@ -1149,6 +1149,8 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‎‎‏‏‏‎‏‎‎‎‏‎‎‎‏‎‎‎‏‎‎‏‏‎‏‏‏‏‎‎‎‎‏‎‎‎‎‏‏‎‎‎‎‎‏‎‏‎‎‎‎‏‎‏‎‏‏‎‎‏‎‎‏‏‎%1$s‎‏‎‎‏‏‏‎ sent a message: ‎‏‎‎‏‏‎%2$s‎‏‎‎‏‏‏‎‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‎‎‎‎‎‏‎‎‏‏‏‏‎‏‎‏‎‏‎‎‎‎‏‏‎‏‎‎‏‎‏‏‏‎‏‎‎‏‏‎‏‎‎‎‎‏‎‏‏‎‎‎‎‏‏‎‎‏‎‎‏‏‎%1$s‎‏‎‎‏‏‏‎ sent an image‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‏‏‎‏‎‎‏‏‏‏‏‏‎‎‏‎‎‎‏‏‏‏‏‏‎‎‎‏‏‎‏‏‏‏‎‎‎‏‎‎‎‎‏‎‏‏‎‏‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎%1$s‎‏‎‎‏‏‏‎ has a status update: ‎‏‎‎‏‏‎%2$s‎‏‎‎‏‏‏‎‎‏‎‎‏‎" + + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‏‏‎‎‎‏‎‏‎‏‎‏‏‎‎‎‏‏‏‎‎‏‏‏‏‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‏‎‎‎‎‎‎‏‏‏‎‎Problem reading your battery meter‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‎‏‏‎‏‏‎‎‎‎‏‎‏‏‏‏‏‏‎‎‎‏‏‏‏‎‏‏‎‎‏‎‎‏‏‏‏‎‏‎‎‎‎‎‎‎‎‎‏‎‎‎‏‎‎‎‏‏‎Tap for more information‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‏‏‏‏‎‏‏‎‎‎‏‎‎‏‎‏‎‏‏‏‎‎‎‎‏‎‏‎‏‏‏‏‏‏‏‏‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‎‎‏‏‎No alarm set‎‏‎‎‏‎" diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index 01a6f8d489a4..b5b82c8ed2b4 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -1149,6 +1149,8 @@ "%1$s envió un mensaje: %2$s" "%1$s envió una imagen" "%1$s actualizó su estado: %2$s" + + "Problema al leer el medidor de batería" "Presiona para obtener más información" "No se estableció alarma" diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 4c43eadeb576..57819bd51156 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -1149,6 +1149,8 @@ "%1$s ha enviado un mensaje: %2$s" "%1$s ha enviado una imagen" "%1$s ha cambiado su estado: %2$s" + + "No se ha podido leer el indicador de batería" "Toca la pantalla para consultar más información" "Ninguna alarma puesta" diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index 3d8659d1de7e..57281f5ab6b5 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -1149,6 +1149,8 @@ "%1$s saatis sõnumi: %2$s" "%1$s saatis pildi" "%1$s värskendas olekut: %2$s" + + "Probleem akumõõdiku lugemisel" "Puudutage lisateabe saamiseks" "Äratust pole" diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index d31157e5cd6c..fe0e922c7324 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -1149,6 +1149,8 @@ "%1$s erabiltzaileak mezu bat bidali du: %2$s" "%1$s erabiltzaileak irudi bat bidali du" "%1$s erabiltzaileak egoera eguneratu du: %2$s" + + "Arazo bat gertatu da bateria-neurgailua irakurtzean" "Informazio gehiago lortzeko, sakatu hau" "Ez da ezarri alarmarik" diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index 3a4f87cbbfe0..c5b100a61ec2 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -1149,6 +1149,8 @@ "%1$s پیامی ارسال کرد: %2$s" "%1$s تصویری ارسال کرد" "%1$s وضعیتش را به‌روزرسانی کرد: %2$s" + + "مشکلی در خواندن میزان باتری وجود دارد" "برای اطلاعات بیشتر ضربه بزنید" "هشداری تنظیم نشده است" diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 62ab1f4aa7ca..60bb0a1bd9e8 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -1149,6 +1149,8 @@ "%1$s lähetti viestin: %2$s" "%1$s lähetti kuvan" "%1$s on päivittänyt tilansa: %2$s" + + "Ongelma akkumittarin lukemisessa" "Saat lisätietoja napauttamalla" "Ei herätyksiä" diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index 6c0839a92347..74ff58e0649f 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -420,9 +420,9 @@ "Jusqu\'à l\'aube" "Actif à %s" "Jusqu\'à %s" - "NFC" - "NFC désactivée" - "NFC activée" + "CCP" + "CCP désactivée" + "CCP activée" "Enregistrement de l\'écran" "Démarrer" "Arrêter" @@ -455,7 +455,7 @@ "Toucher de nouveau" "Balayez l\'écran vers le haut pour ouvrir" "Balayez l\'écran vers le haut pour réessayer" - "Déverrouillez l\'écran pour utiliser la NFC" + "Déverrouillez l\'écran pour utiliser la CCP" "Cet appareil appartient à votre organisation" "Cet appareil appartient à %s" "Cet appareil est fourni par %s" @@ -1149,6 +1149,8 @@ "%1$s a envoyé un message : %2$s" "%1$s a envoyé une image" "%1$s a mis à jour son état : %2$s" + + "Un problème est survenu lors de la lecture du niveau de charge de la pile" "Touchez pour en savoir plus" "Aucune alarme définie" diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index d898fcc16599..3ef870471407 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -1149,6 +1149,8 @@ "%1$s a envoyé un message : %2$s" "%1$s a envoyé une image" "%1$s a mis à jour son statut : %2$s" + + "Un problème est survenu au niveau de la lecture de votre outil de mesure de batterie" "Appuyer pour en savoir plus" "Pas d\'alarme définie" diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index 2d417a357ca2..ee23e949ba5a 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -1149,6 +1149,8 @@ "%1$s enviou unha mensaxe: %2$s" "%1$s enviou unha imaxe" "%1$s cambiou de estado: %2$s" + + "Produciuse un problema ao ler o medidor da batería" "Toca para obter máis información" "Sen alarmas postas" diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index f70bf301b337..59eceb7e0338 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -1149,6 +1149,8 @@ "%1$s દ્વારા કોઈ સંદેશ મોકલવામાં આવ્યો: %2$s" "%1$s દ્વારા કોઈ છબી મોકલવામાં આવી" "%1$s દ્વારા નવી સ્ટેટસ અપડેટ પોસ્ટ કરવામાં આવી: %2$s" + + "તમારું બૅટરી મીટર વાંચવામાં સમસ્યા આવી" "વધુ માહિતી માટે ટૅપ કરો" "કોઈ અલાર્મ સેટ નથી" diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 1d4e56623814..28acd3ff13ec 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -1149,6 +1149,8 @@ "%1$s ने एक मैसेज भेजा है: %2$s" "%1$s ने एक इमेज भेजी है" "%1$s ने स्टेटस अपडेट किया है: %2$s" + + "आपके डिवाइस के बैटरी मीटर की रीडिंग लेने में समस्या आ रही है" "ज़्यादा जानकारी के लिए टैप करें" "कोई अलार्म सेट नहीं है" diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index 72ba16397312..c5c83f3eb8c4 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -1155,6 +1155,8 @@ "%1$s šalje poruku: %2$s" "Korisnik %1$s poslao je sliku" "%1$s ima ažuriranje statusa: %2$s" + + "Problem s očitavanjem mjerača baterije" "Dodirnite za više informacija" "Nema nijednog alarma" diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index d394a848d0c7..d3c9f6fa2f26 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -1149,6 +1149,8 @@ "%1$s üzenetet küldött: %2$s" "%1$s képet küldött" "%1$s frissítette állapotát: %2$s" + + "Probléma merült fel az akkumulátor-töltésmérő olvasásakor" "Koppintással további információkat érhet el." "Nincs ébresztés" diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index ed07b4b48d2e..a91a795a2805 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -1149,6 +1149,8 @@ "%1$s օգտատերը հաղորդագրություն է ուղարկել. «%2$s»" "%1$s օգտատերը պատկեր է ուղարկել" "%1$s օգտատերը նոր կարգավիճակ է հրապարակել. «%2$s»" + + "Մարտկոցի ցուցիչի ցուցմունքը կարդալու հետ կապված խնդիր կա" "Հպեք՝ ավելին իմանալու համար" "Զարթուցիչ դրված չէ" diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index 11ca6c3e5738..227bf4d22d3e 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -1149,6 +1149,8 @@ "%1$s mengirim pesan: %2$s" "%1$s mengirim gambar" "%1$s memposting pembaruan status: %2$s" + + "Terjadi masalah saat membaca indikator baterai" "Ketuk untuk informasi selengkapnya" "Alarm tidak disetel" diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index fda217ec08f3..e65097ef288c 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -1149,6 +1149,8 @@ "%1$s sendi skilaboð: %2$s" "%1$s sendi mynd" "%1$s er með stöðuuppfærslu: %2$s" + + "Vandamál við að lesa stöðu rafhlöðu" "Ýttu til að fá frekari upplýsingar" "Enginn vekjari" diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index b485091c6f35..195be05d665d 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -1149,6 +1149,8 @@ "%1$s ha inviato un messaggio: %2$s" "%1$s ha inviato un\'immagine" "%1$s ha aggiornato lo stato: %2$s" + + "Problema durante la lettura dell\'indicatore di livello della batteria" "Tocca per ulteriori informazioni" "Nessuna sveglia" diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index 7f7e2da41988..65c23d47e043 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -1161,6 +1161,8 @@ "התקבלה הודעה מ%1$s: ‏%2$s" "%1$s שלח/ה תמונה" "הסטטוס של %1$s עודכן: ‏%2$s" + + "בעיה בקריאת מדדי הסוללה" "יש להקיש כדי להציג מידע נוסף" "לא הוגדרה התראה" diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index c4b5d1290e16..667c4dc78102 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -1149,6 +1149,8 @@ "%1$s さんからのメッセージ: %2$s" "%1$s さんが画像を送信しました" "%1$s さんの近況: %2$s" + + "バッテリー残量の読み込み中に問題が発生しました" "タップすると詳細が表示されます" "アラーム未設定" diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml index bc214c7371a5..5ce3fe571bdd 100644 --- a/packages/SystemUI/res/values-ka/strings.xml +++ b/packages/SystemUI/res/values-ka/strings.xml @@ -1149,6 +1149,8 @@ "%1$s-მა გაგზავნა შეტყობინება: %2$s" "%1$s-მ(ა) სურათი გამოგზავნა" "%1$s-მა განაახლა სტატუსი: %2$s" + + "თქვენი ბატარეის მზომის წაკითხვასთან დაკავშირებით პრობლემა დაფიქსირდა" "შეეხეთ მეტი ინფორმაციისთვის" "მაღვიძარა არ არის" diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index 775dea7e074f..cba176d5953b 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -1149,6 +1149,8 @@ "%1$s хабар жіберді: %2$s" "%1$s сурет жіберді." "%1$s ағымдағы күйін жаңартты: %2$s" + + "Батарея зарядының дерегі алынбай жатыр" "Толығырақ ақпарат алу үшін түртіңіз." "Оятқыш орнатылмаған." diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index 265d8e27eb5d..72e031b5ce46 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -1149,6 +1149,8 @@ "%1$s បានផ្ញើសារ៖ %2$s" "%1$s បាន​ផ្ញើ​រូបភាព" "%1$s មាន​បច្ចុប្បន្នភាព​ស្ថានភាព៖ %2$s" + + "មានបញ្ហាក្នុង​ការអាន​ឧបករណ៍រង្វាស់កម្រិតថ្មរបស់អ្នក" "ចុចដើម្បីទទួលបាន​ព័ត៌មានបន្ថែម" "មិនបាន​កំណត់​ម៉ោងរោទ៍​ទេ" diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index c5bd9cda3299..cc6b15372e92 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -1149,6 +1149,8 @@ "%1$s ಅವರು ಸಂದೇಶವನ್ನು ಕಳುಹಿಸಿದ್ದಾರೆ: %2$s" "%1$s ಅವರು ಚಿತ್ರವನ್ನು ಕಳುಹಿಸಿದ್ದಾರೆ" "%1$s ಅವರು ಸ್ಥಿತಿಯ ಅಪ್‌ಡೇಟ್ ಹೊಂದಿದ್ದಾರೆ: %2$s" + + "ನಿಮ್ಮ ಬ್ಯಾಟರಿ ಮೀಟರ್ ಓದುವಾಗ ಸಮಸ್ಯೆ ಎದುರಾಗಿದೆ" "ಇನ್ನಷ್ಟು ಮಾಹಿತಿಗಾಗಿ ಟ್ಯಾಪ್ ಮಾಡಿ" "ಅಲಾರಾಂ ಸೆಟ್ ಆಗಿಲ್ಲ" diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index f43539c84b6a..20a7c5f1545c 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -1149,6 +1149,8 @@ "%1$s님이 메시지를 보냈습니다: %2$s" "%1$s님이 이미지를 보냈습니다." "%1$s님의 상태가 업데이트되었습니다: %2$s" + + "배터리 수준을 읽는 중에 문제가 발생함" "탭하여 자세한 정보를 확인하세요." "설정된 알람 없음" diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index a029bbc9ca41..34d799c2a25b 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -1149,6 +1149,8 @@ "%1$s билдирүү жөнөттү: %2$s" "%1$s сүрөт жөнөттү" "%1$s жаңы абалы тууралуу жарыялады: %2$s" + + "Батареяңыздын кубаты аныкталбай жатат" "Кеңири маалымат алуу үчүн таптап коюңуз" "Ойготкуч коюлган жок" diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index 826e45b94e1b..8a47dddce06f 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -1149,6 +1149,8 @@ "%1$s ສົ່ງຂໍ້ຄວາມ: %2$s" "%1$s ສົ່ງຮູບພາບແລ້ວ" "%1$s ອັບເດດສະຖານະ: %2$s" + + "ເກີດບັນຫາໃນການອ່ານຕົວວັດແທກແບັດເຕີຣີຂອງທ່ານ" "ແຕະເພື່ອເບິ່ງຂໍ້ມູນເພີ່ມເຕີມ" "ບໍ່ໄດ້ຕັ້ງໂມງປຸກ" diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index 656d54cdef7e..11d363ed59ef 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -1161,6 +1161,8 @@ "%1$s išsiuntė pranešimą: „%2$s“" "%1$s išsiuntė vaizdą" "%1$s atnaujino būseną: %2$s" + + "Nuskaitant akumuliatoriaus skaitiklį iškilo problema" "Palieskite, kad sužinotumėte daugiau informacijos" "Nenustatyta signalų" diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index b4c615165168..63f85fb4c76d 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -1155,6 +1155,8 @@ "%1$s nosūtīja ziņojumu: %2$s" "%1$s nosūtīja attēlu" "%1$s atjaunināja statusu: %2$s" + + "Nevar iegūt informāciju par akumulatora uzlādes līmeni." "Pieskarieties, lai iegūtu plašāku informāciju." "Nav iestatīts signāls" diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index 0bead0f72273..5392d52526f3 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -1149,6 +1149,8 @@ "%1$s испрати порака: %2$s" "%1$s испрати слика" "%1$s има ажурирање на статусот: %2$s" + + "Проблем при читањето на мерачот на батеријата" "Допрете за повеќе информации" "Не е поставен аларм" diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index 264d2bf36c6e..7b9f704e8200 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -1149,6 +1149,8 @@ "%1$s ഒരു സന്ദേശം അയച്ചു: %2$s" "%1$s, ഒരു ചിത്രം അയച്ചു" "%1$s എന്നയാൾ സ്‌റ്റാറ്റസ് അപ്‌ഡേറ്റ് ചെയ്‌തു: %2$s" + + "നിങ്ങളുടെ ബാറ്ററി മീറ്റർ വായിക്കുന്നതിൽ പ്രശ്‌നമുണ്ട്" "കൂടുതൽ വിവരങ്ങൾക്ക് ടാപ്പ് ചെയ്യുക" "അലാറം സജ്ജീകരിച്ചിട്ടില്ല" diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index 94ffad5afaf0..9f9a6008b69e 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -1149,6 +1149,8 @@ "%1$s мессеж илгээсэн: %2$s" "%1$s зураг илгээсэн" "%1$s төлөвийн шинэчлэлт хийсэн байна: %2$s" + + "Таны батарей хэмжигчийг уншихад асуудал гарлаа" "Нэмэлт мэдээлэл авахын тулд товшино уу" "Сэрүүлэг тавиагүй" diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index 1ed5458f44b1..bf27df9c63f9 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -1149,6 +1149,8 @@ "%1$s यांनी मेसेज पाठवला: %2$s" "%1$s यांनी इमेज पाठवली" "%1$s यांनी स्टेटस अपडेट केले: %2$s" + + "तुमचे बॅटरी मीटर वाचताना समस्या आली" "अधिक माहितीसाठी टॅप करा" "अलार्म सेट केला नाही" diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index f1ce8324e4cb..1d16edcdc49c 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -1149,6 +1149,8 @@ "%1$s menghantar mesej: %2$s" "%1$s menghantar imej" "%1$s mempunyai kemaskinian status: %2$s" + + "Masalah membaca meter bateri anda" "Ketik untuk mendapatkan maklumat lanjut" "Tiada penggera" diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index 30efdb3ccacb..eeef7c9b7e3a 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -1149,6 +1149,8 @@ "%1$s က မက်ဆေ့ဂျ်ပို့လိုက်သည်- %2$s" "%1$s က ပုံပို့လိုက်သည်" "%1$s က အခြေအနေ အပ်ဒိတ်လုပ်လိုက်သည်- %2$s" + + "သင်၏ ဘက်ထရီမီတာကို ဖတ်ရာတွင် ပြဿနာရှိနေသည်" "နောက်ထပ်အချက်အလက်များအတွက် တို့ပါ" "နှိုးစက်ပေးမထားပါ" diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index 75755c60f607..9b22b022403c 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -1149,6 +1149,8 @@ "%1$s har sendt en melding: %2$s" "%1$s har sendt et bilde" "%1$s har en statusoppdatering: %2$s" + + "Kunne ikke lese batterimåleren" "Trykk for å få mer informasjon" "Ingen alarm angitt" diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index cace5b717efd..185e045c9029 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -1149,6 +1149,8 @@ "%1$s ले एउटा म्यासेज पठाउनुभएको छ: %2$s" "%1$s ले एउटा फोटो पठाउनुभयो" "%1$s ले स्ट्याटस अपडेट गर्नुभएको छ: %2$s" + + "डिभाइसको ब्याट्रीको मिटर रिडिङ क्रममा समस्या भयो" "थप जानकारी प्राप्त गर्न ट्याप गर्नुहोस्" "अलार्म राखिएको छैन" diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index da221af43e0e..75fb82968cbe 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -1149,6 +1149,8 @@ "%1$s heeft een bericht gestuurd: %2$s" "%1$s heeft een afbeelding gestuurd" "%1$s heeft een statusupdate: %2$s" + + "Probleem bij het lezen van je batterijmeter" "Tik hier voor meer informatie" "Geen wekker gezet" diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index 53371ef149ce..2ad54f7fd75a 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -1149,6 +1149,8 @@ "%1$s ଏକ ମେସେଜ୍ ପଠାଇଛନ୍ତି: %2$s" "%1$s ଏକ ଛବି ପଠାଇଛନ୍ତି" "%1$s ଏକ ସ୍ଥିତି ଅପଡେଟ୍ କରିଛନ୍ତି: %2$s" + + "ଆପଣଙ୍କ ବ୍ୟାଟେରୀ ମିଟର୍ ପଢ଼ିବାରେ ସମସ୍ୟା ହେଉଛି" "ଅଧିକ ସୂଚନା ପାଇଁ ଟାପ୍ କରନ୍ତୁ" "ଆଲାରାମ ସେଟ୍ ହୋଇନାହିଁ" diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index 27cb319b32a0..3f2e4810dbd2 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -1149,6 +1149,8 @@ "%1$s ਨੇ ਸੁਨੇਹਾ ਭੇਜਿਆ: %2$s" "%1$s ਨੇ ਇੱਕ ਚਿੱਤਰ ਭੇਜਿਆ ਹੈ" "%1$s ਨੇ ਸਥਿਤੀ ਅੱਪਡੇਟ ਕੀਤੀ ਹੈ: %2$s" + + "ਤੁਹਾਡੇ ਬੈਟਰੀ ਮੀਟਰ ਨੂੰ ਪੜ੍ਹਨ ਵਿੱਚ ਸਮੱਸਿਆ ਹੋ ਰਹੀ ਹੈ" "ਹੋਰ ਜਾਣਕਾਰੀ ਲਈ ਟੈਪ ਕਰੋ" "ਕੋਈ ਅਲਾਰਮ ਸੈੱਟ ਨਹੀਂ" diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index 8005c8194737..baa86a815031 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -1161,6 +1161,8 @@ "%1$s wysyła wiadomość: %2$s" "%1$s wysyła zdjęcie" "%1$s ma nowy stan: %2$s" + + "Problem z odczytaniem pomiaru wykorzystania baterii" "Kliknij, aby uzyskać więcej informacji" "Nie ustawiono alarmu" diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index b175fe628bf0..ca4089cbd288 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -1149,6 +1149,8 @@ "%1$s enviou uma mensagem: %2$s" "%1$s enviou uma imagem" "%1$s atualizou o status: %2$s" + + "Problema para ler seu medidor de bateria" "Toque para mais informações" "Nenhum alarme definido" diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index cb5903e9e0df..16965af689cc 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -1149,6 +1149,8 @@ "%1$s enviou uma mensagem: %2$s" "%1$s enviou uma imagem" "%1$s tem uma atualização de estado: %2$s" + + "Ocorreu um problema ao ler o medidor da bateria" "Toque para obter mais informações" "Nenhum alarme defin." diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index b175fe628bf0..ca4089cbd288 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -1149,6 +1149,8 @@ "%1$s enviou uma mensagem: %2$s" "%1$s enviou uma imagem" "%1$s atualizou o status: %2$s" + + "Problema para ler seu medidor de bateria" "Toque para mais informações" "Nenhum alarme definido" diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index e0a2b9acc72a..346323685e83 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -1155,6 +1155,8 @@ "%1$s a trimis un mesaj: %2$s" "%1$s a trimis o imagine" "%1$s are o nouă stare: %2$s" + + "Problemă la citirea măsurării bateriei" "Atingeți pentru mai multe informații" "Nicio alarmă setată" diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index db487d47d00d..8b0d70e4a8e4 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -1161,6 +1161,8 @@ "Пользователь %1$s отправил сообщение: %2$s" "Пользователь %1$s отправил изображение" "Пользователь %1$s обновил статус: %2$s" + + "Не удается получить данные об уровне заряда батареи" "Нажмите, чтобы узнать больше." "Будильников нет" diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index d2f56c906e90..7b95d57a7678 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -1149,6 +1149,8 @@ "%1$s පණිවිඩයක් එවා ඇත: %2$s" "%1$s රූපයක් යවන ලදී" "%1$s හට තත්ත්ව යාවත්කාලීනයක් ඇත: %2$s" + + "ඔබගේ බැටරි මනුව කියවීමේ දෝෂයකි" "තවත් තොරතුරු සඳහා තට්ටු කරන්න" "එලාම සකසා නැත" diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index cadf2b983b19..4967718196ef 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -1161,6 +1161,8 @@ "%1$s poslal(a) správu: %2$s" "%1$s poslal(a) obrázok" "%1$s má aktualizáciu statusu: %2$s" + + "Pri čítaní meradla batérie sa vyskytol problém" "Klepnutím si zobrazíte ďalšie informácie" "Žiadny budík" diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index 82a34e1d2496..2898a2444966 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -1161,6 +1161,8 @@ "Oseba %1$s je poslala sporočilo: %2$s." "Oseba %1$s je poslala sliko." "Oseba %1$s je posodobila stanje: %2$s." + + "Težava z branjem indikatorja stanja napolnjenosti baterije" "Dotaknite se za več informacij" "Ni nastavljenih alarmov" diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index 77bf2a8c6dda..ad8e2659b612 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -1149,6 +1149,8 @@ "%1$s dërgoi një mesazh: %2$s" "%1$s dërgoi një imazh" "%1$s ka një përditësim të statusit: %2$s" + + "Problem me leximin e matësit të baterisë" "Trokit për më shumë informacione" "Nuk është caktuar asnjë alarm" diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index 592b90f89851..adc69468ec39 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -1155,6 +1155,8 @@ "%1$s је послао/ла поруку: %2$s" "%1$s шаље слику" "%1$s има ажурирање статуса: %2$s" + + "Проблем са очитавањем мерача батерије" "Додирните за више информација" "Аларм није подешен" diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index 7045572457d9..c0588f666e39 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -1149,6 +1149,8 @@ "%1$s skickade ett meddelande: %2$s" "%1$s skickade en bild" "%1$s har gjort en statusuppdatering: %2$s" + + "Batteriindikatorn visas inte" "Tryck för mer information" "Inget inställt alarm" diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index f8033021dd30..d4921310d377 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -1149,6 +1149,8 @@ "%1$s ametuma ujumbe: %2$s" "%1$s ametuma picha" "%1$s ana taarifa kuhusu hali: %2$s" + + "Tatizo la kusoma mita ya betri yako" "Gusa ili upate maelezo zaidi" "Hujaweka kengele" diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index 2901f2902554..4661aee45cc8 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -1149,6 +1149,8 @@ "%1$s ஒரு மெசேஜ் அனுப்பியுள்ளார்: %2$s" "%1$s ஒரு படம் அனுப்பியுள்ளார்" "%1$s புதிய ஸ்டேட்டஸ் வைத்துள்ளார்: %2$s" + + "பேட்டரி அளவை அறிவதில் சிக்கல்" "மேலும் தகவல்களுக்கு தட்டவும்" "அலாரம் எதுவுமில்லை" diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index 42e621ce90cb..409eced5a67d 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -1149,6 +1149,8 @@ "%1$s మెసేజ్‌ను పంపారు: %2$s" "%1$s ఇమేజ్‌ను పంపారు" "%1$s, స్టేటస్‌ను గురించిన అప్‌డేట్‌ను కలిగి ఉన్నారు: %2$s" + + "మీ బ్యాటరీ మీటర్‌ను చదవడంలో సమస్య" "మరింత సమాచారం కోసం ట్యాప్ చేయండి" "అలారం సెట్ చేయలేదు" diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index 37a5924d1274..6e0662693d4a 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -1149,6 +1149,8 @@ "%1$s ส่งข้อความ: %2$s" "%1$s ส่งรูปภาพ" "%1$s มีการอัปเดตสถานะ: %2$s" + + "พบปัญหาในการอ่านเครื่องวัดแบตเตอรี่" "แตะดูข้อมูลเพิ่มเติม" "ไม่มีการตั้งปลุก" diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index adc9aa9d52ef..9a83c227bf32 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -1149,6 +1149,8 @@ "Nagpadala si %1$s ng mensahe: %2$s" "Nagpadala si %1$s ng larawan" "May update sa status si %1$s: %2$s" + + "Nagkaproblema sa pagbabasa ng iyong battery meter" "I-tap para sa higit pang impormasyon" "Walang alarm" diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index eed12221b1cc..ac6ecd09b8d7 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -1149,6 +1149,8 @@ "%1$s bir mesaj gönderdi: %2$s" "%1$s bir resim gönderdi" "%1$s, durumunu güncelledi: %2$s" + + "Pil ölçeriniz okunurken sorun oluştu" "Daha fazla bilgi için dokunun" "Alarm ayarlanmadı" diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 947a597536a5..2e9f24029341 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -1161,6 +1161,8 @@ "%1$s надсилає повідомлення: \"%2$s\"" "%1$s надсилає зображення" "%1$s публікує новий статус: \"%2$s\"" + + "Не вдалось отримати дані лічильника акумулятора" "Натисніть, щоб дізнатися більше" "Немає будильників" diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index 8ef84aa49f07..ffcd9a750abf 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -1149,6 +1149,8 @@ "%1$s نے ایک پیغام بھیجا: %2$s" "%1$s نے ایک تصویر بھیجی" "%1$s نے اسٹیٹس کو اپ ڈیٹ کر دیا ہے: %2$s" + + "آپ کے بیٹری میٹر کو پڑھنے میں دشواری" "مزید معلومات کے لیے تھپتھپائیں" "کوئی الارم سیٹ نہیں ہے" diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index be7f45a3d6ec..c4c42da8fd1c 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -1149,6 +1149,8 @@ "%1$s xabar yubordi: %2$s" "%1$s rasm yubordi" "%1$s ahvolini yangiladi: %2$s" + + "Batareya quvvati aniqlanmadi" "Batafsil axborot olish uchun bosing" "Signal sozlanmagan" diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 53cc87b12b2c..bc186362ad86 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -1149,6 +1149,8 @@ "%1$s đã gửi một tin nhắn: %2$s" "%1$s đã gửi một hình ảnh" "%1$s đã cập nhật trạng thái: %2$s" + + "Đã xảy ra vấn đề khi đọc dung lượng pin của bạn" "Nhấn để biết thêm thông tin" "Chưa đặt chuông báo" diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index ab3ed4a30d9f..ae118bc22ead 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -1149,6 +1149,8 @@ "%1$s发送了一条消息:%2$s" "%1$s发送了一张图片" "%1$s更新了状态:%2$s" + + "读取电池计量器时出现问题" "点按即可了解详情" "未设置闹钟" diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index cc13dd274cb0..3550923c1095 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -1149,6 +1149,8 @@ "%1$s傳送了訊息:%2$s" "%1$s傳送了圖片" "%1$s有狀態更新:%2$s" + + "讀取電池計量器時發生問題" "輕按即可瞭解詳情" "未設定鬧鐘" diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index aa80209050df..98b90cc13457 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -1149,6 +1149,8 @@ "%1$s傳送了一則訊息:%2$s" "%1$s傳送了一張圖片" "%1$s更新了狀態:%2$s" + + "讀取電池計量器時發生問題" "輕觸即可瞭解詳情" "未設定鬧鐘" diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index 1341f0943559..6ced59776adf 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -1149,6 +1149,8 @@ "U-%1$s uthumele umlayezo: %2$s" "U-%1$s uthumele isithombe" "U-%1$s unesibuyekezo sesimo: %2$s" + + "Kube khona inkinga ngokufunda imitha yakho yebhethri" "Thepha ukuze uthole olunye ulwazi" "Akukho alamu esethiwe" -- cgit v1.2.3 From 535b6dcfcea262cf45e4185ec9aed23e07c76a0c Mon Sep 17 00:00:00 2001 From: Evan Chen Date: Sat, 10 Jul 2021 00:03:16 +0000 Subject: Fix misspelled on the comment Changed ADK to APK due to misspelling Fix: 193275871 Test: manual test Change-Id: I1c1b3d6f186e0b18c0e5937d964ed892f86e68fb --- .../com/android/server/companion/CompanionDeviceManagerService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java index 906edb30ff12..d2db4f7c909c 100644 --- a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java +++ b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java @@ -864,7 +864,7 @@ public class CompanionDeviceManagerService extends SystemService implements Bind Set sameOemPackageCerts = new HashSet<>(); // Assume OEM may enter same package name in the parallel string array with - // multiple ADK certs corresponding to it + // multiple APK certs corresponding to it for (int i = 0; i < oemPackages.length; i++) { if (oemPackages[i].equals(packageName)) { sameOemPackageCerts.add(sameOemCerts[i].replaceAll(":", "")); -- cgit v1.2.3 From 00d99dcf25907b9a69da6aa4527b00178e276229 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 10 Jul 2021 00:03:17 +0000 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Id40e827f38e50d7c102f9facb1d1980f922a5fee --- packages/SettingsLib/res/values-eu/arrays.xml | 14 +++++++------- packages/SettingsLib/res/values-kn/strings.xml | 2 +- packages/SettingsLib/res/values-ko/strings.xml | 2 +- packages/SettingsLib/res/values-ms/strings.xml | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/SettingsLib/res/values-eu/arrays.xml b/packages/SettingsLib/res/values-eu/arrays.xml index 4bce1fe750e9..945268867ed2 100644 --- a/packages/SettingsLib/res/values-eu/arrays.xml +++ b/packages/SettingsLib/res/values-eu/arrays.xml @@ -218,17 +218,17 @@ "Bat ere ez" - "480 p" - "480 p (segurua)" - "720 p" - "720 p (segurua)" - "1080 p" - "1080 p (segurua)" + "480p" + "480p (segurua)" + "720p" + "720p (segurua)" + "1080p" + "1080p (segurua)" "4K" "4K (segurua)" "4K (hobetua)" "4K (hobetua, segurua)" - "720 p, 1080 p (bi pantaila)" + "720p, 1080p (bi pantaila)" "Bat ere ez" diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml index 54d01765eea2..c4ba44925bef 100644 --- a/packages/SettingsLib/res/values-kn/strings.xml +++ b/packages/SettingsLib/res/values-kn/strings.xml @@ -341,7 +341,7 @@ "\'ಅಪ್‌ಡೇಟ್‌ಗಳನ್ನು ವೀಕ್ಷಿಸಿ\' ತೋರಿಸಿ" "ಬರೆದಾಗ ವಿಂಡೊದೊಳಗೆ ವೀಕ್ಷಣೆ ಫ್ಲ್ಯಾಶ್‌ ಮಾಡುತ್ತದೆ" "ಹಾರ್ಡ್‌ವೇರ್‌ ಲೇಯರ್‌‌ ಅಪ್‌ಡೇಟ್‌" - "ಅವುಗಳು ನವೀಕರಿಸಿದಾಗ ಹಾರ್ಡ್‌ವೇರ್‌‌ ಲೇಯರ್‌ಗಳು ಹಸಿರು ಫ್ಲ್ಯಾಶ್‌‌ ಆಗುತ್ತದೆ" + "ಅಪ್‍ಡೇಟ್ ಆದಾಗ ಹಾರ್ಡ್‌ವೇರ್‌‌ ಲೇಯರ್‌ಗಳು ಹಸಿರು ಬಣ್ಣದಲ್ಲಿ ಫ್ಲ್ಯಾಶ್‌‌ ಆಗುತ್ತದೆ" "GPU ಓವರ್‌ಡ್ರಾ ಡೀಬಗ್" "HW ಓವರ್‌ಲೇ ನಿಷ್ಕ್ರಿಯ" "ಸ್ಕ್ರೀನ್ ಸಂಯೋಜನೆಗಾಗಿ ಯಾವಾಗಲೂ GPU ಬಳಸಿ" diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml index 4933f4a0ac93..97ad0a0ef347 100644 --- a/packages/SettingsLib/res/values-ko/strings.xml +++ b/packages/SettingsLib/res/values-ko/strings.xml @@ -462,7 +462,7 @@ "무선 충전 중" "충전 안함" "연결됨, 충전 중 아님" - "청구됨" + "충전됨" "관리자가 제어" "사용 안함" "허용됨" diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml index 06525e449061..5ed5f39e0ebd 100644 --- a/packages/SettingsLib/res/values-ms/strings.xml +++ b/packages/SettingsLib/res/values-ms/strings.xml @@ -458,7 +458,7 @@ "Tidak diketahui" "Mengecas" "Mengecas dgn cepat" - "Mengecas dgn prlahan" + "Mengecas perlahan" "Mengecas tanpa wayar" "Tidak mengecas" "Bersambung, tidak mengecas" -- cgit v1.2.3 From 57bd208139c113b703885ca713cf47a3470e627d Mon Sep 17 00:00:00 2001 From: Xiaoyu Jin Date: Wed, 23 Jun 2021 16:50:03 -0700 Subject: Register callback to statsD for AppSearchStorageInfo Bug: b/173532925, b/193254235 Test: statsd_testdrive 10116 atom { app_search_storage_info { user: 0 total_storage_size_bytes: 3929088 document_storage_info { num_alive_documents: 1116 num_deleted_documents: 4933 num_expired_documents: 0 document_store_size_bytes: 3637760 document_log_size_bytes: 2928640 key_mapper_size_bytes: 49152 document_id_mapper_size_bytes: 49152 score_cache_size_bytes: 122880 filter_cache_size_bytes: 73728 corpus_mapper_size_bytes: 20480 corpus_score_cache_size_bytes: 4096 namespace_id_mapper_size_bytes: 20480 num_namespaces: 21 } schema_store_storage_info { schema_store_size_bytes: 39424 num_schema_types: 4 num_total_sections: 9 num_schema_types_sections_exhausted: 0 } index_storage_info { index_size_bytes: 248320 lite_index_lexicon_size_bytes: 155648 lite_index_hit_buffer_size_bytes: 262144 main_index_lexicon_size_bytes: 0 main_index_storage_size_bytes: 0 main_index_block_size_bytes: 4096 num_blocks: 1 min_free_fraction: 0.99999905 } } } appsearch cts tests Change-Id: I009c0932e36afb467c93013215d1e67dfae5a28a --- apex/appsearch/service/Android.bp | 1 + .../server/appsearch/AppSearchManagerService.java | 8 + .../appsearch/AppSearchUserInstanceManager.java | 14 ++ .../server/appsearch/stats/PlatformLogger.java | 2 +- .../server/appsearch/stats/StatsCollector.java | 203 +++++++++++++++++++++ 5 files changed, 227 insertions(+), 1 deletion(-) create mode 100644 apex/appsearch/service/java/com/android/server/appsearch/stats/StatsCollector.java diff --git a/apex/appsearch/service/Android.bp b/apex/appsearch/service/Android.bp index 5ab7ff9f13c0..b101895f82c9 100644 --- a/apex/appsearch/service/Android.bp +++ b/apex/appsearch/service/Android.bp @@ -51,6 +51,7 @@ java_library { ], libs: [ "framework-appsearch.impl", + "framework-statsd.stubs.module_lib", "unsupportedappusage", // TODO(b/181887768) should be removed ], defaults: ["framework-system-server-module-defaults"], diff --git a/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java b/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java index ec37c3f68aaa..3a92e465c82e 100644 --- a/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java +++ b/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java @@ -61,6 +61,7 @@ import com.android.server.LocalManagerRegistry; import com.android.server.SystemService; import com.android.server.appsearch.external.localstorage.stats.CallStats; import com.android.server.appsearch.external.localstorage.visibilitystore.VisibilityStore; +import com.android.server.appsearch.stats.StatsCollector; import com.android.server.appsearch.util.PackageUtil; import com.android.server.usage.StorageStatsManagerLocal; import com.android.server.usage.StorageStatsManagerLocal.StorageStatsAugmenter; @@ -123,6 +124,13 @@ public class AppSearchManagerService extends SystemService { .registerStorageStatsAugmenter(new AppSearchStorageStatsAugmenter(), TAG); } + @Override + public void onBootPhase(/* @BootPhase */ int phase) { + if (phase == PHASE_BOOT_COMPLETED) { + StatsCollector.getInstance(mContext, EXECUTOR); + } + } + private void registerReceivers() { mContext.registerReceiverForAllUsers( new UserActionReceiver(), diff --git a/apex/appsearch/service/java/com/android/server/appsearch/AppSearchUserInstanceManager.java b/apex/appsearch/service/java/com/android/server/appsearch/AppSearchUserInstanceManager.java index d0d2e8964cf0..395559ff151a 100644 --- a/apex/appsearch/service/java/com/android/server/appsearch/AppSearchUserInstanceManager.java +++ b/apex/appsearch/service/java/com/android/server/appsearch/AppSearchUserInstanceManager.java @@ -33,6 +33,8 @@ import com.android.server.appsearch.stats.PlatformLogger; import com.android.server.appsearch.visibilitystore.VisibilityStoreImpl; import java.io.File; +import java.util.ArrayList; +import java.util.List; import java.util.Map; import java.util.Objects; @@ -158,6 +160,18 @@ public final class AppSearchUserInstanceManager { } } + /** + * Returns the list of all {@link UserHandle}s. + * + *

It can return an empty list if there is no {@link AppSearchUserInstance} created yet. + */ + @NonNull + public List getAllUserHandles() { + synchronized (mInstancesLocked) { + return new ArrayList<>(mInstancesLocked.keySet()); + } + } + @NonNull private AppSearchUserInstance createUserInstance( @NonNull Context userContext, diff --git a/apex/appsearch/service/java/com/android/server/appsearch/stats/PlatformLogger.java b/apex/appsearch/service/java/com/android/server/appsearch/stats/PlatformLogger.java index 81788c243533..0372fcf6bd58 100644 --- a/apex/appsearch/service/java/com/android/server/appsearch/stats/PlatformLogger.java +++ b/apex/appsearch/service/java/com/android/server/appsearch/stats/PlatformLogger.java @@ -45,7 +45,7 @@ import java.util.Objects; import java.util.Random; /** - * Logger Implementation to log to statsd. + * Logger Implementation for pushed atoms. * *

This class is thread-safe. * diff --git a/apex/appsearch/service/java/com/android/server/appsearch/stats/StatsCollector.java b/apex/appsearch/service/java/com/android/server/appsearch/stats/StatsCollector.java new file mode 100644 index 000000000000..dd56739cde57 --- /dev/null +++ b/apex/appsearch/service/java/com/android/server/appsearch/stats/StatsCollector.java @@ -0,0 +1,203 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.appsearch.stats; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.annotation.UserIdInt; +import android.app.StatsManager; +import android.content.Context; +import android.os.UserHandle; +import android.util.Log; +import android.util.StatsEvent; + +import com.android.server.appsearch.AppSearchUserInstance; +import com.android.server.appsearch.AppSearchUserInstanceManager; + +import com.google.android.icing.proto.DocumentStorageInfoProto; +import com.google.android.icing.proto.IndexStorageInfoProto; +import com.google.android.icing.proto.SchemaStoreStorageInfoProto; +import com.google.android.icing.proto.StorageInfoProto; + +import java.util.List; +import java.util.Objects; +import java.util.concurrent.Executor; + +/** + * Implements statsd pullers for AppSearch. + * + *

This class registers pullers to statsd, which will be called once a day to obtain AppSearch + * statistics that cannot be sent to statsd in real time by {@link PlatformLogger}. + * + * @hide + */ +public final class StatsCollector implements StatsManager.StatsPullAtomCallback { + private static final String TAG = "AppSearchStatsCollector"; + + private static volatile StatsCollector sStatsCollector; + private final StatsManager mStatsManager; + + /** + * Gets an instance of {@link StatsCollector} to be used. + * + *

If no instance has been initialized yet, a new one will be created. Otherwise, the + * existing instance will be returned. + */ + @NonNull + public static StatsCollector getInstance(@NonNull Context context, + @NonNull Executor executor) { + Objects.requireNonNull(context); + Objects.requireNonNull(executor); + if (sStatsCollector == null) { + synchronized (StatsCollector.class) { + if (sStatsCollector == null) { + sStatsCollector = new StatsCollector(context, executor); + } + } + } + return sStatsCollector; + } + + private StatsCollector(@NonNull Context context, @NonNull Executor executor) { + mStatsManager = context.getSystemService(StatsManager.class); + if (mStatsManager != null) { + registerAtom(AppSearchStatsLog.APP_SEARCH_STORAGE_INFO, /*policy=*/ null, executor); + Log.d(TAG, "atoms registered"); + } else { + Log.e(TAG, "could not get StatsManager, atoms not registered"); + } + } + + /** + * {@inheritDoc} + * + * @return {@link StatsManager#PULL_SUCCESS} with list of atoms (potentially empty) if pull + * succeeded, {@link StatsManager#PULL_SKIP} if pull was too frequent or atom ID is + * unexpected. + */ + @Override + public int onPullAtom(int atomTag, @NonNull List data) { + Objects.requireNonNull(data); + switch (atomTag) { + case AppSearchStatsLog.APP_SEARCH_STORAGE_INFO: + return pullAppSearchStorageInfo(data); + default: + Log.e(TAG, "unexpected atom ID " + atomTag); + return StatsManager.PULL_SKIP; + } + } + + private static int pullAppSearchStorageInfo(@NonNull List data) { + AppSearchUserInstanceManager userInstanceManager = + AppSearchUserInstanceManager.getInstance(); + List userHandles = userInstanceManager.getAllUserHandles(); + for (int i = 0; i < userHandles.size(); i++) { + UserHandle userHandle = userHandles.get(i); + try { + AppSearchUserInstance userInstance = userInstanceManager.getUserInstance( + userHandle); + StorageInfoProto storageInfoProto = + userInstance.getAppSearchImpl().getRawStorageInfoProto(); + data.add(buildStatsEvent(userHandle.getIdentifier(), storageInfoProto)); + } catch (Throwable t) { + Log.e(TAG, + "Failed to pull the storage info for user " + userHandle.toString(), + t); + } + } + + // Skip the report if there is no data. + if (data.isEmpty()) { + return StatsManager.PULL_SKIP; + } + + return StatsManager.PULL_SUCCESS; + } + + /** + * Registers and configures the callback for the pulled atom. + * + * @param atomId The id of the atom + * @param policy Optional metadata specifying the timeout, cool down time etc. statsD would + * use default values if it is null + * @param executor The executor in which to run the callback + */ + private void registerAtom(int atomId, @Nullable StatsManager.PullAtomMetadata policy, + @NonNull Executor executor) { + mStatsManager.setPullAtomCallback(atomId, policy, executor, /*callback=*/this); + } + + private static StatsEvent buildStatsEvent(@UserIdInt int userId, + @NonNull StorageInfoProto storageInfoProto) { + return AppSearchStatsLog.buildStatsEvent( + AppSearchStatsLog.APP_SEARCH_STORAGE_INFO, + userId, + storageInfoProto.getTotalStorageSize(), + getDocumentStorageInfoBytes(storageInfoProto.getDocumentStorageInfo()), + getSchemaStoreStorageInfoBytes(storageInfoProto.getSchemaStoreStorageInfo()), + getIndexStorageInfoBytes(storageInfoProto.getIndexStorageInfo())); + } + + private static byte[] getDocumentStorageInfoBytes( + @NonNull DocumentStorageInfoProto proto) { + // Make sure we only log the fields defined in the atom in case new fields are added in + // IcingLib + DocumentStorageInfoProto.Builder builder = DocumentStorageInfoProto.newBuilder(); + builder.setNumAliveDocuments(proto.getNumAliveDocuments()) + .setNumDeletedDocuments(proto.getNumDeletedDocuments()) + .setNumExpiredDocuments(proto.getNumExpiredDocuments()) + .setDocumentStoreSize(proto.getDocumentStoreSize()) + .setDocumentLogSize(proto.getDocumentLogSize()) + .setKeyMapperSize(proto.getKeyMapperSize()) + .setDocumentIdMapperSize(proto.getDocumentIdMapperSize()) + .setScoreCacheSize(proto.getScoreCacheSize()) + .setFilterCacheSize(proto.getFilterCacheSize()) + .setCorpusMapperSize(proto.getCorpusMapperSize()) + .setCorpusScoreCacheSize(proto.getCorpusScoreCacheSize()) + .setNamespaceIdMapperSize(proto.getNamespaceIdMapperSize()) + .setNumNamespaces(proto.getNumNamespaces()); + return builder.build().toByteArray(); + } + + private static byte[] getSchemaStoreStorageInfoBytes( + @NonNull SchemaStoreStorageInfoProto proto) { + // Make sure we only log the fields defined in the atom in case new fields are added in + // IcingLib + SchemaStoreStorageInfoProto.Builder builder = SchemaStoreStorageInfoProto.newBuilder(); + builder.setSchemaStoreSize(proto.getSchemaStoreSize()) + .setNumSchemaTypes(proto.getNumSchemaTypes()) + .setNumTotalSections(proto.getNumTotalSections()) + .setNumSchemaTypesSectionsExhausted(proto.getNumSchemaTypesSectionsExhausted()); + return builder.build().toByteArray(); + } + + private static byte[] getIndexStorageInfoBytes( + @NonNull IndexStorageInfoProto proto) { + // Make sure we only log the fields defined in the atom in case new fields are added in + // IcingLib + IndexStorageInfoProto.Builder builder = IndexStorageInfoProto.newBuilder(); + builder.setIndexSize(proto.getIndexSize()) + .setLiteIndexLexiconSize(proto.getLiteIndexLexiconSize()) + .setLiteIndexHitBufferSize(proto.getLiteIndexHitBufferSize()) + .setMainIndexLexiconSize(proto.getMainIndexLexiconSize()) + .setMainIndexStorageSize(proto.getMainIndexStorageSize()) + .setMainIndexBlockSize(proto.getMainIndexBlockSize()) + .setNumBlocks(proto.getNumBlocks()) + .setMinFreeFraction(proto.getMinFreeFraction()); + return builder.build().toByteArray(); + } +} -- cgit v1.2.3 From 1babd5bf516be8ffbd649a59dc136a9cdac24ba4 Mon Sep 17 00:00:00 2001 From: Svet Ganov Date: Fri, 9 Jul 2021 22:07:12 +0000 Subject: Optimize AttributionSource tokens - base For cases where the attribution soruce doesn't need to be registered as trusted we are now using a shares static token since the only purpose of the token in these cases is for watching the source process dying as opposed to that and security for registered cases. bug: 192415943 Test: CtsPermissionTestCases CtsPermission2TestCases CtsPermission3TestCases CtsPermission4TestCases CtsPermission5TestCases Change-Id: I93fde9ca1cacada7929761533dcae11b2736ce1e --- core/api/test-current.txt | 2 +- core/java/android/app/ContextImpl.java | 3 ++- core/java/android/content/AttributionSource.java | 16 +++++++++++++--- core/java/android/permission/PermissionManager.java | 11 +++++++++-- 4 files changed, 25 insertions(+), 7 deletions(-) diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 3be40042ad58..dd7c6db5d8fb 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -2068,7 +2068,7 @@ package android.permission { public final class PermissionManager { method @NonNull @RequiresPermission(android.Manifest.permission.GET_APP_OPS_STATS) public java.util.List getIndicatorAppOpUsageData(); method @NonNull @RequiresPermission(android.Manifest.permission.GET_APP_OPS_STATS) public java.util.List getIndicatorAppOpUsageData(boolean); - method public void registerAttributionSource(@NonNull android.content.AttributionSource); + method @NonNull public android.content.AttributionSource registerAttributionSource(@NonNull android.content.AttributionSource); } } diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index 5e99c79a7497..f52fdc562b13 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -3149,7 +3149,8 @@ class ContextImpl extends Context { // If we want to access protected data on behalf of another app we need to // tell the OS that we opt in to participate in the attribution chain. if (nextAttributionSource != null) { - getSystemService(PermissionManager.class).registerAttributionSource(attributionSource); + attributionSource = getSystemService(PermissionManager.class) + .registerAttributionSource(attributionSource); } return attributionSource; } diff --git a/core/java/android/content/AttributionSource.java b/core/java/android/content/AttributionSource.java index c499f691b69a..d63ce0f4a943 100644 --- a/core/java/android/content/AttributionSource.java +++ b/core/java/android/content/AttributionSource.java @@ -88,6 +88,8 @@ import java.util.Set; public final class AttributionSource implements Parcelable { private static final String DESCRIPTOR = "android.content.AttributionSource"; + private static final Binder sDefaultToken = new Binder(DESCRIPTOR); + private final @NonNull AttributionSourceState mAttributionSourceState; private @Nullable AttributionSource mNextCached; @@ -97,7 +99,7 @@ public final class AttributionSource implements Parcelable { @TestApi public AttributionSource(int uid, @Nullable String packageName, @Nullable String attributionTag) { - this(uid, packageName, attributionTag, new Binder(DESCRIPTOR)); + this(uid, packageName, attributionTag, sDefaultToken); } /** @hide */ @@ -132,7 +134,7 @@ public final class AttributionSource implements Parcelable { AttributionSource(int uid, @Nullable String packageName, @Nullable String attributionTag, @Nullable String[] renouncedPermissions, @Nullable AttributionSource next) { - this(uid, packageName, attributionTag, new Binder(DESCRIPTOR), renouncedPermissions, next); + this(uid, packageName, attributionTag, sDefaultToken, renouncedPermissions, next); } AttributionSource(int uid, @Nullable String packageName, @Nullable String attributionTag, @@ -169,6 +171,12 @@ public final class AttributionSource implements Parcelable { mAttributionSourceState.renouncedPermissions, getNext()); } + /** @hide */ + public AttributionSource withToken(@NonNull Binder token) { + return new AttributionSource(getUid(), getPackageName(), getAttributionTag(), + token, mAttributionSourceState.renouncedPermissions, getNext()); + } + /** @hide */ public @NonNull AttributionSourceState asState() { return mAttributionSourceState; @@ -543,7 +551,9 @@ public final class AttributionSource implements Parcelable { if ((mBuilderFieldsSet & 0x10) == 0) { mAttributionSourceState.next = null; } - mAttributionSourceState.token = new Binder(DESCRIPTOR); + + mAttributionSourceState.token = sDefaultToken; + if (mAttributionSourceState.next == null) { // The NDK aidl backend doesn't support null parcelable arrays. mAttributionSourceState.next = new AttributionSourceState[0]; diff --git a/core/java/android/permission/PermissionManager.java b/core/java/android/permission/PermissionManager.java index 4ef0e6e785e8..a52ede87880e 100644 --- a/core/java/android/permission/PermissionManager.java +++ b/core/java/android/permission/PermissionManager.java @@ -44,6 +44,7 @@ import android.content.pm.PermissionGroupInfo; import android.content.pm.PermissionInfo; import android.content.pm.permission.SplitPermissionInfoParcelable; import android.media.AudioManager; +import android.os.Binder; import android.os.Build; import android.os.Handler; import android.os.Looper; @@ -1163,18 +1164,24 @@ public final class PermissionManager { * that doesn't participate in an attribution chain. * * @param source The attribution source to register. + * @return The registered new attribution source. * * @see #isRegisteredAttributionSource(AttributionSource) * * @hide */ @TestApi - public void registerAttributionSource(@NonNull AttributionSource source) { + public @NonNull AttributionSource registerAttributionSource(@NonNull AttributionSource source) { + // We use a shared static token for sources that are not registered since the token's + // only used for process death detection. If we are about to use the source for security + // enforcement we need to replace the binder with a unique one. + final AttributionSource registeredSource = source.withToken(new Binder()); try { - mPermissionManager.registerAttributionSource(source); + mPermissionManager.registerAttributionSource(registeredSource); } catch (RemoteException e) { e.rethrowFromSystemServer(); } + return registeredSource; } /** -- cgit v1.2.3 From 42cee638de9242f70658d38a978ccf46085001a9 Mon Sep 17 00:00:00 2001 From: Ilya Matyukhin Date: Fri, 9 Jul 2021 17:41:53 -0700 Subject: Fix cancel not working for FingerprintDetectClient Bug: 192802036 Test: manual Change-Id: I447947a1293eca37cc927bf9d4b5858e4a628ce8 --- .../sensors/fingerprint/aidl/FingerprintDetectClient.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintDetectClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintDetectClient.java index 45e93a096550..5e1a245554a6 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintDetectClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintDetectClient.java @@ -30,13 +30,14 @@ import android.util.Slog; import com.android.server.biometrics.BiometricsProto; import com.android.server.biometrics.sensors.AcquisitionClient; import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter; +import com.android.server.biometrics.sensors.DetectionConsumer; import com.android.server.biometrics.sensors.fingerprint.UdfpsHelper; /** * Performs fingerprint detection without exposing any matching information (e.g. accept/reject * have the same haptic, lockout counter is not increased). */ -class FingerprintDetectClient extends AcquisitionClient { +class FingerprintDetectClient extends AcquisitionClient implements DetectionConsumer { private static final String TAG = "FingerprintDetectClient"; @@ -88,7 +89,8 @@ class FingerprintDetectClient extends AcquisitionClient { } } - void onInteractionDetected() { + @Override + public void onInteractionDetected() { vibrateSuccess(); try { -- cgit v1.2.3 From 2f2252a77d53cf5842f712d90d8fce4432894474 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 10 Jul 2021 21:25:03 +0000 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I77b9c6618f5a6b79ab105d881debbbda6565a2d2 --- core/res/res/values-is/strings.xml | 2 +- core/res/res/values-ko/strings.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml index 5b390a3fa549..667dd9c46055 100644 --- a/core/res/res/values-is/strings.xml +++ b/core/res/res/values-is/strings.xml @@ -617,7 +617,7 @@ "Taktu símann úr lás með því að horfa á hann" "Settu upp fleiri leiðir til að taka úr lás" "Ýttu til að bæta við fingrafari" - "Fingrafarsopnun" + "Fingrafarskenni" "Ekki er hægt að nota fingrafaralesara" "Þú verður að fara á verkstæði." "Nákvæm andlitsgögn fengust ekki. Reyndu aftur." diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index d9fd1037c902..f5d16fcb3f7f 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -579,7 +579,7 @@ "지문의 일부만 감지됨" "지문을 인식할 수 없습니다. 다시 시도해 주세요." "센서 닦기" - "조금 더 오래 기다려 주세요." + "조금 더 길게 터치하세요." "손가락을 너무 느리게 움직였습니다. 다시 시도해 주세요." "다른 지문으로 시도" "너무 밝음" -- cgit v1.2.3 From 096d4ea9ceb89dea273ff16d66a23c146eced829 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 10 Jul 2021 21:56:12 +0000 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ibd5f68048c40867731aac0bec3cf530c12d39a79 --- packages/SystemUI/res/values-en-rAU/strings.xml | 3 +-- packages/SystemUI/res/values-en-rCA/strings.xml | 3 +-- packages/SystemUI/res/values-en-rGB/strings.xml | 3 +-- packages/SystemUI/res/values-en-rIN/strings.xml | 3 +-- packages/SystemUI/res/values-en-rXC/strings.xml | 3 +-- 5 files changed, 5 insertions(+), 10 deletions(-) diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index 6454a8b028a1..fd540633bb0b 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -1149,8 +1149,7 @@ "%1$s sent a message: %2$s" "%1$s sent an image" "%1$s has a status update: %2$s" - - + "Available" "Problem reading your battery meter" "Tap for more information" "No alarm set" diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml index 8b8cbd13adeb..dff3c3035a43 100644 --- a/packages/SystemUI/res/values-en-rCA/strings.xml +++ b/packages/SystemUI/res/values-en-rCA/strings.xml @@ -1149,8 +1149,7 @@ "%1$s sent a message: %2$s" "%1$s sent an image" "%1$s has a status update: %2$s" - - + "Available" "Problem reading your battery meter" "Tap for more information" "No alarm set" diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index 6454a8b028a1..fd540633bb0b 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -1149,8 +1149,7 @@ "%1$s sent a message: %2$s" "%1$s sent an image" "%1$s has a status update: %2$s" - - + "Available" "Problem reading your battery meter" "Tap for more information" "No alarm set" diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index 6454a8b028a1..fd540633bb0b 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -1149,8 +1149,7 @@ "%1$s sent a message: %2$s" "%1$s sent an image" "%1$s has a status update: %2$s" - - + "Available" "Problem reading your battery meter" "Tap for more information" "No alarm set" diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml index 3e9c075b67bc..97976dbdc1c0 100644 --- a/packages/SystemUI/res/values-en-rXC/strings.xml +++ b/packages/SystemUI/res/values-en-rXC/strings.xml @@ -1149,8 +1149,7 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‎‎‏‏‏‎‏‎‎‎‏‎‎‎‏‎‎‎‏‎‎‏‏‎‏‏‏‏‎‎‎‎‏‎‎‎‎‏‏‎‎‎‎‎‏‎‏‎‎‎‎‏‎‏‎‏‏‎‎‏‎‎‏‏‎%1$s‎‏‎‎‏‏‏‎ sent a message: ‎‏‎‎‏‏‎%2$s‎‏‎‎‏‏‏‎‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‎‎‎‎‎‏‎‎‏‏‏‏‎‏‎‏‎‏‎‎‎‎‏‏‎‏‎‎‏‎‏‏‏‎‏‎‎‏‏‎‏‎‎‎‎‏‎‏‏‎‎‎‎‏‏‎‎‏‎‎‏‏‎%1$s‎‏‎‎‏‏‏‎ sent an image‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‏‏‎‏‎‎‏‏‏‏‏‏‎‎‏‎‎‎‏‏‏‏‏‏‎‎‎‏‏‎‏‏‏‏‎‎‎‏‎‎‎‎‏‎‏‏‎‏‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎%1$s‎‏‎‎‏‏‏‎ has a status update: ‎‏‎‎‏‏‎%2$s‎‏‎‎‏‏‏‎‎‏‎‎‏‎" - - + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‎‎‎‏‎‏‏‎‏‎‏‎‏‎‎‎‏‏‏‎‎‏‏‎‏‏‏‎‎‏‎‏‎‎‏‏‏‏‎‎‏‎‎‏‎‎‎‏‏‎‎‎‏‎‎‎‎‎Available‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‏‏‎‎‎‏‎‏‎‏‎‏‏‎‎‎‏‏‏‎‎‏‏‏‏‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‏‎‎‎‎‎‎‏‏‏‎‎Problem reading your battery meter‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‎‏‏‎‏‏‎‎‎‎‏‎‏‏‏‏‏‏‎‎‎‏‏‏‏‎‏‏‎‎‏‎‎‏‏‏‏‎‏‎‎‎‎‎‎‎‎‎‏‎‎‎‏‎‎‎‏‏‎Tap for more information‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‏‏‏‏‎‏‏‎‎‎‏‎‎‏‎‏‎‏‏‏‎‎‎‎‏‎‏‎‏‏‏‏‏‏‏‏‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‎‎‏‏‎No alarm set‎‏‎‎‏‎" -- cgit v1.2.3 From 564e82d4d5f277cbe6e2cdebfd1bd4329939e26e Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Sat, 10 Jul 2021 23:03:56 +0000 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Id75bb323396f645cf2eae31ba3ef2c01e5653c01 --- packages/SettingsLib/res/values-es/strings.xml | 4 ++-- packages/SettingsLib/res/values-eu/arrays.xml | 14 +++++++------- packages/SettingsLib/res/values-kn/strings.xml | 2 +- packages/SettingsLib/res/values-ko/strings.xml | 2 +- packages/SettingsLib/res/values-ms/strings.xml | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml index 3b56ce72aa74..d9db99e4efca 100644 --- a/packages/SettingsLib/res/values-es/strings.xml +++ b/packages/SettingsLib/res/values-es/strings.xml @@ -452,8 +452,8 @@ "Es posible que el tablet se apague pronto (%1$s)" "Es posible que el dispositivo se apague pronto (%1$s)" "%1$s - %2$s" - "%1$s hasta que esté completamente cargada" - "%1$s: %2$s hasta que esté completamente cargada" + "%1$s hasta la carga completa" + "%1$s: %2$s hasta la carga completa" "%1$s - Carga limitada temporalmente" "Desconocido" "Cargando" diff --git a/packages/SettingsLib/res/values-eu/arrays.xml b/packages/SettingsLib/res/values-eu/arrays.xml index 4bce1fe750e9..945268867ed2 100644 --- a/packages/SettingsLib/res/values-eu/arrays.xml +++ b/packages/SettingsLib/res/values-eu/arrays.xml @@ -218,17 +218,17 @@ "Bat ere ez" - "480 p" - "480 p (segurua)" - "720 p" - "720 p (segurua)" - "1080 p" - "1080 p (segurua)" + "480p" + "480p (segurua)" + "720p" + "720p (segurua)" + "1080p" + "1080p (segurua)" "4K" "4K (segurua)" "4K (hobetua)" "4K (hobetua, segurua)" - "720 p, 1080 p (bi pantaila)" + "720p, 1080p (bi pantaila)" "Bat ere ez" diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml index 54d01765eea2..c4ba44925bef 100644 --- a/packages/SettingsLib/res/values-kn/strings.xml +++ b/packages/SettingsLib/res/values-kn/strings.xml @@ -341,7 +341,7 @@ "\'ಅಪ್‌ಡೇಟ್‌ಗಳನ್ನು ವೀಕ್ಷಿಸಿ\' ತೋರಿಸಿ" "ಬರೆದಾಗ ವಿಂಡೊದೊಳಗೆ ವೀಕ್ಷಣೆ ಫ್ಲ್ಯಾಶ್‌ ಮಾಡುತ್ತದೆ" "ಹಾರ್ಡ್‌ವೇರ್‌ ಲೇಯರ್‌‌ ಅಪ್‌ಡೇಟ್‌" - "ಅವುಗಳು ನವೀಕರಿಸಿದಾಗ ಹಾರ್ಡ್‌ವೇರ್‌‌ ಲೇಯರ್‌ಗಳು ಹಸಿರು ಫ್ಲ್ಯಾಶ್‌‌ ಆಗುತ್ತದೆ" + "ಅಪ್‍ಡೇಟ್ ಆದಾಗ ಹಾರ್ಡ್‌ವೇರ್‌‌ ಲೇಯರ್‌ಗಳು ಹಸಿರು ಬಣ್ಣದಲ್ಲಿ ಫ್ಲ್ಯಾಶ್‌‌ ಆಗುತ್ತದೆ" "GPU ಓವರ್‌ಡ್ರಾ ಡೀಬಗ್" "HW ಓವರ್‌ಲೇ ನಿಷ್ಕ್ರಿಯ" "ಸ್ಕ್ರೀನ್ ಸಂಯೋಜನೆಗಾಗಿ ಯಾವಾಗಲೂ GPU ಬಳಸಿ" diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml index 4933f4a0ac93..97ad0a0ef347 100644 --- a/packages/SettingsLib/res/values-ko/strings.xml +++ b/packages/SettingsLib/res/values-ko/strings.xml @@ -462,7 +462,7 @@ "무선 충전 중" "충전 안함" "연결됨, 충전 중 아님" - "청구됨" + "충전됨" "관리자가 제어" "사용 안함" "허용됨" diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml index 06525e449061..5ed5f39e0ebd 100644 --- a/packages/SettingsLib/res/values-ms/strings.xml +++ b/packages/SettingsLib/res/values-ms/strings.xml @@ -458,7 +458,7 @@ "Tidak diketahui" "Mengecas" "Mengecas dgn cepat" - "Mengecas dgn prlahan" + "Mengecas perlahan" "Mengecas tanpa wayar" "Tidak mengecas" "Bersambung, tidak mengecas" -- cgit v1.2.3 From 75d9fd945b7d5e557af289c6ddd5e6539d79d87a Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 12 Jul 2021 00:02:41 +0000 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ie5c2dda4c07e8c0a604ac1a01a155b03cad1f96a --- packages/SettingsLib/res/values-eu/arrays.xml | 14 ++++++------ packages/SettingsLib/res/values-kn/strings.xml | 2 +- packages/SettingsLib/res/values-ms/strings.xml | 2 +- packages/SettingsLib/res/values-pl/strings.xml | 30 +++++++++++++------------- 4 files changed, 24 insertions(+), 24 deletions(-) diff --git a/packages/SettingsLib/res/values-eu/arrays.xml b/packages/SettingsLib/res/values-eu/arrays.xml index 103ea57a0a22..8c0ac286cf68 100644 --- a/packages/SettingsLib/res/values-eu/arrays.xml +++ b/packages/SettingsLib/res/values-eu/arrays.xml @@ -218,17 +218,17 @@ "Bat ere ez" - "480 p" - "480 p (segurua)" - "720 p" - "720 p (segurua)" - "1080 p" - "1080 p (segurua)" + "480p" + "480p (segurua)" + "720p" + "720p (segurua)" + "1080p" + "1080p (segurua)" "4K" "4K (segurua)" "4K (hobetua)" "4K (hobetua, segurua)" - "720 p, 1080 p (bi pantaila)" + "720p, 1080p (bi pantaila)" "Bat ere ez" diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml index 52b1f90db536..56e22d1af753 100644 --- a/packages/SettingsLib/res/values-kn/strings.xml +++ b/packages/SettingsLib/res/values-kn/strings.xml @@ -341,7 +341,7 @@ "\'ಅಪ್‌ಡೇಟ್‌ಗಳನ್ನು ವೀಕ್ಷಿಸಿ\' ತೋರಿಸಿ" "ಬರೆದಾಗ ವಿಂಡೊದೊಳಗೆ ವೀಕ್ಷಣೆ ಫ್ಲ್ಯಾಶ್‌ ಮಾಡುತ್ತದೆ" "ಹಾರ್ಡ್‌ವೇರ್‌ ಲೇಯರ್‌‌ ಅಪ್‌ಡೇಟ್‌" - "ಅವುಗಳು ನವೀಕರಿಸಿದಾಗ ಹಾರ್ಡ್‌ವೇರ್‌‌ ಲೇಯರ್‌ಗಳು ಹಸಿರು ಫ್ಲ್ಯಾಶ್‌‌ ಆಗುತ್ತದೆ" + "ಅಪ್‍ಡೇಟ್ ಆದಾಗ ಹಾರ್ಡ್‌ವೇರ್‌‌ ಲೇಯರ್‌ಗಳು ಹಸಿರು ಬಣ್ಣದಲ್ಲಿ ಫ್ಲ್ಯಾಶ್‌‌ ಆಗುತ್ತದೆ" "GPU ಓವರ್‌ಡ್ರಾ ಡೀಬಗ್" "HW ಓವರ್‌ಲೇ ನಿಷ್ಕ್ರಿಯ" "ಸ್ಕ್ರೀನ್ ಸಂಯೋಜನೆಗಾಗಿ ಯಾವಾಗಲೂ GPU ಬಳಸಿ" diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml index 3433ce36dec7..62c2ec9f42d6 100644 --- a/packages/SettingsLib/res/values-ms/strings.xml +++ b/packages/SettingsLib/res/values-ms/strings.xml @@ -450,7 +450,7 @@ "Tidak diketahui" "Mengecas" "Mengecas dgn cepat" - "Mengecas dgn prlahan" + "Mengecas perlahan" "Tidak mengecas" "Dipalamkan, tidak boleh mengecas sekarang" "Penuh" diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml index 9d3a0204d8ef..63a27c62af94 100644 --- a/packages/SettingsLib/res/values-pl/strings.xml +++ b/packages/SettingsLib/res/values-pl/strings.xml @@ -234,8 +234,8 @@ "Sparuj urządzenia przez Wi-Fi, skanując kod QR" "Połącz się z siecią Wi-Fi" "adb, debug, dev" - "Skrót do zgłoszenia błędu" - "Pokaż w menu zasilania przycisk zgłaszania błędu" + "Skrót do zgłaszania błędów" + "Pokazuj w menu zasilania przycisk zgłaszania błędów" "Pozostaw włączony ekran" "Ekran nie będzie gaszony podczas ładowania telefonu" "Włącz dziennik snoop Bluetooth HCI" @@ -248,10 +248,10 @@ "Nie ustawiono aplikacji do pozorowania lokalizacji" "Aplikacja do pozorowania lokalizacji: %1$s" "Sieci" - "Wyświetlacz bezprzewodowy" + "Certyfikacja wyświetlacza bezprzewodowego" "Szczegółowy dziennik Wi-Fi" "Ograniczanie skanowania Wi-Fi" - "Randomizacja MAC ulepszona w zakresie Wi‑Fi" + "Randomizacja MAC przez sieć Wi‑Fi" "Mobilna transmisja danych zawsze aktywna" "Akceleracja sprzętowa tetheringu" "Pokazuj urządzenia Bluetooth bez nazw" @@ -281,7 +281,7 @@ "Nazwa hosta dostawcy prywatnego DNS" "Wpisz nazwę hosta dostawcy DNS" "Nie udało się połączyć" - "Pokaż opcje certyfikacji wyświetlacza bezprzewodowego" + "Pokazuj opcje certyfikacji wyświetlacza bezprzewodowego" "Zwiększ poziom rejestrowania Wi‑Fi, pokazuj według RSSI SSID w selektorze Wi‑Fi" "Zmniejsza zużycie baterii i zwiększa wydajność sieci" "Kiedy ten tryb jest włączony, to adres MAC tego urządzenia może zmieniać się za każdym razem, kiedy urządzenie połączy się z siecią, która ma włączoną opcję randomizacji MAC" @@ -297,9 +297,9 @@ "Wybierz konfigurację USB" "Pozorowanie lokalizacji" "Zezwalaj na pozorowanie lokalizacji" - "Inspekcja wyświetlania atrybutu" + "Inspekcja atrybutu wyświetlania" "Nie wyłączaj transmisji danych przez sieć komórkową, nawet gdy aktywne jest połączenie Wi-Fi (aby szybko przełączać sieci)" - "Użyj akceleracji sprzętowej tetheringu, jeśli jest dostępna" + "Używaj akceleracji sprzętowej tetheringu, jeśli jest dostępna" "Czy zezwalać na debugowanie USB?" "Debugowanie USB jest przeznaczone wyłącznie do celów programistycznych. Może służyć do kopiowania danych między komputerem a urządzeniem, instalowania aplikacji na urządzeniu bez powiadamiania, a także odczytu danych dziennika." "Zezwalać na debugowanie bezprzewodowe?" @@ -307,8 +307,8 @@ "Odwołać dostęp wszystkich poprzednio autoryzowanych komputerów do debugowania USB?" "Zezwolić na ustawienia programistyczne?" "Te ustawienia są przeznaczone wyłącznie dla programistów. Ich użycie może spowodować uszkodzenie lub nieprawidłowe działanie urządzenia i zainstalowanych na nim aplikacji." - "Zweryfikuj aplikacje przez USB" - "Sprawdź, czy aplikacje zainstalowane przez ADB/ADT nie zachowują się w szkodliwy sposób" + "Weryfikuj aplikacje przez USB" + "Sprawdzaj, czy aplikacje zainstalowane przez ADB/ADT nie zachowują się w szkodliwy sposób" "Urządzenia Bluetooth będą wyświetlane bez nazw (tylko adresy MAC)" "Wyłącza Głośność bezwzględną Bluetooth, jeśli występują problemy z urządzeniami zdalnymi, np. zbyt duża głośność lub brak kontroli" "Włącza funkcje Bluetooth Gabeldorsche" @@ -349,16 +349,16 @@ "Włącz śledzenie OpenGL" "Wyłącz kierowanie dźwiękowe USB" "Wyłącz autokierowanie do urządzeń peryferyjnych audio USB" - "Pokaż granice układu" - "Pokaż granice przycięcia, marginesy itd." + "Pokazuj granice układu" + "Pokazuj granice przycięcia, marginesy itd." "Układ od prawej do lewej" - "Wymuś wszędzie układ ekranu od prawej do lewej" - "Wymuś 4x MSAA" - "Włącz 4x MSAA w aplikacjach OpenGL ES 2.0" + "Wymuszaj układ ekranu od prawej do lewej dla wszystkich języków" + "Wymuszaj 4x MSAA" + "Włączaj 4x MSAA w aplikacjach OpenGL ES 2.0" "Debuguj operacje przycinania nieprostokątnego" "Profil renderowania HWUI" "Warstwy debugowania GPU" - "Zezwól na ładowanie warstw debugowania GPU" + "Zezwalaj na ładowanie warstw debugowania GPU" "Włącz szczegółowe rejestrowanie dostawcy" "Dołączaj do raportów o błędach dodatkowe dane dostawcy dotyczące konkretnego urządzenia, które mogą zawierać dane prywatne oraz wykorzystywać więcej baterii lub pamięci." "Skala animacji okna" -- cgit v1.2.3 From 8d37fc464c74af76c8e609071a50958c530b4492 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 12 Jul 2021 00:09:32 +0000 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I5bd5d102552522f81fa402322cd6d77f6cbe3698 --- packages/SettingsLib/res/values-eu/arrays.xml | 14 ++++++------ packages/SettingsLib/res/values-kn/strings.xml | 2 +- packages/SettingsLib/res/values-ms/strings.xml | 2 +- packages/SettingsLib/res/values-pl/strings.xml | 30 +++++++++++++------------- 4 files changed, 24 insertions(+), 24 deletions(-) diff --git a/packages/SettingsLib/res/values-eu/arrays.xml b/packages/SettingsLib/res/values-eu/arrays.xml index ad674ea025cd..7b9a26855928 100644 --- a/packages/SettingsLib/res/values-eu/arrays.xml +++ b/packages/SettingsLib/res/values-eu/arrays.xml @@ -218,17 +218,17 @@ "Bat ere ez" - "480 p" - "480 p (segurua)" - "720 p" - "720 p (segurua)" - "1080 p" - "1080 p (segurua)" + "480p" + "480p (segurua)" + "720p" + "720p (segurua)" + "1080p" + "1080p (segurua)" "4K" "4K (segurua)" "4K (hobetua)" "4K (hobetua, segurua)" - "720 p, 1080 p (bi pantaila)" + "720p, 1080p (bi pantaila)" "Bat ere ez" diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml index 02c8b02bb376..3ebb9d383f93 100644 --- a/packages/SettingsLib/res/values-kn/strings.xml +++ b/packages/SettingsLib/res/values-kn/strings.xml @@ -340,7 +340,7 @@ "\'ಅಪ್‌ಡೇಟ್‌ಗಳನ್ನು ವೀಕ್ಷಿಸಿ\' ತೋರಿಸಿ" "ಬರೆದಾಗ ವಿಂಡೊದೊಳಗೆ ವೀಕ್ಷಣೆ ಫ್ಲ್ಯಾಶ್‌ ಮಾಡುತ್ತದೆ" "ಹಾರ್ಡ್‌ವೇರ್‌ ಲೇಯರ್‌‌ ಅಪ್‌ಡೇಟ್‌" - "ಅವುಗಳು ನವೀಕರಿಸಿದಾಗ ಹಾರ್ಡ್‌ವೇರ್‌‌ ಲೇಯರ್‌ಗಳು ಹಸಿರು ಫ್ಲ್ಯಾಶ್‌‌ ಆಗುತ್ತದೆ" + "ಅಪ್‍ಡೇಟ್ ಆದಾಗ ಹಾರ್ಡ್‌ವೇರ್‌‌ ಲೇಯರ್‌ಗಳು ಹಸಿರು ಬಣ್ಣದಲ್ಲಿ ಫ್ಲ್ಯಾಶ್‌‌ ಆಗುತ್ತದೆ" "GPU ಓವರ್‌ಡ್ರಾ ಡೀಬಗ್" "HW ಓವರ್‌ಲೇ ನಿಷ್ಕ್ರಿಯ" "ಸ್ಕ್ರೀನ್ ಸಂಯೋಜನೆಗಾಗಿ ಯಾವಾಗಲೂ GPU ಬಳಸಿ" diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml index bd54f3fd30dc..856420a181b9 100644 --- a/packages/SettingsLib/res/values-ms/strings.xml +++ b/packages/SettingsLib/res/values-ms/strings.xml @@ -450,7 +450,7 @@ "Tidak diketahui" "Mengecas" "Mengecas dgn cepat" - "Mengecas dgn prlahan" + "Mengecas perlahan" "Tidak mengecas" "Dipalamkan, tidak boleh mengecas sekarang" "Penuh" diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml index 3c5a47a7ffd9..d0e0426cc7b5 100644 --- a/packages/SettingsLib/res/values-pl/strings.xml +++ b/packages/SettingsLib/res/values-pl/strings.xml @@ -234,8 +234,8 @@ "Sparuj urządzenia przez Wi-Fi, skanując kod QR" "Połącz się z siecią Wi-Fi" "adb, debug, dev" - "Skrót do zgłoszenia błędu" - "Pokaż w menu zasilania przycisk zgłaszania błędu" + "Skrót do zgłaszania błędów" + "Pokazuj w menu zasilania przycisk zgłaszania błędów" "Pozostaw włączony ekran" "Ekran nie będzie gaszony podczas ładowania telefonu" "Włącz dziennik snoop Bluetooth HCI" @@ -248,10 +248,10 @@ "Nie ustawiono aplikacji do pozorowania lokalizacji" "Aplikacja do pozorowania lokalizacji: %1$s" "Sieci" - "Wyświetlacz bezprzewodowy" + "Certyfikacja wyświetlacza bezprzewodowego" "Szczegółowy dziennik Wi-Fi" "Ograniczanie skanowania Wi-Fi" - "Randomizacja MAC ulepszona w zakresie Wi‑Fi" + "Randomizacja MAC przez sieć Wi‑Fi" "Mobilna transmisja danych zawsze aktywna" "Akceleracja sprzętowa tetheringu" "Pokazuj urządzenia Bluetooth bez nazw" @@ -280,7 +280,7 @@ "Nazwa hosta dostawcy prywatnego DNS" "Wpisz nazwę hosta dostawcy DNS" "Nie udało się połączyć" - "Pokaż opcje certyfikacji wyświetlacza bezprzewodowego" + "Pokazuj opcje certyfikacji wyświetlacza bezprzewodowego" "Zwiększ poziom rejestrowania Wi‑Fi, pokazuj według RSSI SSID w selektorze Wi‑Fi" "Zmniejsza zużycie baterii i zwiększa wydajność sieci" "Kiedy ten tryb jest włączony, to adres MAC tego urządzenia może zmieniać się za każdym razem, kiedy urządzenie połączy się z siecią, która ma włączoną opcję randomizacji MAC" @@ -296,9 +296,9 @@ "Wybierz konfigurację USB" "Pozorowanie lokalizacji" "Zezwalaj na pozorowanie lokalizacji" - "Inspekcja wyświetlania atrybutu" + "Inspekcja atrybutu wyświetlania" "Nie wyłączaj transmisji danych przez sieć komórkową, nawet gdy aktywne jest połączenie Wi-Fi (aby szybko przełączać sieci)" - "Użyj akceleracji sprzętowej tetheringu, jeśli jest dostępna" + "Używaj akceleracji sprzętowej tetheringu, jeśli jest dostępna" "Czy zezwalać na debugowanie USB?" "Debugowanie USB jest przeznaczone wyłącznie do celów programistycznych. Może służyć do kopiowania danych między komputerem a urządzeniem, instalowania aplikacji na urządzeniu bez powiadamiania, a także odczytu danych dziennika." "Zezwalać na debugowanie bezprzewodowe?" @@ -306,8 +306,8 @@ "Odwołać dostęp wszystkich poprzednio autoryzowanych komputerów do debugowania USB?" "Zezwolić na ustawienia programistyczne?" "Te ustawienia są przeznaczone wyłącznie dla programistów. Ich użycie może spowodować uszkodzenie lub nieprawidłowe działanie urządzenia i zainstalowanych na nim aplikacji." - "Zweryfikuj aplikacje przez USB" - "Sprawdź, czy aplikacje zainstalowane przez ADB/ADT nie zachowują się w szkodliwy sposób" + "Weryfikuj aplikacje przez USB" + "Sprawdzaj, czy aplikacje zainstalowane przez ADB/ADT nie zachowują się w szkodliwy sposób" "Urządzenia Bluetooth będą wyświetlane bez nazw (tylko adresy MAC)" "Wyłącza Głośność bezwzględną Bluetooth, jeśli występują problemy z urządzeniami zdalnymi, np. zbyt duża głośność lub brak kontroli" "Włącza funkcje Bluetooth Gabeldorsche" @@ -348,16 +348,16 @@ "Włącz śledzenie OpenGL" "Wyłącz kierowanie dźwiękowe USB" "Wyłącz autokierowanie do urządzeń peryferyjnych audio USB" - "Pokaż granice układu" - "Pokaż granice przycięcia, marginesy itd." + "Pokazuj granice układu" + "Pokazuj granice przycięcia, marginesy itd." "Układ od prawej do lewej" - "Wymuś wszędzie układ ekranu od prawej do lewej" - "Wymuś 4x MSAA" - "Włącz 4x MSAA w aplikacjach OpenGL ES 2.0" + "Wymuszaj układ ekranu od prawej do lewej dla wszystkich języków" + "Wymuszaj 4x MSAA" + "Włączaj 4x MSAA w aplikacjach OpenGL ES 2.0" "Debuguj operacje przycinania nieprostokątnego" "Profil renderowania HWUI" "Warstwy debugowania GPU" - "Zezwól na ładowanie warstw debugowania GPU" + "Zezwalaj na ładowanie warstw debugowania GPU" "Włącz szczegółowe rejestrowanie dostawcy" "Dołączaj do raportów o błędach dodatkowe dane dostawcy dotyczące konkretnego urządzenia, które mogą zawierać dane prywatne oraz wykorzystywać więcej baterii lub pamięci." "Skala animacji okna" -- cgit v1.2.3 From 810915add51ae2e7d853aa04d3fc4b538ed09835 Mon Sep 17 00:00:00 2001 From: Jimmy Hu Date: Wed, 30 Jun 2021 10:18:04 +0800 Subject: Update USB HAL version early USB API could be used before USB HAL version is updated. Update USB HAL version early and log it. Bug: 180711938 Test: USB HAL version updated normally Signed-off-by: Jimmy Hu Change-Id: If63c848e9643e9144662f031c981fad16d0a0fd6 --- .../devicepolicy/DevicePolicyManagerService.java | 4 +--- .../com/android/server/usb/UsbPortManager.java | 28 ++++++---------------- 2 files changed, 8 insertions(+), 24 deletions(-) diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index e553075580c4..fd71d1bc1c38 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -17557,9 +17557,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } final boolean usbEnabled; synchronized (getLockObject()) { - final ActiveAdmin admin = getDeviceOwnerOrProfileOwnerOfOrganizationOwnedDeviceLocked( - UserHandle.USER_SYSTEM); - usbEnabled = admin != null && admin.mUsbDataSignalingEnabled; + usbEnabled = isUsbDataSignalingEnabledInternalLocked(); } if (!mInjector.binderWithCleanCallingIdentity( () -> mInjector.getUsbManager().enableUsbDataSignal(usbEnabled))) { diff --git a/services/usb/java/com/android/server/usb/UsbPortManager.java b/services/usb/java/com/android/server/usb/UsbPortManager.java index d6c046921c57..ec28040f82d8 100644 --- a/services/usb/java/com/android/server/usb/UsbPortManager.java +++ b/services/usb/java/com/android/server/usb/UsbPortManager.java @@ -385,29 +385,16 @@ public class UsbPortManager { * @param none */ private void updateUsbHalVersion() { - android.hardware.usb.V1_3.IUsb usbProxy_V1_3 = - android.hardware.usb.V1_3.IUsb.castFrom(mProxy); - if (usbProxy_V1_3 != null) { + if (android.hardware.usb.V1_3.IUsb.castFrom(mProxy) != null) { mCurrentUsbHalVersion = UsbManager.USB_HAL_V1_3; - return; - } - - android.hardware.usb.V1_2.IUsb usbProxy_V1_2 = - android.hardware.usb.V1_2.IUsb.castFrom(mProxy); - if (usbProxy_V1_2 != null) { + } else if (android.hardware.usb.V1_2.IUsb.castFrom(mProxy) != null) { mCurrentUsbHalVersion = UsbManager.USB_HAL_V1_2; - return; - } - - android.hardware.usb.V1_1.IUsb usbProxy_V1_1 = - android.hardware.usb.V1_1.IUsb.castFrom(mProxy); - if (usbProxy_V1_1 != null) { + } else if (android.hardware.usb.V1_1.IUsb.castFrom(mProxy) != null) { mCurrentUsbHalVersion = UsbManager.USB_HAL_V1_1; - return; + } else { + mCurrentUsbHalVersion = UsbManager.USB_HAL_V1_0; } - - mCurrentUsbHalVersion = UsbManager.USB_HAL_V1_0; - return; + logAndPrint(Log.INFO, null, "USB HAL version: " + mCurrentUsbHalVersion); } public void setPortRoles(String portId, int newPowerRole, int newDataRole, @@ -850,7 +837,7 @@ public class UsbPortManager { mProxy.linkToDeath(new DeathRecipient(pw), USB_HAL_DEATH_COOKIE); mProxy.setCallback(mHALCallback); mProxy.queryPortStatus(); - mCurrentUsbHalVersion = UsbManager.USB_HAL_V1_0; + updateUsbHalVersion(); } catch (NoSuchElementException e) { logAndPrintException(pw, "connectToProxy: usb hal service not found." + " Did the service fail to start?", e); @@ -1183,7 +1170,6 @@ public class UsbPortManager { case MSG_SYSTEM_READY: { mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); - updateUsbHalVersion(); break; } } -- cgit v1.2.3 From d3a458ca4bb99e7ba6f76891988009eb238d788f Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 12 Jul 2021 09:58:24 +0000 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ia88f2b70431185a05f5d060df89d4296e9ef8d9c --- core/res/res/values-am/strings.xml | 4 ++-- core/res/res/values-bn/strings.xml | 3 +-- core/res/res/values-eu/strings.xml | 2 +- core/res/res/values-fr-rCA/strings.xml | 18 +++++++++--------- core/res/res/values-fr/strings.xml | 2 +- core/res/res/values-gu/strings.xml | 3 +-- core/res/res/values-ky/strings.xml | 2 +- core/res/res/values-pl/strings.xml | 2 +- core/res/res/values-pt-rBR/strings.xml | 12 ++++++------ core/res/res/values-pt/strings.xml | 12 ++++++------ core/res/res/values-sk/strings.xml | 2 +- core/res/res/values-ta/strings.xml | 2 +- core/res/res/values-uk/strings.xml | 2 +- 13 files changed, 32 insertions(+), 34 deletions(-) diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index 832204ff5669..062ed143dfd5 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -567,10 +567,10 @@ "የጣት አሻራ አዶ" - "በመልክ መክፈቻ ሃርድዌርን ማስተዳደር" + "በመልክ መክፈት ሃርድዌርን ማስተዳደር" "መተግበሪያው ጥቅም ላይ እንዲውሉ የፊት ቅንብር ደንቦችን ለማከል እና ለመሰረዝ የሚያስችሉ ስልቶችን እንዲያስጀምር ያስችለዋል።" "በመልክ መክፈት ሃርድዌርን መጠቀም" - "መተግበሪያው የመልክ መክፈቻ ሃርድዌርን ለማረጋገጥ እንዲጠቀም ያስችለዋል" + "መተግበሪያው የበመልክ መክፈት ሃርድዌርን ለማረጋገጥ እንዲጠቀም ያስችለዋል" "በመልክ መክፈት" "የእርስዎን ፊት ዳግመኛ ያስመዝግቡ" "ማንነትን ለይቶ ማወቅን ለማሻሻል፣ እባክዎ የእርስዎን ፊት ዳግም ያስመዝግቡ" diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml index 26f6af2ce0b4..a10cb2450bc7 100644 --- a/core/res/res/values-bn/strings.xml +++ b/core/res/res/values-bn/strings.xml @@ -1413,8 +1413,7 @@ "অস্বীকার করুন" "অনুমতির অনুরোধ করা হয়েছে" "%sঅ্যাকাউন্টের জন্য\nঅনুমতির অনুরোধ করা হয়েছে৷" - - + "%2$s অ্যাকাউন্টের জন্য %1$s\n থেকে অনুমতি চাওয়া হয়েছে।" "আপনি এই অ্যাপ্লিকেশানটি আপনার কর্মস্থলের প্রোফাইলের বাইরে ব্যবহার করছেন" "আপনি এই অ্যাপ্লিকেশানটি আপনার কর্মস্থলের প্রোফাইলে ব্যবহার করছেন" "ইনপুট পদ্ধতি" diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index 4ce9c2cdec26..507619cf3b78 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -597,7 +597,7 @@ "Ezin da egiaztatu aurpegia. Hardwarea ez dago erabilgarri." - "Saiatu berriro aurpegiaren bidez desblokeatzen." + "Saiatu berriro aurpegi bidez desblokeatzen." "Ezin dira gorde aurpegiaren datu berriak. Ezabatu zaharrak." "Utzi da aurpegiaren bidezko eragiketa." "Erabiltzaileak aurpegi bidez desblokeatzeko aukera utzi du" diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index 7a420ce02648..a1712d4c277d 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -514,10 +514,10 @@ "Permet à l\'application d\'accéder à la configuration du Bluetooth sur la tablette, et d\'établir et accepter des connexions avec les appareils associés." "Permet à l\'application d\'afficher la configuration du Bluetooth sur votre appareil Android TV, de se connecter à des appareils associés et d\'accepter leur connexion." "Permet à l\'application d\'accéder à la configuration du Bluetooth sur le téléphone, et d\'établir et accepter des connexions avec les appareils associés." - "Information sur le service préféré de paiement NFC" - "Permet à l\'application d\'obtenir de l\'information sur le service préféré de paiement NFC comme les aides enregistrées et la route de destination." + "Information sur le service préféré de paiement CCP" + "Permet à l\'application d\'obtenir de l\'information sur le service préféré de paiement CCP comme les aides enregistrées et la route de destination." "gérer la communication en champ proche" - "Permet à l\'application de communiquer avec des bornes, des cartes et des lecteurs compatibles avec la technologie NFC (communication en champ proche)." + "Permet à l\'application de communiquer avec des bornes, des cartes et des lecteurs compatibles avec la technologie CCP (communication en champ proche)." "désactiver le verrouillage de l\'écran" "Permet à l\'application de désactiver le verrouillage des touches et toute mesure de sécurité par mot de passe associée. Par exemple, votre téléphone désactive le verrouillage des touches lorsque vous recevez un appel, puis le réactive lorsque vous raccrochez." "demander la complexité du verrouillage d\'écran" @@ -570,7 +570,7 @@ "gérer le matériel de déverrouillage par reconnaissance faciale" "Permet à l\'appli d\'employer des méthodes d\'aj. et de suppr. de modèles de reconn. visage." "utiliser le matériel de déverrouillage par reconnaissance faciale" - "Permet à l\'appli d\'utiliser du matériel de déverr. par reconn. faciale pour l\'authentific." + "Autorise l\'appli à utiliser le matériel de déverrouillage par reconnaissance faciale" "Déverrouillage par reconnaissance faciale" "Inscrivez votre visage à nouveau" "Pour améliorer la reconnaissance, veuillez enregistrer à nouveau votre visage" @@ -600,12 +600,12 @@ "Réessayez le déverr. par reconnaissance faciale." "Impossible de stocker de nouveaux visages. Supprimez-en un." "Opération de reconnaissance du visage annulée." - "Déverr. par reconn. faciale annulé par l\'utilisateur." + "Déverrouillage par reconnaissance faciale annulé par l\'utilisateur." "Trop de tentatives. Veuillez réessayer plus tard." - "Trop de tentatives. Le déverr. par reconnaissance faciale est désactivé." + "Trop de tentatives. Déverrouillage par reconnaissance faciale désactivé." "Impossible de vérifier le visage. Réessayez." - "Vous n\'avez pas config. le déverr. par reconn. faciale." - "Cet appar. ne prend pas en charge le déverr. par reconn. faciale." + "Déverrouillage par reconnaissance faciale non configuré." + "Déverrouillage par reconnaissance faciale non pris en charge." "Le capteur a été désactivé temporairement." "Visage %d" @@ -1442,7 +1442,7 @@ "Touchez pour quitter l\'application de conduite." "Précédent" "Suivante" - "Passer" + "Ignorer" "Aucune partie" "Rechercher sur la page" diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 8b915250e174..b6f0fec9e031 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -1013,7 +1013,7 @@ "semaines" "année" "années" - "mainten." + "maintenant" %d m %d m diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index 101fd1564a06..271a71c74b85 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -1413,8 +1413,7 @@ "નકારો" "પરવાનગીની વિનંતી કરી" "એકાઉન્ટ %s માટે\nપરવાનગીની વિનંતી કરી." - - + "%2$s એકાઉન્ટ માટે\n%1$s દ્વારા પરવાનગીની વિનંતી કરવામાં આવી." "તમે તમારી કાર્ય પ્રોફાઇલની બહાર આ એપ્લિકેશનનો ઉપયોગ કરી રહ્યાં છો" "તમે તમારી કાર્ય પ્રોફાઇલમાં આ એપ્લિકેશનનો ઉપયોગ કરી રહ્યાં છો" "ઇનપુટ પદ્ધતિ" diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index ad991d4cd112..26cde1afbc02 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -1413,7 +1413,7 @@ "Уруксат берилбейт" "Уруксат талап кылуу" "Кийинки эсепке\nуруксат талап кылынууда: %s." - "%1$s колдонмосу\n %2$s аккаунтуна кирүүгө уруксат сурады." + "%1$s колдонмосу\n%2$s аккаунтуна кирүүгө уруксат сурады." "Бул колдонмо жумуш профилиңиздин сыртында колдонулуп жатат" "Бул колдонмону жумуш профилиңизде пайдаланып жатасыз" "Киргизүү ыкмасы" diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index d45f26c9b51e..fce84f3caee8 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -243,7 +243,7 @@ "Wyłącz" "Przycisk zasilania" "Uruchom ponownie" - "Nagły przypadek" + "Połączenie alarmowe" "Zgłoś błąd" "Zakończ sesję" "Zrzut ekranu" diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index e42bdeaa7eef..9c5f3a5f8ea7 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -567,10 +567,10 @@ "Ícone de impressão digital" - "gerenciar hardware de desbloqueio facial" + "gerenciar hardware de Desbloqueio facial" "Permite que o app execute métodos para adicionar e excluir modelos de rosto para uso." - "usar hardware de desbloqueio facial" - "Permite que o app use o hardware de desbloqueio facial para autenticação" + "usar hardware de Desbloqueio facial" + "Permite que o app use o hardware de Desbloqueio facial para autenticação" "Desbloqueio facial" "Registre seu rosto novamente" "Para melhorar o reconhecimento, registre seu rosto novamente" @@ -597,15 +597,15 @@ "Impossível verificar rosto. Hardware indisponível." - "Tente usar o desbloqueio facial novamente." + "Tente usar o Desbloqueio facial novamente." "Não é possível salvar dados faciais. Exclua dados antigos." "Operação facial cancelada." "Desbloqueio facial cancelado pelo usuário." "Excesso de tentativas. Tente novamente mais tarde." "Muitas tentativas. Desbloqueio facial desativado." "Não é possível verificar o rosto. Tente novamente." - "O desbloqueio facial não foi configurado." - "O desbloqueio facial não é compatível com este dispositivo." + "O Desbloqueio facial não foi configurado." + "O Desbloqueio facial não é compatível com este dispositivo." "Sensor desativado temporariamente." "Rosto %d" diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index e42bdeaa7eef..9c5f3a5f8ea7 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -567,10 +567,10 @@ "Ícone de impressão digital" - "gerenciar hardware de desbloqueio facial" + "gerenciar hardware de Desbloqueio facial" "Permite que o app execute métodos para adicionar e excluir modelos de rosto para uso." - "usar hardware de desbloqueio facial" - "Permite que o app use o hardware de desbloqueio facial para autenticação" + "usar hardware de Desbloqueio facial" + "Permite que o app use o hardware de Desbloqueio facial para autenticação" "Desbloqueio facial" "Registre seu rosto novamente" "Para melhorar o reconhecimento, registre seu rosto novamente" @@ -597,15 +597,15 @@ "Impossível verificar rosto. Hardware indisponível." - "Tente usar o desbloqueio facial novamente." + "Tente usar o Desbloqueio facial novamente." "Não é possível salvar dados faciais. Exclua dados antigos." "Operação facial cancelada." "Desbloqueio facial cancelado pelo usuário." "Excesso de tentativas. Tente novamente mais tarde." "Muitas tentativas. Desbloqueio facial desativado." "Não é possível verificar o rosto. Tente novamente." - "O desbloqueio facial não foi configurado." - "O desbloqueio facial não é compatível com este dispositivo." + "O Desbloqueio facial não foi configurado." + "O Desbloqueio facial não é compatível com este dispositivo." "Sensor desativado temporariamente." "Rosto %d" diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index 5670b658e3da..7ed70d9ce0d7 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -26,7 +26,7 @@ "GB" "TB" "PB" - "%1$s&#160;%2$s" + "%1$sU+00A0%2$s" "<Bez mena>" "(žiadne telefónne číslo)" "Bez názvu" diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml index 29bd532dadfb..6f0b84c73016 100644 --- a/core/res/res/values-ta/strings.xml +++ b/core/res/res/values-ta/strings.xml @@ -1900,7 +1900,7 @@ "பணிக் கணக்கு பூட்டியுள்ளது" "பணிக் கணக்கை அன்லாக் செய்யத் தட்டுக" "%1$s உடன் இணைக்கப்பட்டது" - "கோப்புகளைப் பார்க்க, தட்டவும்" + "ஃபைல்களைப் பார்க்க, தட்டவும்" "பின் செய்" "%1$s ஐப் பின் செய்" "பின்னை அகற்று" diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index d92964954053..05ccd9d33173 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -1453,7 +1453,7 @@ "Забор." "Потрібен дозвіл" "Запитано дозвіл\nдля облікового запису %s." - "Дозвіл, який додаток %1$s запитує\nна доступ до облікового запису %2$s." + "Додаток %1$s запитує дозвіл\nна доступ до облікового запису %2$s." "Ви використовуєте цей додаток за межами робочого профілю" "Ви використовуєте цей додаток у своєму робочому профілі" "Метод введення" -- cgit v1.2.3 From d980e51c7232624ee69d937077faaa3b178649f8 Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Mon, 12 Jul 2021 17:51:41 +0800 Subject: Sync client visibility if activity is stopped While activity resumed and stopped without transition, there may not have an animation callback to commit client visibility. Though the main window of activity can be updated according to activity lifecycle callback, if there are other windows attached to the activity, those windows may keep in visible state. Bug: 193125596 Test: 1. Enable secured lock. 2. Launch an activity with attaching another window. 3. Lock device and launch a show-when-locked activity. 4. Finish the show-when-locked activity. 5. Check all windows of the current top activity should be invisible by command "adb shell dumpsys window w". 6. There should be no delay when turning off/on display "Timeout waiting for drawn". Change-Id: Ib48b0509c328567302318689c565191cac8019b1 --- services/core/java/com/android/server/wm/ActivityRecord.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index dd545290c377..50b5bfee8da1 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -5016,6 +5016,10 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // Reset the last saved PiP snap fraction on app stop. mDisplayContent.mPinnedTaskController.onActivityHidden(mActivityComponent); mDisplayContent.mUnknownAppVisibilityController.appRemovedOrHidden(this); + if (isClientVisible()) { + // Though this is usually unlikely to happen, still make sure the client is invisible. + setClientVisible(false); + } destroySurfaces(); // Remove any starting window that was added for this app if they are still around. removeStartingWindow(); -- cgit v1.2.3 From 3c82ced3f556aa7e455f89986453f1b7034f6fd1 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 12 Jul 2021 10:33:09 +0000 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I17f5cc51cf4e27ad9892385e46ace3fd65f84766 --- core/res/res/values-am/strings.xml | 4 ++-- core/res/res/values-bn/strings.xml | 3 +-- core/res/res/values-eu/strings.xml | 2 +- core/res/res/values-fr-rCA/strings.xml | 18 +++++++++--------- core/res/res/values-fr/strings.xml | 2 +- core/res/res/values-gu/strings.xml | 3 +-- core/res/res/values-ky/strings.xml | 2 +- core/res/res/values-pl/strings.xml | 2 +- core/res/res/values-pt-rBR/strings.xml | 12 ++++++------ core/res/res/values-pt/strings.xml | 12 ++++++------ core/res/res/values-sk/strings.xml | 2 +- core/res/res/values-ta/strings.xml | 2 +- core/res/res/values-uk/strings.xml | 2 +- 13 files changed, 32 insertions(+), 34 deletions(-) diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index 206c4c593c65..394f52910c9b 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -567,10 +567,10 @@ "የጣት አሻራ አዶ" - "በመልክ መክፈቻ ሃርድዌርን ማስተዳደር" + "በመልክ መክፈት ሃርድዌርን ማስተዳደር" "መተግበሪያው ጥቅም ላይ እንዲውሉ የፊት ቅንብር ደንቦችን ለማከል እና ለመሰረዝ የሚያስችሉ ስልቶችን እንዲያስጀምር ያስችለዋል።" "በመልክ መክፈት ሃርድዌርን መጠቀም" - "መተግበሪያው የመልክ መክፈቻ ሃርድዌርን ለማረጋገጥ እንዲጠቀም ያስችለዋል" + "መተግበሪያው የበመልክ መክፈት ሃርድዌርን ለማረጋገጥ እንዲጠቀም ያስችለዋል" "በመልክ መክፈት" "የእርስዎን ፊት ዳግመኛ ያስመዝግቡ" "ማንነትን ለይቶ ማወቅን ለማሻሻል፣ እባክዎ የእርስዎን ፊት ዳግም ያስመዝግቡ" diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml index 346d0522b988..f295f6d3cdbd 100644 --- a/core/res/res/values-bn/strings.xml +++ b/core/res/res/values-bn/strings.xml @@ -1413,8 +1413,7 @@ "অস্বীকার করুন" "অনুমতির অনুরোধ করা হয়েছে" "%sঅ্যাকাউন্টের জন্য\nঅনুমতির অনুরোধ করা হয়েছে৷" - - + "%2$s অ্যাকাউন্টের জন্য %1$s\n থেকে অনুমতি চাওয়া হয়েছে।" "আপনি এই অ্যাপ্লিকেশানটি আপনার কর্মস্থলের প্রোফাইলের বাইরে ব্যবহার করছেন" "আপনি এই অ্যাপ্লিকেশানটি আপনার কর্মস্থলের প্রোফাইলে ব্যবহার করছেন" "ইনপুট পদ্ধতি" diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index 1c209848e50e..bc90584dcfcd 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -597,7 +597,7 @@ "Ezin da egiaztatu aurpegia. Hardwarea ez dago erabilgarri." - "Saiatu berriro aurpegiaren bidez desblokeatzen." + "Saiatu berriro aurpegi bidez desblokeatzen." "Ezin dira gorde aurpegiaren datu berriak. Ezabatu zaharrak." "Utzi da aurpegiaren bidezko eragiketa." "Erabiltzaileak aurpegi bidez desblokeatzeko aukera utzi du" diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index b6b013c88692..b14ec6e1d39f 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -514,10 +514,10 @@ "Permet à l\'application d\'accéder à la configuration du Bluetooth sur la tablette, et d\'établir et accepter des connexions avec les appareils associés." "Permet à l\'application d\'afficher la configuration du Bluetooth sur votre appareil Android TV, de se connecter à des appareils associés et d\'accepter leur connexion." "Permet à l\'application d\'accéder à la configuration du Bluetooth sur le téléphone, et d\'établir et accepter des connexions avec les appareils associés." - "Information sur le service préféré de paiement NFC" - "Permet à l\'application d\'obtenir de l\'information sur le service préféré de paiement NFC comme les aides enregistrées et la route de destination." + "Information sur le service préféré de paiement CCP" + "Permet à l\'application d\'obtenir de l\'information sur le service préféré de paiement CCP comme les aides enregistrées et la route de destination." "gérer la communication en champ proche" - "Permet à l\'application de communiquer avec des bornes, des cartes et des lecteurs compatibles avec la technologie NFC (communication en champ proche)." + "Permet à l\'application de communiquer avec des bornes, des cartes et des lecteurs compatibles avec la technologie CCP (communication en champ proche)." "désactiver le verrouillage de l\'écran" "Permet à l\'application de désactiver le verrouillage des touches et toute mesure de sécurité par mot de passe associée. Par exemple, votre téléphone désactive le verrouillage des touches lorsque vous recevez un appel, puis le réactive lorsque vous raccrochez." "demander la complexité du verrouillage d\'écran" @@ -570,7 +570,7 @@ "gérer le matériel de déverrouillage par reconnaissance faciale" "Permet à l\'appli d\'employer des méthodes d\'aj. et de suppr. de modèles de reconn. visage." "utiliser le matériel de déverrouillage par reconnaissance faciale" - "Permet à l\'appli d\'utiliser du matériel de déverr. par reconn. faciale pour l\'authentific." + "Autorise l\'appli à utiliser le matériel de déverrouillage par reconnaissance faciale" "Déverrouillage par reconnaissance faciale" "Inscrivez votre visage à nouveau" "Pour améliorer la reconnaissance, veuillez enregistrer à nouveau votre visage" @@ -600,12 +600,12 @@ "Réessayez le déverr. par reconnaissance faciale." "Impossible de stocker de nouveaux visages. Supprimez-en un." "Opération de reconnaissance du visage annulée." - "Déverr. par reconn. faciale annulé par l\'utilisateur." + "Déverrouillage par reconnaissance faciale annulé par l\'utilisateur." "Trop de tentatives. Veuillez réessayer plus tard." - "Trop de tentatives. Le déverr. par reconnaissance faciale est désactivé." + "Trop de tentatives. Déverrouillage par reconnaissance faciale désactivé." "Impossible de vérifier le visage. Réessayez." - "Vous n\'avez pas config. le déverr. par reconn. faciale." - "Cet appar. ne prend pas en charge le déverr. par reconn. faciale." + "Déverrouillage par reconnaissance faciale non configuré." + "Déverrouillage par reconnaissance faciale non pris en charge." "Le capteur a été désactivé temporairement." "Visage %d" @@ -1442,7 +1442,7 @@ "Touchez pour quitter l\'application de conduite." "Précédent" "Suivante" - "Passer" + "Ignorer" "Aucune partie" "Rechercher sur la page" diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 96f5484bc274..948e16df33bd 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -1013,7 +1013,7 @@ "semaines" "année" "années" - "mainten." + "maintenant" %d m %d m diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index 6ab406ed0914..b79d15d224a3 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -1413,8 +1413,7 @@ "નકારો" "પરવાનગીની વિનંતી કરી" "એકાઉન્ટ %s માટે\nપરવાનગીની વિનંતી કરી." - - + "%2$s એકાઉન્ટ માટે\n%1$s દ્વારા પરવાનગીની વિનંતી કરવામાં આવી." "તમે તમારી કાર્ય પ્રોફાઇલની બહાર આ એપ્લિકેશનનો ઉપયોગ કરી રહ્યાં છો" "તમે તમારી કાર્ય પ્રોફાઇલમાં આ એપ્લિકેશનનો ઉપયોગ કરી રહ્યાં છો" "ઇનપુટ પદ્ધતિ" diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index c2f93a5a214d..7fc1de5ce292 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -1413,7 +1413,7 @@ "Уруксат берилбейт" "Уруксат талап кылуу" "Кийинки эсепке\nуруксат талап кылынууда: %s." - "%1$s колдонмосу\n %2$s аккаунтуна кирүүгө уруксат сурады." + "%1$s колдонмосу\n%2$s аккаунтуна кирүүгө уруксат сурады." "Бул колдонмо жумуш профилиңиздин сыртында колдонулуп жатат" "Бул колдонмону жумуш профилиңизде пайдаланып жатасыз" "Киргизүү ыкмасы" diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index 72e9406be244..6bd8b6a206c0 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -243,7 +243,7 @@ "Wyłącz" "Przycisk zasilania" "Uruchom ponownie" - "Nagły przypadek" + "Połączenie alarmowe" "Zgłoś błąd" "Zakończ sesję" "Zrzut ekranu" diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index 76f039f184b5..055be73b1097 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -567,10 +567,10 @@ "Ícone de impressão digital" - "gerenciar hardware de desbloqueio facial" + "gerenciar hardware de Desbloqueio facial" "Permite que o app execute métodos para adicionar e excluir modelos de rosto para uso." - "usar hardware de desbloqueio facial" - "Permite que o app use o hardware de desbloqueio facial para autenticação" + "usar hardware de Desbloqueio facial" + "Permite que o app use o hardware de Desbloqueio facial para autenticação" "Desbloqueio facial" "Registre seu rosto novamente" "Para melhorar o reconhecimento, registre seu rosto novamente" @@ -597,15 +597,15 @@ "Impossível verificar rosto. Hardware indisponível." - "Tente usar o desbloqueio facial novamente." + "Tente usar o Desbloqueio facial novamente." "Não é possível salvar dados faciais. Exclua dados antigos." "Operação facial cancelada." "Desbloqueio facial cancelado pelo usuário." "Excesso de tentativas. Tente novamente mais tarde." "Muitas tentativas. Desbloqueio facial desativado." "Não é possível verificar o rosto. Tente novamente." - "O desbloqueio facial não foi configurado." - "O desbloqueio facial não é compatível com este dispositivo." + "O Desbloqueio facial não foi configurado." + "O Desbloqueio facial não é compatível com este dispositivo." "Sensor desativado temporariamente." "Rosto %d" diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index 76f039f184b5..055be73b1097 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -567,10 +567,10 @@ "Ícone de impressão digital" - "gerenciar hardware de desbloqueio facial" + "gerenciar hardware de Desbloqueio facial" "Permite que o app execute métodos para adicionar e excluir modelos de rosto para uso." - "usar hardware de desbloqueio facial" - "Permite que o app use o hardware de desbloqueio facial para autenticação" + "usar hardware de Desbloqueio facial" + "Permite que o app use o hardware de Desbloqueio facial para autenticação" "Desbloqueio facial" "Registre seu rosto novamente" "Para melhorar o reconhecimento, registre seu rosto novamente" @@ -597,15 +597,15 @@ "Impossível verificar rosto. Hardware indisponível." - "Tente usar o desbloqueio facial novamente." + "Tente usar o Desbloqueio facial novamente." "Não é possível salvar dados faciais. Exclua dados antigos." "Operação facial cancelada." "Desbloqueio facial cancelado pelo usuário." "Excesso de tentativas. Tente novamente mais tarde." "Muitas tentativas. Desbloqueio facial desativado." "Não é possível verificar o rosto. Tente novamente." - "O desbloqueio facial não foi configurado." - "O desbloqueio facial não é compatível com este dispositivo." + "O Desbloqueio facial não foi configurado." + "O Desbloqueio facial não é compatível com este dispositivo." "Sensor desativado temporariamente." "Rosto %d" diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index 7b5b4a4cd6b7..95454aaa116e 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -26,7 +26,7 @@ "GB" "TB" "PB" - "%1$s&#160;%2$s" + "%1$sU+00A0%2$s" "<Bez mena>" "(žiadne telefónne číslo)" "Bez názvu" diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml index 8371dd35ce55..52d31c6bf034 100644 --- a/core/res/res/values-ta/strings.xml +++ b/core/res/res/values-ta/strings.xml @@ -1900,7 +1900,7 @@ "பணிக் கணக்கு பூட்டியுள்ளது" "பணிக் கணக்கை அன்லாக் செய்யத் தட்டுக" "%1$s உடன் இணைக்கப்பட்டது" - "கோப்புகளைப் பார்க்க, தட்டவும்" + "ஃபைல்களைப் பார்க்க, தட்டவும்" "பின் செய்" "%1$s ஐப் பின் செய்" "பின்னை அகற்று" diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 5e6e0cc8ee21..9c5839b1ee7c 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -1453,7 +1453,7 @@ "Забор." "Потрібен дозвіл" "Запитано дозвіл\nдля облікового запису %s." - "Дозвіл, який додаток %1$s запитує\nна доступ до облікового запису %2$s." + "Додаток %1$s запитує дозвіл\nна доступ до облікового запису %2$s." "Ви використовуєте цей додаток за межами робочого профілю" "Ви використовуєте цей додаток у своєму робочому профілі" "Метод введення" -- cgit v1.2.3 From 1aa48a9ef131223ac649ccb2d73fd8184ecde540 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Mon, 12 Jul 2021 10:58:56 +0000 Subject: Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I2db2027ef73b7ce3c5d4499c3640fd413c881719 --- core/res/res/values-zh-rTW/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 29303ba506fd..798e06c3f53c 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -318,7 +318,7 @@ "存取你的體能活動記錄" "相機" "拍照及錄製影片" - "附近的裝置" + "鄰近裝置" "探索附近的裝置並進行連線" "通話記錄" "讀取及寫入通話記錄" -- cgit v1.2.3 From 823d4651620f07a73376c2ca72f82009d44adbd7 Mon Sep 17 00:00:00 2001 From: Kalesh Singh Date: Mon, 12 Jul 2021 13:32:27 +0000 Subject: getGpuDmaBufUsageKb: Report usage in Kilobytes getGpuDmabufUsageKb currently reports the total size of dma-bufs attached by the GPU device from /sys/kernel/dmabuf/buffer//size nodes. However these sysfs nodes report the buffer size in bytes. Convert the value returned by getGpuDmaBufUsageKb to KB. Bug: 193403146 Test: Manual Change-Id: Ie17382794f7e4db34ddadf75488d8f82de435ae0 Merged-In: Ie17382794f7e4db34ddadf75488d8f82de435ae0 --- core/jni/android_os_Debug.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/jni/android_os_Debug.cpp b/core/jni/android_os_Debug.cpp index de65b894e677..41804480122c 100644 --- a/core/jni/android_os_Debug.cpp +++ b/core/jni/android_os_Debug.cpp @@ -880,7 +880,7 @@ static jlong android_os_Debug_getGpuDmaBufUsageKb(JNIEnv* env, jobject clazz) { continue; } - sizeKb += importer_info->second.size; + sizeKb += importer_info->second.size / 1024; } return sizeKb; -- cgit v1.2.3 From 3e62b8f748d39fd383eef0ef23a7d82303c4601e Mon Sep 17 00:00:00 2001 From: Nikita Ioffe Date: Sat, 10 Jul 2021 02:27:51 +0100 Subject: Fix PackageManager query API's related to rebootless APEX updates There were two bugs: 1. In case of the first update, ApexManager removed information about pre-installed version of the APEX. 2. After an update, getPackageInfo cache wasn't invalidated, which resulted in getPackageInfo returning stale information. Bug: 193085724 Test: atest ApexManagerTest Test: atest StagedInstallInternalTest Change-Id: I6df7b296cd5d83c93524178f1546855747ea6b07 --- .../java/com/android/server/pm/ApexManager.java | 15 ++++-- .../android/server/pm/PackageManagerService.java | 1 + .../src/com/android/server/pm/ApexManagerTest.java | 54 +++++++++++++++++++++- .../StagedInstallInternalTest.java | 31 +++++++++++++ 4 files changed, 94 insertions(+), 7 deletions(-) diff --git a/services/core/java/com/android/server/pm/ApexManager.java b/services/core/java/com/android/server/pm/ApexManager.java index 73dc8dc78fbf..53bf7b8aa8ae 100644 --- a/services/core/java/com/android/server/pm/ApexManager.java +++ b/services/core/java/com/android/server/pm/ApexManager.java @@ -1051,13 +1051,18 @@ public abstract class ApexManager { final ParsedPackage parsedPackage2 = packageParser.parsePackage( new File(apexInfo.modulePath), flags, /* useCaches= */ false); final PackageInfo finalApexPkg = PackageInfoWithoutStateUtils.generate( - parsedPackage, apexInfo, flags); + parsedPackage2, apexInfo, flags); // Installation was successful, time to update mAllPackagesCache synchronized (mLock) { - for (int i = 0, size = mAllPackagesCache.size(); i < size; i++) { - if (mAllPackagesCache.get(i).equals(existingApexPkg)) { - mAllPackagesCache.set(i, finalApexPkg); - break; + if (isFactory(existingApexPkg)) { + existingApexPkg.applicationInfo.flags &= ~ApplicationInfo.FLAG_INSTALLED; + mAllPackagesCache.add(finalApexPkg); + } else { + for (int i = 0, size = mAllPackagesCache.size(); i < size; i++) { + if (mAllPackagesCache.get(i).equals(existingApexPkg)) { + mAllPackagesCache.set(i, finalApexPkg); + break; + } } } } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 0a7053c896d0..af3cb5bbe0cb 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -17362,6 +17362,7 @@ public class PackageManagerService extends IPackageManager.Stub } catch (PackageManagerException e) { request.installResult.setError("APEX installation failed", e); } + invalidatePackageInfoCache(); notifyInstallObserver(request.installResult, request.args.observer); } diff --git a/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java index fb768a815624..8b8a7e631caf 100644 --- a/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java @@ -37,6 +37,7 @@ import android.apex.ApexSessionInfo; import android.apex.ApexSessionParams; import android.apex.IApexService; import android.content.Context; +import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.os.RemoteException; import android.platform.test.annotations.Presubmit; @@ -349,9 +350,9 @@ public class ApexManagerTest { } @Test - public void testInstallPackage() throws Exception { + public void testInstallPackage_activeOnSystem() throws Exception { ApexInfo activeApexInfo = createApexInfo("test.apex_rebootless", 1, /* isActive= */ true, - /* isFactory= */ false, extractResource("test.apex_rebootless_v1", + /* isFactory= */ true, extractResource("test.apex_rebootless_v1", "test.rebootless_apex_v1.apex")); when(mApexService.getAllPackages()).thenReturn(new ApexInfo[]{activeApexInfo}); mApexManager.scanApexPackagesTraced(mPackageParser2, @@ -369,6 +370,55 @@ public class ApexManagerTest { ApexManager.MATCH_ACTIVE_PACKAGE); assertThat(newInfo.applicationInfo.sourceDir).isEqualTo(finalApex.getAbsolutePath()); assertThat(newInfo.applicationInfo.longVersionCode).isEqualTo(2); + assertThat(newInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM).isEqualTo(0); + assertThat(newInfo.applicationInfo.flags & ApplicationInfo.FLAG_INSTALLED) + .isEqualTo(ApplicationInfo.FLAG_INSTALLED); + + PackageInfo factoryInfo = mApexManager.getPackageInfo("test.apex.rebootless", + ApexManager.MATCH_FACTORY_PACKAGE); + assertThat(factoryInfo.applicationInfo.sourceDir).isEqualTo(activeApexInfo.modulePath); + assertThat(factoryInfo.applicationInfo.longVersionCode).isEqualTo(1); + assertThat(factoryInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) + .isEqualTo(ApplicationInfo.FLAG_SYSTEM); + assertThat(factoryInfo.applicationInfo.flags & ApplicationInfo.FLAG_INSTALLED).isEqualTo(0); + } + + @Test + public void testInstallPackage_activeOnData() throws Exception { + ApexInfo factoryApexInfo = createApexInfo("test.apex_rebootless", 1, /* isActive= */ false, + /* isFactory= */ true, extractResource("test.apex_rebootless_v1", + "test.rebootless_apex_v1.apex")); + ApexInfo activeApexInfo = createApexInfo("test.apex_rebootless", 1, /* isActive= */ true, + /* isFactory= */ false, extractResource("test.apex.rebootless@1", + "test.rebootless_apex_v1.apex")); + when(mApexService.getAllPackages()) + .thenReturn(new ApexInfo[]{factoryApexInfo, activeApexInfo}); + mApexManager.scanApexPackagesTraced(mPackageParser2, + ParallelPackageParser.makeExecutorService()); + + File finalApex = extractResource("test.rebootles_apex_v2", "test.rebootless_apex_v2.apex"); + ApexInfo newApexInfo = createApexInfo("test.apex_rebootless", 2, /* isActive= */ true, + /* isFactory= */ false, finalApex); + when(mApexService.installAndActivatePackage(anyString())).thenReturn(newApexInfo); + + File installedApex = extractResource("installed", "test.rebootless_apex_v2.apex"); + mApexManager.installPackage(installedApex, mPackageParser2); + + PackageInfo newInfo = mApexManager.getPackageInfo("test.apex.rebootless", + ApexManager.MATCH_ACTIVE_PACKAGE); + assertThat(newInfo.applicationInfo.sourceDir).isEqualTo(finalApex.getAbsolutePath()); + assertThat(newInfo.applicationInfo.longVersionCode).isEqualTo(2); + assertThat(newInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM).isEqualTo(0); + assertThat(newInfo.applicationInfo.flags & ApplicationInfo.FLAG_INSTALLED) + .isEqualTo(ApplicationInfo.FLAG_INSTALLED); + + PackageInfo factoryInfo = mApexManager.getPackageInfo("test.apex.rebootless", + ApexManager.MATCH_FACTORY_PACKAGE); + assertThat(factoryInfo.applicationInfo.sourceDir).isEqualTo(factoryApexInfo.modulePath); + assertThat(factoryInfo.applicationInfo.longVersionCode).isEqualTo(1); + assertThat(factoryInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) + .isEqualTo(ApplicationInfo.FLAG_SYSTEM); + assertThat(factoryInfo.applicationInfo.flags & ApplicationInfo.FLAG_INSTALLED).isEqualTo(0); } @Test diff --git a/tests/StagedInstallTest/app/src/com/android/tests/stagedinstallinternal/StagedInstallInternalTest.java b/tests/StagedInstallTest/app/src/com/android/tests/stagedinstallinternal/StagedInstallInternalTest.java index d6b3c27b4b09..9cdaef75c491 100644 --- a/tests/StagedInstallTest/app/src/com/android/tests/stagedinstallinternal/StagedInstallInternalTest.java +++ b/tests/StagedInstallTest/app/src/com/android/tests/stagedinstallinternal/StagedInstallInternalTest.java @@ -212,6 +212,28 @@ public class StagedInstallInternalTest { assertThat(apex.applicationInfo.sourceDir).startsWith("/system/apex"); } + TestApp apex1 = new TestApp("TestRebootlessApexV1", "test.apex.rebootless", 1, + /* isApex= */ true, "test.rebootless_apex_v1.apex"); + Install.single(apex1).commit(); + + { + PackageInfo apex = pm.getPackageInfo("test.apex.rebootless", PackageManager.MATCH_APEX); + assertThat(apex.getLongVersionCode()).isEqualTo(1); + assertThat(apex.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM).isEqualTo(0); + assertThat(apex.applicationInfo.flags & ApplicationInfo.FLAG_INSTALLED) + .isEqualTo(ApplicationInfo.FLAG_INSTALLED); + assertThat(apex.applicationInfo.sourceDir).startsWith("/data/apex/active"); + } + { + PackageInfo apex = pm.getPackageInfo("test.apex.rebootless", + PackageManager.MATCH_APEX | PackageManager.MATCH_FACTORY_ONLY); + assertThat(apex.getLongVersionCode()).isEqualTo(1); + assertThat(apex.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) + .isEqualTo(ApplicationInfo.FLAG_SYSTEM); + assertThat(apex.applicationInfo.flags & ApplicationInfo.FLAG_INSTALLED).isEqualTo(0); + assertThat(apex.applicationInfo.sourceDir).startsWith("/system/apex"); + } + TestApp apex2 = new TestApp("TestRebootlessApexV1", "test.apex.rebootless", 2, /* isApex= */ true, "test.rebootless_apex_v2.apex"); Install.single(apex2).commit(); @@ -224,6 +246,15 @@ public class StagedInstallInternalTest { .isEqualTo(ApplicationInfo.FLAG_INSTALLED); assertThat(apex.applicationInfo.sourceDir).startsWith("/data/apex/active"); } + { + PackageInfo apex = pm.getPackageInfo("test.apex.rebootless", + PackageManager.MATCH_APEX | PackageManager.MATCH_FACTORY_ONLY); + assertThat(apex.getLongVersionCode()).isEqualTo(1); + assertThat(apex.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) + .isEqualTo(ApplicationInfo.FLAG_SYSTEM); + assertThat(apex.applicationInfo.flags & ApplicationInfo.FLAG_INSTALLED).isEqualTo(0); + assertThat(apex.applicationInfo.sourceDir).startsWith("/system/apex"); + } } private static void assertSessionFailedWithMessage(int sessionId, String msg) { -- cgit v1.2.3 From a0bd30cb78df98f03a5802d3748106d0f88e1dbc Mon Sep 17 00:00:00 2001 From: Flavio Fiszman Date: Mon, 12 Jul 2021 14:57:09 +0100 Subject: Fix configuration activity colors for accessibility Change-Id: I024e1cdf7886d5b65b8503cd4b9c3b9d7fa7e70a Test: manual Bug: 193069099 --- .../SystemUI/res/layout/people_space_activity_no_conversations.xml | 3 ++- packages/SystemUI/res/values-night/styles.xml | 6 ++++++ packages/SystemUI/res/values/styles.xml | 1 + 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/res/layout/people_space_activity_no_conversations.xml b/packages/SystemUI/res/layout/people_space_activity_no_conversations.xml index e87bf61417db..2e9ff07caed9 100644 --- a/packages/SystemUI/res/layout/people_space_activity_no_conversations.xml +++ b/packages/SystemUI/res/layout/people_space_activity_no_conversations.xml @@ -15,6 +15,7 @@ --> diff --git a/packages/SystemUI/res/values-night/styles.xml b/packages/SystemUI/res/values-night/styles.xml index e6165ee50076..461505f12ce6 100644 --- a/packages/SystemUI/res/values-night/styles.xml +++ b/packages/SystemUI/res/values-night/styles.xml @@ -42,4 +42,10 @@ ?android:attr/textColorPrimaryInverse + + diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml index 17a984e48ff1..70ed81788e58 100644 --- a/packages/SystemUI/res/values/styles.xml +++ b/packages/SystemUI/res/values/styles.xml @@ -777,6 +777,7 @@