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

Commit 0137c3da authored by Amith Yamasani's avatar Amith Yamasani Committed by Android (Google) Code Review
Browse files

Merge "Clean up App Standby code" into nyc-dev

parents bcac3bd7 ca5d6d2a
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -1033,9 +1033,18 @@ public class DevicePolicyManager {
     * @hide
     */
    public boolean packageHasActiveAdmins(String packageName) {
        return packageHasActiveAdmins(packageName, myUserId());
    }

    /**
     * Used by package administration code to determine if a package can be stopped
     * or uninstalled.
     * @hide
     */
    public boolean packageHasActiveAdmins(String packageName, int userId) {
        if (mService != null) {
            try {
                return mService.packageHasActiveAdmins(packageName, myUserId());
                return mService.packageHasActiveAdmins(packageName, userId);
            } catch (RemoteException e) {
                Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e);
            }
+60 −46
Original line number Diff line number Diff line
@@ -74,6 +74,7 @@ import com.android.internal.annotations.GuardedBy;
import com.android.internal.app.IBatteryStats;
import com.android.internal.os.BackgroundThread;
import com.android.internal.os.SomeArgs;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.IndentingPrintWriter;
import com.android.server.SystemService;

@@ -125,6 +126,7 @@ public class UsageStatsService extends SystemService implements
    Handler mHandler;
    AppOpsManager mAppOps;
    UserManager mUserManager;
    PackageManager mPackageManager;
    AppWidgetManager mAppWidgetManager;
    IDeviceIdleController mDeviceIdleController;
    private DisplayManager mDisplayManager;
@@ -157,7 +159,7 @@ public class UsageStatsService extends SystemService implements
    public void onStart() {
        mAppOps = (AppOpsManager) getContext().getSystemService(Context.APP_OPS_SERVICE);
        mUserManager = (UserManager) getContext().getSystemService(Context.USER_SERVICE);

        mPackageManager = getContext().getPackageManager();
        mHandler = new H(BackgroundThread.get().getLooper());

        File systemDataDir = new File(Environment.getDataDirectory(), "system");
@@ -296,9 +298,8 @@ public class UsageStatsService extends SystemService implements
    private void initializeDefaultsForSystemApps(int userId) {
        Slog.d(TAG, "Initializing defaults for system apps on user " + userId);
        final long elapsedRealtime = SystemClock.elapsedRealtime();
        List<PackageInfo> packages = getContext().getPackageManager().getInstalledPackagesAsUser(
                PackageManager.MATCH_DISABLED_COMPONENTS
                | PackageManager.MATCH_UNINSTALLED_PACKAGES,
        List<PackageInfo> packages = mPackageManager.getInstalledPackagesAsUser(
                PackageManager.MATCH_DISABLED_COMPONENTS,
                userId);
        final int packageCount = packages.size();
        for (int i = 0; i < packageCount; i++) {
@@ -398,30 +399,37 @@ public class UsageStatsService extends SystemService implements
        }
    }

    /** Check all running users' or specified user's apps to see if they enter an idle state. */
    void checkIdleStates(int checkUserId) {
    /**
     * Check all running users' or specified user's apps to see if they enter an idle state.
     * @return Returns whether checking should continue periodically.
     */
    boolean checkIdleStates(int checkUserId) {
        if (!mAppIdleEnabled) {
            return;
            return false;
        }

        final int[] userIds;
        final int[] runningUserIds;
        try {
            if (checkUserId == UserHandle.USER_ALL) {
                userIds = ActivityManagerNative.getDefault().getRunningUserIds();
            } else {
                userIds = new int[] { checkUserId };
            runningUserIds = ActivityManagerNative.getDefault().getRunningUserIds();
            if (checkUserId != UserHandle.USER_ALL
                    && !ArrayUtils.contains(runningUserIds, checkUserId)) {
                return false;
            }
        } catch (RemoteException re) {
            return;
            return false;
        }

        final long elapsedRealtime = SystemClock.elapsedRealtime();
        for (int i = 0; i < userIds.length; i++) {
            final int userId = userIds[i];
            List<PackageInfo> packages =
                    getContext().getPackageManager().getInstalledPackagesAsUser(
                            PackageManager.MATCH_DISABLED_COMPONENTS
                                | PackageManager.MATCH_UNINSTALLED_PACKAGES,
        for (int i = 0; i < runningUserIds.length; i++) {
            final int userId = runningUserIds[i];
            if (checkUserId != UserHandle.USER_ALL && checkUserId != userId) {
                continue;
            }
            if (DEBUG) {
                Slog.d(TAG, "Checking idle state for user " + userId);
            }
            List<PackageInfo> packages = mPackageManager.getInstalledPackagesAsUser(
                    PackageManager.MATCH_DISABLED_COMPONENTS,
                    userId);
            synchronized (mLock) {
                final int packageCount = packages.size();
@@ -439,6 +447,11 @@ public class UsageStatsService extends SystemService implements
                }
            }
        }
        if (DEBUG) {
            Slog.d(TAG, "checkIdleStates took "
                    + (SystemClock.elapsedRealtime() - elapsedRealtime));
        }
        return true;
    }

    /** Check if it's been a while since last parole and let idle apps do some work */
@@ -459,7 +472,7 @@ public class UsageStatsService extends SystemService implements

    private void notifyBatteryStats(String packageName, int userId, boolean idle) {
        try {
            final int uid = AppGlobals.getPackageManager().getPackageUid(packageName,
            final int uid = mPackageManager.getPackageUidAsUser(packageName,
                    PackageManager.MATCH_UNINSTALLED_PACKAGES, userId);
            if (idle) {
                mBatteryStats.noteEvent(BatteryStats.HistoryItem.EVENT_PACKAGE_INACTIVE,
@@ -468,7 +481,7 @@ public class UsageStatsService extends SystemService implements
                mBatteryStats.noteEvent(BatteryStats.HistoryItem.EVENT_PACKAGE_ACTIVE,
                        packageName, uid);
            }
        } catch (RemoteException re) {
        } catch (NameNotFoundException | RemoteException e) {
        }
    }

@@ -592,7 +605,7 @@ public class UsageStatsService extends SystemService implements
            // Only force the sync adapters to active if the provider is not in the same package and
            // the sync adapter is a system package.
            try {
                PackageInfo pi = AppGlobals.getPackageManager().getPackageInfo(
                PackageInfo pi = mPackageManager.getPackageInfoAsUser(
                        packageName, PackageManager.MATCH_SYSTEM_ONLY, userId);
                if (pi == null || pi.applicationInfo == null) {
                    continue;
@@ -600,7 +613,7 @@ public class UsageStatsService extends SystemService implements
                if (!packageName.equals(providerPkgName)) {
                    forceIdleState(packageName, userId, false);
                }
            } catch (RemoteException re) {
            } catch (NameNotFoundException e) {
                // Shouldn't happen
            }
        }
@@ -725,7 +738,7 @@ public class UsageStatsService extends SystemService implements

    int getAppId(String packageName) {
        try {
            ApplicationInfo ai = getContext().getPackageManager().getApplicationInfo(packageName,
            ApplicationInfo ai = mPackageManager.getApplicationInfo(packageName,
                    PackageManager.MATCH_UNINSTALLED_PACKAGES
                            | PackageManager.MATCH_DISABLED_COMPONENTS);
            return ai.uid;
@@ -772,12 +785,8 @@ public class UsageStatsService extends SystemService implements
            }
        } catch (RemoteException re) {
        }
        // TODO: Optimize this check
        if (isActiveDeviceAdmin(packageName, userId)) {
            return false;
        }

        if (isCarrierApp(packageName)) {
        if (isActiveDeviceAdmin(packageName, userId)) {
            return false;
        }

@@ -790,7 +799,17 @@ public class UsageStatsService extends SystemService implements
            return false;
        }

        return isAppIdleUnfiltered(packageName, userId, elapsedRealtime);
        if (!isAppIdleUnfiltered(packageName, userId, elapsedRealtime)) {
            return false;
        }

        // Check this last, as it is the most expensive check
        // TODO: Optimize this by fetching the carrier privileged apps ahead of time
        if (isCarrierApp(packageName)) {
            return false;
        }

        return true;
    }

    int[] getIdleUidsForUser(int userId) {
@@ -803,7 +822,7 @@ public class UsageStatsService extends SystemService implements
        List<ApplicationInfo> apps;
        try {
            ParceledListSlice<ApplicationInfo> slice = AppGlobals.getPackageManager()
                    .getInstalledApplications(PackageManager.MATCH_UNINSTALLED_PACKAGES, userId);
                    .getInstalledApplications(/* flags= */ 0, userId);
            if (slice == null) {
                return new int[0];
            }
@@ -833,7 +852,9 @@ public class UsageStatsService extends SystemService implements
                uidStates.setValueAt(index, value + 1 + (idle ? 1<<16 : 0));
            }
        }

        if (DEBUG) {
            Slog.d(TAG, "getIdleUids took " + (SystemClock.elapsedRealtime() - elapsedRealtime));
        }
        int numIdle = 0;
        for (int i = uidStates.size() - 1; i >= 0; i--) {
            int value = uidStates.valueAt(i);
@@ -865,15 +886,7 @@ public class UsageStatsService extends SystemService implements
    private boolean isActiveDeviceAdmin(String packageName, int userId) {
        DevicePolicyManager dpm = getContext().getSystemService(DevicePolicyManager.class);
        if (dpm == null) return false;
        List<ComponentName> components = dpm.getActiveAdminsAsUser(userId);
        if (components == null) return false;
        final int size = components.size();
        for (int i = 0; i < size; i++) {
            if (components.get(i).getPackageName().equals(packageName)) {
                return true;
            }
        }
        return false;
        return dpm.packageHasActiveAdmins(packageName, userId);
    }

    private boolean isCarrierApp(String packageName) {
@@ -1011,10 +1024,11 @@ public class UsageStatsService extends SystemService implements
                    break;

                case MSG_CHECK_IDLE_STATES:
                    checkIdleStates(msg.arg1);
                    if (checkIdleStates(msg.arg1)) {
                        mHandler.sendMessageDelayed(mHandler.obtainMessage(
                                MSG_CHECK_IDLE_STATES, msg.arg1, 0),
                                mCheckIdleIntervalMillis);
                    }
                    break;

                case MSG_ONE_TIME_CHECK_IDLE_STATES: