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

Commit e1b1f676 authored by Wesley.CW Wang's avatar Wesley.CW Wang
Browse files

Make App info page support new battery entry

 - Add new battery entry to app info battery preference, support both
 legacy and new args, controlled by P/H
 - Add a method to check is work profile app or not, use owner context to
 query correct context for feature provider
 - Add string for new args

Bug: 178197718
Test: make RunSettingsRoboTests
Change-Id: Ic93142a0c5e2851917cb3e224340a6e3e81fd801
parent ad84b3dd
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