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

Commit 4e14ca12 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Decouple FUSE mount from main thread for demo user" into rvc-dev am: 931d7d27

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/12261202

Change-Id: I90b8ffbf76d92bebf9404f8f4f41a93f4f6c5d3d
parents f336feb6 931d7d27
Loading
Loading
Loading
Loading
+35 −13
Original line number Original line Diff line number Diff line
@@ -29,6 +29,7 @@ import android.content.Context;
import android.content.Intent;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Bundle;
import android.os.HandlerThread;
import android.os.IBinder;
import android.os.IBinder;
import android.os.ParcelFileDescriptor;
import android.os.ParcelFileDescriptor;
import android.os.ParcelableException;
import android.os.ParcelableException;
@@ -64,9 +65,6 @@ public final class StorageUserConnection {
    private static final String TAG = "StorageUserConnection";
    private static final String TAG = "StorageUserConnection";


    private static final int DEFAULT_REMOTE_TIMEOUT_SECONDS = 20;
    private static final int DEFAULT_REMOTE_TIMEOUT_SECONDS = 20;
    // TODO(b/161702661): Workaround for demo user to have shorter timeout.
    // This allows the DevicePolicyManagerService#enableSystemApp call to succeed without ANR.
    private static final int DEMO_USER_REMOTE_TIMEOUT_SECONDS = 5;


    private final Object mLock = new Object();
    private final Object mLock = new Object();
    private final Context mContext;
    private final Context mContext;
@@ -75,6 +73,7 @@ public final class StorageUserConnection {
    private final ActiveConnection mActiveConnection = new ActiveConnection();
    private final ActiveConnection mActiveConnection = new ActiveConnection();
    private final boolean mIsDemoUser;
    private final boolean mIsDemoUser;
    @GuardedBy("mLock") private final Map<String, Session> mSessions = new HashMap<>();
    @GuardedBy("mLock") private final Map<String, Session> mSessions = new HashMap<>();
    @GuardedBy("mLock") @Nullable private HandlerThread mHandlerThread;


    public StorageUserConnection(Context context, int userId, StorageSessionController controller) {
    public StorageUserConnection(Context context, int userId, StorageSessionController controller) {
        mContext = Objects.requireNonNull(context);
        mContext = Objects.requireNonNull(context);
@@ -82,6 +81,10 @@ public final class StorageUserConnection {
        mSessionController = controller;
        mSessionController = controller;
        mIsDemoUser = LocalServices.getService(UserManagerInternal.class)
        mIsDemoUser = LocalServices.getService(UserManagerInternal.class)
                .getUserInfo(userId).isDemo();
                .getUserInfo(userId).isDemo();
        if (mIsDemoUser) {
            mHandlerThread = new HandlerThread("StorageUserConnectionThread-" + mUserId);
            mHandlerThread.start();
        }
    }
    }


    /**
    /**
@@ -188,6 +191,9 @@ public final class StorageUserConnection {
     */
     */
    public void close() {
    public void close() {
        mActiveConnection.close();
        mActiveConnection.close();
        if (mIsDemoUser) {
            mHandlerThread.quit();
        }
    }
    }


    /** Returns all created sessions. */
    /** Returns all created sessions. */
@@ -207,8 +213,7 @@ public final class StorageUserConnection {


    private void waitForLatch(CountDownLatch latch, String reason) throws TimeoutException {
    private void waitForLatch(CountDownLatch latch, String reason) throws TimeoutException {
        try {
        try {
            if (!latch.await(mIsDemoUser ? DEMO_USER_REMOTE_TIMEOUT_SECONDS
            if (!latch.await(DEFAULT_REMOTE_TIMEOUT_SECONDS, TimeUnit.SECONDS)) {
                            : DEFAULT_REMOTE_TIMEOUT_SECONDS, TimeUnit.SECONDS)) {
                // TODO(b/140025078): Call ActivityManager ANR API?
                // TODO(b/140025078): Call ActivityManager ANR API?
                Slog.wtf(TAG, "Failed to bind to the ExternalStorageService for user " + mUserId);
                Slog.wtf(TAG, "Failed to bind to the ExternalStorageService for user " + mUserId);
                throw new TimeoutException("Latch wait for " + reason + " elapsed");
                throw new TimeoutException("Latch wait for " + reason + " elapsed");
@@ -424,8 +429,12 @@ public final class StorageUserConnection {
                };
                };


                Slog.i(TAG, "Binding to the ExternalStorageService for user " + mUserId);
                Slog.i(TAG, "Binding to the ExternalStorageService for user " + mUserId);
                if (mContext.bindServiceAsUser(new Intent().setComponent(name), mServiceConnection,
                if (mIsDemoUser) {
                    // Schedule on a worker thread for demo user to avoid deadlock
                    if (mContext.bindServiceAsUser(new Intent().setComponent(name),
                                    mServiceConnection,
                                    Context.BIND_AUTO_CREATE | Context.BIND_IMPORTANT,
                                    Context.BIND_AUTO_CREATE | Context.BIND_IMPORTANT,
                                    mHandlerThread.getThreadHandler(),
                                    UserHandle.of(mUserId))) {
                                    UserHandle.of(mUserId))) {
                        Slog.i(TAG, "Bound to the ExternalStorageService for user " + mUserId);
                        Slog.i(TAG, "Bound to the ExternalStorageService for user " + mUserId);
                        return mLatch;
                        return mLatch;
@@ -434,6 +443,19 @@ public final class StorageUserConnection {
                        throw new ExternalStorageServiceException(
                        throw new ExternalStorageServiceException(
                                "Failed to bind to the ExternalStorageService for user " + mUserId);
                                "Failed to bind to the ExternalStorageService for user " + mUserId);
                    }
                    }
                } else {
                    if (mContext.bindServiceAsUser(new Intent().setComponent(name),
                                    mServiceConnection,
                                    Context.BIND_AUTO_CREATE | Context.BIND_IMPORTANT,
                                    UserHandle.of(mUserId))) {
                        Slog.i(TAG, "Bound to the ExternalStorageService for user " + mUserId);
                        return mLatch;
                    } else {
                        mIsConnecting = false;
                        throw new ExternalStorageServiceException(
                                "Failed to bind to the ExternalStorageService for user " + mUserId);
                    }
                }
            }
            }
        }
        }
    }
    }