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

Commit 4b9d0558 authored by Alex Buynytskyy's avatar Alex Buynytskyy Committed by Automerger Merge Worker
Browse files

Merge "Make caller wait for installd to become available." into tm-dev am:...

Merge "Make caller wait for installd to become available." into tm-dev am: 98040763 am: c5688f4a

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



Change-Id: I4e97e6aab06ecd822ccd5aecd857d01eae4fb962
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 32cea411 c5688f4a
Loading
Loading
Loading
Loading
+23 −4
Original line number Diff line number Diff line
@@ -44,6 +44,9 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class Installer extends SystemService {
    private static final String TAG = "Installer";
@@ -118,9 +121,13 @@ public class Installer extends SystemService {
    public static final int FLAG_CLEAR_APP_DATA_KEEP_ART_PROFILES =
            IInstalld.FLAG_CLEAR_APP_DATA_KEEP_ART_PROFILES;

    private static final long CONNECT_RETRY_DELAY_MS = DateUtils.SECOND_IN_MILLIS;
    private static final long CONNECT_WAIT_MS = 10 * DateUtils.SECOND_IN_MILLIS;

    private final boolean mIsolated;
    private volatile boolean mDeferSetFirstBoot;
    private volatile IInstalld mInstalld;
    private volatile IInstalld mInstalld = null;
    private volatile CompletableFuture<IInstalld> mInstalldFuture = new CompletableFuture<>();
    private volatile Object mWarnIfHeld;

    public Installer(Context context) {
@@ -149,6 +156,7 @@ public class Installer extends SystemService {
    public void onStart() {
        if (mIsolated) {
            mInstalld = null;
            mInstalldFuture = null;
        } else {
            connect();
        }
@@ -168,7 +176,9 @@ public class Installer extends SystemService {
        }

        if (binder != null) {
            mInstalld = IInstalld.Stub.asInterface(binder);
            IInstalld installd = IInstalld.Stub.asInterface(binder);
            mInstalld = installd;
            mInstalldFuture.complete(installd);
            try {
                invalidateMounts();
                executeDeferredActions();
@@ -202,9 +212,18 @@ public class Installer extends SystemService {
        if (mIsolated) {
            Slog.i(TAG, "Ignoring request because this installer is isolated");
            return false;
        } else {
            return true;
        }

        if (mInstalld == null && mInstalldFuture != null) {
            try {
                Slog.i(TAG, "installd not ready, waiting for: " + CONNECT_WAIT_MS + "ms");
                mInstalld = mInstalldFuture.get(CONNECT_WAIT_MS, TimeUnit.MILLISECONDS);
            } catch (InterruptedException | ExecutionException | TimeoutException e) {
                Slog.e(TAG, "Ignoring request because this installer is not initialized", e);
            }
        }

        return mInstalld != null;
    }

    // We explicitly do NOT set previousAppId because the default value should always be 0.