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

Commit 4752ea17 authored by ykhung's avatar ykhung Committed by YUKAI HUNG
Browse files

Refine startBatteryDetailPage method to support history data

Bug: 177406865
Test: make SettingsRoboTests
Test: make SettingsGoogleRoboTests
Change-Id: Iee3b6b353c4f92bdad37fac55adad58b4f205bf6
parent d2bffb94
Loading
Loading
Loading
Loading
+61 −16
Original line number Diff line number Diff line
@@ -116,37 +116,82 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements

    private String mPackageName;

    /**
     * Launches battery details page for an individual battery consumer.
     */
    // A wrapper class to carry LaunchBatteryDetailPage required arguments.
    private static final class LaunchBatteryDetailPageArgs {
        private String mUsagePercent;
        private String mPackageName;
        private String mAppLabel;
        private int mUid;
        private int mIconId;
        private int mConsumedPower;
        private long mForegroundTimeMs;
        private long mBackgroundTimeMs;
        private boolean mIsUserEntry;
    }

    /** Launches battery details page for an individual battery consumer. */
    public static void startBatteryDetailPage(
            Activity caller, InstrumentedPreferenceFragment fragment,
            BatteryDiffEntry diffEntry, String usagePercent) {
        final BatteryHistEntry histEntry = diffEntry.mBatteryHistEntry;
        final LaunchBatteryDetailPageArgs launchArgs = new LaunchBatteryDetailPageArgs();
        // configure the launch argument.
        launchArgs.mUsagePercent = usagePercent;
        launchArgs.mPackageName = diffEntry.getPackageName();
        launchArgs.mAppLabel = diffEntry.getAppLabel();
        launchArgs.mUid = (int) histEntry.mUid;
        launchArgs.mIconId = diffEntry.getAppIconId();
        launchArgs.mConsumedPower = (int) diffEntry.mConsumePower;
        launchArgs.mForegroundTimeMs = diffEntry.mForegroundUsageTimeInMs;
        launchArgs.mBackgroundTimeMs = diffEntry.mBackgroundUsageTimeInMs;
        launchArgs.mIsUserEntry = histEntry.isUserEntry();
        startBatteryDetailPage(caller, fragment, launchArgs);
    }

    /** Launches battery details page for an individual battery consumer. */
    public static void startBatteryDetailPage(Activity caller,
            InstrumentedPreferenceFragment fragment, BatteryEntry entry, String usagePercent) {
        final LaunchBatteryDetailPageArgs launchArgs = new LaunchBatteryDetailPageArgs();
        // configure the launch argument.
        launchArgs.mUsagePercent = usagePercent;
        launchArgs.mPackageName = entry.getDefaultPackageName();
        launchArgs.mAppLabel = entry.getLabel();
        launchArgs.mUid = entry.getUid();
        launchArgs.mIconId = entry.iconId;
        launchArgs.mConsumedPower = (int) entry.getConsumedPower();
        launchArgs.mForegroundTimeMs = entry.getTimeInForegroundMs();
        launchArgs.mBackgroundTimeMs = entry.getTimeInBackgroundMs();
        launchArgs.mIsUserEntry = entry.isUserEntry();
        startBatteryDetailPage(caller, fragment, launchArgs);
    }

    private static void startBatteryDetailPage(Activity caller,
            InstrumentedPreferenceFragment fragment, LaunchBatteryDetailPageArgs launchArgs) {
        final Bundle args = new Bundle();
        final long foregroundTimeMs = entry.getTimeInForegroundMs();
        final long backgroundTimeMs = entry.getTimeInBackgroundMs();
        final String packageName = entry.getDefaultPackageName();
        if (packageName == null) {
        if (launchArgs.mPackageName == null) {
            // populate data for system app
            args.putString(EXTRA_LABEL, entry.getLabel());
            args.putInt(EXTRA_ICON_ID, entry.iconId);
            args.putString(EXTRA_LABEL, launchArgs.mAppLabel);
            args.putInt(EXTRA_ICON_ID, launchArgs.mIconId);
            args.putString(EXTRA_PACKAGE_NAME, null);
        } else {
            // populate data for normal app
            args.putString(EXTRA_PACKAGE_NAME, packageName);
            args.putString(EXTRA_PACKAGE_NAME, launchArgs.mPackageName);
        }

        args.putInt(EXTRA_UID, entry.getUid());
        args.putLong(EXTRA_BACKGROUND_TIME, backgroundTimeMs);
        args.putLong(EXTRA_FOREGROUND_TIME, foregroundTimeMs);
        args.putString(EXTRA_POWER_USAGE_PERCENT, usagePercent);
        args.putInt(EXTRA_POWER_USAGE_AMOUNT, (int) entry.getConsumedPower());
        args.putInt(EXTRA_UID, launchArgs.mUid);
        args.putLong(EXTRA_BACKGROUND_TIME, launchArgs.mBackgroundTimeMs);
        args.putLong(EXTRA_FOREGROUND_TIME, launchArgs.mForegroundTimeMs);
        args.putString(EXTRA_POWER_USAGE_PERCENT, launchArgs.mUsagePercent);
        args.putInt(EXTRA_POWER_USAGE_AMOUNT, launchArgs.mConsumedPower);
        final int userId = launchArgs.mIsUserEntry ? ActivityManager.getCurrentUser()
            : UserHandle.getUserId(launchArgs.mUid);

        new SubSettingLauncher(caller)
                .setDestination(AdvancedPowerUsageDetail.class.getName())
                .setTitleRes(R.string.battery_details_title)
                .setArguments(args)
                .setSourceMetricsCategory(fragment.getMetricsCategory())
                .setUserHandle(new UserHandle(getUserIdToLaunchAdvancePowerUsageDetail(entry)))
                .setUserHandle(new UserHandle(userId))
                .launch();
    }

+28 −0
Original line number Diff line number Diff line
@@ -58,6 +58,7 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll
    Map<Integer, List<BatteryDiffEntry>> mBatteryIndexedMap;

    @VisibleForTesting Context mPrefContext;
    @VisibleForTesting BatteryUtils mBatteryUtils;
    @VisibleForTesting PreferenceGroup mAppListPrefGroup;
    @VisibleForTesting BatteryChartView mBatteryChartView;

@@ -98,6 +99,9 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll
        }
        mHandler.removeCallbacksAndMessages(/*token=*/ null);
        mPreferenceCache.clear();
        if (mAppListPrefGroup != null) {
            mAppListPrefGroup.removeAll();
        }
    }

    @Override
