Search in sources :

Example 41 with BatterySipper

use of com.android.internal.os.BatterySipper in project android_packages_apps_Settings by SudaMod.

the class WakeLockAnomalyDetector method detectAnomalies.

@Override
public List<Anomaly> detectAnomalies(BatteryStatsHelper batteryStatsHelper, String targetPackageName) {
    final List<BatterySipper> batterySippers = batteryStatsHelper.getUsageList();
    final List<Anomaly> anomalies = new ArrayList<>();
    final long rawRealtime = SystemClock.elapsedRealtime();
    final int targetUid = mBatteryUtils.getPackageUid(targetPackageName);
    // Check the app one by one
    for (int i = 0, size = batterySippers.size(); i < size; i++) {
        final BatterySipper sipper = batterySippers.get(i);
        final BatteryStats.Uid uid = sipper.uidObj;
        if (uid == null || mBatteryUtils.shouldHideSipper(sipper) || (targetUid != BatteryUtils.UID_NULL && targetUid != uid.getUid())) {
            continue;
        }
        final long currentDurationMs = getCurrentDurationMs(uid, rawRealtime);
        final long backgroundDurationMs = getBackgroundTotalDurationMs(uid, rawRealtime);
        if (backgroundDurationMs > mWakeLockThresholdMs && currentDurationMs != 0) {
            final String packageName = mBatteryUtils.getPackageName(uid.getUid());
            final CharSequence displayName = Utils.getApplicationLabel(mContext, packageName);
            Anomaly anomaly = new Anomaly.Builder().setUid(uid.getUid()).setType(Anomaly.AnomalyType.WAKE_LOCK).setDisplayName(displayName).setPackageName(packageName).setWakeLockTimeMs(backgroundDurationMs).build();
            if (mAnomalyUtils.getAnomalyAction(anomaly).isActionActive(anomaly)) {
                anomalies.add(anomaly);
            }
        }
    }
    return anomalies;
}
Also used : BatterySipper(com.android.internal.os.BatterySipper) ArrayList(java.util.ArrayList) Anomaly(com.android.settings.fuelgauge.anomaly.Anomaly) BatteryStats(android.os.BatteryStats)

Example 42 with BatterySipper

use of com.android.internal.os.BatterySipper in project android_packages_apps_Settings by DirtyUnicorns.

the class PowerUsageAdvanced method updateUsageDataSummary.

@VisibleForTesting
void updateUsageDataSummary(PowerUsageData usageData, double totalPower, int dischargeAmount) {
    if (shouldHideSummary(usageData)) {
        return;
    }
    if (usageData.usageList.size() <= 1) {
        CharSequence timeSequence = Utils.formatElapsedTime(getContext(), usageData.totalUsageTimeMs, false);
        usageData.summary = usageData.usageType == UsageType.IDLE ? timeSequence : TextUtils.expandTemplate(getText(R.string.battery_used_for), timeSequence);
    } else {
        BatterySipper sipper = findBatterySipperWithMaxBatteryUsage(usageData.usageList);
        BatteryEntry batteryEntry = new BatteryEntry(getContext(), mHandler, mUserManager, sipper);
        final double percentage = (sipper.totalPowerMah / totalPower) * dischargeAmount;
        usageData.summary = getString(R.string.battery_used_by, Utils.formatPercentage(percentage, true), batteryEntry.name);
    }
}
Also used : BatterySipper(com.android.internal.os.BatterySipper) VisibleForTesting(android.support.annotation.VisibleForTesting)

Example 43 with BatterySipper

use of com.android.internal.os.BatterySipper in project android_packages_apps_Settings by DirtyUnicorns.

the class PowerUsageAdvanced method parsePowerUsageData.

