115a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root/*
215a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Copyright (C) 2009 The Android Open Source Project
315a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root *
415a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Licensed under the Apache License, Version 2.0 (the "License");
515a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * you may not use this file except in compliance with the License.
615a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * You may obtain a copy of the License at
715a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root *
815a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root *      http://www.apache.org/licenses/LICENSE-2.0
915a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root *
1015a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Unless required by applicable law or agreed to in writing, software
1115a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * distributed under the License is distributed on an "AS IS" BASIS,
1215a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1315a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * See the License for the specific language governing permissions and
1415a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * limitations under the License.
1515a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root */
1615a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root
17eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackbornpackage android.content.pm;
18eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn
19eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackbornimport android.content.Intent;
20eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackbornimport android.graphics.drawable.Drawable;
21eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackbornimport android.os.Parcel;
22eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackbornimport android.text.TextUtils;
23eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn
24eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn/**
25eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn * A special subclass of Intent that can have a custom label/icon
26eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn * associated with it.  Primarily for use with {@link Intent#ACTION_CHOOSER}.
27eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn */
28eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackbornpublic class LabeledIntent extends Intent {
29eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    private String mSourcePackage;
30eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    private int mLabelRes;
31eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    private CharSequence mNonLocalizedLabel;
32eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    private int mIcon;
33eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn
34eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    /**
35eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     * Create a labeled intent from the given intent, supplying the label
36eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     * and icon resources for it.
37eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     *
38eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     * @param origIntent The original Intent to copy.
39eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     * @param sourcePackage The package in which the label and icon live.
40eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     * @param labelRes Resource containing the label, or 0 if none.
41eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     * @param icon Resource containing the icon, or 0 if none.
42eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     */
43eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    public LabeledIntent(Intent origIntent, String sourcePackage,
44eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            int labelRes, int icon) {
45eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        super(origIntent);
46eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        mSourcePackage = sourcePackage;
47eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        mLabelRes = labelRes;
48eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        mNonLocalizedLabel = null;
49eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        mIcon = icon;
50eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    }
51eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn
52eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    /**
53eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     * Create a labeled intent from the given intent, supplying a textual
54eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     * label and icon resource for it.
55eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     *
56eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     * @param origIntent The original Intent to copy.
57eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     * @param sourcePackage The package in which the label and icon live.
58eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     * @param nonLocalizedLabel Concrete text to use for the label.
59eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     * @param icon Resource containing the icon, or 0 if none.
60eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     */
61eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    public LabeledIntent(Intent origIntent, String sourcePackage,
62eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            CharSequence nonLocalizedLabel, int icon) {
63eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        super(origIntent);
64eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        mSourcePackage = sourcePackage;
65eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        mLabelRes = 0;
66eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        mNonLocalizedLabel = nonLocalizedLabel;
67eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        mIcon = icon;
68eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    }
69eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn
70eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    /**
71eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     * Create a labeled intent with no intent data but supplying the label
72eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     * and icon resources for it.
73eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     *
74eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     * @param sourcePackage The package in which the label and icon live.
75eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     * @param labelRes Resource containing the label, or 0 if none.
76eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     * @param icon Resource containing the icon, or 0 if none.
77eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     */
78eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    public LabeledIntent(String sourcePackage, int labelRes, int icon) {
79eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        mSourcePackage = sourcePackage;
80eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        mLabelRes = labelRes;
81eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        mNonLocalizedLabel = null;
82eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        mIcon = icon;
83eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    }
84eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn
85eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    /**
86eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     * Create a labeled intent with no intent data but supplying a textual
87eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     * label and icon resource for it.
88eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     *
89eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     * @param sourcePackage The package in which the label and icon live.
90eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     * @param nonLocalizedLabel Concrete text to use for the label.
91eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     * @param icon Resource containing the icon, or 0 if none.
92eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     */
93eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    public LabeledIntent(String sourcePackage,
94eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            CharSequence nonLocalizedLabel, int icon) {
95eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        mSourcePackage = sourcePackage;
96eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        mLabelRes = 0;
97eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        mNonLocalizedLabel = nonLocalizedLabel;
98eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        mIcon = icon;
99eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    }
100eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn
101eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    /**
102eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     * Return the name of the package holding label and icon resources.
103eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     */
104eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    public String getSourcePackage() {
105eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        return mSourcePackage;
106eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    }
107eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn
108eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    /**
109eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     * Return any resource identifier that has been given for the label text.
110eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     */
111eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    public int getLabelResource() {
112eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        return mLabelRes;
113eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    }
114eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn
115eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    /**
116eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     * Return any concrete text that has been given for the label text.
117eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     */
118eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    public CharSequence getNonLocalizedLabel() {
119eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        return mNonLocalizedLabel;
120eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    }
121eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn
122eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    /**
123eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     * Return any resource identifier that has been given for the label icon.
124eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     */
125eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    public int getIconResource() {
126eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        return mIcon;
127eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    }
128eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn
129eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    /**
130eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     * Retrieve the label associated with this object.  If the object does
131eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     * not have a label, null will be returned, in which case you will probably
132eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     * want to load the label from the underlying resolved info for the Intent.
133eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     */
134eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    public CharSequence loadLabel(PackageManager pm) {
135eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        if (mNonLocalizedLabel != null) {
136eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            return mNonLocalizedLabel;
137eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        }
138eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        if (mLabelRes != 0 && mSourcePackage != null) {
139eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            CharSequence label = pm.getText(mSourcePackage, mLabelRes, null);
140eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            if (label != null) {
141eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                return label;
142eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            }
143eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        }
144eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        return null;
145eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    }
146eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn
147eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    /**
148eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     * Retrieve the icon associated with this object.  If the object does
149eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     * not have a icon, null will be returned, in which case you will probably
150eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     * want to load the icon from the underlying resolved info for the Intent.
151eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     */
152eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    public Drawable loadIcon(PackageManager pm) {
153eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        if (mIcon != 0 && mSourcePackage != null) {
154eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            Drawable icon = pm.getDrawable(mSourcePackage, mIcon, null);
155eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            if (icon != null) {
156eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                return icon;
157eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            }
158eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        }
159eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        return null;
160eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    }
161eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn
162eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    public void writeToParcel(Parcel dest, int parcelableFlags) {
163eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        super.writeToParcel(dest, parcelableFlags);
164eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        dest.writeString(mSourcePackage);
165eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        dest.writeInt(mLabelRes);
166eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        TextUtils.writeToParcel(mNonLocalizedLabel, dest, parcelableFlags);
167eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        dest.writeInt(mIcon);
168eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    }
169eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn
170eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    /** @hide */
171eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    protected LabeledIntent(Parcel in) {
172eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        readFromParcel(in);
173eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    }
174eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn
175eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    public void readFromParcel(Parcel in) {
176eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        super.readFromParcel(in);
177eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        mSourcePackage = in.readString();
178eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        mLabelRes = in.readInt();
179eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        mNonLocalizedLabel = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
180eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        mIcon = in.readInt();
181eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    }
182eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn
183eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    public static final Creator<LabeledIntent> CREATOR
184eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            = new Creator<LabeledIntent>() {
185eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        public LabeledIntent createFromParcel(Parcel source) {
186eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            return new LabeledIntent(source);
187eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        }
188eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        public LabeledIntent[] newArray(int size) {
189eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            return new LabeledIntent[size];
190eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        }
191eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    };
192eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn
193eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn}
194