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

Commit ac9155b2 authored by Philip P. Moltmann's avatar Philip P. Moltmann
Browse files

Report legacy status from installer

As we did in N.

Test: Performed successful and failed installations
Change-Id: I858f1552719e175e5d5f006099e722a55b70bb98
parent 3450ba84
Loading
Loading
Loading
Loading
+12 −6
Original line number Diff line number Diff line
@@ -81,7 +81,7 @@ class EventResultPersister {

    /** Call back when a result is received. Observer is removed when onResult it called. */
    interface EventResultObserver {
        void onResult(int status, @Nullable String message);
        void onResult(int status, int legacyStatus, @Nullable String message);
    }

    /**
@@ -106,13 +106,14 @@ class EventResultPersister {
                } else if ("result".equals(tagName)) {
                    int id = XmlUtils.readIntAttribute(parser, "id", 0);
                    int status = XmlUtils.readIntAttribute(parser, "status", 0);
                    int legacyStatus = XmlUtils.readIntAttribute(parser, "legacyStatus", 0);
                    String statusMessage = XmlUtils.readStringAttribute(parser, "statusMessage");

                    if (mResults.get(id) != null) {
                        throw new Exception("id " + id + " has two results");
                    }

                    mResults.put(id, new EventResult(status, statusMessage));
                    mResults.put(id, new EventResult(status, legacyStatus, statusMessage));
                } else {
                    throw new Exception("unexpected tag");
                }
@@ -143,6 +144,7 @@ class EventResultPersister {

        int id = intent.getIntExtra(EXTRA_ID, 0);
        String statusMessage = intent.getStringExtra(PackageInstaller.EXTRA_STATUS_MESSAGE);
        int legacyStatus = intent.getIntExtra(PackageInstaller.EXTRA_LEGACY_STATUS, 0);

        EventResultObserver observerToCall = null;
        synchronized (mLock) {
@@ -157,9 +159,9 @@ class EventResultPersister {
            }

            if (observerToCall != null) {
                observerToCall.onResult(status, statusMessage);
                observerToCall.onResult(status, legacyStatus, statusMessage);
            } else {
                mResults.put(id, new EventResult(status, statusMessage));
                mResults.put(id, new EventResult(status, legacyStatus, statusMessage));
                writeState();
            }
        }
@@ -205,6 +207,8 @@ class EventResultPersister {
                                        Integer.toString(results.keyAt(i)));
                                serializer.attribute(null, "status",
                                        Integer.toString(results.valueAt(i).status));
                                serializer.attribute(null, "legacyStatus",
                                        Integer.toString(results.valueAt(i).legacyStatus));
                                if (results.valueAt(i).message != null) {
                                    serializer.attribute(null, "statusMessage",
                                            results.valueAt(i).message);
@@ -271,7 +275,7 @@ class EventResultPersister {
            if (resultIndex >= 0) {
                EventResult result = mResults.valueAt(resultIndex);

                observer.onResult(result.status, result.message);
                observer.onResult(result.status, result.legacyStatus, result.message);
                mResults.removeAt(resultIndex);
                stateChanged = true;
            } else {
@@ -303,10 +307,12 @@ class EventResultPersister {
     */
    private class EventResult {
        public final int status;
        public final int legacyStatus;
        @Nullable public final String message;

        private EventResult(int status, @Nullable String message) {
        private EventResult(int status, int legacyStatus, @Nullable String message) {
            this.status = status;
            this.legacyStatus = legacyStatus;
            this.message = message;
        }
    }
+4 −1
Original line number Diff line number Diff line
@@ -76,9 +76,12 @@ public class InstallFailed extends Activity {
                PackageInstaller.STATUS_FAILURE);

        if (getIntent().getBooleanExtra(Intent.EXTRA_RETURN_RESULT, false)) {
            int legacyStatus = getIntent().getIntExtra(PackageInstaller.EXTRA_LEGACY_STATUS,
                    PackageManager.INSTALL_FAILED_INTERNAL_ERROR);

            // Return result if requested
            Intent result = new Intent();
            result.putExtra(Intent.EXTRA_INSTALL_RESULT, statusCode);
            result.putExtra(Intent.EXTRA_INSTALL_RESULT, legacyStatus);
            setResult(Activity.RESULT_FIRST_USER, result);
            finish();
        } else {
+15 −10
Original line number Diff line number Diff line
@@ -89,7 +89,7 @@ public class InstallInstalling extends Activity {
                getPackageManager().installExistingPackage(appInfo.packageName);
                launchSuccess();
            } catch (PackageManager.NameNotFoundException e) {
                launchFailure(PackageInstaller.STATUS_FAILURE_INVALID, null);
                launchFailure(PackageManager.INSTALL_FAILED_INTERNAL_ERROR, null);
            }
        } else {
            final File sourceFile = new File(mPackageURI.getPath());
@@ -140,13 +140,13 @@ public class InstallInstalling extends Activity {
                            .addObserver(this, EventResultPersister.GENERATE_NEW_ID,
                                    this::launchFinishBasedOnResult);
                } catch (EventResultPersister.OutOfIdsException e) {
                    launchFailure(PackageInstaller.STATUS_FAILURE, null);
                    launchFailure(PackageManager.INSTALL_FAILED_INTERNAL_ERROR, null);
                }

                try {
                    mSessionId = getPackageManager().getPackageInstaller().createSession(params);
                } catch (IOException e) {
                    launchFailure(PackageInstaller.STATUS_FAILURE, null);
                    launchFailure(PackageManager.INSTALL_FAILED_INTERNAL_ERROR, null);
                }
            }

@@ -185,13 +185,14 @@ public class InstallInstalling extends Activity {
    /**
     * Launch the "failure" version of the final package installer dialog
     *
     * @param statusCode The status code explaining what went wrong
     * @param legacyStatus  The status as used internally in the package manager.
     * @param statusMessage The status description.
     */
    private void launchFailure(int statusCode, String statusMessage) {
    private void launchFailure(int legacyStatus, String statusMessage) {
        Intent failureIntent = new Intent(getIntent());
        failureIntent.setClass(this, InstallFailed.class);
        failureIntent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
        failureIntent.putExtra(PackageInstaller.EXTRA_STATUS, statusCode);
        failureIntent.putExtra(PackageInstaller.EXTRA_LEGACY_STATUS, legacyStatus);
        failureIntent.putExtra(PackageInstaller.EXTRA_STATUS_MESSAGE, statusMessage);

        startActivity(failureIntent);
@@ -264,13 +265,14 @@ public class InstallInstalling extends Activity {
     * Launch the appropriate finish activity (success or failed) for the installation result.
     *
     * @param statusCode    The installation result.
     * @param legacyStatus  The installation as used internally in the package manager.
     * @param statusMessage The detailed installation result.
     */
    private void launchFinishBasedOnResult(int statusCode, String statusMessage) {
    private void launchFinishBasedOnResult(int statusCode, int legacyStatus, String statusMessage) {
        if (statusCode == PackageInstaller.STATUS_SUCCESS) {
            launchSuccess();
        } else {
            launchFailure(statusCode, statusMessage);
            launchFailure(legacyStatus, statusMessage);
        }
    }

@@ -308,7 +310,7 @@ public class InstallInstalling extends Activity {

    /**
     * Send the package to the package installer and then register a event result observer that
     * will call {@link #launchFinishBasedOnResult(int, String)}
     * will call {@link #launchFinishBasedOnResult(int, int, String)}
     */
    private final class InstallingAsyncTask extends AsyncTask<Void, Void,
            PackageInstaller.Session> {
@@ -386,7 +388,10 @@ public class InstallInstalling extends Activity {
                mCancelButton.setEnabled(false);
            } else {
                getPackageManager().getPackageInstaller().abandonSession(mSessionId);
                launchFailure(PackageInstaller.STATUS_FAILURE, null);

                if (!isCancelled()) {
                    launchFailure(PackageManager.INSTALL_FAILED_INVALID_APK, null);
                }
            }
        }
    }
+1 −2
Original line number Diff line number Diff line
@@ -21,7 +21,6 @@ import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInstaller;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.Uri;
@@ -45,7 +44,7 @@ public class InstallSuccess extends Activity {
        if (getIntent().getBooleanExtra(Intent.EXTRA_RETURN_RESULT, false)) {
            // Return result if requested
            Intent result = new Intent();
            result.putExtra(Intent.EXTRA_INSTALL_RESULT, PackageInstaller.STATUS_SUCCESS);
            result.putExtra(Intent.EXTRA_INSTALL_RESULT, PackageManager.INSTALL_SUCCEEDED);
            setResult(Activity.RESULT_OK, result);
            finish();
        } else {