@VisibleForTesting
List<PowerUsageData> parsePowerUsageData(BatteryStatsHelper statusHelper) {
    final List<BatterySipper> batterySippers = statusHelper.getUsageList();
    final Map<Integer, PowerUsageData> batteryDataMap = new HashMap<>();
    for (@UsageType final Integer type : mUsageTypes) {
        batteryDataMap.put(type, new PowerUsageData(type));
    }
    // Accumulate power usage based on usage type
    for (final BatterySipper sipper : batterySippers) {
        sipper.mPackages = mPackageManager.getPackagesForUid(sipper.getUid());
        final PowerUsageData usageData = batteryDataMap.get(extractUsageType(sipper));
        usageData.totalPowerMah += sipper.totalPowerMah;
        if (sipper.drainType == DrainType.APP && sipper.usageTimeMs != 0) {
            sipper.usageTimeMs = mBatteryUtils.getProcessTimeMs(BatteryUtils.StatusType.FOREGROUND, sipper.uidObj, STATUS_TYPE);
        }
        usageData.totalUsageTimeMs += sipper.usageTimeMs;
        if (shouldShowBatterySipper(sipper)) {
            usageData.usageList.add(sipper);
        }
    }
    final List<PowerUsageData> batteryDataList = new ArrayList<>(batteryDataMap.values());
    final int dischargeAmount = statusHelper.getStats().getDischargeAmount(STATUS_TYPE);
    final double totalPower = statusHelper.getTotalPower();
    final double hiddenPower = calculateHiddenPower(batteryDataList);
    for (final PowerUsageData usageData : batteryDataList) {
        usageData.percentage = mBatteryUtils.calculateBatteryPercent(usageData.totalPowerMah, totalPower, hiddenPower, dischargeAmount);
        updateUsageDataSummary(usageData, totalPower, dischargeAmount);
    }
    Collections.sort(batteryDataList);
    mBatteryDataMap = batteryDataMap;
    return batteryDataList;
}
Also used : BatterySipper(com.android.internal.os.BatterySipper) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) UsageType(com.android.settings.fuelgauge.PowerUsageAdvanced.PowerUsageData.UsageType) VisibleForTesting(android.support.annotation.VisibleForTesting)

Example 44 with BatterySipper

use of com.android.internal.os.BatterySipper in project android_packages_apps_Settings by DirtyUnicorns.

the class PowerUsageSummary method updateScreenPreference.

@VisibleForTesting
void updateScreenPreference() {
    final BatterySipper sipper = findBatterySipperByType(mStatsHelper.getUsageList(), DrainType.SCREEN);
    final long usageTimeMs = sipper != null ? sipper.usageTimeMs : 0;
    mScreenUsagePref.setSubtitle(Utils.formatElapsedTime(getContext(), usageTimeMs, false));
}
Also used : BatterySipper(com.android.internal.os.BatterySipper) VisibleForTesting(android.support.annotation.VisibleForTesting)

Example 45 with BatterySipper

use of com.android.internal.os.BatterySipper in project android_packages_apps_Settings by DirtyUnicorns.

the class PowerUsageSummary method refreshAppListGroup.

