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

Commit f2a884b8 authored by Wesley Wang's avatar Wesley Wang Committed by Android (Google) Code Review
Browse files

Merge "Make App info page support new battery entry" into sc-dev

parents 9598398d e1b1f676
Loading
Loading
Loading
Loading
+7 −5
Original line number Diff line number Diff line
@@ -10479,13 +10479,15 @@
        Allowing <xliff:g id="app_name" example="Settings">%1$s</xliff:g> to always run in the background may reduce battery life.
        \n\nYou can change this later from Settings > Apps &amp; notifications.</string>
    <!-- Summary of power usage for an app [CHAR LIMIT=NONE] -->
    <string name="battery_summary"><xliff:g id="percentage" example="2">%1$s</xliff:g> use for past 24 hours</string>
    <!-- Title of a group of settings that let you manage settings that affect battery life [CHAR LIMIT=60] -->
    <string name="battery_power_management">Power management</string>
    <string name="battery_summary"><xliff:g id="percentage" example="2">%1$s</xliff:g> use since last full charge</string>
    <!-- Summary of power usage for an app within past 24 hr[CHAR LIMIT=NONE] -->
    <string name="battery_summary_24hr"><xliff:g id="percentage" example="2">%1$s</xliff:g> use for past 24 hours</string>
    <!-- Summary for app with no battery usage [CHAR LIMIT=NONE] -->
    <string name="no_battery_summary">No battery use for past 24 hours</string>
    <string name="no_battery_summary">No battery use since last full charge</string>
    <!-- Summary for app with no battery usage for past 24 hours [CHAR LIMIT=NONE] -->
    <string name="no_battery_summary_24hr">No battery use for past 24 hours</string>
    <!-- Link to an apps notification settings [CHAR LIMIT=50] -->
    <string name="app_notification_preferences">App settings</string>
+58 −6
Original line number Diff line number Diff line
@@ -18,11 +18,14 @@ package com.android.settings.applications.appinfo;

import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.AsyncTask;
import android.os.BatteryUsageStats;
import android.os.Bundle;
import android.os.UidBatteryConsumer;
import android.os.UserHandle;
import android.os.UserManager;
import android.util.Log;

import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
@@ -40,6 +43,8 @@ import com.android.settings.fuelgauge.BatteryDiffEntry;
import com.android.settings.fuelgauge.BatteryEntry;
import com.android.settings.fuelgauge.BatteryUsageStatsLoader;
import com.android.settings.fuelgauge.BatteryUtils;
import com.android.settings.fuelgauge.PowerUsageFeatureProvider;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnPause;
@@ -50,6 +55,7 @@ import java.util.List;
public class AppBatteryPreferenceController extends BasePreferenceController
        implements LifecycleObserver, OnResume, OnPause {

    private static final String TAG = "AppBatteryPreferenceController";
    private static final String KEY_BATTERY = "battery";

    @VisibleForTesting
@@ -61,13 +67,16 @@ public class AppBatteryPreferenceController extends BasePreferenceController
    BatteryUsageStats mBatteryUsageStats;
    @VisibleForTesting
    UidBatteryConsumer mUidBatteryConsumer;
    @VisibleForTesting
    BatteryDiffEntry mBatteryDiffEntry;
    @VisibleForTesting
    boolean mIsChartGraphEnabled;

    private Preference mPreference;
    private final AppInfoDashboardFragment mParent;
    private String mBatteryPercent;
    private final String mPackageName;
    private final int mUid;
    private BatteryDiffEntry mBatteryDiffEntry;
    private boolean mBatteryUsageStatsLoaded = false;
    private boolean mBatteryDiffEntriesLoaded = false;

@@ -78,6 +87,7 @@ public class AppBatteryPreferenceController extends BasePreferenceController
        mBatteryUtils = BatteryUtils.getInstance(mContext);
        mPackageName = packageName;
        mUid = uid;
        refreshFeatureFlag(mContext);
        if (lifecycle != null) {
            lifecycle.addObserver(this);
        }
@@ -108,7 +118,8 @@ public class AppBatteryPreferenceController extends BasePreferenceController
                    mParent.getActivity(),
                    mParent,
                    mBatteryDiffEntry,
                    mBatteryPercent,
                    Utils.formatPercentage(
                            mBatteryDiffEntry.getPercentOfTotal(), /* round */ true),
                    /*isValidToShowSummary=*/ true,
                    /*slotInformation=*/ null);
            return true;
