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

Commit 5b6f59a0 authored by Dianne Hackborn's avatar Dianne Hackborn
Browse files

Add "unaccounted" item to battery use UI.

Kind-of informative.

Change-Id: I10d2ee1ad8fe598a1ce1989df6628da11b82d906
parent 5f37dda3
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
@@ -3604,6 +3604,10 @@
    <string name="power_idle" product="tablet">Tablet idle</string>
    <!-- Label for power consumed when Idle -->
    <string name="power_idle" product="default">Phone idle</string>
    <!-- Label for power that we aren't able to account for -->
    <string name="power_unaccounted">Unaccounted</string>
    <!-- Label for power that we computed too much for -->
    <string name="power_overcounted">Over-counted</string>

    <!-- Label for CPU usage time -->
    <string name="usage_type_cpu">CPU total</string>
@@ -3635,6 +3639,14 @@
    <string name="usage_type_on_time">Time on</string>
    <!-- Label for time that there was no cell coverage -->
    <string name="usage_type_no_coverage">Time without a signal</string>
    <!-- Label for the total power capacity of the device's battery -->
    <string name="usage_type_total_battery_capacity">Total battery capacity</string>
    <!-- Label for amount of power use that was computed -->
    <string name="usage_type_computed_power">Computed power</string>
    <!-- Label for minimum amount of actual power use -->
    <string name="usage_type_min_actual_power">Min real power</string>
    <!-- Label for maximum amount of power use -->
    <string name="usage_type_max_actual_power">Max real power</string>
    <!-- Label for force stop action -->
    <string name="battery_action_stop">Force stop</string>
    <!-- Label for app details action -->
@@ -3690,6 +3702,13 @@
    <!-- [CHAR LIMIT=50] Description for power consumed by users -->
    <string name="battery_desc_users">Battery used by user</string>

    <!-- [CHAR LIMIT=50] Description for unaccounted power use -->
    <string name="battery_desc_unaccounted">Unaccounted power use</string>
    <!-- [CHAR LIMIT=50] Description for over-counted power use -->
    <string name="battery_desc_overcounted">Over-counted power use</string>
    <!-- Representation of a mAh value. [CHAR LIMIT=NONE] -->
    <string name="mah"><xliff:g id="number" example="30">%d</xliff:g> mAh</string>

    <!-- Menu label for viewing battery usage since unplugged -->
    <string name="menu_stats_unplugged"><xliff:g id="unplugged">%1$s</xliff:g> since unplugged</string>
    <!-- Menu label for viewing battery usage since unplugged -->
