Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0856fc35 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Note applicable modifiers in EconomicPolicies."

parents 846d1389 584b3e37
Loading
Loading
Loading
Loading
+17 −0
Original line number Diff line number Diff line
@@ -16,6 +16,10 @@

package com.android.server.tare;

import static com.android.server.tare.Modifier.COST_MODIFIER_CHARGING;
import static com.android.server.tare.Modifier.COST_MODIFIER_DEVICE_IDLE;
import static com.android.server.tare.Modifier.COST_MODIFIER_POWER_SAVE_MODE;
import static com.android.server.tare.Modifier.COST_MODIFIER_PROCESS_STATE;
import static com.android.server.tare.TareUtils.arcToNarc;

import android.annotation.NonNull;
@@ -41,6 +45,13 @@ public class AlarmManagerEconomicPolicy extends EconomicPolicy {
    public static final String ACTION_ALARM_NONWAKEUP_INEXACT = "ALARM_NONWAKEUP_INEXACT";
    public static final String ACTION_ALARM_CLOCK = "ALARM_CLOCK";

    private static final int[] COST_MODIFIERS = new int[]{
            COST_MODIFIER_CHARGING,
            COST_MODIFIER_DEVICE_IDLE,
            COST_MODIFIER_POWER_SAVE_MODE,
            COST_MODIFIER_PROCESS_STATE
    };

    private final ArrayMap<String, Action> mActions = new ArrayMap<>();
    private final ArrayMap<String, Reward> mRewards = new ArrayMap<>();

@@ -67,6 +78,12 @@ public class AlarmManagerEconomicPolicy extends EconomicPolicy {
        return arcToNarc(52000);
    }

    @NonNull
    @Override
    int[] getCostModifiers() {
        return COST_MODIFIERS;
    }

    @Nullable
    @Override
    Action getAction(@NonNull String actionName) {
+17 −7
Original line number Diff line number Diff line
@@ -27,27 +27,37 @@ import android.util.IndentingPrintWriter;
import android.util.Log;
import android.util.Slog;

/** Multiplier that makes things free when the device is charging. */
class ChargingMultiplier extends Multiplier {
    private static final String TAG = "TARE-" + ChargingMultiplier.class.getSimpleName();
/** Modifier that makes things free when the device is charging. */
class ChargingModifier extends Modifier {
    private static final String TAG = "TARE-" + ChargingModifier.class.getSimpleName();
    private static final boolean DEBUG = InternalResourceService.DEBUG
            || Log.isLoggable(TAG, Log.DEBUG);

    private final InternalResourceService mIrs;
    private final ChargingTracker mChargingTracker;

    ChargingMultiplier(@NonNull InternalResourceService irs) {
        super(true, true);
    ChargingModifier(@NonNull InternalResourceService irs) {
        super();
        mIrs = irs;
        mChargingTracker = new ChargingTracker();
        mChargingTracker.startTracking(irs.getContext());
    }

    double getCurrentMultiplier() {
    @Override
    long getModifiedCostToProduce(long ctp) {
        return modifyValue(ctp);
    }

    @Override
    long getModifiedPrice(long price) {
        return modifyValue(price);
    }

    private long modifyValue(long val) {
        if (mChargingTracker.mCharging) {
            return 0;
        }
        return 1;
        return val;
    }

    @Override
+27 −0
Original line number Diff line number Diff line
@@ -20,6 +20,9 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.IndentingPrintWriter;

import libcore.util.EmptyArray;


/** Combines all enabled policies into one. */
@@ -29,6 +32,7 @@ public class CompleteEconomicPolicy extends EconomicPolicy {
    private final ArrayMap<String, Action> mActions = new ArrayMap<>();
    /** Lazily populated set of rewards covered by this policy. */
    private final ArrayMap<String, Reward> mRewards = new ArrayMap<>();
    private final int[] mCostModifiers;
    private final long mMaxSatiatedBalance;
    private final long mMaxSatiatedCirculation;

@@ -37,6 +41,18 @@ public class CompleteEconomicPolicy extends EconomicPolicy {
        mEnabledEconomicPolicies.add(new AlarmManagerEconomicPolicy(irs));
        mEnabledEconomicPolicies.add(new JobSchedulerEconomicPolicy(irs));

        ArraySet<Integer> costModifiers = new ArraySet<>();
        for (int i = 0; i < mEnabledEconomicPolicies.size(); ++i) {
            final int[] sm = mEnabledEconomicPolicies.valueAt(i).getCostModifiers();
            for (int s : sm) {
                costModifiers.add(s);
            }
        }
        mCostModifiers = new int[costModifiers.size()];
        for (int i = 0; i < costModifiers.size(); ++i) {
            mCostModifiers[i] = costModifiers.valueAt(i);
        }

        long max = 0;
        for (int i = 0; i < mEnabledEconomicPolicies.size(); ++i) {
            max += mEnabledEconomicPolicies.valueAt(i).getMaxSatiatedBalance();
@@ -69,6 +85,12 @@ public class CompleteEconomicPolicy extends EconomicPolicy {
        return mMaxSatiatedCirculation;
    }

    @NonNull
    @Override
    public int[] getCostModifiers() {
        return mCostModifiers == null ? EmptyArray.INT : mCostModifiers;
    }

    @Nullable
    @Override
    public Action getAction(@NonNull String actionName) {
@@ -114,4 +136,9 @@ public class CompleteEconomicPolicy extends EconomicPolicy {
        mRewards.put(rewardName, reward);
        return reward;
    }

    @Override
    void dump(IndentingPrintWriter pw) {
        dumpActiveModifiers(pw);
    }
}
+10 −9
Original line number Diff line number Diff line
@@ -25,9 +25,9 @@ import android.os.PowerManager;
import android.util.IndentingPrintWriter;
import android.util.Log;

/** Multiplier that makes things more expensive in light and deep doze. */
class DeviceIdleMultiplier extends Multiplier {
    private static final String TAG = "TARE-" + DeviceIdleMultiplier.class.getSimpleName();
/** Modifier that makes things more expensive in light and deep doze. */
class DeviceIdleModifier extends Modifier {
    private static final String TAG = "TARE-" + DeviceIdleModifier.class.getSimpleName();
    private static final boolean DEBUG = InternalResourceService.DEBUG
            || Log.isLoggable(TAG, Log.DEBUG);

@@ -35,22 +35,23 @@ class DeviceIdleMultiplier extends Multiplier {
    private final PowerManager mPowerManager;
    private final DeviceIdleTracker mDeviceIdleTracker;

    DeviceIdleMultiplier(@NonNull InternalResourceService irs) {
        super(true, false);
    DeviceIdleModifier(@NonNull InternalResourceService irs) {
        super();
        mIrs = irs;
        mPowerManager = irs.getContext().getSystemService(PowerManager.class);
        mDeviceIdleTracker = new DeviceIdleTracker();
        mDeviceIdleTracker.startTracking(irs.getContext());
    }

    double getCurrentMultiplier() {
    @Override
    long getModifiedCostToProduce(long ctp) {
        if (mDeviceIdleTracker.mDeviceIdle) {
            return 1.2;
            return (long) (1.2 * ctp);
        }
        if (mDeviceIdleTracker.mDeviceLightIdle) {
            return 1.1;
            return (long) (1.1 * ctp);
        }
        return 1;
        return ctp;
    }

    @Override
+106 −1
Original line number Diff line number Diff line
@@ -16,6 +16,12 @@

package com.android.server.tare;

import static com.android.server.tare.Modifier.COST_MODIFIER_CHARGING;
import static com.android.server.tare.Modifier.COST_MODIFIER_DEVICE_IDLE;
import static com.android.server.tare.Modifier.COST_MODIFIER_POWER_SAVE_MODE;
import static com.android.server.tare.Modifier.COST_MODIFIER_PROCESS_STATE;
import static com.android.server.tare.Modifier.NUM_COST_MODIFIERS;

import android.annotation.CallSuper;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -62,7 +68,7 @@ public abstract class EconomicPolicy {
        /**
         * The base price to perform this action. If this is
         * less than the {@link #costToProduce}, then the system should not perform
         * the action unless a multiplier lowers the cost to produce.
         * the action unless a modifier lowers the cost to produce.
         */
        public final long basePrice;

@@ -91,11 +97,22 @@ public abstract class EconomicPolicy {
        }
    }

    private static final Modifier[] COST_MODIFIER_BY_INDEX = new Modifier[NUM_COST_MODIFIERS];

    EconomicPolicy(@NonNull InternalResourceService irs) {
        for (int mId : getCostModifiers()) {
            initModifier(mId, irs);
        }
    }

    @CallSuper
    void onSystemServicesReady() {
        for (int i = 0; i < NUM_COST_MODIFIERS; ++i) {
            final Modifier modifier = COST_MODIFIER_BY_INDEX[i];
            if (modifier != null) {
                modifier.onSystemServicesReady();
            }
        }
    }

    /**
@@ -117,6 +134,10 @@ public abstract class EconomicPolicy {
     */
    abstract long getMaxSatiatedCirculation();

    /** Return the set of modifiers that should apply to this policy's costs. */
    @NonNull
    abstract int[] getCostModifiers();

    @Nullable
    abstract Action getAction(@NonNull String actionName);

@@ -125,4 +146,88 @@ public abstract class EconomicPolicy {

    void dump(IndentingPrintWriter pw) {
    }

    final long getCostOfAction(@NonNull String actionName, int userId, @NonNull String pkgName) {
        final Action action = getAction(actionName);
        if (action == null) {
            return 0;
        }
        long ctp = action.costToProduce;
        long price = action.basePrice;
        final int[] costModifiers = getCostModifiers();
        boolean useProcessStatePriceDeterminant = false;
        for (int costModifier : costModifiers) {
            if (costModifier == COST_MODIFIER_PROCESS_STATE) {
                useProcessStatePriceDeterminant = true;
            } else {
                final Modifier modifier = getModifier(costModifier);
                ctp = modifier.getModifiedCostToProduce(ctp);
                price = modifier.getModifiedPrice(price);
            }
        }
        // ProcessStateModifier needs to be done last.
        if (useProcessStatePriceDeterminant) {
            ProcessStateModifier processStateModifier =
                    (ProcessStateModifier) getModifier(COST_MODIFIER_PROCESS_STATE);
            price = processStateModifier.getModifiedPrice(userId, pkgName, ctp, price);
        }
        return price;
    }

    private static void initModifier(@Modifier.CostModifier final int modifierId,
            @NonNull InternalResourceService irs) {
        if (modifierId < 0 || modifierId >= COST_MODIFIER_BY_INDEX.length) {
            throw new IllegalArgumentException("Invalid modifier id " + modifierId);
        }
        Modifier modifier = COST_MODIFIER_BY_INDEX[modifierId];
        if (modifier == null) {
            switch (modifierId) {
                case COST_MODIFIER_CHARGING:
                    modifier = new ChargingModifier(irs);
                    break;
                case COST_MODIFIER_DEVICE_IDLE:
                    modifier = new DeviceIdleModifier(irs);
                    break;
                case COST_MODIFIER_POWER_SAVE_MODE:
                    modifier = new PowerSaveModeModifier(irs);
                    break;
                case COST_MODIFIER_PROCESS_STATE:
                    modifier = new ProcessStateModifier(irs);
                    break;
                default:
                    throw new IllegalArgumentException("Invalid modifier id " + modifierId);
            }
            COST_MODIFIER_BY_INDEX[modifierId] = modifier;
        }
    }

    @NonNull
    private static Modifier getModifier(@Modifier.CostModifier final int modifierId) {
        if (modifierId < 0 || modifierId >= COST_MODIFIER_BY_INDEX.length) {
            throw new IllegalArgumentException("Invalid modifier id " + modifierId);
        }
        final Modifier modifier = COST_MODIFIER_BY_INDEX[modifierId];
        if (modifier == null) {
            throw new IllegalStateException(
                    "Modifier #" + modifierId + " was never initialized");
        }
        return modifier;
    }

    protected static void dumpActiveModifiers(IndentingPrintWriter pw) {
        for (int i = 0; i < NUM_COST_MODIFIERS; ++i) {
            pw.print("Modifier ");
            pw.println(i);
            pw.increaseIndent();

            Modifier modifier = COST_MODIFIER_BY_INDEX[i];
            if (modifier != null) {
                modifier.dump(pw);
            } else {
                pw.println("NOT ACTIVE");
            }

            pw.decreaseIndent();
        }
    }
}
Loading