diff options
5 files changed, 126 insertions, 0 deletions
diff --git a/AconfigFlags.bp b/AconfigFlags.bp index edd9d3af5926..ce311d01cd58 100644 --- a/AconfigFlags.bp +++ b/AconfigFlags.bp @@ -73,6 +73,7 @@ aconfig_srcjars = [ ":android.provider.flags-aconfig-java{.generated_srcjars}", ":android.chre.flags-aconfig-java{.generated_srcjars}", ":android.speech.flags-aconfig-java{.generated_srcjars}", + ":power_flags_lib{.generated_srcjars}", ] filegroup { @@ -932,3 +933,10 @@ java_aconfig_library { aconfig_declarations: "android.speech.flags-aconfig", defaults: ["framework-minus-apex-aconfig-java-defaults"], } + +// Power +java_aconfig_library { + name: "power_flags_lib", + aconfig_declarations: "power_flags", + defaults: ["framework-minus-apex-aconfig-java-defaults"], +} diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index 2128c991c273..e2269535d931 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -139,6 +139,7 @@ import com.android.server.power.batterysaver.BatterySaverController; import com.android.server.power.batterysaver.BatterySaverPolicy; import com.android.server.power.batterysaver.BatterySaverStateMachine; import com.android.server.power.batterysaver.BatterySavingStats; +import com.android.server.power.feature.PowerManagerFlags; import dalvik.annotation.optimization.NeverCompile; @@ -329,6 +330,8 @@ public final class PowerManagerService extends SystemService // True if battery saver is supported on this device. private final boolean mBatterySaverSupported; + private final PowerManagerFlags mFeatureFlags; + private boolean mDisableScreenWakeLocksWhileCached; private LightsManager mLightsManager; @@ -1079,6 +1082,10 @@ public final class PowerManagerService extends SystemService DeviceConfigParameterProvider createDeviceConfigParameterProvider() { return new DeviceConfigParameterProvider(DeviceConfigInterface.REAL); } + + PowerManagerFlags getFlags() { + return new PowerManagerFlags(); + } } /** Interface for checking an app op permission */ @@ -1145,6 +1152,7 @@ public final class PowerManagerService extends SystemService mNativeWrapper = injector.createNativeWrapper(); mSystemProperties = injector.createSystemPropertiesWrapper(); mClock = injector.createClock(); + mFeatureFlags = injector.getFlags(); mInjector = injector; mHandlerThread = new ServiceThread(TAG, @@ -4802,6 +4810,7 @@ public final class PowerManagerService extends SystemService mAmbientDisplaySuppressionController.dump(pw); mLowPowerStandbyController.dump(pw); + mFeatureFlags.dump(pw); } private void dumpProto(FileDescriptor fd) { diff --git a/services/core/java/com/android/server/power/feature/Android.bp b/services/core/java/com/android/server/power/feature/Android.bp new file mode 100644 index 000000000000..2295b41009de --- /dev/null +++ b/services/core/java/com/android/server/power/feature/Android.bp @@ -0,0 +1,7 @@ +aconfig_declarations { + name: "power_flags", + package: "com.android.server.power.feature.flags", + srcs: [ + "*.aconfig", + ], +} diff --git a/services/core/java/com/android/server/power/feature/PowerManagerFlags.java b/services/core/java/com/android/server/power/feature/PowerManagerFlags.java new file mode 100644 index 000000000000..a5a7069b6ea1 --- /dev/null +++ b/services/core/java/com/android/server/power/feature/PowerManagerFlags.java @@ -0,0 +1,91 @@ +/* + * 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.power.feature; + +import android.text.TextUtils; +import android.util.Slog; + +import com.android.server.power.feature.flags.Flags; + +import java.io.PrintWriter; +import java.util.function.Supplier; + +/** + * Utility class to read the flags used in the power manager server. + */ +public class PowerManagerFlags { + private static final boolean DEBUG = false; + private static final String TAG = "PowerManagerFlags"; + + private final FlagState mEarlyScreenTimeoutDetectorFlagState = new FlagState( + Flags.FLAG_ENABLE_EARLY_SCREEN_TIMEOUT_DETECTOR, + Flags::enableEarlyScreenTimeoutDetector); + + /** Returns whether early-screen-timeout-detector is enabled on not. */ + public boolean isEarlyScreenTimeoutDetectorEnabled() { + return mEarlyScreenTimeoutDetectorFlagState.isEnabled(); + } + + /** + * dumps all flagstates + * @param pw printWriter + */ + public void dump(PrintWriter pw) { + pw.println("PowerManagerFlags:"); + pw.println(" " + mEarlyScreenTimeoutDetectorFlagState); + } + + private static class FlagState { + + private final String mName; + + private final Supplier<Boolean> mFlagFunction; + private boolean mEnabledSet; + private boolean mEnabled; + + private FlagState(String name, Supplier<Boolean> flagFunction) { + mName = name; + mFlagFunction = flagFunction; + } + + private boolean isEnabled() { + if (mEnabledSet) { + if (DEBUG) { + Slog.d(TAG, mName + ": mEnabled. Recall = " + mEnabled); + } + return mEnabled; + } + mEnabled = mFlagFunction.get(); + if (DEBUG) { + Slog.d(TAG, mName + ": mEnabled. Flag value = " + mEnabled); + } + mEnabledSet = true; + return mEnabled; + } + + @Override + public String toString() { + // remove com.android.server.power.feature.flags. from the beginning of the name. + // align all isEnabled() values. + // Adjust lengths if we end up with longer names + final int nameLength = mName.length(); + return TextUtils.substring(mName, 39, nameLength) + ": " + + TextUtils.formatSimple("%" + (91 - nameLength) + "s%s", " " , isEnabled()) + + " (def:" + mFlagFunction.get() + ")"; + } + } +} diff --git a/services/core/java/com/android/server/power/feature/power_flags.aconfig b/services/core/java/com/android/server/power/feature/power_flags.aconfig new file mode 100644 index 000000000000..c8c16db15e0e --- /dev/null +++ b/services/core/java/com/android/server/power/feature/power_flags.aconfig @@ -0,0 +1,11 @@ +package: "com.android.server.power.feature.flags" + +# Important: Flags must be accessed through PowerManagerFlags. + +flag { + name: "enable_early_screen_timeout_detector" + namespace: "power_manager" + description: "Feature flag for Early Screen Timeout detector" + bug: "309861917" + is_fixed_read_only: true +} |