+59 −0
Original line number Diff line number Diff line
@@ -89,8 +89,11 @@ public class BatteryStatsHelper {
    private long mStatsPeriod = 0;
    private double mMaxPower = 1;
    private double mTotalPower;
    private double mTotalPowermAh;
    private double mWifiPower;
    private double mBluetoothPower;
    private double mMinDrainedPower;
    private double mMaxDrainedPower;

    // How much the apps together have left WIFI running.
    private long mAppWifiRunning;
@@ -304,6 +307,22 @@ public class BatteryStatsHelper {
                    sipper.wifiTxPackets,
                };
            } break;
            case UNACCOUNTED:
            case OVERCOUNTED:
            {
                types = new int[] {
                    R.string.usage_type_total_battery_capacity,
                    R.string.usage_type_computed_power,
                    R.string.usage_type_min_actual_power,
                    R.string.usage_type_max_actual_power,
                };
                values = new double[] {
                    mPowerProfile.getBatteryCapacity(),
                    mTotalPowermAh,
                    mMinDrainedPower,
                    mMaxDrainedPower,
                };
            } break;
            default:
            {
                types = new int[] {
@@ -341,9 +360,35 @@ public class BatteryStatsHelper {
        mUserSippers.clear();
        mUserPower.clear();

        mMinDrainedPower = (mStats.getLowDischargeAmountSinceCharge()
                * mPowerProfile.getBatteryCapacity()) / 100;
        mMaxDrainedPower = (mStats.getHighDischargeAmountSinceCharge()
                * mPowerProfile.getBatteryCapacity()) / 100;

        processAppUsage(includeZeroConsumption);
        processMiscUsage();

        // We have been computing totals in seconds, convert to hours.
        mTotalPowermAh = mTotalPower / 3600;

        if (true || mStats.getLowDischargeAmountSinceCharge() > 10) {
            if (mMinDrainedPower > mTotalPowermAh) {
                double amount = mMinDrainedPower - mTotalPowermAh;
                if (mMaxPower < amount) {
                    mMaxPower = amount;
                }
                addEntryNoTotal(mActivity.getString(R.string.power_unaccounted),
                        DrainType.UNACCOUNTED, 0, R.drawable.ic_power_system, amount * 3600);
            } else if (mMaxDrainedPower < mTotalPowermAh) {
                double amount = mTotalPowermAh - mMaxDrainedPower;
                if (mMaxPower < amount) {
                    mMaxPower = amount;
                }
                addEntryNoTotal(mActivity.getString(R.string.power_overcounted),
                        DrainType.OVERCOUNTED, 0, R.drawable.ic_power_system, amount * 3600);
            }
        }

        Collections.sort(mUsageList);

        if (mHandler != null) {
@@ -807,6 +852,12 @@ public class BatteryStatsHelper {

    private BatterySipper addEntry(String label, DrainType drainType, long time, int iconId,
            double power) {
        mTotalPower += power;
        return addEntryNoTotal(label, drainType, time, iconId, power);
    }

    private BatterySipper addEntryNoTotal(String label, DrainType drainType, long time, int iconId,
            double power) {
        if (power > mMaxPower) mMaxPower = power;
        mTotalPower += power;
        BatterySipper bs = new BatterySipper(mActivity, mRequestQueue, mHandler,
@@ -832,6 +883,14 @@ public class BatteryStatsHelper {
        return mTotalPower;
    }

    public double getMinDrainedPower() {
        return mMinDrainedPower;
    }

    public double getMaxDrainedPower() {
        return mMaxDrainedPower;
    }

    private void load() {
        try {
            byte[] data = mBatteryInfo.getStatistics();
+11 −1
Original line number Diff line number Diff line
@@ -67,7 +67,9 @@ public class PowerUsageDetail extends Fragment implements Button.OnClickListener
        BLUETOOTH,
        SCREEN,
        APP,
        USER
        USER,
        UNACCOUNTED,
        OVERCOUNTED
    }

    // Note: Must match the sequence of the DrainType
@@ -80,6 +82,8 @@ public class PowerUsageDetail extends Fragment implements Button.OnClickListener
        R.string.battery_desc_display,
        R.string.battery_desc_apps,
        R.string.battery_desc_users,
        R.string.battery_desc_unaccounted,
        R.string.battery_desc_overcounted,
    };

    public static final int ACTION_DISPLAY_SETTINGS = 1;
@@ -329,6 +333,12 @@ public class PowerUsageDetail extends Fragment implements Button.OnClickListener
                        final int percentage = (int) Math.floor(mValues[i]);
                        value = getActivity().getString(R.string.percentage, percentage);
                        break;
                    case R.string.usage_type_total_battery_capacity:
                    case R.string.usage_type_computed_power:
                    case R.string.usage_type_min_actual_power:
                    case R.string.usage_type_max_actual_power:
                        value = getActivity().getString(R.string.mah, (long)(mValues[i]));
                        break;
                    case R.string.usage_type_gps:
                        mUsesGps = true;
                        // Fall through
+26 −9
Original line number Diff line number Diff line
@@ -60,6 +60,8 @@ public class PowerUsageSummary extends PreferenceFragment {
    private static final int MENU_HELP = Menu.FIRST + 2;

    private PreferenceGroup mAppListGroup;
    private String mBatteryLevel;
    private String mBatteryStatus;
    private Preference mBatteryStatusPref;

    private int mStatsType = BatteryStats.STATS_SINCE_CHARGED;
@@ -74,13 +76,8 @@ public class PowerUsageSummary extends PreferenceFragment {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (Intent.ACTION_BATTERY_CHANGED.equals(action)) {
                String batteryLevel = com.android.settings.Utils.getBatteryPercentage(intent);
                String batteryStatus = com.android.settings.Utils.getBatteryStatus(getResources(),
                        intent);
                String batterySummary = context.getResources().getString(
                        R.string.power_usage_level_and_status, batteryLevel, batteryStatus);
                mBatteryStatusPref.setTitle(batterySummary);
            if (Intent.ACTION_BATTERY_CHANGED.equals(action)
                    && updateBatteryStatus(intent)) {
                mStatsHelper.clearStats();
                refreshStats();
            }
@@ -107,8 +104,8 @@ public class PowerUsageSummary extends PreferenceFragment {
    @Override
    public void onResume() {
        super.onResume();
        getActivity().registerReceiver(mBatteryInfoReceiver,
                new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
        updateBatteryStatus(getActivity().registerReceiver(mBatteryInfoReceiver,
                new IntentFilter(Intent.ACTION_BATTERY_CHANGED)));
        refreshStats();
    }

@@ -194,12 +191,32 @@ public class PowerUsageSummary extends PreferenceFragment {
        mAppListGroup.addPreference(notAvailable);
    }

    private boolean updateBatteryStatus(Intent intent) {
        if (intent != null) {
            String batteryLevel = com.android.settings.Utils.getBatteryPercentage(intent);
            String batteryStatus = com.android.settings.Utils.getBatteryStatus(getResources(),
                    intent);
            if (!batteryLevel.equals(mBatteryLevel) || !batteryStatus.equals(mBatteryStatus)) {
                mBatteryLevel = batteryLevel;
                mBatteryStatus = batteryStatus;
                return true;
            }
        }
        return false;
    }

    private void refreshStats() {
        mAppListGroup.removeAll();
        mAppListGroup.setOrderingAsAdded(false);

        mBatteryStatusPref.setOrder(-2);
        if (mBatteryLevel != null && mBatteryStatus != null) {
            String batterySummary = getActivity().getResources().getString(
                    R.string.power_usage_level_and_status, mBatteryLevel, mBatteryStatus);
            mBatteryStatusPref.setTitle(batterySummary);
        }
        mAppListGroup.addPreference(mBatteryStatusPref);

        BatteryHistoryPreference hist = new BatteryHistoryPreference(
                getActivity(), mStatsHelper.getStats());
        hist.setOrder(-1);