Implement all of the infrastructure for configuring wallpapers.
Actually being able to configure a wallpaper relies on additional work in the launcher and wallpapers that will be in another change. Also note that this breaks all existing wallpapers, since they now need to include a meta-data item about themselves. This also will be fixed in another change. Change-Id: I97d2c2bd07237abc32f92b9147c32530a2f73c71
This commit is contained in:
@@ -684,6 +684,11 @@ public class ActivityManager {
|
||||
*/
|
||||
public int pid;
|
||||
|
||||
/**
|
||||
* The user id of this process.
|
||||
*/
|
||||
public int uid;
|
||||
|
||||
public String pkgList[];
|
||||
|
||||
/**
|
||||
@@ -797,6 +802,7 @@ public class ActivityManager {
|
||||
public void writeToParcel(Parcel dest, int flags) {
|
||||
dest.writeString(processName);
|
||||
dest.writeInt(pid);
|
||||
dest.writeInt(uid);
|
||||
dest.writeStringArray(pkgList);
|
||||
dest.writeInt(importance);
|
||||
dest.writeInt(lru);
|
||||
@@ -808,6 +814,7 @@ public class ActivityManager {
|
||||
public void readFromParcel(Parcel source) {
|
||||
processName = source.readString();
|
||||
pid = source.readInt();
|
||||
uid = source.readInt();
|
||||
pkgList = source.readStringArray();
|
||||
importance = source.readInt();
|
||||
lru = source.readInt();
|
||||
|
||||
@@ -19,6 +19,7 @@ package android.app;
|
||||
import android.os.Bundle;
|
||||
import android.os.ParcelFileDescriptor;
|
||||
import android.app.IWallpaperManagerCallback;
|
||||
import android.app.WallpaperInfo;
|
||||
import android.content.ComponentName;
|
||||
|
||||
/** @hide */
|
||||
@@ -40,6 +41,11 @@ interface IWallpaperManager {
|
||||
ParcelFileDescriptor getWallpaper(IWallpaperManagerCallback cb,
|
||||
out Bundle outParams);
|
||||
|
||||
/**
|
||||
* Get information about a live wallpaper.
|
||||
*/
|
||||
WallpaperInfo getWallpaperInfo();
|
||||
|
||||
/**
|
||||
* Clear the wallpaper.
|
||||
*/
|
||||
|
||||
@@ -53,9 +53,9 @@ import java.util.List;
|
||||
*
|
||||
*/
|
||||
public abstract class LauncherActivity extends ListActivity {
|
||||
|
||||
Intent mIntent;
|
||||
PackageManager mPackageManager;
|
||||
IconResizer mIconResizer;
|
||||
|
||||
/**
|
||||
* An item in the list
|
||||
@@ -77,7 +77,9 @@ public abstract class LauncherActivity extends ListActivity {
|
||||
label = resolveInfo.activityInfo.name;
|
||||
}
|
||||
|
||||
icon = resizer.createIconThumbnail(resolveInfo.loadIcon(pm));
|
||||
if (resizer != null) {
|
||||
icon = resizer.createIconThumbnail(resolveInfo.loadIcon(pm));
|
||||
}
|
||||
packageName = ci.applicationInfo.packageName;
|
||||
className = ci.name;
|
||||
}
|
||||
@@ -93,13 +95,15 @@ public abstract class LauncherActivity extends ListActivity {
|
||||
private final Object lock = new Object();
|
||||
private ArrayList<ListItem> mOriginalValues;
|
||||
|
||||
protected final IconResizer mIconResizer;
|
||||
protected final LayoutInflater mInflater;
|
||||
|
||||
protected List<ListItem> mActivitiesList;
|
||||
|
||||
private Filter mFilter;
|
||||
|
||||
public ActivityAdapter() {
|
||||
public ActivityAdapter(IconResizer resizer) {
|
||||
mIconResizer = resizer;
|
||||
mInflater = (LayoutInflater) LauncherActivity.this.getSystemService(
|
||||
Context.LAYOUT_INFLATER_SERVICE);
|
||||
mActivitiesList = makeListItems();
|
||||
@@ -154,6 +158,10 @@ public abstract class LauncherActivity extends ListActivity {
|
||||
private void bindView(View view, ListItem item) {
|
||||
TextView text = (TextView) view;
|
||||
text.setText(item.label);
|
||||
if (item.icon == null) {
|
||||
item.icon = mIconResizer.createIconThumbnail(
|
||||
item.resolveInfo.loadIcon(getPackageManager()));
|
||||
}
|
||||
text.setCompoundDrawablesWithIntrinsicBounds(item.icon, null, null, null);
|
||||
}
|
||||
|
||||
@@ -330,9 +338,11 @@ public abstract class LauncherActivity extends ListActivity {
|
||||
setProgressBarIndeterminateVisibility(true);
|
||||
onSetContentView();
|
||||
|
||||
mIconResizer = new IconResizer();
|
||||
|
||||
mIntent = new Intent(getTargetIntent());
|
||||
mIntent.setComponent(null);
|
||||
mAdapter = new ActivityAdapter();
|
||||
mAdapter = new ActivityAdapter(mIconResizer);
|
||||
|
||||
setListAdapter(mAdapter);
|
||||
getListView().setTextFilterEnabled(true);
|
||||
@@ -398,13 +408,11 @@ public abstract class LauncherActivity extends ListActivity {
|
||||
List<ResolveInfo> list = onQueryPackageManager(mIntent);
|
||||
Collections.sort(list, new ResolveInfo.DisplayNameComparator(mPackageManager));
|
||||
|
||||
IconResizer resizer = new IconResizer();
|
||||
|
||||
ArrayList<ListItem> result = new ArrayList<ListItem>(list.size());
|
||||
int listSize = list.size();
|
||||
for (int i = 0; i < listSize; i++) {
|
||||
ResolveInfo resolveInfo = list.get(i);
|
||||
result.add(new ListItem(mPackageManager, resolveInfo, resizer));
|
||||
result.add(new ListItem(mPackageManager, resolveInfo, null));
|
||||
}
|
||||
|
||||
return result;
|
||||
|
||||
19
core/java/android/app/WallpaperInfo.aidl
Normal file
19
core/java/android/app/WallpaperInfo.aidl
Normal file
@@ -0,0 +1,19 @@
|
||||
/*
|
||||
** Copyright 2009, The Android Open Source Project
|
||||
**
|
||||
** Licensed under the Apache License, Version 2.0 (the "License");
|
||||
** you may not use this file except in compliance with the License.
|
||||
** You may obtain a copy of the License at
|
||||
**
|
||||
** http://www.apache.org/licenses/LICENSE-2.0
|
||||
**
|
||||
** Unless required by applicable law or agreed to in writing, software
|
||||
** distributed under the License is distributed on an "AS IS" BASIS,
|
||||
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
** See the License for the specific language governing permissions and
|
||||
** limitations under the License.
|
||||
*/
|
||||
|
||||
package android.app;
|
||||
|
||||
parcelable WallpaperInfo;
|
||||
200
core/java/android/app/WallpaperInfo.java
Normal file
200
core/java/android/app/WallpaperInfo.java
Normal file
@@ -0,0 +1,200 @@
|
||||
package android.app;
|
||||
|
||||
import org.xmlpull.v1.XmlPullParser;
|
||||
import org.xmlpull.v1.XmlPullParserException;
|
||||
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.pm.ResolveInfo;
|
||||
import android.content.pm.ServiceInfo;
|
||||
import android.content.res.TypedArray;
|
||||
import android.content.res.XmlResourceParser;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
import android.service.wallpaper.WallpaperService;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.Printer;
|
||||
import android.util.Xml;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* This class is used to specify meta information of a wallpaper service.
|
||||
* @hide Live Wallpaper
|
||||
*/
|
||||
public final class WallpaperInfo implements Parcelable {
|
||||
static final String TAG = "WallpaperInfo";
|
||||
|
||||
/**
|
||||
* The Service that implements this wallpaper component.
|
||||
*/
|
||||
final ResolveInfo mService;
|
||||
|
||||
/**
|
||||
* The wallpaper setting activity's name, to
|
||||
* launch the setting activity of this wallpaper.
|
||||
*/
|
||||
final String mSettingsActivityName;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param context The Context in which we are parsing the wallpaper.
|
||||
* @param service The ResolveInfo returned from the package manager about
|
||||
* this wallpaper's component.
|
||||
*/
|
||||
public WallpaperInfo(Context context, ResolveInfo service)
|
||||
throws XmlPullParserException, IOException {
|
||||
mService = service;
|
||||
ServiceInfo si = service.serviceInfo;
|
||||
|
||||
PackageManager pm = context.getPackageManager();
|
||||
String settingsActivityComponent = null;
|
||||
|
||||
XmlResourceParser parser = null;
|
||||
try {
|
||||
parser = si.loadXmlMetaData(pm, WallpaperService.SERVICE_META_DATA);
|
||||
if (parser == null) {
|
||||
throw new XmlPullParserException("No "
|
||||
+ WallpaperService.SERVICE_META_DATA + " meta-data");
|
||||
}
|
||||
|
||||
AttributeSet attrs = Xml.asAttributeSet(parser);
|
||||
|
||||
int type;
|
||||
while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
|
||||
&& type != XmlPullParser.START_TAG) {
|
||||
}
|
||||
|
||||
String nodeName = parser.getName();
|
||||
if (!"wallpaper".equals(nodeName)) {
|
||||
throw new XmlPullParserException(
|
||||
"Meta-data does not start with wallpaper tag");
|
||||
}
|
||||
|
||||
TypedArray sa = context.getResources().obtainAttributes(attrs,
|
||||
com.android.internal.R.styleable.Wallpaper);
|
||||
settingsActivityComponent = sa.getString(
|
||||
com.android.internal.R.styleable.Wallpaper_settingsActivity);
|
||||
sa.recycle();
|
||||
} finally {
|
||||
if (parser != null) parser.close();
|
||||
}
|
||||
|
||||
mSettingsActivityName = settingsActivityComponent;
|
||||
}
|
||||
|
||||
WallpaperInfo(Parcel source) {
|
||||
mSettingsActivityName = source.readString();
|
||||
mService = ResolveInfo.CREATOR.createFromParcel(source);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the .apk package that implements this wallpaper.
|
||||
*/
|
||||
public String getPackageName() {
|
||||
return mService.serviceInfo.packageName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the class name of the service component that implements
|
||||
* this wallpaper.
|
||||
*/
|
||||
public String getServiceName() {
|
||||
return mService.serviceInfo.name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the raw information about the Service implementing this
|
||||
* wallpaper. Do not modify the returned object.
|
||||
*/
|
||||
public ServiceInfo getServiceInfo() {
|
||||
return mService.serviceInfo;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the component of the service that implements this wallpaper.
|
||||
*/
|
||||
public ComponentName getComponent() {
|
||||
return new ComponentName(mService.serviceInfo.packageName,
|
||||
mService.serviceInfo.name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Load the user-displayed label for this wallpaper.
|
||||
*
|
||||
* @param pm Supply a PackageManager used to load the wallpaper's
|
||||
* resources.
|
||||
*/
|
||||
public CharSequence loadLabel(PackageManager pm) {
|
||||
return mService.loadLabel(pm);
|
||||
}
|
||||
|
||||
/**
|
||||
* Load the user-displayed icon for this wallpaper.
|
||||
*
|
||||
* @param pm Supply a PackageManager used to load the wallpaper's
|
||||
* resources.
|
||||
*/
|
||||
public Drawable loadIcon(PackageManager pm) {
|
||||
return mService.loadIcon(pm);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the class name of an activity that provides a settings UI for
|
||||
* the wallpaper. You can launch this activity be starting it with
|
||||
* an {@link android.content.Intent} whose action is MAIN and with an
|
||||
* explicit {@link android.content.ComponentName}
|
||||
* composed of {@link #getPackageName} and the class name returned here.
|
||||
*
|
||||
* <p>A null will be returned if there is no settings activity associated
|
||||
* with the wallpaper.
|
||||
*/
|
||||
public String getSettingsActivity() {
|
||||
return mSettingsActivityName;
|
||||
}
|
||||
|
||||
public void dump(Printer pw, String prefix) {
|
||||
pw.println(prefix + "Service:");
|
||||
mService.dump(pw, prefix + " ");
|
||||
pw.println(prefix + "mSettingsActivityName=" + mSettingsActivityName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "WallpaperInfo{" + mService.serviceInfo.name
|
||||
+ ", settings: "
|
||||
+ mSettingsActivityName + "}";
|
||||
}
|
||||
|
||||
/**
|
||||
* Used to package this object into a {@link Parcel}.
|
||||
*
|
||||
* @param dest The {@link Parcel} to be written.
|
||||
* @param flags The flags used for parceling.
|
||||
*/
|
||||
public void writeToParcel(Parcel dest, int flags) {
|
||||
dest.writeString(mSettingsActivityName);
|
||||
mService.writeToParcel(dest, flags);
|
||||
}
|
||||
|
||||
/**
|
||||
* Used to make this class parcelable.
|
||||
*/
|
||||
public static final Parcelable.Creator<WallpaperInfo> CREATOR = new Parcelable.Creator<WallpaperInfo>() {
|
||||
public WallpaperInfo createFromParcel(Parcel source) {
|
||||
return new WallpaperInfo(source);
|
||||
}
|
||||
|
||||
public WallpaperInfo[] newArray(int size) {
|
||||
return new WallpaperInfo[size];
|
||||
}
|
||||
};
|
||||
|
||||
public int describeContents() {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@@ -49,7 +49,7 @@ public class WallpaperManager {
|
||||
/**
|
||||
* Launch an activity for the user to pick the current global live
|
||||
* wallpaper.
|
||||
* @hide
|
||||
* @hide Live Wallpaper
|
||||
*/
|
||||
public static final String ACTION_LIVE_WALLPAPER_CHOOSER
|
||||
= "android.service.wallpaper.LIVE_WALLPAPER_CHOOSER";
|
||||
@@ -238,6 +238,20 @@ public class WallpaperManager {
|
||||
return bm != null ? new BitmapDrawable(mContext.getResources(), bm) : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* If the current wallpaper is a live wallpaper component, return the
|
||||
* information about that wallpaper. Otherwise, if it is a static image,
|
||||
* simply return null.
|
||||
* @hide Live Wallpaper
|
||||
*/
|
||||
public WallpaperInfo getWallpaperInfo() {
|
||||
try {
|
||||
return sGlobals.mService.getWallpaperInfo();
|
||||
} catch (RemoteException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Change the current system wallpaper to the bitmap in the given resource.
|
||||
* The resource is opened as a raw data stream and copied into the
|
||||
|
||||
@@ -1928,6 +1928,15 @@ public class Intent implements Parcelable {
|
||||
*/
|
||||
public static final String EXTRA_TITLE = "android.intent.extra.TITLE";
|
||||
|
||||
/**
|
||||
* A Parcelable[] of {@link Intent} or
|
||||
* {@link android.content.pm.LabeledIntent} objects as set with
|
||||
* {@link #putExtra(String, Parcelable[])} of additional activities to place
|
||||
* a the front of the list of choices, when shown to the user with a
|
||||
* {@link #ACTION_CHOOSER}.
|
||||
*/
|
||||
public static final String EXTRA_INITIAL_INTENTS = "android.intent.extra.INITIAL_INTENTS";
|
||||
|
||||
/**
|
||||
* A {@link android.view.KeyEvent} object containing the event that
|
||||
* triggered the creation of the Intent it is in.
|
||||
@@ -5067,7 +5076,8 @@ public class Intent implements Parcelable {
|
||||
}
|
||||
};
|
||||
|
||||
private Intent(Parcel in) {
|
||||
/** @hide */
|
||||
protected Intent(Parcel in) {
|
||||
readFromParcel(in);
|
||||
}
|
||||
|
||||
|
||||
177
core/java/android/content/pm/LabeledIntent.java
Normal file
177
core/java/android/content/pm/LabeledIntent.java
Normal file
@@ -0,0 +1,177 @@
|
||||
package android.content.pm;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.Parcel;
|
||||
import android.text.TextUtils;
|
||||
|
||||
/**
|
||||
* A special subclass of Intent that can have a custom label/icon
|
||||
* associated with it. Primarily for use with {@link Intent#ACTION_CHOOSER}.
|
||||
*/
|
||||
public class LabeledIntent extends Intent {
|
||||
private String mSourcePackage;
|
||||
private int mLabelRes;
|
||||
private CharSequence mNonLocalizedLabel;
|
||||
private int mIcon;
|
||||
|
||||
/**
|
||||
* Create a labeled intent from the given intent, supplying the label
|
||||
* and icon resources for it.
|
||||
*
|
||||
* @param origIntent The original Intent to copy.
|
||||
* @param sourcePackage The package in which the label and icon live.
|
||||
* @param labelRes Resource containing the label, or 0 if none.
|
||||
* @param icon Resource containing the icon, or 0 if none.
|
||||
*/
|
||||
public LabeledIntent(Intent origIntent, String sourcePackage,
|
||||
int labelRes, int icon) {
|
||||
super(origIntent);
|
||||
mSourcePackage = sourcePackage;
|
||||
mLabelRes = labelRes;
|
||||
mNonLocalizedLabel = null;
|
||||
mIcon = icon;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a labeled intent from the given intent, supplying a textual
|
||||
* label and icon resource for it.
|
||||
*
|
||||
* @param origIntent The original Intent to copy.
|
||||
* @param sourcePackage The package in which the label and icon live.
|
||||
* @param nonLocalizedLabel Concrete text to use for the label.
|
||||
* @param icon Resource containing the icon, or 0 if none.
|
||||
*/
|
||||
public LabeledIntent(Intent origIntent, String sourcePackage,
|
||||
CharSequence nonLocalizedLabel, int icon) {
|
||||
super(origIntent);
|
||||
mSourcePackage = sourcePackage;
|
||||
mLabelRes = 0;
|
||||
mNonLocalizedLabel = nonLocalizedLabel;
|
||||
mIcon = icon;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a labeled intent with no intent data but supplying the label
|
||||
* and icon resources for it.
|
||||
*
|
||||
* @param sourcePackage The package in which the label and icon live.
|
||||
* @param labelRes Resource containing the label, or 0 if none.
|
||||
* @param icon Resource containing the icon, or 0 if none.
|
||||
*/
|
||||
public LabeledIntent(String sourcePackage, int labelRes, int icon) {
|
||||
mSourcePackage = sourcePackage;
|
||||
mLabelRes = labelRes;
|
||||
mNonLocalizedLabel = null;
|
||||
mIcon = icon;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a labeled intent with no intent data but supplying a textual
|
||||
* label and icon resource for it.
|
||||
*
|
||||
* @param sourcePackage The package in which the label and icon live.
|
||||
* @param nonLocalizedLabel Concrete text to use for the label.
|
||||
* @param icon Resource containing the icon, or 0 if none.
|
||||
*/
|
||||
public LabeledIntent(String sourcePackage,
|
||||
CharSequence nonLocalizedLabel, int icon) {
|
||||
mSourcePackage = sourcePackage;
|
||||
mLabelRes = 0;
|
||||
mNonLocalizedLabel = nonLocalizedLabel;
|
||||
mIcon = icon;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the name of the package holding label and icon resources.
|
||||
*/
|
||||
public String getSourcePackage() {
|
||||
return mSourcePackage;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return any resource identifier that has been given for the label text.
|
||||
*/
|
||||
public int getLabelResource() {
|
||||
return mLabelRes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return any concrete text that has been given for the label text.
|
||||
*/
|
||||
public CharSequence getNonLocalizedLabel() {
|
||||
return mNonLocalizedLabel;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return any resource identifier that has been given for the label icon.
|
||||
*/
|
||||
public int getIconResource() {
|
||||
return mIcon;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the label associated with this object. If the object does
|
||||
* not have a label, null will be returned, in which case you will probably
|
||||
* want to load the label from the underlying resolved info for the Intent.
|
||||
*/
|
||||
public CharSequence loadLabel(PackageManager pm) {
|
||||
if (mNonLocalizedLabel != null) {
|
||||
return mNonLocalizedLabel;
|
||||
}
|
||||
if (mLabelRes != 0 && mSourcePackage != null) {
|
||||
CharSequence label = pm.getText(mSourcePackage, mLabelRes, null);
|
||||
if (label != null) {
|
||||
return label;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the icon associated with this object. If the object does
|
||||
* not have a icon, null will be returned, in which case you will probably
|
||||
* want to load the icon from the underlying resolved info for the Intent.
|
||||
*/
|
||||
public Drawable loadIcon(PackageManager pm) {
|
||||
if (mIcon != 0 && mSourcePackage != null) {
|
||||
Drawable icon = pm.getDrawable(mSourcePackage, mIcon, null);
|
||||
if (icon != null) {
|
||||
return icon;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public void writeToParcel(Parcel dest, int parcelableFlags) {
|
||||
super.writeToParcel(dest, parcelableFlags);
|
||||
dest.writeString(mSourcePackage);
|
||||
dest.writeInt(mLabelRes);
|
||||
TextUtils.writeToParcel(mNonLocalizedLabel, dest, parcelableFlags);
|
||||
dest.writeInt(mIcon);
|
||||
}
|
||||
|
||||
/** @hide */
|
||||
protected LabeledIntent(Parcel in) {
|
||||
readFromParcel(in);
|
||||
}
|
||||
|
||||
public void readFromParcel(Parcel in) {
|
||||
super.readFromParcel(in);
|
||||
mSourcePackage = in.readString();
|
||||
mLabelRes = in.readInt();
|
||||
mNonLocalizedLabel = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
|
||||
mIcon = in.readInt();
|
||||
}
|
||||
|
||||
public static final Creator<LabeledIntent> CREATOR
|
||||
= new Creator<LabeledIntent>() {
|
||||
public LabeledIntent createFromParcel(Parcel source) {
|
||||
return new LabeledIntent(source);
|
||||
}
|
||||
public LabeledIntent[] newArray(int size) {
|
||||
return new LabeledIntent[size];
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
@@ -91,6 +91,13 @@ public class ResolveInfo implements Parcelable {
|
||||
*/
|
||||
public int icon;
|
||||
|
||||
/**
|
||||
* Optional -- if non-null, the {@link #labelRes} and {@link #icon}
|
||||
* resources will be loaded from this package, rather than the one
|
||||
* containing the resolved component.
|
||||
*/
|
||||
public String resolvePackageName;
|
||||
|
||||
/**
|
||||
* Retrieve the current textual label associated with this resolution. This
|
||||
* will call back on the given PackageManager to load the label from
|
||||
@@ -106,9 +113,15 @@ public class ResolveInfo implements Parcelable {
|
||||
if (nonLocalizedLabel != null) {
|
||||
return nonLocalizedLabel;
|
||||
}
|
||||
CharSequence label;
|
||||
if (resolvePackageName != null && labelRes != 0) {
|
||||
label = pm.getText(resolvePackageName, labelRes, null);
|
||||
if (label != null) {
|
||||
return label;
|
||||
}
|
||||
}
|
||||
ComponentInfo ci = activityInfo != null ? activityInfo : serviceInfo;
|
||||
ApplicationInfo ai = ci.applicationInfo;
|
||||
CharSequence label;
|
||||
if (labelRes != 0) {
|
||||
label = pm.getText(ci.packageName, labelRes, ai);
|
||||
if (label != null) {
|
||||
@@ -133,6 +146,12 @@ public class ResolveInfo implements Parcelable {
|
||||
ComponentInfo ci = activityInfo != null ? activityInfo : serviceInfo;
|
||||
ApplicationInfo ai = ci.applicationInfo;
|
||||
Drawable dr;
|
||||
if (resolvePackageName != null && icon != 0) {
|
||||
dr = pm.getDrawable(resolvePackageName, icon, null);
|
||||
if (dr != null) {
|
||||
return dr;
|
||||
}
|
||||
}
|
||||
if (icon != 0) {
|
||||
dr = pm.getDrawable(ci.packageName, icon, ai);
|
||||
if (dr != null) {
|
||||
@@ -160,24 +179,26 @@ public class ResolveInfo implements Parcelable {
|
||||
if (filter != null) {
|
||||
pw.println(prefix + "Filter:");
|
||||
filter.dump(pw, prefix + " ");
|
||||
} else {
|
||||
pw.println(prefix + "Filter: null");
|
||||
}
|
||||
pw.println(prefix + "priority=" + priority
|
||||
+ " preferredOrder=" + preferredOrder
|
||||
+ " match=0x" + Integer.toHexString(match)
|
||||
+ " specificIndex=" + specificIndex
|
||||
+ " isDefault=" + isDefault);
|
||||
pw.println(prefix + "labelRes=0x" + Integer.toHexString(labelRes)
|
||||
+ " nonLocalizedLabel=" + nonLocalizedLabel
|
||||
+ " icon=0x" + Integer.toHexString(icon));
|
||||
if (resolvePackageName != null) {
|
||||
pw.println(prefix + "resolvePackageName=" + resolvePackageName);
|
||||
}
|
||||
if (labelRes != 0 || nonLocalizedLabel != null || icon != 0) {
|
||||
pw.println(prefix + "labelRes=0x" + Integer.toHexString(labelRes)
|
||||
+ " nonLocalizedLabel=" + nonLocalizedLabel
|
||||
+ " icon=0x" + Integer.toHexString(icon));
|
||||
}
|
||||
if (activityInfo != null) {
|
||||
pw.println(prefix + "ActivityInfo:");
|
||||
activityInfo.dump(pw, prefix + " ");
|
||||
} else if (serviceInfo != null) {
|
||||
pw.println(prefix + "ServiceInfo:");
|
||||
// TODO
|
||||
//serviceInfo.dump(pw, prefix + " ");
|
||||
serviceInfo.dump(pw, prefix + " ");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -219,6 +240,7 @@ public class ResolveInfo implements Parcelable {
|
||||
dest.writeInt(labelRes);
|
||||
TextUtils.writeToParcel(nonLocalizedLabel, dest, parcelableFlags);
|
||||
dest.writeInt(icon);
|
||||
dest.writeString(resolvePackageName);
|
||||
}
|
||||
|
||||
public static final Creator<ResolveInfo> CREATOR
|
||||
@@ -257,6 +279,7 @@ public class ResolveInfo implements Parcelable {
|
||||
nonLocalizedLabel
|
||||
= TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source);
|
||||
icon = source.readInt();
|
||||
resolvePackageName = source.readString();
|
||||
}
|
||||
|
||||
public static class DisplayNameComparator
|
||||
|
||||
@@ -2,6 +2,7 @@ package android.content.pm;
|
||||
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
import android.util.Printer;
|
||||
|
||||
/**
|
||||
* Information you can retrieve about a particular application
|
||||
@@ -24,6 +25,11 @@ public class ServiceInfo extends ComponentInfo
|
||||
permission = orig.permission;
|
||||
}
|
||||
|
||||
public void dump(Printer pw, String prefix) {
|
||||
super.dumpFront(pw, prefix);
|
||||
pw.println(prefix + "permission=" + permission);
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "ServiceInfo{"
|
||||
+ Integer.toHexString(System.identityHashCode(this))
|
||||
|
||||
@@ -50,6 +50,14 @@ public abstract class WallpaperService extends Service {
|
||||
public static final String SERVICE_INTERFACE =
|
||||
"android.service.wallpaper.WallpaperService";
|
||||
|
||||
/**
|
||||
* Name under which a WallpaperService component publishes information
|
||||
* about itself. This meta-data must reference an XML resource containing
|
||||
* a <code><{@link android.R.styleable#Wallpaper wallpaper}></code>
|
||||
* tag.
|
||||
*/
|
||||
public static final String SERVICE_META_DATA = "android.service.wallpaper";
|
||||
|
||||
static final String TAG = "WallpaperService";
|
||||
static final boolean DEBUG = false;
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ import java.io.IOException;
|
||||
* This class is used to specify meta information of an input method.
|
||||
*/
|
||||
public final class InputMethodInfo implements Parcelable {
|
||||
static final String TAG = "InputMethodMetaInfo";
|
||||
static final String TAG = "InputMethodInfo";
|
||||
|
||||
/**
|
||||
* The Service that implements this input method component.
|
||||
@@ -244,7 +244,7 @@ public final class InputMethodInfo implements Parcelable {
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "InputMethodMetaInfo{" + mId
|
||||
return "InputMethodInfo{" + mId
|
||||
+ ", settings: "
|
||||
+ mSettingsActivityName + "}";
|
||||
}
|
||||
|
||||
@@ -17,17 +17,40 @@
|
||||
package com.android.internal.app;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.content.pm.ResolveInfo;
|
||||
import android.os.Bundle;
|
||||
import android.os.Parcelable;
|
||||
import android.util.Log;
|
||||
|
||||
public class ChooserActivity extends ResolverActivity {
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
Intent intent = getIntent();
|
||||
Intent target = (Intent)intent.getParcelableExtra(Intent.EXTRA_INTENT);
|
||||
Parcelable targetParcelable = intent.getParcelableExtra(Intent.EXTRA_INTENT);
|
||||
if (!(targetParcelable instanceof Intent)) {
|
||||
Log.w("ChooseActivity", "Target is not an intent: " + targetParcelable);
|
||||
finish();
|
||||
return;
|
||||
}
|
||||
Intent target = (Intent)targetParcelable;
|
||||
CharSequence title = intent.getCharSequenceExtra(Intent.EXTRA_TITLE);
|
||||
if (title == null) {
|
||||
title = getResources().getText(com.android.internal.R.string.chooseActivity);
|
||||
}
|
||||
super.onCreate(savedInstanceState, target, title, false);
|
||||
Parcelable[] pa = intent.getParcelableArrayExtra(Intent.EXTRA_INITIAL_INTENTS);
|
||||
Intent[] initialIntents = null;
|
||||
if (pa != null) {
|
||||
initialIntents = new Intent[pa.length];
|
||||
for (int i=0; i<pa.length; i++) {
|
||||
if (!(pa[i] instanceof Intent)) {
|
||||
Log.w("ChooseActivity", "Initial intent #" + i
|
||||
+ " not an Intent: " + pa[i]);
|
||||
finish();
|
||||
return;
|
||||
}
|
||||
initialIntents[i] = (Intent)pa[i];
|
||||
}
|
||||
}
|
||||
super.onCreate(savedInstanceState, target, title, initialIntents, false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,8 +23,10 @@ import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.content.pm.ActivityInfo;
|
||||
import android.content.pm.LabeledIntent;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.pm.ResolveInfo;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.os.PatternMatcher;
|
||||
@@ -61,11 +63,11 @@ public class ResolverActivity extends AlertActivity implements
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
onCreate(savedInstanceState, new Intent(getIntent()),
|
||||
getResources().getText(com.android.internal.R.string.whichApplication),
|
||||
true);
|
||||
null, true);
|
||||
}
|
||||
|
||||
protected void onCreate(Bundle savedInstanceState, Intent intent,
|
||||
CharSequence title, boolean alwaysUseOption) {
|
||||
CharSequence title, Intent[] initialIntents, boolean alwaysUseOption) {
|
||||
super.onCreate(savedInstanceState);
|
||||
mPm = getPackageManager();
|
||||
intent.setComponent(null);
|
||||
@@ -86,7 +88,7 @@ public class ResolverActivity extends AlertActivity implements
|
||||
com.android.internal.R.id.clearDefaultHint);
|
||||
mClearDefaultHint.setVisibility(View.GONE);
|
||||
}
|
||||
mAdapter = new ResolveListAdapter(this, intent);
|
||||
mAdapter = new ResolveListAdapter(this, intent, initialIntents);
|
||||
if (mAdapter.getCount() > 1) {
|
||||
ap.mAdapter = mAdapter;
|
||||
} else if (mAdapter.getCount() == 1) {
|
||||
@@ -185,12 +187,16 @@ public class ResolverActivity extends AlertActivity implements
|
||||
private final class DisplayResolveInfo {
|
||||
ResolveInfo ri;
|
||||
CharSequence displayLabel;
|
||||
Drawable displayIcon;
|
||||
CharSequence extendedInfo;
|
||||
Intent origIntent;
|
||||
|
||||
DisplayResolveInfo(ResolveInfo pri, CharSequence pLabel, CharSequence pInfo) {
|
||||
DisplayResolveInfo(ResolveInfo pri, CharSequence pLabel,
|
||||
CharSequence pInfo, Intent pOrigIntent) {
|
||||
ri = pri;
|
||||
displayLabel = pLabel;
|
||||
extendedInfo = pInfo;
|
||||
origIntent = pOrigIntent;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -200,7 +206,8 @@ public class ResolverActivity extends AlertActivity implements
|
||||
|
||||
private List<DisplayResolveInfo> mList;
|
||||
|
||||
public ResolveListAdapter(Context context, Intent intent) {
|
||||
public ResolveListAdapter(Context context, Intent intent,
|
||||
Intent[] initialIntents) {
|
||||
mIntent = new Intent(intent);
|
||||
mIntent.setComponent(null);
|
||||
mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
|
||||
@@ -234,9 +241,39 @@ public class ResolverActivity extends AlertActivity implements
|
||||
new ResolveInfo.DisplayNameComparator(mPm);
|
||||
Collections.sort(rList, rComparator);
|
||||
}
|
||||
|
||||
mList = new ArrayList<DisplayResolveInfo>();
|
||||
|
||||
// First put the initial items at the top.
|
||||
if (initialIntents != null) {
|
||||
for (int i=0; i<initialIntents.length; i++) {
|
||||
Intent ii = initialIntents[i];
|
||||
if (ii == null) {
|
||||
continue;
|
||||
}
|
||||
ActivityInfo ai = ii.resolveActivityInfo(
|
||||
getPackageManager(), 0);
|
||||
if (ai == null) {
|
||||
Log.w("ResolverActivity", "No activity found for "
|
||||
+ ii);
|
||||
continue;
|
||||
}
|
||||
ResolveInfo ri = new ResolveInfo();
|
||||
ri.activityInfo = ai;
|
||||
if (ii instanceof LabeledIntent) {
|
||||
LabeledIntent li = (LabeledIntent)ii;
|
||||
ri.resolvePackageName = li.getSourcePackage();
|
||||
ri.labelRes = li.getLabelResource();
|
||||
ri.nonLocalizedLabel = li.getNonLocalizedLabel();
|
||||
ri.icon = li.getIconResource();
|
||||
}
|
||||
mList.add(new DisplayResolveInfo(ri,
|
||||
ri.loadLabel(getPackageManager()), null, ii));
|
||||
}
|
||||
}
|
||||
|
||||
// Check for applications with same name and use application name or
|
||||
// package name if necessary
|
||||
mList = new ArrayList<DisplayResolveInfo>();
|
||||
r0 = rList.get(0);
|
||||
int start = 0;
|
||||
CharSequence r0Label = r0.loadLabel(mPm);
|
||||
@@ -268,7 +305,7 @@ public class ResolverActivity extends AlertActivity implements
|
||||
int num = end - start+1;
|
||||
if (num == 1) {
|
||||
// No duplicate labels. Use label for entry at start
|
||||
mList.add(new DisplayResolveInfo(ro, roLabel, null));
|
||||
mList.add(new DisplayResolveInfo(ro, roLabel, null, null));
|
||||
} else {
|
||||
boolean usePkg = false;
|
||||
CharSequence startApp = ro.activityInfo.applicationInfo.loadLabel(mPm);
|
||||
@@ -298,11 +335,11 @@ public class ResolverActivity extends AlertActivity implements
|
||||
if (usePkg) {
|
||||
// Use application name for all entries from start to end-1
|
||||
mList.add(new DisplayResolveInfo(add, roLabel,
|
||||
add.activityInfo.packageName));
|
||||
add.activityInfo.packageName, null));
|
||||
} else {
|
||||
// Use package name for all entries from start to end-1
|
||||
mList.add(new DisplayResolveInfo(add, roLabel,
|
||||
add.activityInfo.applicationInfo.loadLabel(mPm)));
|
||||
add.activityInfo.applicationInfo.loadLabel(mPm), null));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -321,10 +358,13 @@ public class ResolverActivity extends AlertActivity implements
|
||||
return null;
|
||||
}
|
||||
|
||||
Intent intent = new Intent(mIntent);
|
||||
DisplayResolveInfo dri = mList.get(position);
|
||||
|
||||
Intent intent = new Intent(dri.origIntent != null
|
||||
? dri.origIntent : mIntent);
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT
|
||||
|Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP);
|
||||
ActivityInfo ai = mList.get(position).ri.activityInfo;
|
||||
ActivityInfo ai = dri.ri.activityInfo;
|
||||
intent.setComponent(new ComponentName(
|
||||
ai.applicationInfo.packageName, ai.name));
|
||||
return intent;
|
||||
@@ -365,7 +405,10 @@ public class ResolverActivity extends AlertActivity implements
|
||||
} else {
|
||||
text2.setVisibility(View.GONE);
|
||||
}
|
||||
icon.setImageDrawable(info.ri.loadIcon(mPm));
|
||||
if (info.displayIcon == null) {
|
||||
info.displayIcon = info.ri.loadIcon(mPm);
|
||||
}
|
||||
icon.setImageDrawable(info.displayIcon);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user