@@ -120,6 +124,28 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll

    @Override
    public boolean handlePreferenceTreeClick(Preference preference) {
        if (!(preference instanceof PowerGaugePreference)) {
            return false;
        }
        final PowerGaugePreference powerPref = (PowerGaugePreference) preference;
        final BatteryDiffEntry diffEntry = powerPref.getBatteryDiffEntry();
        final BatteryHistEntry histEntry = diffEntry.mBatteryHistEntry;
        // Checks whether the package is installed or not.
        boolean isValidPackage = true;
        if (histEntry.isAppEntry()) {
            if (mBatteryUtils == null) {
                mBatteryUtils = BatteryUtils.getInstance(mPrefContext);
            }
            isValidPackage = mBatteryUtils.getPackageUid(histEntry.mPackageName)
                != BatteryUtils.UID_NULL;
        }
        Log.d(TAG, String.format("handleClick() label=%s key=%s isValid:%b",
            diffEntry.getAppLabel(), histEntry.getKey(), isValidPackage));
        if (isValidPackage) {
            AdvancedPowerUsageDetail.startBatteryDetailPage(
                mActivity, mFragment, diffEntry, powerPref.getPercent());
            return true;
        }
        return false;
    }

@@ -273,6 +299,8 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll
            pref.setTitle(appLabel);
            pref.setOrder(prefIndex);
            pref.setPercent(entry.getPercentOfTotal());
            // Sets the BatteryDiffEntry to preference for launching detailed page.
            pref.setBatteryDiffEntry(entry);
            mAppListPrefGroup.addPreference(pref);
            prefIndex++;
        }
