diff options
5 files changed, 50 insertions, 0 deletions
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 6f468e03e0b7..a2aa4929475a 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -4421,4 +4421,8 @@ <!-- The max scale for the wallpaper when it's zoomed in --> <item name="config_wallpaperMaxScale" format="float" type="dimen">1</item> + + <!-- Package name that will receive an explicit manifest broadcast for + android.os.action.POWER_SAVE_MODE_CHANGED. --> + <string name="config_powerSaveModeChangedListenerPackage" translatable="false"></string> </resources> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index a9008d78e19a..e99d395a20ac 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -3615,6 +3615,7 @@ <java-symbol type="bool" name="config_batterySaverStickyBehaviourDisabled" /> <java-symbol type="integer" name="config_dynamicPowerSavingsDefaultDisableThreshold" /> <java-symbol type="string" name="config_batterySaverScheduleProvider" /> + <java-symbol type="string" name="config_powerSaveModeChangedListenerPackage" /> <!-- For car devices --> <java-symbol type="string" name="car_loading_profile" /> diff --git a/services/core/java/android/content/pm/PackageManagerInternal.java b/services/core/java/android/content/pm/PackageManagerInternal.java index dadcd4e03f89..9fddafbe023b 100644 --- a/services/core/java/android/content/pm/PackageManagerInternal.java +++ b/services/core/java/android/content/pm/PackageManagerInternal.java @@ -991,4 +991,9 @@ public abstract class PackageManagerInternal { * @param enabled true if visibility blocks should be logged */ public abstract void setVisibilityLogging(String packageName, boolean enabled); + + /** + * Returns if a package name is a valid system package. + */ + public abstract boolean isSystemPackage(@NonNull String packageName); } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 799ce65669db..183927e8b0f9 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -24173,6 +24173,12 @@ public class PackageManagerService extends IPackageManager.Stub } mAppsFilter.getFeatureConfig().enableLogging(pkg.appId, enable); } + + @Override + public boolean isSystemPackage(@NonNull String packageName) { + return packageName.equals( + PackageManagerService.this.ensureSystemPackageName(packageName)); + } } @GuardedBy("mLock") diff --git a/services/core/java/com/android/server/power/batterysaver/BatterySaverController.java b/services/core/java/com/android/server/power/batterysaver/BatterySaverController.java index beba106ca0a6..8b6e9a46ca91 100644 --- a/services/core/java/com/android/server/power/batterysaver/BatterySaverController.java +++ b/services/core/java/com/android/server/power/batterysaver/BatterySaverController.java @@ -16,11 +16,13 @@ package com.android.server.power.batterysaver; import android.Manifest; +import android.annotation.Nullable; import android.app.ActivityManagerInternal; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.pm.PackageManagerInternal; import android.hardware.power.V1_0.PowerHint; import android.os.BatteryManager; import android.os.BatterySaverPolicyConfig; @@ -35,6 +37,7 @@ import android.os.UserHandle; import android.util.ArrayMap; import android.util.Slog; +import com.android.internal.R; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ArrayUtils; @@ -49,6 +52,7 @@ import com.android.server.power.batterysaver.BatterySavingStats.InteractiveState import java.util.ArrayList; import java.util.Objects; +import java.util.Optional; /** * Responsible for battery saver mode transition logic. @@ -112,6 +116,14 @@ public class BatterySaverController implements BatterySaverPolicyListener { */ private final Plugin[] mPlugins; + /** + * Package name that will receive an explicit manifest broadcast for + * {@link PowerManager#ACTION_POWER_SAVE_MODE_CHANGED}. It's {@code null} if it hasn't been + * retrieved yet. + */ + @Nullable + private Optional<String> mPowerSaveModeChangedListenerPackage; + public static final int REASON_PERCENTAGE_AUTOMATIC_ON = 0; public static final int REASON_PERCENTAGE_AUTOMATIC_OFF = 1; public static final int REASON_MANUAL_ON = 2; @@ -494,6 +506,14 @@ public class BatterySaverController implements BatterySaverPolicyListener { intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); mContext.sendBroadcastAsUser(intent, UserHandle.ALL); + // Send the broadcast to a manifest-registered receiver that is specified in the config. + if (getPowerSaveModeChangedListenerPackage().isPresent()) { + intent = new Intent(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED) + .setPackage(getPowerSaveModeChangedListenerPackage().get()) + .addFlags(Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND); + mContext.sendBroadcastAsUser(intent, UserHandle.ALL); + } + // Send internal version that requires signature permission. intent = new Intent(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED_INTERNAL); intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); @@ -508,6 +528,20 @@ public class BatterySaverController implements BatterySaverPolicyListener { } } + private Optional<String> getPowerSaveModeChangedListenerPackage() { + if (mPowerSaveModeChangedListenerPackage == null) { + String configPowerSaveModeChangedListenerPackage = + mContext.getString(R.string.config_powerSaveModeChangedListenerPackage); + mPowerSaveModeChangedListenerPackage = + LocalServices + .getService(PackageManagerInternal.class) + .isSystemPackage(configPowerSaveModeChangedListenerPackage) + ? Optional.of(configPowerSaveModeChangedListenerPackage) + : Optional.empty(); + } + return mPowerSaveModeChangedListenerPackage; + } + private void updateBatterySavingStats() { final PowerManager pm = getPowerManager(); if (pm == null) { |