1 /* 2 * Copyright (C) 2008 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.compat.annotation.UnsupportedAppUsage; 20 import android.content.ComponentName; 21 import android.graphics.drawable.Drawable; 22 import android.os.Parcel; 23 import android.os.Parcelable; 24 import android.util.Printer; 25 26 /** 27 * Base class containing information common to all application components 28 * ({@link ActivityInfo}, {@link ServiceInfo}). This class is not intended 29 * to be used by itself; it is simply here to share common definitions 30 * between all application components. As such, it does not itself 31 * implement Parcelable, but does provide convenience methods to assist 32 * in the implementation of Parcelable in subclasses. 33 */ 34 public class ComponentInfo extends PackageItemInfo { 35 /** 36 * Global information about the application/package this component is a 37 * part of. 38 */ 39 public ApplicationInfo applicationInfo; 40 41 /** 42 * The name of the process this component should run in. 43 * From the "android:process" attribute or, if not set, the same 44 * as <var>applicationInfo.processName</var>. 45 */ 46 public String processName; 47 48 /** 49 * The name of the split in which this component is declared. 50 * Null if the component was declared in the base APK. 51 */ 52 public String splitName; 53 54 /** 55 * A string resource identifier (in the package's resources) containing 56 * a user-readable description of the component. From the "description" 57 * attribute or, if not set, 0. 58 */ 59 public int descriptionRes; 60 61 /** 62 * Indicates whether or not this component may be instantiated. Note that this value can be 63 * overridden by the one in its parent {@link ApplicationInfo}. 64 */ 65 public boolean enabled = true; 66 67 /** 68 * Set to true if this component is available for use by other applications. 69 * Comes from {@link android.R.attr#exported android:exported} of the 70 * <activity>, <receiver>, <service>, or 71 * <provider> tag. 72 */ 73 public boolean exported = false; 74 75 /** 76 * Indicates if this component is aware of direct boot lifecycle, and can be 77 * safely run before the user has entered their credentials (such as a lock 78 * pattern or PIN). 79 */ 80 public boolean directBootAware = false; 81 82 /** @removed */ 83 @Deprecated 84 public boolean encryptionAware = false; 85 ComponentInfo()86 public ComponentInfo() { 87 } 88 ComponentInfo(ComponentInfo orig)89 public ComponentInfo(ComponentInfo orig) { 90 super(orig); 91 applicationInfo = orig.applicationInfo; 92 processName = orig.processName; 93 splitName = orig.splitName; 94 descriptionRes = orig.descriptionRes; 95 enabled = orig.enabled; 96 exported = orig.exported; 97 encryptionAware = directBootAware = orig.directBootAware; 98 } 99 100 /** @hide */ loadUnsafeLabel(PackageManager pm)101 @Override public CharSequence loadUnsafeLabel(PackageManager pm) { 102 if (nonLocalizedLabel != null) { 103 return nonLocalizedLabel; 104 } 105 ApplicationInfo ai = applicationInfo; 106 CharSequence label; 107 if (labelRes != 0) { 108 label = pm.getText(packageName, labelRes, ai); 109 if (label != null) { 110 return label; 111 } 112 } 113 if (ai.nonLocalizedLabel != null) { 114 return ai.nonLocalizedLabel; 115 } 116 if (ai.labelRes != 0) { 117 label = pm.getText(packageName, ai.labelRes, ai); 118 if (label != null) { 119 return label; 120 } 121 } 122 return name; 123 } 124 125 /** 126 * Return whether this component and its enclosing application are enabled. 127 */ isEnabled()128 public boolean isEnabled() { 129 return enabled && applicationInfo.enabled; 130 } 131 132 /** 133 * Return the icon resource identifier to use for this component. If 134 * the component defines an icon, that is used; else, the application 135 * icon is used. 136 * 137 * @return The icon associated with this component. 138 */ getIconResource()139 public final int getIconResource() { 140 return icon != 0 ? icon : applicationInfo.icon; 141 } 142 143 /** 144 * Return the logo resource identifier to use for this component. If 145 * the component defines a logo, that is used; else, the application 146 * logo is used. 147 * 148 * @return The logo associated with this component. 149 */ getLogoResource()150 public final int getLogoResource() { 151 return logo != 0 ? logo : applicationInfo.logo; 152 } 153 154 /** 155 * Return the banner resource identifier to use for this component. If the 156 * component defines a banner, that is used; else, the application banner is 157 * used. 158 * 159 * @return The banner associated with this component. 160 */ getBannerResource()161 public final int getBannerResource() { 162 return banner != 0 ? banner : applicationInfo.banner; 163 } 164 165 /** {@hide} */ 166 @UnsupportedAppUsage getComponentName()167 public ComponentName getComponentName() { 168 return new ComponentName(packageName, name); 169 } 170 dumpFront(Printer pw, String prefix)171 protected void dumpFront(Printer pw, String prefix) { 172 super.dumpFront(pw, prefix); 173 if (processName != null && !packageName.equals(processName)) { 174 pw.println(prefix + "processName=" + processName); 175 } 176 if (splitName != null) { 177 pw.println(prefix + "splitName=" + splitName); 178 } 179 pw.println(prefix + "enabled=" + enabled + " exported=" + exported 180 + " directBootAware=" + directBootAware); 181 if (descriptionRes != 0) { 182 pw.println(prefix + "description=" + descriptionRes); 183 } 184 } 185 dumpBack(Printer pw, String prefix)186 protected void dumpBack(Printer pw, String prefix) { 187 dumpBack(pw, prefix, DUMP_FLAG_ALL); 188 } 189 dumpBack(Printer pw, String prefix, int dumpFlags)190 void dumpBack(Printer pw, String prefix, int dumpFlags) { 191 if ((dumpFlags & DUMP_FLAG_APPLICATION) != 0) { 192 if (applicationInfo != null) { 193 pw.println(prefix + "ApplicationInfo:"); 194 applicationInfo.dump(pw, prefix + " ", dumpFlags); 195 } else { 196 pw.println(prefix + "ApplicationInfo: null"); 197 } 198 } 199 super.dumpBack(pw, prefix); 200 } 201 writeToParcel(Parcel dest, int parcelableFlags)202 public void writeToParcel(Parcel dest, int parcelableFlags) { 203 super.writeToParcel(dest, parcelableFlags); 204 if ((parcelableFlags & Parcelable.PARCELABLE_ELIDE_DUPLICATES) != 0) { 205 dest.writeInt(0); 206 } else { 207 dest.writeInt(1); 208 applicationInfo.writeToParcel(dest, parcelableFlags); 209 } 210 dest.writeString(processName); 211 dest.writeString(splitName); 212 dest.writeInt(descriptionRes); 213 dest.writeInt(enabled ? 1 : 0); 214 dest.writeInt(exported ? 1 : 0); 215 dest.writeInt(directBootAware ? 1 : 0); 216 } 217 ComponentInfo(Parcel source)218 protected ComponentInfo(Parcel source) { 219 super(source); 220 final boolean hasApplicationInfo = (source.readInt() != 0); 221 if (hasApplicationInfo) { 222 applicationInfo = ApplicationInfo.CREATOR.createFromParcel(source); 223 } 224 processName = source.readString(); 225 splitName = source.readString(); 226 descriptionRes = source.readInt(); 227 enabled = (source.readInt() != 0); 228 exported = (source.readInt() != 0); 229 encryptionAware = directBootAware = (source.readInt() != 0); 230 } 231 232 /** 233 * @hide 234 */ 235 @Override loadDefaultIcon(PackageManager pm)236 public Drawable loadDefaultIcon(PackageManager pm) { 237 return applicationInfo.loadIcon(pm); 238 } 239 240 /** 241 * @hide 242 */ loadDefaultBanner(PackageManager pm)243 @Override protected Drawable loadDefaultBanner(PackageManager pm) { 244 return applicationInfo.loadBanner(pm); 245 } 246 247 /** 248 * @hide 249 */ 250 @Override loadDefaultLogo(PackageManager pm)251 protected Drawable loadDefaultLogo(PackageManager pm) { 252 return applicationInfo.loadLogo(pm); 253 } 254 255 /** 256 * @hide 257 */ getApplicationInfo()258 @Override protected ApplicationInfo getApplicationInfo() { 259 return applicationInfo; 260 } 261 } 262