+12 −7
Original line number Diff line number Diff line
@@ -57,6 +57,7 @@ public class BatteryDiffEntry {
    private UserManager mUserManager;
    private String mDefaultPackageName = null;

    @VisibleForTesting int mAppIconId;
    @VisibleForTesting String mAppLabel = null;
    @VisibleForTesting Drawable mAppIcon = null;
    @VisibleForTesting boolean mIsLoaded = false;
@@ -112,9 +113,16 @@ public class BatteryDiffEntry {
        return mAppIcon;
    }

    /** Gets the app icon id for this entry. */
    public int getAppIconId() {
        loadLabelAndIcon();
        return mAppIconId;
    }

    /** Gets the searching package name for UID battery type. */
    public String getPackageName() {
        return mDefaultPackageName;
        return mDefaultPackageName != null
            ? mDefaultPackageName : mBatteryHistEntry.mPackageName;
    }

    /** Whether the current BatteryDiffEntry is system component or not. */
@@ -153,6 +161,7 @@ public class BatteryDiffEntry {
                if (nameAndIconForSystem != null) {
                    mAppLabel = nameAndIconForSystem.name;
                    if (nameAndIconForSystem.iconId != 0) {
                        mAppIconId = nameAndIconForSystem.iconId;
                        mAppIcon = mContext.getDrawable(nameAndIconForSystem.iconId);
                    }
                }
@@ -225,8 +234,8 @@ public class BatteryDiffEntry {
        // Clears BatteryEntry internal cache since we will have another one.
        BatteryEntry.clearUidCache();
        if (nameAndIcon != null) {
            mAppLabel = getNonNull(mAppLabel, nameAndIcon.name);
            mAppIcon = getNonNull(mAppIcon, nameAndIcon.icon);
            mAppLabel = nameAndIcon.name;
            mAppIcon = nameAndIcon.icon;
            mDefaultPackageName = nameAndIcon.packageName;
            if (mDefaultPackageName != null
                    && !mDefaultPackageName.equals(nameAndIcon.packageName)) {
@@ -265,8 +274,4 @@ public class BatteryDiffEntry {
        final int appUid = UserHandle.getAppId(uid);
        return appUid >= Process.SYSTEM_UID && appUid < Process.FIRST_APPLICATION_UID;
    }

    private static <T> T getNonNull(T originalObj, T newObj) {
        return newObj != null ? newObj : originalObj;
    }
}
+3 −8
Original line number Diff line number Diff line
@@ -113,10 +113,9 @@ public class BatteryEntry {
                        be.mContext, be.getUid(), sHandler, be,
                        be.mDefaultPackageName, be.name, be.icon);
                if (nameAndIcon != null) {
                    be.icon = getNonNull(be.icon, nameAndIcon.icon);
                    be.name = getNonNull(be.name, nameAndIcon.name);
                    be.mDefaultPackageName = getNonNull(
                        be.mDefaultPackageName, nameAndIcon.packageName);
                    be.icon = nameAndIcon.icon;
                    be.name = nameAndIcon.name;
                    be.mDefaultPackageName = nameAndIcon.packageName;
                }
            }
        }
@@ -589,8 +588,4 @@ public class BatteryEntry {
        }
        return new NameAndIcon(name, null /* icon */, iconId);
    }

    private static <T> T getNonNull(T originalObj, T newObj) {
        return newObj != null ? newObj : originalObj;
    }
}
+10 −0
Original line number Diff line number Diff line
@@ -113,6 +113,16 @@ public class BatteryHistEntry {
        return mIsValidEntry;
    }

    /** Whether this {@link BatteryHistEntry} is user consumer or not. */
    public boolean isUserEntry() {
        return mConsumerType == ConvertUtils.CONSUMER_TYPE_USER_BATTERY;
    }

    /** Whether this {@link BatteryHistEntry} is app consumer or not. */
    public boolean isAppEntry() {
        return mConsumerType == ConvertUtils.CONSUMER_TYPE_UID_BATTERY;
    }

    /** Gets an identifier to represent this {@link BatteryHistEntry}. */
    public String getKey() {
        if (mKey == null) {
Loading