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

Commit 59d1c943 authored by Philip P. Moltmann's avatar Philip P. Moltmann Committed by Android (Google) Code Review
Browse files

Merge "If the print spooler gets started onUserUnlock use less of a priority...

Merge "If the print spooler gets started onUserUnlock use less of a priority to have less impact on the system." into nyc-dev
parents b5be5ec3 e8ae1548
Loading
Loading
Loading
Loading
+33 −26
Original line number Diff line number Diff line
@@ -129,7 +129,7 @@ public final class PrintManagerService extends SystemService {
                }
                resolvedAppId = resolveCallingAppEnforcingPermissions(appId);
                resolvedPackageName = resolveCallingPackageNameEnforcingSecurity(packageName);
                userState = getOrCreateUserStateLocked(resolvedUserId);
                userState = getOrCreateUserStateLocked(resolvedUserId, false);
            }
            final long identity = Binder.clearCallingIdentity();
            try {
@@ -151,7 +151,7 @@ public final class PrintManagerService extends SystemService {
                    return null;
                }
                resolvedAppId = resolveCallingAppEnforcingPermissions(appId);
                userState = getOrCreateUserStateLocked(resolvedUserId);
                userState = getOrCreateUserStateLocked(resolvedUserId, false);
            }
            final long identity = Binder.clearCallingIdentity();
            try {
@@ -176,7 +176,7 @@ public final class PrintManagerService extends SystemService {
                    return null;
                }
                resolvedAppId = resolveCallingAppEnforcingPermissions(appId);
                userState = getOrCreateUserStateLocked(resolvedUserId);
                userState = getOrCreateUserStateLocked(resolvedUserId, false);
            }
            final long identity = Binder.clearCallingIdentity();
            try {
@@ -197,7 +197,7 @@ public final class PrintManagerService extends SystemService {
                if (resolveCallingProfileParentLocked(resolvedUserId) != getCurrentUserId()) {
                    return null;
                }
                userState = getOrCreateUserStateLocked(resolvedUserId);
                userState = getOrCreateUserStateLocked(resolvedUserId, false);
            }
            final long identity = Binder.clearCallingIdentity();
            try {
@@ -222,7 +222,7 @@ public final class PrintManagerService extends SystemService {
                    return;
                }
                resolvedAppId = resolveCallingAppEnforcingPermissions(appId);
                userState = getOrCreateUserStateLocked(resolvedUserId);
                userState = getOrCreateUserStateLocked(resolvedUserId, false);
            }
            final long identity = Binder.clearCallingIdentity();
            try {
@@ -247,7 +247,7 @@ public final class PrintManagerService extends SystemService {
                    return;
                }
                resolvedAppId = resolveCallingAppEnforcingPermissions(appId);
                userState = getOrCreateUserStateLocked(resolvedUserId);
                userState = getOrCreateUserStateLocked(resolvedUserId, false);
            }
            final long identity = Binder.clearCallingIdentity();
            try {
@@ -269,7 +269,7 @@ public final class PrintManagerService extends SystemService {
                if (resolveCallingProfileParentLocked(resolvedUserId) != getCurrentUserId()) {
                    return null;
                }
                userState = getOrCreateUserStateLocked(resolvedUserId);
                userState = getOrCreateUserStateLocked(resolvedUserId, false);
            }
            final long identity = Binder.clearCallingIdentity();
            try {
@@ -303,7 +303,7 @@ public final class PrintManagerService extends SystemService {
                if (resolveCallingProfileParentLocked(resolvedUserId) != getCurrentUserId()) {
                    return;
                }
                userState = getOrCreateUserStateLocked(resolvedUserId);
                userState = getOrCreateUserStateLocked(resolvedUserId, false);
            }
            final long identity = Binder.clearCallingIdentity();
            try {
@@ -325,7 +325,7 @@ public final class PrintManagerService extends SystemService {
                if (resolveCallingProfileParentLocked(resolvedUserId) != getCurrentUserId()) {
                    return;
                }
                userState = getOrCreateUserStateLocked(resolvedUserId);
                userState = getOrCreateUserStateLocked(resolvedUserId, false);
            }
            final long identity = Binder.clearCallingIdentity();
            try {
@@ -347,7 +347,7 @@ public final class PrintManagerService extends SystemService {
                if (resolveCallingProfileParentLocked(resolvedUserId) != getCurrentUserId()) {
                    return;
                }
                userState = getOrCreateUserStateLocked(resolvedUserId);
                userState = getOrCreateUserStateLocked(resolvedUserId, false);
            }
            final long identity = Binder.clearCallingIdentity();
            try {
@@ -373,7 +373,7 @@ public final class PrintManagerService extends SystemService {
                if (resolveCallingProfileParentLocked(resolvedUserId) != getCurrentUserId()) {
                    return;
                }
                userState = getOrCreateUserStateLocked(resolvedUserId);
                userState = getOrCreateUserStateLocked(resolvedUserId, false);
            }
            final long identity = Binder.clearCallingIdentity();
            try {
@@ -394,7 +394,7 @@ public final class PrintManagerService extends SystemService {
                if (resolveCallingProfileParentLocked(resolvedUserId) != getCurrentUserId()) {
                    return;
                }
                userState = getOrCreateUserStateLocked(resolvedUserId);
                userState = getOrCreateUserStateLocked(resolvedUserId, false);
            }
            final long identity = Binder.clearCallingIdentity();
            try {
@@ -415,7 +415,7 @@ public final class PrintManagerService extends SystemService {
                if (resolveCallingProfileParentLocked(resolvedUserId) != getCurrentUserId()) {
                    return;
                }
                userState = getOrCreateUserStateLocked(resolvedUserId);
                userState = getOrCreateUserStateLocked(resolvedUserId, false);
            }
            final long identity = Binder.clearCallingIdentity();
            try {
@@ -436,7 +436,7 @@ public final class PrintManagerService extends SystemService {
                if (resolveCallingProfileParentLocked(resolvedUserId) != getCurrentUserId()) {
                    return;
                }
                userState = getOrCreateUserStateLocked(resolvedUserId);
                userState = getOrCreateUserStateLocked(resolvedUserId, false);
            }
            final long identity = Binder.clearCallingIdentity();
            try {
@@ -457,7 +457,7 @@ public final class PrintManagerService extends SystemService {
                if (resolveCallingProfileParentLocked(resolvedUserId) != getCurrentUserId()) {
                    return;
                }
                userState = getOrCreateUserStateLocked(resolvedUserId);
                userState = getOrCreateUserStateLocked(resolvedUserId, false);
            }
            final long identity = Binder.clearCallingIdentity();
            try {
@@ -481,7 +481,7 @@ public final class PrintManagerService extends SystemService {
                    return;
                }
                resolvedAppId = resolveCallingAppEnforcingPermissions(appId);
                userState = getOrCreateUserStateLocked(resolvedUserId);
                userState = getOrCreateUserStateLocked(resolvedUserId, false);
            }
            final long identity = Binder.clearCallingIdentity();
            try {
@@ -503,7 +503,7 @@ public final class PrintManagerService extends SystemService {
                if (resolveCallingProfileParentLocked(resolvedUserId) != getCurrentUserId()) {
                    return;
                }
                userState = getOrCreateUserStateLocked(resolvedUserId);
                userState = getOrCreateUserStateLocked(resolvedUserId, false);
            }
            final long identity = Binder.clearCallingIdentity();
            try {
@@ -525,7 +525,7 @@ public final class PrintManagerService extends SystemService {
                if (resolveCallingProfileParentLocked(resolvedUserId) != getCurrentUserId()) {
                    return;
                }
                userState = getOrCreateUserStateLocked(resolvedUserId);
                userState = getOrCreateUserStateLocked(resolvedUserId, false);
            }
            final long identity = Binder.clearCallingIdentity();
            try {
@@ -547,7 +547,7 @@ public final class PrintManagerService extends SystemService {
                if (resolveCallingProfileParentLocked(resolvedUserId) != getCurrentUserId()) {
                    return;
                }
                userState = getOrCreateUserStateLocked(resolvedUserId);
                userState = getOrCreateUserStateLocked(resolvedUserId, false);
            }
            final long identity = Binder.clearCallingIdentity();
            try {
@@ -661,7 +661,7 @@ public final class PrintManagerService extends SystemService {
                @Override
                public void onPackageModified(String packageName) {
                    if (!mUserManager.isUserUnlocked(getChangingUserId())) return;
                    UserState userState = getOrCreateUserStateLocked(getChangingUserId());
                    UserState userState = getOrCreateUserStateLocked(getChangingUserId(), false);

                    synchronized (mLock) {
                        if (hadPrintService(userState, packageName)
@@ -676,7 +676,7 @@ public final class PrintManagerService extends SystemService {
                @Override
                public void onPackageRemoved(String packageName, int uid) {
                    if (!mUserManager.isUserUnlocked(getChangingUserId())) return;
                    UserState userState = getOrCreateUserStateLocked(getChangingUserId());
                    UserState userState = getOrCreateUserStateLocked(getChangingUserId(), false);

                    synchronized (mLock) {
                        if (hadPrintService(userState, packageName)) {
@@ -695,7 +695,8 @@ public final class PrintManagerService extends SystemService {
                        // A background user/profile's print jobs are running but there is
                        // no UI shown. Hence, if the packages of such a user change we need
                        // to handle it as the change may affect ongoing print jobs.
                        UserState userState = getOrCreateUserStateLocked(getChangingUserId());
                        UserState userState = getOrCreateUserStateLocked(getChangingUserId(),
                                false);
                        boolean stoppedSomePackages = false;

                        List<PrintServiceInfo> enabledServices = userState
@@ -730,7 +731,8 @@ public final class PrintManagerService extends SystemService {
                    if (!mUserManager.isUserUnlocked(getChangingUserId())) return;
                    synchronized (mLock) {
                        if (hasPrintService(packageName)) {
                            UserState userState = getOrCreateUserStateLocked(getChangingUserId());
                            UserState userState = getOrCreateUserStateLocked(getChangingUserId(),
                                    false);
                            userState.updateIfNeededLocked();
                        }
                    }
@@ -742,7 +744,7 @@ public final class PrintManagerService extends SystemService {
                    UserHandle.ALL, true);
        }

        private UserState getOrCreateUserStateLocked(int userId) {
        private UserState getOrCreateUserStateLocked(int userId, boolean lowPriority) {
            if (!mUserManager.isUserUnlocked(userId)) {
                throw new IllegalStateException(
                        "User " + userId + " must be unlocked for printing to be available");
@@ -750,9 +752,14 @@ public final class PrintManagerService extends SystemService {

            UserState userState = mUserStates.get(userId);
            if (userState == null) {
                userState = new UserState(mContext, userId, mLock);
                userState = new UserState(mContext, userId, mLock, lowPriority);
                mUserStates.put(userId, userState);
            }

            if (!lowPriority) {
                userState.increasePriority();
            }

            return userState;
        }

@@ -764,7 +771,7 @@ public final class PrintManagerService extends SystemService {
                public void run() {
                    UserState userState;
                    synchronized (mLock) {
                        userState = getOrCreateUserStateLocked(userId);
                        userState = getOrCreateUserStateLocked(userId, true);
                        userState.updateIfNeededLocked();
                    }
                    // This is the first time we switch to this user after boot, so
+38 −4
Original line number Diff line number Diff line
@@ -98,6 +98,8 @@ final class RemotePrintSpooler {

    private final PrintSpoolerCallbacks mCallbacks;

    private boolean mIsLowPriority;

    private IPrintSpooler mRemoteInstance;

    private boolean mDestroyed;
@@ -110,17 +112,42 @@ final class RemotePrintSpooler {
        public void onPrintJobStateChanged(PrintJobInfo printJob);
    }

    public RemotePrintSpooler(Context context, int userId,
    public RemotePrintSpooler(Context context, int userId, boolean lowPriority,
            PrintSpoolerCallbacks callbacks) {
        mContext = context;
        mUserHandle = new UserHandle(userId);
        mCallbacks = callbacks;
        mIsLowPriority = lowPriority;
        mClient = new PrintSpoolerClient(this);
        mIntent = new Intent();
        mIntent.setComponent(new ComponentName(PrintManager.PRINT_SPOOLER_PACKAGE_NAME,
                PrintManager.PRINT_SPOOLER_PACKAGE_NAME + ".model.PrintSpoolerService"));
    }

    public void increasePriority() {
        if (mIsLowPriority) {
            mIsLowPriority = false;

            synchronized (mLock) {
                throwIfDestroyedLocked();

                while (!mCanUnbind) {
                    try {
                        mLock.wait();
                    } catch (InterruptedException e) {
                        Slog.e(LOG_TAG, "Interrupted while waiting for operation to complete");
                    }
                }

                if (DEBUG) {
                    Slog.i(LOG_TAG, "Unbinding as previous binding was low priority");
                }

                unbindLocked();
            }
        }
    }

    public final List<PrintJobInfo> getPrintJobInfos(ComponentName componentName, int state,
            int appId) {
        throwIfCalledOnMainThread();
@@ -579,11 +606,18 @@ final class RemotePrintSpooler {
            return;
        }
        if (DEBUG) {
            Slog.i(LOG_TAG, "[user: " + mUserHandle.getIdentifier() + "] bindLocked()");
            Slog.i(LOG_TAG, "[user: " + mUserHandle.getIdentifier() + "] bindLocked() " +
                    (mIsLowPriority ? "low priority" : ""));
        }

        int flags;
        if (mIsLowPriority) {
            flags = Context.BIND_AUTO_CREATE;
        } else {
            flags = Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE;
        }

        mContext.bindServiceAsUser(mIntent, mServiceConnection,
                Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE, mUserHandle);
        mContext.bindServiceAsUser(mIntent, mServiceConnection, flags, mUserHandle);

        final long startMillis = SystemClock.uptimeMillis();
        while (true) {
+6 −2
Original line number Diff line number Diff line
@@ -126,11 +126,11 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks {

    private boolean mDestroyed;

    public UserState(Context context, int userId, Object lock) {
    public UserState(Context context, int userId, Object lock, boolean lowPriority) {
        mContext = context;
        mUserId = userId;
        mLock = lock;
        mSpooler = new RemotePrintSpooler(context, userId, this);
        mSpooler = new RemotePrintSpooler(context, userId, lowPriority, this);
        mHandler = new UserStateHandler(context.getMainLooper());

        synchronized (mLock) {
@@ -145,6 +145,10 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks {
        }
    }

    public void increasePriority() {
        mSpooler.increasePriority();
    }

    @Override
    public void onPrintJobQueued(PrintJobInfo printJob) {
        final RemotePrintService service;