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

Commit fba915be authored by Adam Lesinski's avatar Adam Lesinski Committed by Android (Google) Code Review
Browse files

Merge "Merge dex2oat with app being installed" into mnc-dev

parents a8c4db48 4444fb85
Loading
Loading
Loading
Loading
+7 −1
Original line number Original line Diff line number Diff line
@@ -27,9 +27,15 @@ import android.util.SparseArray;
 */
 */
public class FakeUid extends Uid {
public class FakeUid extends Uid {


    private final int mUid;

    public FakeUid(int uid) {
        mUid = uid;
    }

    @Override
    @Override
    public int getUid() {
    public int getUid() {
        return Process.FIRST_APPLICATION_UID;
        return mUid;
    }
    }


    @Override
    @Override
+72 −3
Original line number Original line Diff line number Diff line
@@ -23,11 +23,13 @@ import android.os.Build;
import android.os.Bundle;
import android.os.Bundle;
import android.os.Handler;
import android.os.Handler;
import android.os.Message;
import android.os.Message;
import android.os.Process;
import android.os.UserHandle;
import android.os.UserHandle;
import android.preference.Preference;
import android.preference.Preference;
import android.preference.PreferenceGroup;
import android.preference.PreferenceGroup;
import android.preference.PreferenceScreen;
import android.preference.PreferenceScreen;
import android.text.TextUtils;
import android.text.TextUtils;
import android.util.SparseArray;
import android.util.TypedValue;
import android.util.TypedValue;
import android.view.Menu;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuInflater;
@@ -44,6 +46,8 @@ import com.android.settings.SettingsActivity;
import com.android.settings.applications.ManageApplications;
import com.android.settings.applications.ManageApplications;


import java.util.ArrayList;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.List;


/**
/**
@@ -178,6 +182,64 @@ public class PowerUsageSummary extends PowerUsageBase {
        mAppListGroup.addPreference(notAvailable);
        mAppListGroup.addPreference(notAvailable);
    }
    }


    /**
     * We want to coalesce some UIDs. For example, dex2oat runs under a shared gid that
     * exists for all users of the same app. We detect this case and merge the power use
     * for dex2oat to the device OWNER's use of the app.
     * @return A sorted list of app's using power.
     */
    private static List<BatterySipper> getCoalescedUsageList(final List<BatterySipper> sippers) {
        final SparseArray<BatterySipper> uidList = new SparseArray<>();

        final ArrayList<BatterySipper> results = new ArrayList<>();
        final int numSippers = sippers.size();
        for (int i = 0; i < numSippers; i++) {
            final BatterySipper sipper = sippers.get(i);
            if (sipper.getUid() > 0) {
                int realUid = sipper.getUid();
                if (sipper.getUid() >= Process.FIRST_SHARED_APPLICATION_GID &&
                        sipper.getUid() <= Process.LAST_SHARED_APPLICATION_GID) {
                    // This is a shared gid being used to do work on behalf of an app across all
                    // users. But we'll blame the power on the device OWNER.
                    realUid = UserHandle.getUid(UserHandle.USER_OWNER,
                            UserHandle.getAppIdFromSharedAppGid(sipper.getUid()));
                }

                int index = uidList.indexOfKey(realUid);
                if (index < 0) {
                    uidList.put(realUid, sipper);
                } else {
                    BatterySipper existingSipper = uidList.valueAt(index);
                    if (existingSipper.getUid() >= Process.FIRST_SHARED_APPLICATION_GID &&
                            existingSipper.getUid() <= Process.FIRST_SHARED_APPLICATION_GID) {
                        // If the app already under this uid is a dex2oat run, then combine and
                        // substitute it with the actual app.
                        sipper.add(existingSipper);
                        uidList.setValueAt(index, sipper);
                    } else {
                        existingSipper.add(sipper);
                    }
                }
            } else {
                results.add(sipper);
            }
        }

        final int numUidSippers = uidList.size();
        for (int i = 0; i < numUidSippers; i++) {
            results.add(uidList.valueAt(i));
        }

        // The sort order must have changed, so re-sort based on total power use.
        Collections.sort(results, new Comparator<BatterySipper>() {
            @Override
            public int compare(BatterySipper a, BatterySipper b) {
                return Double.compare(b.totalPowerMah, a.totalPowerMah);
            }
        });
        return results;
    }

    protected void refreshStats() {
    protected void refreshStats() {
        super.refreshStats();
        super.refreshStats();
        updatePreference(mHistPref);
        updatePreference(mHistPref);
@@ -194,8 +256,8 @@ public class PowerUsageSummary extends PowerUsageBase {
        int colorControl = getContext().getColor(value.resourceId);
        int colorControl = getContext().getColor(value.resourceId);


        if (averagePower >= MIN_AVERAGE_POWER_THRESHOLD_MILLI_AMP || USE_FAKE_DATA) {
        if (averagePower >= MIN_AVERAGE_POWER_THRESHOLD_MILLI_AMP || USE_FAKE_DATA) {
            final List<BatterySipper> usageList = USE_FAKE_DATA ? getFakeStats()
            final List<BatterySipper> usageList = getCoalescedUsageList(
                    : mStatsHelper.getUsageList();
                    USE_FAKE_DATA ? getFakeStats() : mStatsHelper.getUsageList());


            final int dischargeAmount = USE_FAKE_DATA ? 5000
            final int dischargeAmount = USE_FAKE_DATA ? 5000
                    : stats != null ? stats.getDischargeAmount(mStatsType) : 0;
                    : stats != null ? stats.getDischargeAmount(mStatsType) : 0;
@@ -282,8 +344,15 @@ public class PowerUsageSummary extends PowerUsageBase {
            stats.add(new BatterySipper(type, null, use));
            stats.add(new BatterySipper(type, null, use));
            use += 5;
            use += 5;
        }
        }
        BatterySipper sipper = new BatterySipper(DrainType.APP, new FakeUid(), use);
        stats.add(new BatterySipper(DrainType.APP,
                new FakeUid(Process.FIRST_APPLICATION_UID), use));

        // Simulate dex2oat process.
        BatterySipper sipper = new BatterySipper(DrainType.APP,
                new FakeUid(UserHandle.getSharedAppGid(Process.FIRST_APPLICATION_UID)), 10.0f);
        sipper.packageWithHighestDrain = "dex2oat";
        stats.add(sipper);
        stats.add(sipper);

        return stats;
        return stats;
    }
    }