1 /* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.content.pm; 18 19 import android.annotation.NonNull; 20 import android.annotation.Nullable; 21 import android.content.ComponentName; 22 import android.content.Intent; 23 import android.content.IntentFilter; 24 import android.os.Bundle; 25 26 import java.util.Collections; 27 import java.util.List; 28 29 /** 30 * Auxiliary application resolution response. 31 * <p> 32 * Used when resolution occurs, but, the target is not actually on the device. 33 * This happens resolving instant apps that haven't been installed yet or if 34 * the application consists of multiple feature splits and the needed split 35 * hasn't been installed. 36 * @hide 37 */ 38 public final class AuxiliaryResolveInfo { 39 /** The activity to launch if there's an installation failure. */ 40 public final ComponentName installFailureActivity; 41 /** Whether or not instant resolution needs the second phase */ 42 public final boolean needsPhaseTwo; 43 /** Opaque token to track the instant application resolution */ 44 public final String token; 45 /** An intent to start upon failure to install */ 46 public final Intent failureIntent; 47 /** The matching filters for this resolve info. */ 48 public final List<AuxiliaryFilter> filters; 49 /** Stored {@link InstantAppRequest#hostDigestPrefixSecure} to prevent re-generation */ 50 public final int[] hostDigestPrefixSecure; 51 52 /** Create a response for installing an instant application. */ AuxiliaryResolveInfo(@onNull String token, boolean needsPhase2, @Nullable Intent failureIntent, @Nullable List<AuxiliaryFilter> filters, @Nullable int[] hostDigestPrefix)53 public AuxiliaryResolveInfo(@NonNull String token, 54 boolean needsPhase2, 55 @Nullable Intent failureIntent, 56 @Nullable List<AuxiliaryFilter> filters, 57 @Nullable int[] hostDigestPrefix) { 58 this.token = token; 59 this.needsPhaseTwo = needsPhase2; 60 this.failureIntent = failureIntent; 61 this.filters = filters; 62 this.installFailureActivity = null; 63 this.hostDigestPrefixSecure = hostDigestPrefix; 64 } 65 66 /** Create a response for installing a split on demand. */ AuxiliaryResolveInfo(@ullable ComponentName failureActivity, @Nullable Intent failureIntent, @Nullable List<AuxiliaryFilter> filters)67 public AuxiliaryResolveInfo(@Nullable ComponentName failureActivity, 68 @Nullable Intent failureIntent, 69 @Nullable List<AuxiliaryFilter> filters) { 70 super(); 71 this.installFailureActivity = failureActivity; 72 this.filters = filters; 73 this.token = null; 74 this.needsPhaseTwo = false; 75 this.failureIntent = failureIntent; 76 this.hostDigestPrefixSecure = null; 77 } 78 79 /** Create a response for installing a split on demand. */ AuxiliaryResolveInfo(@ullable ComponentName failureActivity, String packageName, long versionCode, String splitName)80 public AuxiliaryResolveInfo(@Nullable ComponentName failureActivity, 81 String packageName, long versionCode, String splitName) { 82 this(failureActivity, null, Collections.singletonList( 83 new AuxiliaryResolveInfo.AuxiliaryFilter(packageName, versionCode, splitName))); 84 } 85 86 /** @hide */ 87 public static final class AuxiliaryFilter extends IntentFilter { 88 /** Resolved information returned from the external instant resolver */ 89 public final InstantAppResolveInfo resolveInfo; 90 /** The resolved package. Copied from {@link #resolveInfo}. */ 91 public final String packageName; 92 /** The version code of the package */ 93 public final long versionCode; 94 /** The resolve split. Copied from the matched filter in {@link #resolveInfo}. */ 95 public final String splitName; 96 /** The extras to pass on to the installer for this filter. */ 97 public final Bundle extras; 98 AuxiliaryFilter(IntentFilter orig, InstantAppResolveInfo resolveInfo, String splitName, Bundle extras)99 public AuxiliaryFilter(IntentFilter orig, InstantAppResolveInfo resolveInfo, 100 String splitName, Bundle extras) { 101 super(orig); 102 this.resolveInfo = resolveInfo; 103 this.packageName = resolveInfo.getPackageName(); 104 this.versionCode = resolveInfo.getLongVersionCode(); 105 this.splitName = splitName; 106 this.extras = extras; 107 } 108 AuxiliaryFilter(InstantAppResolveInfo resolveInfo, String splitName, Bundle extras)109 public AuxiliaryFilter(InstantAppResolveInfo resolveInfo, 110 String splitName, Bundle extras) { 111 this.resolveInfo = resolveInfo; 112 this.packageName = resolveInfo.getPackageName(); 113 this.versionCode = resolveInfo.getLongVersionCode(); 114 this.splitName = splitName; 115 this.extras = extras; 116 } 117 AuxiliaryFilter(String packageName, long versionCode, String splitName)118 public AuxiliaryFilter(String packageName, long versionCode, String splitName) { 119 this.resolveInfo = null; 120 this.packageName = packageName; 121 this.versionCode = versionCode; 122 this.splitName = splitName; 123 this.extras = null; 124 } 125 126 @Override toString()127 public String toString() { 128 return "AuxiliaryFilter{" 129 + "packageName='" + packageName + '\'' 130 + ", versionCode=" + versionCode 131 + ", splitName='" + splitName + '\'' + '}'; 132 } 133 } 134 } 135