private void refreshAppListGroup() {
    final Context context = getContext();
    final PowerProfile powerProfile = mStatsHelper.getPowerProfile();
    final BatteryStats stats = mStatsHelper.getStats();
    final double averagePower = powerProfile.getAveragePower(PowerProfile.POWER_SCREEN_FULL);
    boolean addedSome = false;
    TypedArray array = context.obtainStyledAttributes(new int[] { android.R.attr.colorControlNormal });
    final int colorControl = array.getColor(0, 0);
    array.recycle();
    final int dischargeAmount = USE_FAKE_DATA ? 5000 : stats != null ? stats.getDischargeAmount(mStatsType) : 0;
    cacheRemoveAllPrefs(mAppListGroup);
    mAppListGroup.setOrderingAsAdded(false);
    if (averagePower >= MIN_AVERAGE_POWER_THRESHOLD_MILLI_AMP || USE_FAKE_DATA) {
        final List<BatterySipper> usageList = getCoalescedUsageList(USE_FAKE_DATA ? getFakeStats() : mStatsHelper.getUsageList());
        double hiddenPowerMah = mShowAllApps ? 0 : mBatteryUtils.removeHiddenBatterySippers(usageList);
        mBatteryUtils.sortUsageList(usageList);
        final int numSippers = usageList.size();
        for (int i = 0; i < numSippers; i++) {
            final BatterySipper sipper = usageList.get(i);
            double totalPower = USE_FAKE_DATA ? 4000 : mStatsHelper.getTotalPower();
            final double percentOfTotal = mBatteryUtils.calculateBatteryPercent(sipper.totalPowerMah, totalPower, hiddenPowerMah, dischargeAmount);
            if (((int) (percentOfTotal + .5)) < 1) {
                continue;
            }
            if (shouldHideSipper(sipper)) {
                continue;
            }
            final UserHandle userHandle = new UserHandle(UserHandle.getUserId(sipper.getUid()));
            final BatteryEntry entry = new BatteryEntry(getActivity(), mHandler, mUm, sipper);
            final Drawable badgedIcon = mUm.getBadgedIconForUser(entry.getIcon(), userHandle);
            final CharSequence contentDescription = mUm.getBadgedLabelForUser(entry.getLabel(), userHandle);
            final String key = extractKeyFromSipper(sipper);
            PowerGaugePreference pref = (PowerGaugePreference) getCachedPreference(key);
            if (pref == null) {
                pref = new PowerGaugePreference(getPrefContext(), badgedIcon, contentDescription, entry);
                pref.setKey(key);
            }
            final double percentOfMax = (sipper.totalPowerMah * 100) / mStatsHelper.getMaxPower();
            sipper.percent = percentOfTotal;
            pref.setTitle(entry.getLabel());
            pref.setOrder(i + 1);
            pref.setPercent(percentOfTotal);
            pref.shouldShowAnomalyIcon(false);
            if (sipper.usageTimeMs == 0 && sipper.drainType == DrainType.APP) {
                sipper.usageTimeMs = mBatteryUtils.getProcessTimeMs(BatteryUtils.StatusType.FOREGROUND, sipper.uidObj, mStatsType);
            }
            setUsageSummary(pref, sipper);
            if ((sipper.drainType != DrainType.APP || sipper.uidObj.getUid() == Process.ROOT_UID) && sipper.drainType != DrainType.USER) {
                pref.setTint(colorControl);
            }
            addedSome = true;
            mAppListGroup.addPreference(pref);
            if (mAppListGroup.getPreferenceCount() - getCachedCount() > (MAX_ITEMS_TO_LIST + 1)) {
                break;
            }
        }
    }
    if (!addedSome) {
        addNotAvailableMessage();
    }
    removeCachedPrefs(mAppListGroup);
    BatteryEntry.startRequestQueue();
}
Also used : Context(android.content.Context) BatterySipper(com.android.internal.os.BatterySipper) Drawable(android.graphics.drawable.Drawable) BatteryStats(android.os.BatteryStats) TypedArray(android.content.res.TypedArray) UserHandle(android.os.UserHandle) PowerProfile(com.android.internal.os.PowerProfile)

Aggregations

BatterySipper (com.android.internal.os.BatterySipper)148 ArrayList (java.util.ArrayList)60 BatteryStats (android.os.BatteryStats)48 VisibleForTesting (android.support.annotation.VisibleForTesting)30 Test (org.junit.Test)29 Anomaly (com.android.settings.fuelgauge.anomaly.Anomaly)18 HashMap (java.util.HashMap)16 UserHandle (android.os.UserHandle)15 ArrayMap (android.util.ArrayMap)10 BatteryStatsHelper (com.android.internal.os.BatteryStatsHelper)10 Map (java.util.Map)10 Drawable (android.graphics.drawable.Drawable)8 SparseArray (android.util.SparseArray)8 DrainType (com.android.internal.os.BatterySipper.DrainType)8 PowerProfile (com.android.internal.os.PowerProfile)8 Bundle (android.os.Bundle)7 SparseLongArray (android.util.SparseLongArray)7 Context (android.content.Context)6 TypedArray (android.content.res.TypedArray)6 PowerUsageData (com.android.settings.fuelgauge.PowerUsageAdvanced.PowerUsageData)6