Merge "Clean up flag fix_crash_on_getting_config_when_phone_is_gone" into main
diff --git a/apex/jobscheduler/service/java/com/android/server/job/TEST_MAPPING b/apex/jobscheduler/service/java/com/android/server/job/TEST_MAPPING
index 16c2fd4..a0bf78f 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/TEST_MAPPING
+++ b/apex/jobscheduler/service/java/com/android/server/job/TEST_MAPPING
@@ -25,10 +25,7 @@
]
},
{
- "name": "FrameworksServicesTests",
- "options": [
- {"include-filter": "com.android.server.job"}
- ]
+ "name": "FrameworksServicesTests_com_android_server_job"
},
{
"name": "CtsHostsideNetworkPolicyTests",
diff --git a/apex/jobscheduler/service/java/com/android/server/usage/TEST_MAPPING b/apex/jobscheduler/service/java/com/android/server/usage/TEST_MAPPING
index dd0d1b6..f56c14d 100644
--- a/apex/jobscheduler/service/java/com/android/server/usage/TEST_MAPPING
+++ b/apex/jobscheduler/service/java/com/android/server/usage/TEST_MAPPING
@@ -21,10 +21,7 @@
"name": "CtsUsageStatsTestCases"
},
{
- "name": "FrameworksServicesTests",
- "options": [
- {"include-filter": "com.android.server.usage"}
- ]
+ "name": "FrameworksServicesTests_com_android_server_usage"
}
]
}
diff --git a/api/Android.bp b/api/Android.bp
index 341be3d53..533f9f6 100644
--- a/api/Android.bp
+++ b/api/Android.bp
@@ -87,6 +87,7 @@
"framework-permission",
"framework-permission-s",
"framework-profiling",
+ "framework-photopicker",
"framework-scheduling",
"framework-sdkextensions",
"framework-statsd",
diff --git a/core/java/android/security/flags.aconfig b/core/java/android/security/flags.aconfig
index f6f0eff..a86c961 100644
--- a/core/java/android/security/flags.aconfig
+++ b/core/java/android/security/flags.aconfig
@@ -99,3 +99,10 @@
description: "Causes TrustManagerService to listen for credential attempts and ignore reports from upstream"
bug: "323086607"
}
+
+flag {
+ name: "clear_strong_auth_on_add_primary_credential"
+ namespace: "biometrics"
+ description: "Clear StrongAuth on add credential"
+ bug: "320817991"
+}
diff --git a/media/java/android/media/projection/OWNERS b/media/java/android/media/projection/OWNERS
index 880ec8f..2b72744 100644
--- a/media/java/android/media/projection/OWNERS
+++ b/media/java/android/media/projection/OWNERS
@@ -1,7 +1,7 @@
# Bug component: 1345447
-michaelwr@google.com
-santoscordon@google.com
-chaviw@google.com
-nmusgrave@google.com
+marvinramin@google.com
dakinola@google.com
+vaniadesmonda@google.com
+caen@google.com
+santoscordon@google.com
\ No newline at end of file
diff --git a/ravenwood/OWNERS b/ravenwood/OWNERS
index f7b13d1..8722ad9 100644
--- a/ravenwood/OWNERS
+++ b/ravenwood/OWNERS
@@ -1,5 +1,7 @@
+# Bug component: 25698
set noparent
+omakoto@google.com
topjohnwu@google.com
hackbod@google.com #{LAST_RESORT_SUGGESTION}
diff --git a/services/core/java/com/android/server/TEST_MAPPING b/services/core/java/com/android/server/TEST_MAPPING
index dd4239c..825e4fb 100644
--- a/services/core/java/com/android/server/TEST_MAPPING
+++ b/services/core/java/com/android/server/TEST_MAPPING
@@ -78,24 +78,11 @@
"file_patterns": ["StorageManagerService\\.java"]
},
{
- "name": "FrameworksServicesTests",
- "options": [
- {
- "include-filter": "com.android.server.BinaryTransparencyServiceTest"
- }
- ],
+ "name": "FrameworksServicesTests_binary_transparency",
"file_patterns": ["BinaryTransparencyService\\.java"]
},
{
- "name": "FrameworksServicesTests",
- "options": [
- {
- "include-filter": "com.android.server.PinnerServiceTest"
- },
- {
- "exclude-annotation": "org.junit.Ignore"
- }
- ],
+ "name": "FrameworksServicesTests_pinner_service",
"file_patterns": ["PinnerService\\.java"]
},
{
@@ -176,15 +163,7 @@
"name": "CtsPackageManagerTestCases"
},
{
- "name": "FrameworksServicesTests",
- "options": [
- {
- "include-filter": "com.android.server.PinnerServiceTest"
- },
- {
- "exclude-annotation": "org.junit.Ignore"
- }
- ],
+ "name": "FrameworksServicesTests_pinner_service",
"file_patterns": ["PinnerService\\.java"]
},
{
diff --git a/services/core/java/com/android/server/am/TEST_MAPPING b/services/core/java/com/android/server/am/TEST_MAPPING
index 6e8eb7d..ab5e2d0 100644
--- a/services/core/java/com/android/server/am/TEST_MAPPING
+++ b/services/core/java/com/android/server/am/TEST_MAPPING
@@ -94,12 +94,7 @@
],
"postsubmit": [
{
- "name": "FrameworksServicesTests",
- "options": [
- {
- "include-filter": "com.android.server.am."
- }
- ]
+ "name": "FrameworksServicesTests_android_server_am"
},
{
"name": "CtsAppDataIsolationHostTestCases"
diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java
index ae59d49..df768dc 100644
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
@@ -587,7 +587,8 @@
mUniqueDisplayId,
mThermalBrightnessThrottlingDataId,
logicalDisplay.getPowerThrottlingDataIdLocked(),
- mDisplayDeviceConfig), mContext, flags, mSensorManager);
+ mDisplayDeviceConfig,
+ mDisplayId), mContext, flags, mSensorManager);
// Seed the cached brightness
saveBrightnessInfo(getScreenBrightnessSetting());
mAutomaticBrightnessStrategy =
@@ -892,7 +893,8 @@
// will call updatePowerState if needed.
mBrightnessClamperController.onDisplayChanged(
new BrightnessClamperController.DisplayDeviceData(uniqueId,
- thermalBrightnessThrottlingDataId, powerThrottlingDataId, config));
+ thermalBrightnessThrottlingDataId, powerThrottlingDataId,
+ config, mDisplayId));
if (changed) {
updatePowerState();
diff --git a/services/core/java/com/android/server/display/brightness/clamper/BrightnessClamperController.java b/services/core/java/com/android/server/display/brightness/clamper/BrightnessClamperController.java
index 101ad30..2206402 100644
--- a/services/core/java/com/android/server/display/brightness/clamper/BrightnessClamperController.java
+++ b/services/core/java/com/android/server/display/brightness/clamper/BrightnessClamperController.java
@@ -23,23 +23,17 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
-import android.content.res.Resources;
-import android.hardware.Sensor;
-import android.hardware.SensorEvent;
-import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.hardware.display.BrightnessInfo;
import android.hardware.display.DisplayManagerInternal;
import android.os.Handler;
import android.os.HandlerExecutor;
import android.os.PowerManager;
-import android.os.SystemClock;
import android.provider.DeviceConfig;
import android.provider.DeviceConfigInterface;
import android.util.IndentingPrintWriter;
import android.util.Slog;
-import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;
import com.android.server.display.DisplayBrightnessState;
import com.android.server.display.DisplayDeviceConfig;
@@ -50,30 +44,22 @@
import com.android.server.display.config.SensorData;
import com.android.server.display.feature.DeviceConfigParameterProvider;
import com.android.server.display.feature.DisplayManagerFlags;
-import com.android.server.display.utils.AmbientFilter;
-import com.android.server.display.utils.AmbientFilterFactory;
-import com.android.server.display.utils.DebugUtils;
-import com.android.server.display.utils.SensorUtils;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executor;
-import java.util.concurrent.TimeUnit;
/**
* Clampers controller, all in DisplayControllerHandler
*/
public class BrightnessClamperController {
private static final String TAG = "BrightnessClamperController";
- // To enable these logs, run:
- // 'adb shell setprop persist.log.tag.BrightnessClamperController DEBUG && adb reboot'
- private static final boolean DEBUG = DebugUtils.isDebuggable(TAG);
- public static final float INVALID_LUX = -1f;
private final DeviceConfigParameterProvider mDeviceConfigParameterProvider;
private final Handler mHandler;
- private final SensorManager mSensorManager;
+ private final LightSensorController mLightSensorController;
+
private final ClamperChangeListener mClamperChangeListenerExternal;
private final Executor mExecutor;
private final List<BrightnessClamper<? super DisplayDeviceData>> mClampers;
@@ -85,70 +71,49 @@
private float mCustomAnimationRate = DisplayBrightnessState.CUSTOM_ANIMATION_RATE_NOT_SET;
@Nullable
private Type mClamperType = null;
- private final SensorEventListener mLightSensorListener;
- private Sensor mRegisteredLightSensor = null;
- private Sensor mLightSensor;
- private String mLightSensorType;
- private String mLightSensorName;
- private AmbientFilter mAmbientFilter;
- private final DisplayDeviceConfig mDisplayDeviceConfig;
- private final Resources mResources;
- private final int mLightSensorRate;
- private final Injector mInjector;
private boolean mClamperApplied = false;
+ private final LightSensorController.LightSensorListener mLightSensorListener =
+ new LightSensorController.LightSensorListener() {
+ @Override
+ public void onAmbientLuxChange(float lux) {
+ mModifiers.forEach(mModifier -> mModifier.setAmbientLux(lux));
+ }
+ };
+
public BrightnessClamperController(Handler handler,
ClamperChangeListener clamperChangeListener, DisplayDeviceData data, Context context,
DisplayManagerFlags flags, SensorManager sensorManager) {
- this(null, handler, clamperChangeListener, data, context, flags, sensorManager);
+ this(new Injector(), handler, clamperChangeListener, data, context, flags, sensorManager);
}
@VisibleForTesting
BrightnessClamperController(Injector injector, Handler handler,
ClamperChangeListener clamperChangeListener, DisplayDeviceData data, Context context,
DisplayManagerFlags flags, SensorManager sensorManager) {
- mInjector = injector == null ? new Injector() : injector;
- mDeviceConfigParameterProvider = mInjector.getDeviceConfigParameterProvider();
+ mDeviceConfigParameterProvider = injector.getDeviceConfigParameterProvider();
mHandler = handler;
- mSensorManager = sensorManager;
- mDisplayDeviceConfig = data.mDisplayDeviceConfig;
- mLightSensorListener = new SensorEventListener() {
- @Override
- public void onSensorChanged(SensorEvent event) {
- long now = SystemClock.elapsedRealtime();
- mAmbientFilter.addValue(TimeUnit.NANOSECONDS.toMillis(event.timestamp),
- event.values[0]);
- final float lux = mAmbientFilter.getEstimate(now);
- mModifiers.forEach(mModifier -> mModifier.setAmbientLux(lux));
- }
-
- @Override
- public void onAccuracyChanged(Sensor sensor, int accuracy) {
- // unused
- }
- };
+ mLightSensorController = injector.getLightSensorController(sensorManager, context,
+ mLightSensorListener, mHandler);
mClamperChangeListenerExternal = clamperChangeListener;
mExecutor = new HandlerExecutor(handler);
- mResources = context.getResources();
- mLightSensorRate = context.getResources().getInteger(
- R.integer.config_autoBrightnessLightSensorRate);
Runnable clamperChangeRunnableInternal = this::recalculateBrightnessCap;
-
ClamperChangeListener clamperChangeListenerInternal = () -> {
if (!mHandler.hasCallbacks(clamperChangeRunnableInternal)) {
mHandler.post(clamperChangeRunnableInternal);
}
};
- mClampers = mInjector.getClampers(handler, clamperChangeListenerInternal, data, flags,
+ mClampers = injector.getClampers(handler, clamperChangeListenerInternal, data, flags,
context);
- mModifiers = mInjector.getModifiers(flags, context, handler, clamperChangeListener,
- data.mDisplayDeviceConfig, mSensorManager);
+ mModifiers = injector.getModifiers(flags, context, handler, clamperChangeListener,
+ data.mDisplayDeviceConfig);
mOnPropertiesChangedListener =
properties -> mClampers.forEach(BrightnessClamper::onDeviceConfigChanged);
+ mLightSensorController.configure(data.getAmbientLightSensor(), data.getDisplayId());
start();
}
@@ -156,7 +121,9 @@
* Should be called when display changed. Forwards the call to individual clampers
*/
public void onDisplayChanged(DisplayDeviceData data) {
+ mLightSensorController.configure(data.getAmbientLightSensor(), data.getDisplayId());
mClampers.forEach(clamper -> clamper.onDisplayChanged(data));
+ adjustLightSensorSubscription();
}
/**
@@ -184,9 +151,9 @@
}
if (displayState != STATE_ON) {
- unregisterSensorListener();
+ mLightSensorController.stop();
} else {
- maybeRegisterLightSensor();
+ adjustLightSensorSubscription();
}
for (int i = 0; i < mModifiers.size(); i++) {
@@ -231,9 +198,8 @@
writer.println(" mBrightnessCap: " + mBrightnessCap);
writer.println(" mClamperType: " + mClamperType);
writer.println(" mClamperApplied: " + mClamperApplied);
- writer.println(" mLightSensor=" + mLightSensor);
- writer.println(" mRegisteredLightSensor=" + mRegisteredLightSensor);
IndentingPrintWriter ipw = new IndentingPrintWriter(writer, " ");
+ mLightSensorController.dump(ipw);
mClampers.forEach(clamper -> clamper.dump(ipw));
mModifiers.forEach(modifier -> modifier.dump(ipw));
}
@@ -245,6 +211,7 @@
public void stop() {
mDeviceConfigParameterProvider.removeOnPropertiesChangedListener(
mOnPropertiesChangedListener);
+ mLightSensorController.stop();
mClampers.forEach(BrightnessClamper::stop);
mModifiers.forEach(BrightnessStateModifier::stop);
}
@@ -281,10 +248,15 @@
if (!mClampers.isEmpty()) {
mDeviceConfigParameterProvider.addOnPropertiesChangedListener(
mExecutor, mOnPropertiesChangedListener);
- reloadLightSensorData(mDisplayDeviceConfig);
- mLightSensor = mInjector.getLightSensor(
- mSensorManager, mLightSensorType, mLightSensorName);
- maybeRegisterLightSensor();
+ }
+ adjustLightSensorSubscription();
+ }
+
+ private void adjustLightSensorSubscription() {
+ if (mModifiers.stream().anyMatch(BrightnessStateModifier::shouldListenToLightSensor)) {
+ mLightSensorController.restart();
+ } else {
+ mLightSensorController.stop();
}
}
@@ -323,7 +295,7 @@
List<BrightnessStateModifier> getModifiers(DisplayManagerFlags flags, Context context,
Handler handler, ClamperChangeListener listener,
- DisplayDeviceConfig displayDeviceConfig, SensorManager sensorManager) {
+ DisplayDeviceConfig displayDeviceConfig) {
List<BrightnessStateModifier> modifiers = new ArrayList<>();
modifiers.add(new DisplayDimModifier(context));
modifiers.add(new BrightnessLowPowerModeModifier());
@@ -335,11 +307,12 @@
return modifiers;
}
- Sensor getLightSensor(SensorManager sensorManager, String type, String name) {
- return SensorUtils.findSensor(sensorManager, type,
- name, Sensor.TYPE_LIGHT);
+ LightSensorController getLightSensorController(SensorManager sensorManager,
+ Context context, LightSensorController.LightSensorListener listener,
+ Handler handler) {
+ return new LightSensorController(sensorManager, context.getResources(),
+ listener, handler);
}
-
}
/**
@@ -354,17 +327,21 @@
private final String mThermalThrottlingDataId;
@NonNull
private final String mPowerThrottlingDataId;
-
+ @NonNull
private final DisplayDeviceConfig mDisplayDeviceConfig;
+ private final int mDisplayId;
+
public DisplayDeviceData(@NonNull String uniqueDisplayId,
@NonNull String thermalThrottlingDataId,
@NonNull String powerThrottlingDataId,
- @NonNull DisplayDeviceConfig displayDeviceConfig) {
+ @NonNull DisplayDeviceConfig displayDeviceConfig,
+ int displayId) {
mUniqueDisplayId = uniqueDisplayId;
mThermalThrottlingDataId = thermalThrottlingDataId;
mPowerThrottlingDataId = powerThrottlingDataId;
mDisplayDeviceConfig = displayDeviceConfig;
+ mDisplayId = displayId;
}
@@ -412,55 +389,18 @@
}
@NonNull
+ @Override
public SensorData getTempSensor() {
return mDisplayDeviceConfig.getTempSensor();
}
- }
- private void maybeRegisterLightSensor() {
- if (mModifiers.stream().noneMatch(BrightnessStateModifier::shouldListenToLightSensor)) {
- return;
+ @NonNull
+ SensorData getAmbientLightSensor() {
+ return mDisplayDeviceConfig.getAmbientLightSensor();
}
- if (mRegisteredLightSensor == mLightSensor) {
- return;
- }
-
- if (mRegisteredLightSensor != null) {
- unregisterSensorListener();
- }
-
- mAmbientFilter = AmbientFilterFactory.createBrightnessFilter(TAG, mResources);
- mSensorManager.registerListener(mLightSensorListener,
- mLightSensor, mLightSensorRate * 1000, mHandler);
- mRegisteredLightSensor = mLightSensor;
-
- if (DEBUG) {
- Slog.d(TAG, "maybeRegisterLightSensor");
- }
- }
-
- private void unregisterSensorListener() {
- mSensorManager.unregisterListener(mLightSensorListener);
- mRegisteredLightSensor = null;
- mModifiers.forEach(mModifier -> mModifier.setAmbientLux(INVALID_LUX)); // set lux to invalid
- if (DEBUG) {
- Slog.d(TAG, "unregisterSensorListener");
- }
- }
-
- private void reloadLightSensorData(DisplayDeviceConfig displayDeviceConfig) {
- // The displayDeviceConfig (ddc) contains display specific preferences. When loaded,
- // it naturally falls back to the global config.xml.
- if (displayDeviceConfig != null
- && displayDeviceConfig.getAmbientLightSensor() != null) {
- // This covers both the ddc and the config.xml fallback
- mLightSensorType = displayDeviceConfig.getAmbientLightSensor().type;
- mLightSensorName = displayDeviceConfig.getAmbientLightSensor().name;
- } else if (mLightSensorName == null && mLightSensorType == null) {
- mLightSensorType = mResources.getString(
- com.android.internal.R.string.config_displayLightSensorType);
- mLightSensorName = "";
+ int getDisplayId() {
+ return mDisplayId;
}
}
}
diff --git a/services/core/java/com/android/server/display/brightness/clamper/LightSensorController.java b/services/core/java/com/android/server/display/brightness/clamper/LightSensorController.java
new file mode 100644
index 0000000..d89dd28
--- /dev/null
+++ b/services/core/java/com/android/server/display/brightness/clamper/LightSensorController.java
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2024 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.display.brightness.clamper;
+
+import android.annotation.Nullable;
+import android.content.res.Resources;
+import android.hardware.Sensor;
+import android.hardware.SensorEvent;
+import android.hardware.SensorEventListener;
+import android.hardware.SensorManager;
+import android.os.Handler;
+import android.os.SystemClock;
+import android.util.Slog;
+import android.view.Display;
+
+import com.android.internal.R;
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.server.display.config.SensorData;
+import com.android.server.display.utils.AmbientFilter;
+import com.android.server.display.utils.AmbientFilterFactory;
+import com.android.server.display.utils.DebugUtils;
+import com.android.server.display.utils.SensorUtils;
+
+import java.io.PrintWriter;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Manages light sensor subscription and notifies its listener about ambient lux changes
+ */
+public class LightSensorController {
+ private static final String TAG = "LightSensorController";
+
+ // To enable these logs, run:
+ // 'adb shell setprop persist.log.tag.LightSensorController DEBUG && adb reboot'
+ private static final boolean DEBUG = DebugUtils.isDebuggable(TAG);
+ static final float INVALID_LUX = -1f;
+
+ private final SensorManager mSensorManager;
+ private final LightSensorListener mLightSensorListener;
+ private final Handler mHandler;
+ private final Injector mInjector;
+ private final AmbientFilter mAmbientFilter;
+
+ private Sensor mLightSensor;
+ private Sensor mRegisteredLightSensor = null;
+ private final int mLightSensorRate;
+
+ private final SensorEventListener mLightSensorEventListener = new SensorEventListener() {
+ @Override
+ public void onSensorChanged(SensorEvent event) {
+ long now = mInjector.getTime();
+ mAmbientFilter.addValue(TimeUnit.NANOSECONDS.toMillis(event.timestamp),
+ event.values[0]);
+ final float lux = mAmbientFilter.getEstimate(now);
+ mLightSensorListener.onAmbientLuxChange(lux);
+ }
+
+ @Override
+ public void onAccuracyChanged(Sensor sensor, int accuracy) {
+ // unused
+ }
+ };
+
+ LightSensorController(SensorManager sensorManager, Resources resources,
+ LightSensorListener listener, Handler handler) {
+ this(sensorManager, resources, listener, handler, new Injector());
+ }
+
+ @VisibleForTesting
+ LightSensorController(SensorManager sensorManager, Resources resources,
+ LightSensorListener listener, Handler handler, Injector injector) {
+ mSensorManager = sensorManager;
+ mLightSensorRate = injector.getLightSensorRate(resources);
+ mAmbientFilter = injector.getAmbientFilter(resources);
+ mLightSensorListener = listener;
+ mHandler = handler;
+ mInjector = injector;
+ }
+
+ void restart() {
+ if (mRegisteredLightSensor == mLightSensor) {
+ return;
+ }
+ if (mRegisteredLightSensor != null) {
+ stop();
+ }
+ if (mLightSensor == null) {
+ return;
+ }
+
+ mSensorManager.registerListener(mLightSensorEventListener,
+ mLightSensor, mLightSensorRate * 1000, mHandler);
+ mRegisteredLightSensor = mLightSensor;
+
+ if (DEBUG) {
+ Slog.d(TAG, "restart");
+ }
+ }
+
+ void stop() {
+ if (mRegisteredLightSensor == null) {
+ return;
+ }
+ mSensorManager.unregisterListener(mLightSensorEventListener);
+ mRegisteredLightSensor = null;
+ mAmbientFilter.clear();
+ mLightSensorListener.onAmbientLuxChange(INVALID_LUX);
+ if (DEBUG) {
+ Slog.d(TAG, "stop");
+ }
+ }
+
+ void configure(SensorData sensorData, int displayId) {
+ final int fallbackType = displayId == Display.DEFAULT_DISPLAY
+ ? Sensor.TYPE_LIGHT : SensorUtils.NO_FALLBACK;
+ mLightSensor = mInjector.getLightSensor(mSensorManager, sensorData, fallbackType);
+ }
+
+ void dump(PrintWriter writer) {
+ writer.println("LightSensorController");
+ writer.println(" mLightSensor=" + mLightSensor);
+ writer.println(" mRegisteredLightSensor=" + mRegisteredLightSensor);
+ }
+
+ static class Injector {
+ @Nullable
+ Sensor getLightSensor(SensorManager sensorManager, SensorData sensorData,
+ int fallbackType) {
+ return SensorUtils.findSensor(sensorManager, sensorData, fallbackType);
+ }
+
+ AmbientFilter getAmbientFilter(Resources resources) {
+ return AmbientFilterFactory.createBrightnessFilter(TAG, resources);
+ }
+
+ int getLightSensorRate(Resources resources) {
+ return resources.getInteger(R.integer.config_autoBrightnessLightSensorRate);
+ }
+
+ // should be consistent with SensorEvent.timestamp
+ long getTime() {
+ return SystemClock.elapsedRealtime();
+ }
+ }
+
+ interface LightSensorListener {
+ void onAmbientLuxChange(float ambientLux);
+ }
+}
diff --git a/services/core/java/com/android/server/hdmi/TEST_MAPPING b/services/core/java/com/android/server/hdmi/TEST_MAPPING
index 1c85c7f..d116087d 100644
--- a/services/core/java/com/android/server/hdmi/TEST_MAPPING
+++ b/services/core/java/com/android/server/hdmi/TEST_MAPPING
@@ -6,15 +6,7 @@
],
"postsubmit": [
{
- "name": "FrameworksServicesTests",
- "options": [
- {
- "include-filter": "com.android.server.hdmi"
- },
- {
- "exclude-annotation": "org.junit.Ignore"
- }
- ]
+ "name": "FrameworksServicesTests_android_server_hdmi"
}
],
// Postsubmit tests for TV devices
diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java
index 7d44ba1..3780fbd 100644
--- a/services/core/java/com/android/server/locksettings/LockSettingsService.java
+++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java
@@ -16,7 +16,6 @@
package com.android.server.locksettings;
-import static android.security.Flags.reportPrimaryAuthAttempts;
import static android.Manifest.permission.ACCESS_KEYGUARD_SECURE_STORAGE;
import static android.Manifest.permission.CONFIGURE_FACTORY_RESET_PROTECTION;
import static android.Manifest.permission.MANAGE_BIOMETRIC;
@@ -32,6 +31,7 @@
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.os.UserHandle.USER_ALL;
import static android.os.UserHandle.USER_SYSTEM;
+import static android.security.Flags.reportPrimaryAuthAttempts;
import static com.android.internal.widget.LockPatternUtils.CREDENTIAL_TYPE_NONE;
import static com.android.internal.widget.LockPatternUtils.CREDENTIAL_TYPE_PASSWORD_OR_PIN;
@@ -1836,6 +1836,13 @@
}
/**
+ * Set a new LSKF for the given user/profile. Only succeeds if the synthetic password for the
+ * user is protected by the given {@param savedCredential}.
+ * <p>
+ * When {@link android.security.Flags#clearStrongAuthOnAddPrimaryCredential()} is enabled and
+ * setting a new credential where there was none, updates the strong auth state for
+ * {@param userId} to <tt>STRONG_AUTH_NOT_REQUIRED</tt>.
+ *
* @param savedCredential if the user is a profile with
* {@link UserManager#isCredentialSharableWithParent()} with unified challenge and
* savedCredential is empty, LSS will try to re-derive the profile password internally.
@@ -1884,6 +1891,12 @@
onSyntheticPasswordUnlocked(userId, sp);
setLockCredentialWithSpLocked(credential, sp, userId);
+ if (android.security.Flags.clearStrongAuthOnAddPrimaryCredential()
+ && savedCredential.isNone() && !credential.isNone()) {
+ // Clear the strong auth value, since the LSKF has just been entered and set,
+ // but only when the previous credential was None.
+ mStrongAuth.reportUnlock(userId);
+ }
sendCredentialsOnChangeIfRequired(credential, userId, isLockTiedToParent);
return true;
}
diff --git a/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java b/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java
index cc58f38..3a429b0 100644
--- a/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java
+++ b/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java
@@ -1701,7 +1701,7 @@
.setGatekeeperHAT(response.getPayload()).build();
if (response.getShouldReEnroll()) {
try {
- response = gatekeeper.enroll(userId, spHandle, spHandle,
+ response = gatekeeper.enroll(userId, spHandle, gatekeeperPassword,
gatekeeperPassword);
} catch (RemoteException e) {
Slog.e(TAG, "Failed to invoke gatekeeper.enroll", e);
diff --git a/services/core/java/com/android/server/power/TEST_MAPPING b/services/core/java/com/android/server/power/TEST_MAPPING
index 4ce01d2..935a238 100644
--- a/services/core/java/com/android/server/power/TEST_MAPPING
+++ b/services/core/java/com/android/server/power/TEST_MAPPING
@@ -30,10 +30,7 @@
]
},
{
- "name": "FrameworksServicesTests",
- "options": [
- {"include-filter": "com.android.server.power"}
- ]
+ "name": "FrameworksServicesTests_android_server_power"
},
{
"name": "PowerServiceTests",
diff --git a/services/core/java/com/android/server/power/ThermalManagerService.java b/services/core/java/com/android/server/power/ThermalManagerService.java
index 6847a5c..dc6b164 100644
--- a/services/core/java/com/android/server/power/ThermalManagerService.java
+++ b/services/core/java/com/android/server/power/ThermalManagerService.java
@@ -1628,9 +1628,9 @@
long mInactivityThresholdMillis = INACTIVITY_THRESHOLD_MILLIS;
void updateThresholds() {
- synchronized (mSamples) {
- List<TemperatureThreshold> thresholds =
+ List<TemperatureThreshold> thresholds =
mHalWrapper.getTemperatureThresholds(true, Temperature.TYPE_SKIN);
+ synchronized (mSamples) {
if (Flags.allowThermalHeadroomThresholds()) {
Arrays.fill(mHeadroomThresholds, Float.NaN);
}
diff --git a/services/tests/displayservicetests/src/com/android/server/display/brightness/clamper/BrightnessClamperControllerTest.java b/services/tests/displayservicetests/src/com/android/server/display/brightness/clamper/BrightnessClamperControllerTest.java
index 69043f5..e982153 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/brightness/clamper/BrightnessClamperControllerTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/brightness/clamper/BrightnessClamperControllerTest.java
@@ -16,19 +16,19 @@
package com.android.server.display.brightness.clamper;
+import static android.view.Display.STATE_OFF;
import static android.view.Display.STATE_ON;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.clearInvocations;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.Context;
-import android.hardware.Sensor;
-import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.hardware.display.BrightnessInfo;
import android.hardware.display.DisplayManagerInternal;
@@ -40,12 +40,10 @@
import androidx.test.filters.SmallTest;
import androidx.test.platform.app.InstrumentationRegistry;
-import com.android.internal.util.test.FakeSettingsProvider;
-import com.android.internal.util.test.FakeSettingsProviderRule;
import com.android.server.display.DisplayBrightnessState;
import com.android.server.display.DisplayDeviceConfig;
-import com.android.server.display.TestUtils;
import com.android.server.display.brightness.BrightnessReason;
+import com.android.server.display.config.SensorData;
import com.android.server.display.feature.DeviceConfigParameterProvider;
import com.android.server.display.feature.DisplayManagerFlags;
import com.android.server.testutils.OffsettableClock;
@@ -63,6 +61,7 @@
@SmallTest
public class BrightnessClamperControllerTest {
private static final float FLOAT_TOLERANCE = 0.001f;
+ private static final int DISPLAY_ID = 2;
private final OffsettableClock mClock = new OffsettableClock();
private final TestHandler mTestHandler = new TestHandler(null, mClock);
@@ -78,8 +77,12 @@
@Mock
private BrightnessClamperController.DisplayDeviceData mMockDisplayDeviceData;
@Mock
+ private SensorData mMockSensorData;
+ @Mock
private DeviceConfigParameterProvider mMockDeviceConfigParameterProvider;
@Mock
+ private LightSensorController mMockLightSensorController;
+ @Mock
private BrightnessClamper<BrightnessClamperController.DisplayDeviceData> mMockClamper;
@Mock
private DisplayManagerFlags mFlags;
@@ -88,23 +91,17 @@
@Mock
private DisplayManagerInternal.DisplayPowerRequest mMockRequest;
- Sensor mLightSensor;
-
@Mock
private DeviceConfig.Properties mMockProperties;
private BrightnessClamperController mClamperController;
private TestInjector mTestInjector;
- @Rule
- public FakeSettingsProviderRule mSettingsProviderRule = FakeSettingsProvider.rule();
-
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
- mLightSensor = TestUtils.createSensor(Sensor.TYPE_LIGHT, "Light Sensor");
mTestInjector = new TestInjector(List.of(mMockClamper), List.of(mMockModifier));
- when(mSensorManager.getDefaultSensor(anyInt())).thenReturn(mLightSensor);
- when(mMockModifier.shouldListenToLightSensor()).thenReturn(true);
+ when(mMockDisplayDeviceData.getDisplayId()).thenReturn(DISPLAY_ID);
+ when(mMockDisplayDeviceData.getAmbientLightSensor()).thenReturn(mMockSensorData);
mClamperController = createBrightnessClamperController();
}
@@ -115,6 +112,25 @@
}
@Test
+ public void testConstructor_ConfiguresLightSensorController() {
+ verify(mMockLightSensorController).configure(mMockSensorData, DISPLAY_ID);
+ }
+
+ @Test
+ public void testConstructor_doesNotStartsLightSensorController() {
+ verify(mMockLightSensorController, never()).restart();
+ }
+
+ @Test
+ public void testConstructor_startsLightSensorController() {
+ when(mMockModifier.shouldListenToLightSensor()).thenReturn(true);
+
+ mClamperController = createBrightnessClamperController();
+
+ verify(mMockLightSensorController).restart();
+ }
+
+ @Test
public void testStop_RemovesOnPropertiesChangeListener() {
ArgumentCaptor<DeviceConfig.OnPropertiesChangedListener> captor = ArgumentCaptor.forClass(
DeviceConfig.OnPropertiesChangedListener.class);
@@ -152,6 +168,21 @@
}
@Test
+ public void testOnDisplayChanged_doesNotRestartLightSensor() {
+ mClamperController.onDisplayChanged(mMockDisplayDeviceData);
+
+ verify(mMockLightSensorController, never()).restart();
+ }
+
+ @Test
+ public void testOnDisplayChanged_restartsLightSensor() {
+ when(mMockModifier.shouldListenToLightSensor()).thenReturn(true);
+ mClamperController.onDisplayChanged(mMockDisplayDeviceData);
+
+ verify(mMockLightSensorController).restart();
+ }
+
+ @Test
public void testClamp_AppliesModifier() {
float initialBrightness = 0.2f;
boolean initialSlowChange = true;
@@ -161,6 +192,26 @@
}
@Test
+ public void testClamp_restartsLightSensor() {
+ float initialBrightness = 0.2f;
+ boolean initialSlowChange = true;
+ when(mMockModifier.shouldListenToLightSensor()).thenReturn(true);
+ mClamperController.clamp(mMockRequest, initialBrightness, initialSlowChange, STATE_ON);
+
+ verify(mMockLightSensorController).restart();
+ }
+
+ @Test
+ public void testClamp_stopsLightSensor() {
+ float initialBrightness = 0.2f;
+ boolean initialSlowChange = true;
+ clearInvocations(mMockLightSensorController);
+ mClamperController.clamp(mMockRequest, initialBrightness, initialSlowChange, STATE_OFF);
+
+ verify(mMockLightSensorController).stop();
+ }
+
+ @Test
public void testClamp_inactiveClamperNotApplied() {
float initialBrightness = 0.8f;
boolean initialSlowChange = true;
@@ -260,33 +311,17 @@
}
@Test
- public void testAmbientLuxChanges() throws Exception {
- ArgumentCaptor<SensorEventListener> listenerCaptor = ArgumentCaptor.forClass(
- SensorEventListener.class);
+ public void testAmbientLuxChanges() {
+ mTestInjector.mCapturedLightSensorListener.onAmbientLuxChange(50);
- verify(mSensorManager).registerListener(listenerCaptor.capture(), eq(mLightSensor),
- anyInt(), any(Handler.class));
- SensorEventListener listener = listenerCaptor.getValue();
-
- when(mSensorManager.getSensorList(eq(Sensor.TYPE_ALL))).thenReturn(List.of(mLightSensor));
-
- float initialBrightness = 0.8f;
- boolean initialSlowChange = true;
-
- DisplayBrightnessState state = mClamperController.clamp(mMockRequest, initialBrightness,
- initialSlowChange, STATE_ON);
- assertEquals(initialBrightness, state.getBrightness(), FLOAT_TOLERANCE);
-
- listener.onSensorChanged(TestUtils.createSensorEvent(mLightSensor, 50, mClock.now()));
verify(mMockModifier).setAmbientLux(50);
-
- listener.onSensorChanged(TestUtils.createSensorEvent(mLightSensor, 300, mClock.now()));
- verify(mMockModifier).setAmbientLux(300);
}
@Test
public void testStop() {
+ clearInvocations(mMockLightSensorController);
mClamperController.stop();
+ verify(mMockLightSensorController).stop();
verify(mMockModifier).stop();
verify(mMockClamper).stop();
}
@@ -303,6 +338,7 @@
private final List<BrightnessStateModifier> mModifiers;
private BrightnessClamperController.ClamperChangeListener mCapturedChangeListener;
+ private LightSensorController.LightSensorListener mCapturedLightSensorListener;
private TestInjector(
List<BrightnessClamper<? super BrightnessClamperController.DisplayDeviceData>>
@@ -330,8 +366,15 @@
@Override
List<BrightnessStateModifier> getModifiers(DisplayManagerFlags flags, Context context,
Handler handler, BrightnessClamperController.ClamperChangeListener listener,
- DisplayDeviceConfig displayDeviceConfig, SensorManager sensorManager) {
+ DisplayDeviceConfig displayDeviceConfig) {
return mModifiers;
}
+
+ @Override
+ LightSensorController getLightSensorController(SensorManager sensorManager, Context context,
+ LightSensorController.LightSensorListener listener, Handler handler) {
+ mCapturedLightSensorListener = listener;
+ return mMockLightSensorController;
+ }
}
}
diff --git a/services/tests/displayservicetests/src/com/android/server/display/brightness/clamper/LightSensorControllerTest.kt b/services/tests/displayservicetests/src/com/android/server/display/brightness/clamper/LightSensorControllerTest.kt
new file mode 100644
index 0000000..b742d02
--- /dev/null
+++ b/services/tests/displayservicetests/src/com/android/server/display/brightness/clamper/LightSensorControllerTest.kt
@@ -0,0 +1,168 @@
+/*
+ * Copyright (C) 2023 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.display.brightness.clamper
+
+import android.content.res.Resources
+import android.hardware.Sensor
+import android.hardware.SensorEventListener
+import android.hardware.SensorManager
+import android.os.Handler
+import androidx.test.filters.SmallTest
+import com.android.server.display.TestUtils
+import com.android.server.display.brightness.clamper.LightSensorController.Injector
+import com.android.server.display.brightness.clamper.LightSensorController.LightSensorListener
+import com.android.server.display.config.SensorData
+import com.android.server.display.utils.AmbientFilter
+import org.junit.Before
+import org.mockito.kotlin.any
+import org.mockito.kotlin.argumentCaptor
+import org.mockito.kotlin.eq
+import org.mockito.kotlin.inOrder
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.verify
+import org.mockito.kotlin.verifyNoMoreInteractions
+import org.mockito.kotlin.whenever
+
+private const val LIGHT_SENSOR_RATE: Int = 10
+private const val DISPLAY_ID: Int = 3
+private const val NOW: Long = 3_000
+
+@SmallTest
+class LightSensorControllerTest {
+
+ private val mockSensorManager: SensorManager = mock()
+ private val mockResources: Resources = mock()
+ private val mockLightSensorListener: LightSensorListener = mock()
+ private val mockHandler: Handler = mock()
+ private val mockAmbientFilter: AmbientFilter = mock()
+
+ private val testInjector = TestInjector()
+ private val dummySensorData = SensorData()
+
+ private lateinit var controller: LightSensorController
+
+ @Before
+ fun setUp() {
+ controller = LightSensorController(mockSensorManager, mockResources,
+ mockLightSensorListener, mockHandler, testInjector)
+ }
+
+ fun `does not register light sensor if is not configured`() {
+ controller.restart()
+
+ verifyNoMoreInteractions(mockSensorManager, mockAmbientFilter, mockLightSensorListener)
+ }
+
+ fun `does not register light sensor if missing`() {
+ controller.configure(dummySensorData, DISPLAY_ID)
+ controller.restart()
+
+ verifyNoMoreInteractions(mockSensorManager, mockAmbientFilter, mockLightSensorListener)
+ }
+
+ fun `register light sensor if configured and present`() {
+ testInjector.lightSensor = TestUtils
+ .createSensor(Sensor.TYPE_LIGHT, Sensor.STRING_TYPE_LIGHT)
+ controller.configure(dummySensorData, DISPLAY_ID)
+ controller.restart()
+
+ verify(mockSensorManager).registerListener(any(),
+ testInjector.lightSensor, LIGHT_SENSOR_RATE * 1000, mockHandler)
+ verifyNoMoreInteractions(mockSensorManager, mockAmbientFilter, mockLightSensorListener)
+ }
+
+ fun `register light sensor once if not changed`() {
+ testInjector.lightSensor = TestUtils
+ .createSensor(Sensor.TYPE_LIGHT, Sensor.STRING_TYPE_LIGHT)
+ controller.configure(dummySensorData, DISPLAY_ID)
+
+ controller.restart()
+ controller.restart()
+
+ verify(mockSensorManager).registerListener(any(),
+ testInjector.lightSensor, LIGHT_SENSOR_RATE * 1000, mockHandler)
+ verifyNoMoreInteractions(mockSensorManager, mockAmbientFilter, mockLightSensorListener)
+ }
+
+ fun `register new light sensor and unregister old if changed`() {
+ val lightSensor1 = TestUtils
+ .createSensor(Sensor.TYPE_LIGHT, Sensor.STRING_TYPE_LIGHT)
+ testInjector.lightSensor = lightSensor1
+ controller.configure(dummySensorData, DISPLAY_ID)
+ controller.restart()
+
+ val lightSensor2 = TestUtils
+ .createSensor(Sensor.TYPE_LIGHT, Sensor.STRING_TYPE_LIGHT)
+ testInjector.lightSensor = lightSensor2
+ controller.configure(dummySensorData, DISPLAY_ID)
+ controller.restart()
+
+ inOrder {
+ verify(mockSensorManager).registerListener(any(),
+ lightSensor1, LIGHT_SENSOR_RATE * 1000, mockHandler)
+ verify(mockSensorManager).unregisterListener(any<SensorEventListener>())
+ verify(mockAmbientFilter).clear()
+ verify(mockLightSensorListener).onAmbientLuxChange(LightSensorController.INVALID_LUX)
+ verify(mockSensorManager).registerListener(any(),
+ lightSensor2, LIGHT_SENSOR_RATE * 1000, mockHandler)
+ }
+ verifyNoMoreInteractions(mockSensorManager, mockAmbientFilter, mockLightSensorListener)
+ }
+
+ fun `notifies listener on ambient lux change`() {
+ val expectedLux = 40f
+ val eventLux = 50
+ val eventTime = 60L
+ whenever(mockAmbientFilter.getEstimate(NOW)).thenReturn(expectedLux)
+ val listenerCaptor = argumentCaptor<SensorEventListener>()
+ testInjector.lightSensor = TestUtils
+ .createSensor(Sensor.TYPE_LIGHT, Sensor.STRING_TYPE_LIGHT)
+ controller.configure(dummySensorData, DISPLAY_ID)
+ controller.restart()
+ verify(mockSensorManager).registerListener(listenerCaptor.capture(),
+ eq(testInjector.lightSensor), eq(LIGHT_SENSOR_RATE * 1000), eq(mockHandler))
+
+ val listener = listenerCaptor.lastValue
+ listener.onSensorChanged(TestUtils.createSensorEvent(testInjector.lightSensor,
+ eventLux, eventTime * 1_000_000))
+
+ inOrder {
+ verify(mockAmbientFilter).addValue(eventTime, eventLux.toFloat())
+ verify(mockLightSensorListener).onAmbientLuxChange(expectedLux)
+ }
+ }
+
+ private inner class TestInjector : Injector() {
+ var lightSensor: Sensor? = null
+ override fun getLightSensor(sensorManager: SensorManager?,
+ sensorData: SensorData?, fallbackType: Int): Sensor? {
+ return lightSensor
+ }
+
+ override fun getLightSensorRate(resources: Resources?): Int {
+ return LIGHT_SENSOR_RATE
+ }
+
+ override fun getAmbientFilter(resources: Resources?): AmbientFilter {
+ return mockAmbientFilter
+ }
+
+ override fun getTime(): Long {
+ return NOW
+ }
+ }
+}
\ No newline at end of file
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/BaseLockSettingsServiceTests.java b/services/tests/servicestests/src/com/android/server/locksettings/BaseLockSettingsServiceTests.java
index 2ba3969..87c9db2 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/BaseLockSettingsServiceTests.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/BaseLockSettingsServiceTests.java
@@ -92,6 +92,7 @@
MockLockSettingsContext mContext;
LockSettingsStorageTestable mStorage;
+ LockSettingsStrongAuth mStrongAuth;
Resources mResources;
FakeGateKeeperService mGateKeeperService;
@@ -135,6 +136,7 @@
mFingerprintManager = mock(FingerprintManager.class);
mFaceManager = mock(FaceManager.class);
mPackageManager = mock(PackageManager.class);
+ mStrongAuth = mock(LockSettingsStrongAuth.class);
LocalServices.removeServiceForTest(LockSettingsInternal.class);
LocalServices.removeServiceForTest(DevicePolicyManagerInternal.class);
@@ -162,7 +164,7 @@
mInjector =
new LockSettingsServiceTestable.MockInjector(
mContext,
- mStorage,
+ mStorage, mStrongAuth,
mActivityManager,
setUpStorageManagerMock(),
mSpManager,
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTestable.java b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTestable.java
index 93fc071a..abd39b0 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTestable.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTestable.java
@@ -50,6 +50,7 @@
public static class MockInjector extends LockSettingsService.Injector {
private LockSettingsStorage mLockSettingsStorage;
+ private final LockSettingsStrongAuth mStrongAuth;
private IActivityManager mActivityManager;
private IStorageManager mStorageManager;
private SyntheticPasswordManager mSpManager;
@@ -62,12 +63,14 @@
public boolean mIsMainUserPermanentAdmin = false;
public MockInjector(Context context, LockSettingsStorage storage,
+ LockSettingsStrongAuth strongAuth,
IActivityManager activityManager, IStorageManager storageManager,
SyntheticPasswordManager spManager, FakeGsiService gsiService,
RecoverableKeyStoreManager recoverableKeyStoreManager,
UserManagerInternal userManagerInternal, DeviceStateCache deviceStateCache) {
super(context);
mLockSettingsStorage = storage;
+ mStrongAuth = strongAuth;
mActivityManager = activityManager;
mStorageManager = storageManager;
mSpManager = spManager;
@@ -89,7 +92,7 @@
@Override
public LockSettingsStrongAuth getStrongAuth() {
- return mock(LockSettingsStrongAuth.class);
+ return mStrongAuth;
}
@Override
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTests.java b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTests.java
index 601a016..2868e55 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTests.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTests.java
@@ -17,6 +17,7 @@
package com.android.server.locksettings;
import static android.Manifest.permission.CONFIGURE_FACTORY_RESET_PROTECTION;
+import static android.security.Flags.FLAG_CLEAR_STRONG_AUTH_ON_ADD_PRIMARY_CREDENTIAL;
import static android.security.Flags.FLAG_REPORT_PRIMARY_AUTH_ATTEMPTS;
import static com.android.internal.widget.LockPatternUtils.CREDENTIAL_TYPE_NONE;
@@ -46,6 +47,10 @@
import android.platform.test.annotations.DisableFlags;
import android.platform.test.annotations.EnableFlags;
import android.platform.test.annotations.Presubmit;
+import android.platform.test.annotations.RequiresFlagsDisabled;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
import android.platform.test.flag.junit.SetFlagsRule;
import android.service.gatekeeper.GateKeeperResponse;
import android.text.TextUtils;
@@ -71,6 +76,8 @@
@RunWith(AndroidJUnit4.class)
public class LockSettingsServiceTests extends BaseLockSettingsServiceTests {
@Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+ @Rule
+ public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
@Before
public void setUp() {
@@ -258,6 +265,34 @@
}
@Test
+ @RequiresFlagsEnabled(FLAG_CLEAR_STRONG_AUTH_ON_ADD_PRIMARY_CREDENTIAL)
+ public void setLockCredential_forPrimaryUser_clearsStrongAuthWhenFlagIsOn()
+ throws Exception {
+ setCredential(PRIMARY_USER_ID, newPassword("password"));
+
+ verify(mStrongAuth).reportUnlock(PRIMARY_USER_ID);
+ }
+
+ @Test
+ @RequiresFlagsDisabled(FLAG_CLEAR_STRONG_AUTH_ON_ADD_PRIMARY_CREDENTIAL)
+ public void setLockCredential_forPrimaryUser_leavesStrongAuthWhenFlagIsOff()
+ throws Exception {
+ setCredential(PRIMARY_USER_ID, newPassword("password"));
+
+ verify(mStrongAuth, never()).reportUnlock(anyInt());
+ }
+
+ @Test
+ public void setLockCredential_forPrimaryUserWithCredential_leavesStrongAuth() throws Exception {
+ setCredential(PRIMARY_USER_ID, newPassword("password"));
+ reset(mStrongAuth);
+
+ setCredential(PRIMARY_USER_ID, newPassword("password2"), newPassword("password"));
+
+ verify(mStrongAuth, never()).reportUnlock(anyInt());
+ }
+
+ @Test
public void testSetLockCredential_forProfileWithSeparateChallenge_sendsCredentials()
throws Exception {
setCredential(MANAGED_PROFILE_USER_ID, newPattern("12345"));
@@ -278,6 +313,28 @@
}
@Test
+ @RequiresFlagsEnabled(FLAG_CLEAR_STRONG_AUTH_ON_ADD_PRIMARY_CREDENTIAL)
+ public void setLockCredential_profileWithNewSeparateChallenge_clearsStrongAuthWhenFlagIsOn()
+ throws Exception {
+ mService.setSeparateProfileChallengeEnabled(MANAGED_PROFILE_USER_ID, true, null);
+
+ setCredential(MANAGED_PROFILE_USER_ID, newPattern("12345"));
+
+ verify(mStrongAuth).reportUnlock(MANAGED_PROFILE_USER_ID);
+ }
+
+ @Test
+ @RequiresFlagsDisabled(FLAG_CLEAR_STRONG_AUTH_ON_ADD_PRIMARY_CREDENTIAL)
+ public void setLockCredential_profileWithNewSeparateChallenge_leavesStrongAuthWhenFlagIsOff()
+ throws Exception {
+ mService.setSeparateProfileChallengeEnabled(MANAGED_PROFILE_USER_ID, true, null);
+
+ setCredential(MANAGED_PROFILE_USER_ID, newPattern("12345"));
+
+ verify(mStrongAuth, never()).reportUnlock(anyInt());
+ }
+
+ @Test
public void testSetLockCredential_forProfileWithUnifiedChallenge_doesNotSendRandomCredential()
throws Exception {
mService.setSeparateProfileChallengeEnabled(MANAGED_PROFILE_USER_ID, false, null);
@@ -305,6 +362,67 @@
MANAGED_PROFILE_USER_ID);
}
+
+ @Test
+ public void setLockCredential_primaryWithUnifiedProfileAndCredential_leavesStrongAuthForBoth()
+ throws Exception {
+ final LockscreenCredential oldCredential = newPassword("oldPassword");
+ final LockscreenCredential newCredential = newPassword("newPassword");
+ setCredential(PRIMARY_USER_ID, oldCredential);
+ mService.setSeparateProfileChallengeEnabled(MANAGED_PROFILE_USER_ID, false, null);
+ reset(mStrongAuth);
+
+ setCredential(PRIMARY_USER_ID, newCredential, oldCredential);
+
+ verify(mStrongAuth, never()).reportUnlock(anyInt());
+ }
+
+ @Test
+ @RequiresFlagsEnabled(FLAG_CLEAR_STRONG_AUTH_ON_ADD_PRIMARY_CREDENTIAL)
+ public void setLockCredential_primaryWithUnifiedProfile_clearsStrongAuthForBothWhenFlagIsOn()
+ throws Exception {
+ final LockscreenCredential credential = newPassword("oldPassword");
+ setCredential(PRIMARY_USER_ID, credential);
+ mService.setSeparateProfileChallengeEnabled(MANAGED_PROFILE_USER_ID, false, null);
+ clearCredential(PRIMARY_USER_ID, credential);
+ reset(mStrongAuth);
+
+ setCredential(PRIMARY_USER_ID, credential);
+
+ verify(mStrongAuth).reportUnlock(PRIMARY_USER_ID);
+ verify(mStrongAuth).reportUnlock(MANAGED_PROFILE_USER_ID);
+ }
+
+ @Test
+ @RequiresFlagsDisabled(FLAG_CLEAR_STRONG_AUTH_ON_ADD_PRIMARY_CREDENTIAL)
+ public void setLockCredential_primaryWithUnifiedProfile_leavesStrongAuthForBothWhenFlagIsOff()
+ throws Exception {
+ final LockscreenCredential credential = newPassword("oldPassword");
+ setCredential(PRIMARY_USER_ID, credential);
+ mService.setSeparateProfileChallengeEnabled(MANAGED_PROFILE_USER_ID, false, null);
+ clearCredential(PRIMARY_USER_ID, credential);
+ reset(mStrongAuth);
+
+ setCredential(PRIMARY_USER_ID, credential);
+
+ verify(mStrongAuth, never()).reportUnlock(anyInt());
+ }
+
+
+ @Test
+ public void setLockCredential_primaryWithUnifiedProfileWithCredential_leavesStrongAuthForBoth()
+ throws Exception {
+ final LockscreenCredential oldCredential = newPassword("oldPassword");
+ final LockscreenCredential newCredential = newPassword("newPassword");
+ setCredential(PRIMARY_USER_ID, oldCredential);
+ mService.setSeparateProfileChallengeEnabled(MANAGED_PROFILE_USER_ID, false, null);
+ reset(mStrongAuth);
+
+ setCredential(PRIMARY_USER_ID, newCredential, oldCredential);
+
+ verify(mStrongAuth, never()).reportUnlock(anyInt());
+ }
+
@Test
public void
testSetLockCredential_forPrimaryUserWithUnifiedChallengeProfile_removesBothCredentials()
@@ -343,6 +461,18 @@
}
@Test
+ public void clearLockCredential_primaryWithUnifiedProfile_leavesStrongAuthForBoth()
+ throws Exception {
+ setCredential(PRIMARY_USER_ID, newPassword("password"));
+ mService.setSeparateProfileChallengeEnabled(MANAGED_PROFILE_USER_ID, false, null);
+ reset(mStrongAuth);
+
+ clearCredential(PRIMARY_USER_ID, newPassword("password"));
+
+ verify(mStrongAuth, never()).reportUnlock(anyInt());
+ }
+
+ @Test
public void testSetLockCredential_forUnifiedToSeparateChallengeProfile_sendsNewCredentials()
throws Exception {
final LockscreenCredential parentPassword = newPassword("parentPassword");
diff --git a/services/tests/servicestests/test-apps/DisplayManagerTestApp/OWNERS b/services/tests/servicestests/test-apps/DisplayManagerTestApp/OWNERS
new file mode 100644
index 0000000..e9557f8
--- /dev/null
+++ b/services/tests/servicestests/test-apps/DisplayManagerTestApp/OWNERS
@@ -0,0 +1,3 @@
+# Bug component: 345010
+
+include /services/core/java/com/android/server/display/OWNERS