@@ -120,8 +131,9 @@ public class AppBatteryPreferenceController extends BasePreferenceController
            final BatteryEntry entry = new BatteryEntry(mContext, /* handler */null, userManager,
                    mUidBatteryConsumer, /* isHidden */ false,
                    mUidBatteryConsumer.getUid(), /* packages */ null, mPackageName);
            AdvancedPowerUsageDetail.startBatteryDetailPage(mParent.getActivity(), mParent,
                    entry, mBatteryPercent);
            AdvancedPowerUsageDetail.startBatteryDetailPage(mParent.getActivity(), mParent, entry,
                    mIsChartGraphEnabled ? Utils.formatPercentage(0) : mBatteryPercent,
                    !mIsChartGraphEnabled);
        } else {
            AdvancedPowerUsageDetail.startBatteryDetailPage(mParent.getActivity(), mParent,
                    mPackageName);
@@ -161,12 +173,29 @@ public class AppBatteryPreferenceController extends BasePreferenceController
            @Override
            protected void onPostExecute(BatteryDiffEntry batteryDiffEntry) {
                mBatteryDiffEntry = batteryDiffEntry;
                mBatteryDiffEntriesLoaded = true;
                mPreference.setEnabled(mBatteryUsageStatsLoaded);
                updateBatteryWithDiffEntry();
            }
        }.execute();
    }

    @VisibleForTesting
    void updateBatteryWithDiffEntry() {
        if (mIsChartGraphEnabled) {
            if (mBatteryDiffEntry != null && mBatteryDiffEntry.mConsumePower > 0) {
                mBatteryPercent = Utils.formatPercentage(
                        mBatteryDiffEntry.getPercentOfTotal(), /* round */ true);
                mPreference.setSummary(mContext.getString(
                        R.string.battery_summary_24hr, mBatteryPercent));
            } else {
                mPreference.setSummary(
                        mContext.getString(R.string.no_battery_summary_24hr));
            }
        }

        mBatteryDiffEntriesLoaded = true;
        mPreference.setEnabled(mBatteryUsageStatsLoaded);
    }

    private void onLoadFinished() {
        if (mBatteryUsageStats == null) {
            return;
@@ -182,10 +211,33 @@ public class AppBatteryPreferenceController extends BasePreferenceController
        }
    }

    private void refreshFeatureFlag(Context context) {
        if (isWorkProfile(context)) {
            try {
                context = context.createPackageContextAsUser(
                        context.getPackageName(), 0, UserHandle.OWNER);
            } catch (PackageManager.NameNotFoundException e) {
                Log.e(TAG, "context.createPackageContextAsUser() fail: " + e);
            }
        }

        final PowerUsageFeatureProvider powerUsageFeatureProvider =
                FeatureFactory.getFactory(context).getPowerUsageFeatureProvider(context);
        mIsChartGraphEnabled = powerUsageFeatureProvider.isChartGraphEnabled(context);
    }

    private boolean isWorkProfile(Context context) {
        final UserManager userManager = context.getSystemService(UserManager.class);
        return userManager.isManagedProfile() && !userManager.isSystemUser();
    }

    @VisibleForTesting
    void updateBattery() {
        mBatteryUsageStatsLoaded = true;
        mPreference.setEnabled(mBatteryDiffEntriesLoaded);
        if (mIsChartGraphEnabled) {
            return;
        }
        if (isBatteryStatsAvailable()) {
            final int percentOfMax = (int) mBatteryUtils.calculateBatteryPercent(
                    mUidBatteryConsumer.getConsumedPower(), mBatteryUsageStats.getConsumedPower(),
+4 −3
Original line number Diff line number Diff line
@@ -157,7 +157,8 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements

    /** Launches battery details page for an individual battery consumer. */
    public static void startBatteryDetailPage(Activity caller,
            InstrumentedPreferenceFragment fragment, BatteryEntry entry, String usagePercent) {
            InstrumentedPreferenceFragment fragment, BatteryEntry entry, String usagePercent,
            boolean isValidToShowSummary) {
        final LaunchBatteryDetailPageArgs launchArgs = new LaunchBatteryDetailPageArgs();
        // configure the launch argument.
        launchArgs.mUsagePercent = usagePercent;
@@ -166,8 +167,8 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements
        launchArgs.mUid = entry.getUid();
        launchArgs.mIconId = entry.iconId;
        launchArgs.mConsumedPower = (int) entry.getConsumedPower();
        launchArgs.mForegroundTimeMs = entry.getTimeInForegroundMs();
        launchArgs.mBackgroundTimeMs = entry.getTimeInBackgroundMs();
        launchArgs.mForegroundTimeMs = isValidToShowSummary ? entry.getTimeInForegroundMs() : 0;
        launchArgs.mBackgroundTimeMs = isValidToShowSummary ? entry.getTimeInBackgroundMs() : 0;
        launchArgs.mIsUserEntry = entry.isUserEntry();
        startBatteryDetailPage(caller, fragment, launchArgs);
    }
+1 −1
Original line number Diff line number Diff line
@@ -188,7 +188,7 @@ public class BatteryAppListPreferenceController extends AbstractPreferenceContro
            PowerGaugePreference pgp = (PowerGaugePreference) preference;
            BatteryEntry entry = pgp.getInfo();
            AdvancedPowerUsageDetail.startBatteryDetailPage(mActivity,
                    mFragment, entry, pgp.getPercent());
                    mFragment, entry, pgp.getPercent(), /*isValidToShowSummary=*/ true);
            return true;
        }
        return false;
+27 −1
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@ import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;

import com.android.settings.SettingsActivity;
import com.android.settings.fuelgauge.BatteryDiffEntry;
import com.android.settings.fuelgauge.BatteryUtils;

import org.junit.Before;
@@ -76,6 +77,8 @@ public class AppBatteryPreferenceControllerTest {
    private PackageManager mPackageManager;
    @Mock
    private LoaderManager mLoaderManager;
    @Mock
    private BatteryDiffEntry mBatteryDiffEntry;

    private Context mContext;
    private AppInfoDashboardFragment mFragment;
@@ -134,7 +137,7 @@ public class AppBatteryPreferenceControllerTest {
        mController.updateBattery();

        assertThat(mBatteryPreference.getSummary())
            .isEqualTo("No battery use for past 24 hours");
            .isEqualTo("No battery use since last full charge");
    }

    @Test
@@ -147,6 +150,29 @@ public class AppBatteryPreferenceControllerTest {

        mController.updateBattery();

        assertThat(mBatteryPreference.getSummary()).isEqualTo("60% use since last full charge");
    }

    @Test
    public void updateBatteryWithDiffEntry_noConsumePower_summaryNo() {
        mController.displayPreference(mScreen);
        mController.mIsChartGraphEnabled = true;

        mController.updateBatteryWithDiffEntry();

        assertThat(mBatteryPreference.getSummary()).isEqualTo("No battery use for past 24 hours");
    }

    @Test
    public void updateBatteryWithDiffEntry_withConsumePower_summaryPercent() {
        mController.displayPreference(mScreen);
        mController.mIsChartGraphEnabled = true;
        mBatteryDiffEntry.mConsumePower = 1;
        mController.mBatteryDiffEntry = mBatteryDiffEntry;
        when(mBatteryDiffEntry.getPercentOfTotal()).thenReturn(60.0);

        mController.updateBatteryWithDiffEntry();

        assertThat(mBatteryPreference.getSummary()).isEqualTo("60% use for past 24 hours");
    }

Loading