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

Commit c5688f4a 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: 98040763

parents 829992b6 98040763
Loading
Loading
Loading
Loading
+23 −4
Original line number Original line Diff line number Diff line
@@ -44,6 +44,9 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Arrays;
import java.util.List;
import java.util.List;
import java.util.concurrent.CompletableFuture;
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 {
public class Installer extends SystemService {
    private static final String TAG = "Installer";
    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 =
    public static final int FLAG_CLEAR_APP_DATA_KEEP_ART_PROFILES =
            IInstalld.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 final boolean mIsolated;
    private volatile boolean mDeferSetFirstBoot;
    private volatile boolean mDeferSetFirstBoot;
    private volatile IInstalld mInstalld;
    private volatile IInstalld mInstalld = null;
    private volatile CompletableFuture<IInstalld> mInstalldFuture = new CompletableFuture<>();
    private volatile Object mWarnIfHeld;
    private volatile Object mWarnIfHeld;


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


        if (binder != null) {
        if (binder != null) {
            mInstalld = IInstalld.Stub.asInterface(binder);
            IInstalld installd = IInstalld.Stub.asInterface(binder);
            mInstalld = installd;
            mInstalldFuture.complete(installd);
            try {
            try {
                invalidateMounts();
                invalidateMounts();
                executeDeferredActions();
                executeDeferredActions();
@@ -202,9 +212,18 @@ public class Installer extends SystemService {
        if (mIsolated) {
        if (mIsolated) {
            Slog.i(TAG, "Ignoring request because this installer is isolated");
            Slog.i(TAG, "Ignoring request because this installer is isolated");
            return false;
            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.
    // We explicitly do NOT set previousAppId because the default value should always be 0.