18aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn/*
28aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * Copyright (C) 2008 The Android Open Source Project
38aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn *
48aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License");
58aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * you may not use this file except in compliance with the License.
68aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * You may obtain a copy of the License at
78aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn *
88aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn *      http://www.apache.org/licenses/LICENSE-2.0
98aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn *
108aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * Unless required by applicable law or agreed to in writing, software
118aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS,
128aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * See the License for the specific language governing permissions and
148aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn * limitations under the License.
158aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn */
168aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.content.pm;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Printer;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Base class containing information common to all application components
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ({@link ActivityInfo}, {@link ServiceInfo}).  This class is not intended
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to be used by itself; it is simply here to share common definitions
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * between all application components.  As such, it does not itself
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * implement Parcelable, but does provide convenience methods to assist
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the implementation of Parcelable in subclasses.
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class ComponentInfo extends PackageItemInfo {
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Global information about the application/package this component is a
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * part of.
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ApplicationInfo applicationInfo;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The name of the process this component should run in.
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * From the "android:process" attribute or, if not set, the same
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * as <var>applicationInfo.processName</var>.
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String processName;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
468aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * A string resource identifier (in the package's resources) containing
478aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * a user-readable description of the component.  From the "description"
488aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     * attribute or, if not set, 0.
498aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn     */
508aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    public int descriptionRes;
518aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn
528aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn    /**
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates whether or not this component may be instantiated.  Note that this value can be
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * overriden by the one in its parent {@link ApplicationInfo}.
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean enabled = true;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set to true if this component is available for use by other applications.
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Comes from {@link android.R.attr#exported android:exported} of the
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * &lt;activity&gt;, &lt;receiver&gt;, &lt;service&gt;, or
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * &lt;provider&gt; tag.
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean exported = false;
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ComponentInfo() {
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ComponentInfo(ComponentInfo orig) {
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(orig);
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        applicationInfo = orig.applicationInfo;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        processName = orig.processName;
738aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn        descriptionRes = orig.descriptionRes;
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enabled = orig.enabled;
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        exported = orig.exported;
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override public CharSequence loadLabel(PackageManager pm) {
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (nonLocalizedLabel != null) {
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return nonLocalizedLabel;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ApplicationInfo ai = applicationInfo;
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        CharSequence label;
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (labelRes != 0) {
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            label = pm.getText(packageName, labelRes, ai);
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (label != null) {
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return label;
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ai.nonLocalizedLabel != null) {
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ai.nonLocalizedLabel;
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ai.labelRes != 0) {
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            label = pm.getText(packageName, ai.labelRes, ai);
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (label != null) {
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return label;
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return name;
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
101a85a91573af97a76ab08ffd5f8558b73283e1faaJoe Onorato
102a85a91573af97a76ab08ffd5f8558b73283e1faaJoe Onorato    /**
103a85a91573af97a76ab08ffd5f8558b73283e1faaJoe Onorato     * Return whether this component and its enclosing application are enabled.
104a85a91573af97a76ab08ffd5f8558b73283e1faaJoe Onorato     */
105a85a91573af97a76ab08ffd5f8558b73283e1faaJoe Onorato    public boolean isEnabled() {
106a85a91573af97a76ab08ffd5f8558b73283e1faaJoe Onorato        return enabled && applicationInfo.enabled;
107a85a91573af97a76ab08ffd5f8558b73283e1faaJoe Onorato    }
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the icon resource identifier to use for this component.  If
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the component defines an icon, that is used; else, the application
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * icon is used.
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The icon associated with this component.
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getIconResource() {
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return icon != 0 ? icon : applicationInfo.icon;
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11904fe6ebb9f919f196ec06a19bebc09b8e943f95bAdam Powell
12004fe6ebb9f919f196ec06a19bebc09b8e943f95bAdam Powell    /**
12104fe6ebb9f919f196ec06a19bebc09b8e943f95bAdam Powell     * Return the logo resource identifier to use for this component.  If
12204fe6ebb9f919f196ec06a19bebc09b8e943f95bAdam Powell     * the component defines a logo, that is used; else, the application
12304fe6ebb9f919f196ec06a19bebc09b8e943f95bAdam Powell     * logo is used.
12404fe6ebb9f919f196ec06a19bebc09b8e943f95bAdam Powell     *
12504fe6ebb9f919f196ec06a19bebc09b8e943f95bAdam Powell     * @return The logo associated with this component.
12604fe6ebb9f919f196ec06a19bebc09b8e943f95bAdam Powell     */
12704fe6ebb9f919f196ec06a19bebc09b8e943f95bAdam Powell    public final int getLogoResource() {
12804fe6ebb9f919f196ec06a19bebc09b8e943f95bAdam Powell        return logo != 0 ? logo : applicationInfo.logo;
12904fe6ebb9f919f196ec06a19bebc09b8e943f95bAdam Powell    }
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
131f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima    /**
132f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima     * Return the banner resource identifier to use for this component. If the
133f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima     * component defines a banner, that is used; else, the application banner is
134f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima     * used.
135f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima     *
136f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima     * @return The banner associated with this component.
137f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima     */
138f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima    public final int getBannerResource() {
139f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima        return banner != 0 ? banner : applicationInfo.banner;
140f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima    }
141f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void dumpFront(Printer pw, String prefix) {
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.dumpFront(pw, prefix);
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println(prefix + "enabled=" + enabled + " exported=" + exported
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " processName=" + processName);
1468aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn        if (descriptionRes != 0) {
1478aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn            pw.println(prefix + "description=" + descriptionRes);
1488aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn        }
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void dumpBack(Printer pw, String prefix) {
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (applicationInfo != null) {
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.println(prefix + "ApplicationInfo:");
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            applicationInfo.dump(pw, prefix + "  ");
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.println(prefix + "ApplicationInfo: null");
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.dumpBack(pw, prefix);
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeToParcel(Parcel dest, int parcelableFlags) {
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.writeToParcel(dest, parcelableFlags);
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        applicationInfo.writeToParcel(dest, parcelableFlags);
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeString(processName);
1658aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn        dest.writeInt(descriptionRes);
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeInt(enabled ? 1 : 0);
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeInt(exported ? 1 : 0);
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16907330791116513710d879c45b2f095cd314cbfd0Jeff Brown
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected ComponentInfo(Parcel source) {
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(source);
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        applicationInfo = ApplicationInfo.CREATOR.createFromParcel(source);
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        processName = source.readString();
1748aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn        descriptionRes = source.readInt();
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enabled = (source.readInt() != 0);
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        exported = (source.readInt() != 0);
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17807330791116513710d879c45b2f095cd314cbfd0Jeff Brown
17907330791116513710d879c45b2f095cd314cbfd0Jeff Brown    /**
18007330791116513710d879c45b2f095cd314cbfd0Jeff Brown     * @hide
18107330791116513710d879c45b2f095cd314cbfd0Jeff Brown     */
182a709314537164d959a18ee78768c69c4a9cb33c7Alexandra Gherghina    @Override
183a709314537164d959a18ee78768c69c4a9cb33c7Alexandra Gherghina    public Drawable loadDefaultIcon(PackageManager pm) {
18407330791116513710d879c45b2f095cd314cbfd0Jeff Brown        return applicationInfo.loadIcon(pm);
18507330791116513710d879c45b2f095cd314cbfd0Jeff Brown    }
18607330791116513710d879c45b2f095cd314cbfd0Jeff Brown
18707330791116513710d879c45b2f095cd314cbfd0Jeff Brown    /**
18807330791116513710d879c45b2f095cd314cbfd0Jeff Brown     * @hide
18907330791116513710d879c45b2f095cd314cbfd0Jeff Brown     */
190f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima    @Override protected Drawable loadDefaultBanner(PackageManager pm) {
191f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima        return applicationInfo.loadBanner(pm);
192f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima    }
193f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima
194f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima    /**
195f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima     * @hide
196f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima     */
19781cd2e90ccdda498234384c8207afe2213714e60Adam Powell    @Override
19881cd2e90ccdda498234384c8207afe2213714e60Adam Powell    protected Drawable loadDefaultLogo(PackageManager pm) {
19981cd2e90ccdda498234384c8207afe2213714e60Adam Powell        return applicationInfo.loadLogo(pm);
20081cd2e90ccdda498234384c8207afe2213714e60Adam Powell    }
20181cd2e90ccdda498234384c8207afe2213714e60Adam Powell
20281cd2e90ccdda498234384c8207afe2213714e60Adam Powell    /**
20381cd2e90ccdda498234384c8207afe2213714e60Adam Powell     * @hide
20481cd2e90ccdda498234384c8207afe2213714e60Adam Powell     */
20507330791116513710d879c45b2f095cd314cbfd0Jeff Brown    @Override protected ApplicationInfo getApplicationInfo() {
20607330791116513710d879c45b2f095cd314cbfd0Jeff Brown        return applicationInfo;
20707330791116513710d879c45b2f095cd314cbfd0Jeff Brown    }
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
209