1/* 2 * Copyright (C) 2009 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 17package android.content.pm; 18 19import android.content.Intent; 20import android.graphics.drawable.Drawable; 21import android.os.Parcel; 22import android.text.TextUtils; 23 24/** 25 * A special subclass of Intent that can have a custom label/icon 26 * associated with it. Primarily for use with {@link Intent#ACTION_CHOOSER}. 27 */ 28public class LabeledIntent extends Intent { 29 private String mSourcePackage; 30 private int mLabelRes; 31 private CharSequence mNonLocalizedLabel; 32 private int mIcon; 33 34 /** 35 * Create a labeled intent from the given intent, supplying the label 36 * and icon resources for it. 37 * 38 * @param origIntent The original Intent to copy. 39 * @param sourcePackage The package in which the label and icon live. 40 * @param labelRes Resource containing the label, or 0 if none. 41 * @param icon Resource containing the icon, or 0 if none. 42 */ 43 public LabeledIntent(Intent origIntent, String sourcePackage, 44 int labelRes, int icon) { 45 super(origIntent); 46 mSourcePackage = sourcePackage; 47 mLabelRes = labelRes; 48 mNonLocalizedLabel = null; 49 mIcon = icon; 50 } 51 52 /** 53 * Create a labeled intent from the given intent, supplying a textual 54 * label and icon resource for it. 55 * 56 * @param origIntent The original Intent to copy. 57 * @param sourcePackage The package in which the label and icon live. 58 * @param nonLocalizedLabel Concrete text to use for the label. 59 * @param icon Resource containing the icon, or 0 if none. 60 */ 61 public LabeledIntent(Intent origIntent, String sourcePackage, 62 CharSequence nonLocalizedLabel, int icon) { 63 super(origIntent); 64 mSourcePackage = sourcePackage; 65 mLabelRes = 0; 66 mNonLocalizedLabel = nonLocalizedLabel; 67 mIcon = icon; 68 } 69 70 /** 71 * Create a labeled intent with no intent data but supplying the label 72 * and icon resources for it. 73 * 74 * @param sourcePackage The package in which the label and icon live. 75 * @param labelRes Resource containing the label, or 0 if none. 76 * @param icon Resource containing the icon, or 0 if none. 77 */ 78 public LabeledIntent(String sourcePackage, int labelRes, int icon) { 79 mSourcePackage = sourcePackage; 80 mLabelRes = labelRes; 81 mNonLocalizedLabel = null; 82 mIcon = icon; 83 } 84 85 /** 86 * Create a labeled intent with no intent data but supplying a textual 87 * label and icon resource for it. 88 * 89 * @param sourcePackage The package in which the label and icon live. 90 * @param nonLocalizedLabel Concrete text to use for the label. 91 * @param icon Resource containing the icon, or 0 if none. 92 */ 93 public LabeledIntent(String sourcePackage, 94 CharSequence nonLocalizedLabel, int icon) { 95 mSourcePackage = sourcePackage; 96 mLabelRes = 0; 97 mNonLocalizedLabel = nonLocalizedLabel; 98 mIcon = icon; 99 } 100 101 /** 102 * Return the name of the package holding label and icon resources. 103 */ 104 public String getSourcePackage() { 105 return mSourcePackage; 106 } 107 108 /** 109 * Return any resource identifier that has been given for the label text. 110 */ 111 public int getLabelResource() { 112 return mLabelRes; 113 } 114 115 /** 116 * Return any concrete text that has been given for the label text. 117 */ 118 public CharSequence getNonLocalizedLabel() { 119 return mNonLocalizedLabel; 120 } 121 122 /** 123 * Return any resource identifier that has been given for the label icon. 124 */ 125 public int getIconResource() { 126 return mIcon; 127 } 128 129 /** 130 * Retrieve the label associated with this object. If the object does 131 * not have a label, null will be returned, in which case you will probably 132 * want to load the label from the underlying resolved info for the Intent. 133 */ 134 public CharSequence loadLabel(PackageManager pm) { 135 if (mNonLocalizedLabel != null) { 136 return mNonLocalizedLabel; 137 } 138 if (mLabelRes != 0 && mSourcePackage != null) { 139 CharSequence label = pm.getText(mSourcePackage, mLabelRes, null); 140 if (label != null) { 141 return label; 142 } 143 } 144 return null; 145 } 146 147 /** 148 * Retrieve the icon associated with this object. If the object does 149 * not have a icon, null will be returned, in which case you will probably 150 * want to load the icon from the underlying resolved info for the Intent. 151 */ 152 public Drawable loadIcon(PackageManager pm) { 153 if (mIcon != 0 && mSourcePackage != null) { 154 Drawable icon = pm.getDrawable(mSourcePackage, mIcon, null); 155 if (icon != null) { 156 return icon; 157 } 158 } 159 return null; 160 } 161 162 public void writeToParcel(Parcel dest, int parcelableFlags) { 163 super.writeToParcel(dest, parcelableFlags); 164 dest.writeString(mSourcePackage); 165 dest.writeInt(mLabelRes); 166 TextUtils.writeToParcel(mNonLocalizedLabel, dest, parcelableFlags); 167 dest.writeInt(mIcon); 168 } 169 170 /** @hide */ 171 protected LabeledIntent(Parcel in) { 172 readFromParcel(in); 173 } 174 175 public void readFromParcel(Parcel in) { 176 super.readFromParcel(in); 177 mSourcePackage = in.readString(); 178 mLabelRes = in.readInt(); 179 mNonLocalizedLabel = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in); 180 mIcon = in.readInt(); 181 } 182 183 public static final Creator<LabeledIntent> CREATOR 184 = new Creator<LabeledIntent>() { 185 public LabeledIntent createFromParcel(Parcel source) { 186 return new LabeledIntent(source); 187 } 188 public LabeledIntent[] newArray(int size) { 189 return new LabeledIntent[size]; 190 } 191 }; 192 193} 194