Merge "Add a broadcast to manifest-register receivers for power save mode changes." into rvc-dev

This commit is contained in:
Mariia Sandrikova
2020-03-16 17:32:29 +00:00
committed by Android (Google) Code Review
5 changed files with 50 additions and 0 deletions

View File

@@ -4421,4 +4421,8 @@
<!-- The max scale for the wallpaper when it's zoomed in --> <!-- The max scale for the wallpaper when it's zoomed in -->
<item name="config_wallpaperMaxScale" format="float" type="dimen">1</item> <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> </resources>

View File

@@ -3615,6 +3615,7 @@
<java-symbol type="bool" name="config_batterySaverStickyBehaviourDisabled" /> <java-symbol type="bool" name="config_batterySaverStickyBehaviourDisabled" />
<java-symbol type="integer" name="config_dynamicPowerSavingsDefaultDisableThreshold" /> <java-symbol type="integer" name="config_dynamicPowerSavingsDefaultDisableThreshold" />
<java-symbol type="string" name="config_batterySaverScheduleProvider" /> <java-symbol type="string" name="config_batterySaverScheduleProvider" />
<java-symbol type="string" name="config_powerSaveModeChangedListenerPackage" />
<!-- For car devices --> <!-- For car devices -->
<java-symbol type="string" name="car_loading_profile" /> <java-symbol type="string" name="car_loading_profile" />

View File

@@ -991,4 +991,9 @@ public abstract class PackageManagerInternal {
* @param enabled true if visibility blocks should be logged * @param enabled true if visibility blocks should be logged
*/ */
public abstract void setVisibilityLogging(String packageName, boolean enabled); 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);
} }

View File

@@ -24192,6 +24192,12 @@ public class PackageManagerService extends IPackageManager.Stub
} }
mAppsFilter.getFeatureConfig().enableLogging(pkg.appId, enable); mAppsFilter.getFeatureConfig().enableLogging(pkg.appId, enable);
} }
@Override
public boolean isSystemPackage(@NonNull String packageName) {
return packageName.equals(
PackageManagerService.this.ensureSystemPackageName(packageName));
}
} }
@GuardedBy("mLock") @GuardedBy("mLock")

View File

@@ -16,11 +16,13 @@
package com.android.server.power.batterysaver; package com.android.server.power.batterysaver;
import android.Manifest; import android.Manifest;
import android.annotation.Nullable;
import android.app.ActivityManagerInternal; import android.app.ActivityManagerInternal;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.content.pm.PackageManagerInternal;
import android.hardware.power.V1_0.PowerHint; import android.hardware.power.V1_0.PowerHint;
import android.os.BatteryManager; import android.os.BatteryManager;
import android.os.BatterySaverPolicyConfig; import android.os.BatterySaverPolicyConfig;
@@ -35,6 +37,7 @@ import android.os.UserHandle;
import android.util.ArrayMap; import android.util.ArrayMap;
import android.util.Slog; import android.util.Slog;
import com.android.internal.R;
import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.ArrayUtils; 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.ArrayList;
import java.util.Objects; import java.util.Objects;
import java.util.Optional;
/** /**
* Responsible for battery saver mode transition logic. * Responsible for battery saver mode transition logic.
@@ -112,6 +116,14 @@ public class BatterySaverController implements BatterySaverPolicyListener {
*/ */
private final Plugin[] mPlugins; 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_ON = 0;
public static final int REASON_PERCENTAGE_AUTOMATIC_OFF = 1; public static final int REASON_PERCENTAGE_AUTOMATIC_OFF = 1;
public static final int REASON_MANUAL_ON = 2; public static final int REASON_MANUAL_ON = 2;
@@ -494,6 +506,14 @@ public class BatterySaverController implements BatterySaverPolicyListener {
intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
mContext.sendBroadcastAsUser(intent, UserHandle.ALL); 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. // Send internal version that requires signature permission.
intent = new Intent(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED_INTERNAL); intent = new Intent(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED_INTERNAL);
intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); 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() { private void updateBatterySavingStats() {
final PowerManager pm = getPowerManager(); final PowerManager pm = getPowerManager();
if (pm == null) { if (pm == null) {