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

Commit bc37883e authored by Song Chun Fan's avatar Song Chun Fan Committed by Android (Google) Code Review
Browse files

Merge "[PreVerfiedDomains] API to set pre-verified domains in a session" into main

parents 808f5e29 d5cd134a
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -3944,7 +3944,9 @@ package android.content.pm {
    method @RequiresPermission("com.android.permission.USE_INSTALLER_V2") public void addFile(int, @NonNull String, long, @NonNull byte[], @Nullable byte[]);
    method @RequiresPermission(android.Manifest.permission.INSTALL_PACKAGES) public void commitTransferred(@NonNull android.content.IntentSender);
    method @Nullable @RequiresPermission("com.android.permission.USE_INSTALLER_V2") public android.content.pm.DataLoaderParams getDataLoaderParams();
    method @FlaggedApi("android.content.pm.set_pre_verified_domains") @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_INSTANT_APPS) public java.util.Set<java.lang.String> getPreVerifiedDomains();
    method @RequiresPermission("com.android.permission.USE_INSTALLER_V2") public void removeFile(int, @NonNull String);
    method @FlaggedApi("android.content.pm.set_pre_verified_domains") @RequiresPermission(android.Manifest.permission.ACCESS_INSTANT_APPS) public void setPreVerifiedDomains(@NonNull java.util.Set<java.lang.String>);
  }
  public static class PackageInstaller.SessionInfo implements android.os.Parcelable {
+4 −0
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import android.content.pm.DataLoaderParamsParcel;
import android.content.pm.IOnChecksumsReadyListener;
import android.content.pm.IPackageInstallObserver2;
import android.content.pm.PackageInstaller;
import android.content.pm.verify.domain.DomainSet;
import android.content.IntentSender;
import android.os.ParcelFileDescriptor;

@@ -73,4 +74,7 @@ interface IPackageInstallerSession {
    ParcelFileDescriptor getAppMetadataFd();
    ParcelFileDescriptor openWriteAppMetadata();
    void removeAppMetadata();

    void setPreVerifiedDomains(in DomainSet preVerifiedDomains);
    DomainSet getPreVerifiedDomains();
}
+61 −0
Original line number Diff line number Diff line
@@ -61,6 +61,7 @@ import android.content.pm.parsing.ApkLiteParseUtils;
import android.content.pm.parsing.PackageLite;
import android.content.pm.parsing.result.ParseResult;
import android.content.pm.parsing.result.ParseTypeImpl;
import android.content.pm.verify.domain.DomainSet;
import android.graphics.Bitmap;
import android.icu.util.ULocale;
import android.net.Uri;
@@ -2296,6 +2297,66 @@ public class PackageInstaller {
                throw e.rethrowFromSystemServer();
            }
        }

        /**
         * Sets the pre-verified domains for the app to be installed. By setting pre-verified
         * domains, the installer allows the app to be opened by the app links of these domains
         * immediately after it is installed.
         *
         * <p>The specified pre-verified domains should be a subset of the hostnames declared with
         * {@code android:host} and {@code android:autoVerify=true} in the intent filters of the
         * AndroidManifest.xml of the app. If some of the specified domains are not declared in
         * the manifest, they will be ignored.</p>
         * <p>If this API is called multiple times on the same {@link #Session}, the last call
         * overrides the previous ones.</p>
         * <p>The instant app installer is the only entity that may call this API.
         * </p>
         *
         * @param preVerifiedDomains domains that are already pre-verified by the installer.
         *
         * @throws IllegalArgumentException if the number or the total size of the pre-verified
         *                                  domains exceeds the maximum allowed, or if the domain
         *                                  names contain invalid characters.
         * @throws SecurityException if called from an installer that is not the instant app
         *                           installer of the device, or if called after the session has
         *                           been committed or abandoned.
         *
         * @hide
         */
        @SystemApi
        @FlaggedApi(Flags.FLAG_SET_PRE_VERIFIED_DOMAINS)
        @RequiresPermission(Manifest.permission.ACCESS_INSTANT_APPS)
        public void setPreVerifiedDomains(@NonNull Set<String> preVerifiedDomains) {
            Preconditions.checkArgument(preVerifiedDomains != null && !preVerifiedDomains.isEmpty(),
                    "Provided pre-verified domains cannot be null or empty.");
            try {
                mSession.setPreVerifiedDomains(new DomainSet(preVerifiedDomains));
            } catch (RemoteException e) {
                throw e.rethrowFromSystemServer();
            }
        }

        /**
         * Retrieve the pre-verified domains set in a session.
         * See {@link #setPreVerifiedDomains(Set)} for the definition of pre-verified domains.
         *
         * @throws SecurityException if called from an installer that is not the owner of the
         *                           session, or if called after the session has been committed or
         *                           abandoned.
         * @hide
         */
        @SystemApi
        @FlaggedApi(Flags.FLAG_SET_PRE_VERIFIED_DOMAINS)
        @RequiresPermission(Manifest.permission.ACCESS_INSTANT_APPS)
        @NonNull
        public Set<String> getPreVerifiedDomains() {
            try {
                DomainSet domainSet = mSession.getPreVerifiedDomains();
                return domainSet != null ? domainSet.getDomains() : Collections.emptySet();
            } catch (RemoteException e) {
                throw e.rethrowFromSystemServer();
            }
        }
    }

    /**
+10 −0
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ import android.content.pm.PackageManager;
import android.content.pm.SharedLibraryInfo;
import android.content.pm.SigningDetails;
import android.content.pm.parsing.PackageLite;
import android.content.pm.verify.domain.DomainSet;
import android.net.Uri;
import android.os.Build;
import android.os.Process;
@@ -155,6 +156,9 @@ final class InstallRequest {
    @NonNull
    private final ArrayList<String> mWarnings = new ArrayList<>();

    @Nullable
    private DomainSet mPreVerifiedDomains;

    // New install
    InstallRequest(InstallingSession params) {
        mUserId = params.getUser().getIdentifier();
@@ -172,6 +176,7 @@ final class InstallRequest {
        mIsInstallInherit = params.mIsInherit;
        mSessionId = params.mSessionId;
        mRequireUserAction = params.mRequireUserAction;
        mPreVerifiedDomains = params.mPreVerifiedDomains;
    }

    // Install existing package as user
@@ -875,6 +880,11 @@ final class InstallRequest {
        }
    }

    @Nullable
    public DomainSet getPreVerifiedDomains() {
        return mPreVerifiedDomains;
    }

    public void addWarning(@NonNull String warning) {
        mWarnings.add(warning);
    }
+6 −1
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ import android.content.pm.PackageInstaller;
import android.content.pm.PackageManager;
import android.content.pm.SigningDetails;
import android.content.pm.parsing.PackageLite;
import android.content.pm.verify.domain.DomainSet;
import android.os.Environment;
import android.os.Trace;
import android.os.UserHandle;
@@ -98,6 +99,8 @@ class InstallingSession {
    final int mSessionId;
    final int mRequireUserAction;
    final boolean mApplicationEnabledSettingPersistent;
    @Nullable
    final DomainSet mPreVerifiedDomains;

    // For move install
    InstallingSession(OriginInfo originInfo, MoveInfo moveInfo, IPackageInstallObserver2 observer,
@@ -130,12 +133,13 @@ class InstallingSession {
        mSessionId = -1;
        mRequireUserAction = USER_ACTION_UNSPECIFIED;
        mApplicationEnabledSettingPersistent = false;
        mPreVerifiedDomains = null;
    }

    InstallingSession(int sessionId, File stagedDir, IPackageInstallObserver2 observer,
            PackageInstaller.SessionParams sessionParams, InstallSource installSource,
            UserHandle user, SigningDetails signingDetails, int installerUid,
            PackageLite packageLite, PackageManagerService pm) {
            PackageLite packageLite, DomainSet preVerifiedDomains, PackageManagerService pm) {
        mPm = pm;
        mUser = user;
        mOriginInfo = OriginInfo.fromStagedFile(stagedDir);
@@ -163,6 +167,7 @@ class InstallingSession {
        mSessionId = sessionId;
        mRequireUserAction = sessionParams.requireUserAction;
        mApplicationEnabledSettingPersistent = sessionParams.applicationEnabledSettingPersistent;
        mPreVerifiedDomains = preVerifiedDomains;
    }

    @Override
Loading