am 8c6cd908: Merge "Apply API feedback for ChooserTarget" into mnc-dev

* commit '8c6cd9088ebcb48db9d43c9340f77097a1c25b37':
  Apply API feedback for ChooserTarget
This commit is contained in:
Adam Powell
2015-05-13 00:02:11 +00:00
committed by Android Git Automerger
5 changed files with 41 additions and 23 deletions

View File

@@ -28633,10 +28633,10 @@ package android.service.carrier {
package android.service.chooser { package android.service.chooser {
public final class ChooserTarget implements android.os.Parcelable { public final class ChooserTarget implements android.os.Parcelable {
ctor public ChooserTarget(java.lang.CharSequence, android.graphics.Bitmap, float, android.app.PendingIntent); ctor public ChooserTarget(java.lang.CharSequence, android.graphics.drawable.Icon, float, android.app.PendingIntent);
ctor public ChooserTarget(java.lang.CharSequence, android.graphics.Bitmap, float, android.content.IntentSender); ctor public ChooserTarget(java.lang.CharSequence, android.graphics.drawable.Icon, float, android.content.IntentSender);
method public int describeContents(); method public int describeContents();
method public android.graphics.Bitmap getIcon(); method public android.graphics.drawable.Icon getIcon();
method public android.content.IntentSender getIntentSender(); method public android.content.IntentSender getIntentSender();
method public float getScore(); method public float getScore();
method public java.lang.CharSequence getTitle(); method public java.lang.CharSequence getTitle();

View File

@@ -30656,10 +30656,10 @@ package android.service.carrier {
package android.service.chooser { package android.service.chooser {
public final class ChooserTarget implements android.os.Parcelable { public final class ChooserTarget implements android.os.Parcelable {
ctor public ChooserTarget(java.lang.CharSequence, android.graphics.Bitmap, float, android.app.PendingIntent); ctor public ChooserTarget(java.lang.CharSequence, android.graphics.drawable.Icon, float, android.app.PendingIntent);
ctor public ChooserTarget(java.lang.CharSequence, android.graphics.Bitmap, float, android.content.IntentSender); ctor public ChooserTarget(java.lang.CharSequence, android.graphics.drawable.Icon, float, android.content.IntentSender);
method public int describeContents(); method public int describeContents();
method public android.graphics.Bitmap getIcon(); method public android.graphics.drawable.Icon getIcon();
method public android.content.IntentSender getIntentSender(); method public android.content.IntentSender getIntentSender();
method public float getScore(); method public float getScore();
method public java.lang.CharSequence getTitle(); method public java.lang.CharSequence getTitle();

View File

@@ -25,6 +25,7 @@ import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.content.IntentSender; import android.content.IntentSender;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.drawable.Icon;
import android.os.Bundle; import android.os.Bundle;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
@@ -34,6 +35,16 @@ import android.util.Log;
/** /**
* A ChooserTarget represents a deep-link into an application as returned by a * A ChooserTarget represents a deep-link into an application as returned by a
* {@link android.service.chooser.ChooserTargetService}. * {@link android.service.chooser.ChooserTargetService}.
*
* <p>A chooser target represents a specific deep link target into an application exposed
* for selection by the user. This might be a frequently emailed contact, a recently active
* group messaging conversation, a folder in a cloud storage app, a collection of related
* items published on a social media service or any other contextually relevant grouping
* of target app + relevant metadata.</p>
*
* <p>Creators of chooser targets should consult the relevant design guidelines for the type
* of target they are presenting. For example, targets involving people should be presented
* with a circular icon.</p>
*/ */
public final class ChooserTarget implements Parcelable { public final class ChooserTarget implements Parcelable {
private static final String TAG = "ChooserTarget"; private static final String TAG = "ChooserTarget";
@@ -48,7 +59,7 @@ public final class ChooserTarget implements Parcelable {
* The icon that will be shown to the user to represent this target. * The icon that will be shown to the user to represent this target.
* The system may resize this icon as appropriate. * The system may resize this icon as appropriate.
*/ */
private Bitmap mIcon; private Icon mIcon;
/** /**
* The IntentSender that will be used to deliver the intent to the target. * The IntentSender that will be used to deliver the intent to the target.
@@ -93,7 +104,7 @@ public final class ChooserTarget implements Parcelable {
* @param score ranking score for this target between 0.0f and 1.0f, inclusive * @param score ranking score for this target between 0.0f and 1.0f, inclusive
* @param pendingIntent PendingIntent to fill in and send if the user chooses this target * @param pendingIntent PendingIntent to fill in and send if the user chooses this target
*/ */
public ChooserTarget(CharSequence title, Bitmap icon, float score, public ChooserTarget(CharSequence title, Icon icon, float score,
PendingIntent pendingIntent) { PendingIntent pendingIntent) {
this(title, icon, score, pendingIntent.getIntentSender()); this(title, icon, score, pendingIntent.getIntentSender());
} }
@@ -129,7 +140,7 @@ public final class ChooserTarget implements Parcelable {
* @param score ranking score for this target between 0.0f and 1.0f, inclusive * @param score ranking score for this target between 0.0f and 1.0f, inclusive
* @param intentSender IntentSender to fill in and send if the user chooses this target * @param intentSender IntentSender to fill in and send if the user chooses this target
*/ */
public ChooserTarget(CharSequence title, Bitmap icon, float score, IntentSender intentSender) { public ChooserTarget(CharSequence title, Icon icon, float score, IntentSender intentSender) {
mTitle = title; mTitle = title;
mIcon = icon; mIcon = icon;
if (score > 1.f || score < 0.f) { if (score > 1.f || score < 0.f) {
@@ -143,7 +154,7 @@ public final class ChooserTarget implements Parcelable {
ChooserTarget(Parcel in) { ChooserTarget(Parcel in) {
mTitle = in.readCharSequence(); mTitle = in.readCharSequence();
if (in.readInt() != 0) { if (in.readInt() != 0) {
mIcon = Bitmap.CREATOR.createFromParcel(in); mIcon = Icon.CREATOR.createFromParcel(in);
} else { } else {
mIcon = null; mIcon = null;
} }
@@ -167,7 +178,7 @@ public final class ChooserTarget implements Parcelable {
* *
* @return the icon representing this target, intended to be shown to a user * @return the icon representing this target, intended to be shown to a user
*/ */
public Bitmap getIcon() { public Icon getIcon() {
return mIcon; return mIcon;
} }

View File

@@ -107,7 +107,7 @@ public abstract class ChooserTargetService extends Service {
* <p>The returned list should be sorted such that the most relevant targets appear first. * <p>The returned list should be sorted such that the most relevant targets appear first.
* Any PendingIntents used to construct the resulting ChooserTargets should always be prepared * Any PendingIntents used to construct the resulting ChooserTargets should always be prepared
* to have the relevant data fields filled in by the sender. See * to have the relevant data fields filled in by the sender. See
* {@link ChooserTarget#ChooserTarget(CharSequence, android.graphics.Bitmap, float, android.app.PendingIntent) ChooserTarget}.</p> * {@link ChooserTarget#ChooserTarget(CharSequence, android.graphics.drawable.Icon, float, android.app.PendingIntent) ChooserTarget}.</p>
* *
* <p><em>Important:</em> Calls to this method from other applications will occur on * <p><em>Important:</em> Calls to this method from other applications will occur on
* a binder thread, not on your app's main thread. Make sure that access to relevant data * a binder thread, not on your app's main thread. Make sure that access to relevant data

View File

@@ -29,8 +29,8 @@ import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo; import android.content.pm.ResolveInfo;
import android.database.DataSetObserver; import android.database.DataSetObserver;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.IBinder; import android.os.IBinder;
@@ -51,10 +51,8 @@ import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.AbsListView; import android.widget.AbsListView;
import android.widget.BaseAdapter; import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.ListView; import android.widget.ListView;
import com.android.internal.R; import com.android.internal.R;
@@ -74,6 +72,8 @@ public class ChooserActivity extends ResolverActivity {
private IntentSender mRefinementIntentSender; private IntentSender mRefinementIntentSender;
private RefinementResultReceiver mRefinementResultReceiver; private RefinementResultReceiver mRefinementResultReceiver;
private Intent mReferrerFillInIntent;
private ChooserListAdapter mChooserListAdapter; private ChooserListAdapter mChooserListAdapter;
private final List<ChooserTargetServiceConnection> mServiceConnections = new ArrayList<>(); private final List<ChooserTargetServiceConnection> mServiceConnections = new ArrayList<>();
@@ -81,7 +81,7 @@ public class ChooserActivity extends ResolverActivity {
private static final int CHOOSER_TARGET_SERVICE_RESULT = 1; private static final int CHOOSER_TARGET_SERVICE_RESULT = 1;
private static final int CHOOSER_TARGET_SERVICE_WATCHDOG_TIMEOUT = 2; private static final int CHOOSER_TARGET_SERVICE_WATCHDOG_TIMEOUT = 2;
private Handler mTargetResultHandler = new Handler() { private final Handler mChooserHandler = new Handler() {
@Override @Override
public void handleMessage(Message msg) { public void handleMessage(Message msg) {
switch (msg.what) { switch (msg.what) {
@@ -176,6 +176,8 @@ public class ChooserActivity extends ResolverActivity {
} }
} }
mReferrerFillInIntent = new Intent().putExtra(Intent.EXTRA_REFERRER, getReferrer());
mChosenComponentSender = intent.getParcelableExtra( mChosenComponentSender = intent.getParcelableExtra(
Intent.EXTRA_CHOSEN_COMPONENT_INTENT_SENDER); Intent.EXTRA_CHOSEN_COMPONENT_INTENT_SENDER);
mRefinementIntentSender = intent.getParcelableExtra( mRefinementIntentSender = intent.getParcelableExtra(
@@ -346,7 +348,7 @@ public class ChooserActivity extends ResolverActivity {
if (!mServiceConnections.isEmpty()) { if (!mServiceConnections.isEmpty()) {
if (DEBUG) Log.d(TAG, "queryTargets setting watchdog timer for " if (DEBUG) Log.d(TAG, "queryTargets setting watchdog timer for "
+ WATCHDOG_TIMEOUT_MILLIS + "ms"); + WATCHDOG_TIMEOUT_MILLIS + "ms");
mTargetResultHandler.sendEmptyMessageDelayed(CHOOSER_TARGET_SERVICE_WATCHDOG_TIMEOUT, mChooserHandler.sendEmptyMessageDelayed(CHOOSER_TARGET_SERVICE_WATCHDOG_TIMEOUT,
WATCHDOG_TIMEOUT_MILLIS); WATCHDOG_TIMEOUT_MILLIS);
} }
} }
@@ -379,7 +381,7 @@ public class ChooserActivity extends ResolverActivity {
unbindService(conn); unbindService(conn);
} }
mServiceConnections.clear(); mServiceConnections.clear();
mTargetResultHandler.removeMessages(CHOOSER_TARGET_SERVICE_WATCHDOG_TIMEOUT); mChooserHandler.removeMessages(CHOOSER_TARGET_SERVICE_WATCHDOG_TIMEOUT);
} }
void onRefinementResult(TargetInfo selectedTarget, Intent matchingIntent) { void onRefinementResult(TargetInfo selectedTarget, Intent matchingIntent) {
@@ -435,7 +437,7 @@ public class ChooserActivity extends ResolverActivity {
private final ResolveInfo mBackupResolveInfo; private final ResolveInfo mBackupResolveInfo;
private final ChooserTarget mChooserTarget; private final ChooserTarget mChooserTarget;
private Drawable mBadgeIcon = null; private Drawable mBadgeIcon = null;
private final Drawable mDisplayIcon; private Drawable mDisplayIcon;
private final Intent mFillInIntent; private final Intent mFillInIntent;
private final int mFillInFlags; private final int mFillInFlags;
@@ -451,7 +453,9 @@ public class ChooserActivity extends ResolverActivity {
} }
} }
} }
mDisplayIcon = new BitmapDrawable(getResources(), chooserTarget.getIcon()); final Icon icon = chooserTarget.getIcon();
// TODO do this in the background
mDisplayIcon = icon != null ? icon.loadDrawable(ChooserActivity.this) : null;
if (sourceInfo != null) { if (sourceInfo != null) {
mBackupResolveInfo = null; mBackupResolveInfo = null;
@@ -497,9 +501,12 @@ public class ChooserActivity extends ResolverActivity {
? mSourceInfo.getResolvedIntent() : getTargetIntent(); ? mSourceInfo.getResolvedIntent() : getTargetIntent();
if (result == null) { if (result == null) {
Log.e(TAG, "ChooserTargetInfo#getFillInIntent: no fillIn intent available"); Log.e(TAG, "ChooserTargetInfo#getFillInIntent: no fillIn intent available");
} else if (mFillInIntent != null) { } else {
result = new Intent(result); result = new Intent(result);
result.fillIn(mFillInIntent, mFillInFlags); if (mFillInIntent != null) {
result.fillIn(mFillInIntent, mFillInFlags);
}
result.fillIn(mReferrerFillInIntent, 0);
} }
return result; return result;
} }
@@ -867,7 +874,7 @@ public class ChooserActivity extends ResolverActivity {
msg.what = CHOOSER_TARGET_SERVICE_RESULT; msg.what = CHOOSER_TARGET_SERVICE_RESULT;
msg.obj = new ServiceResultInfo(mOriginalTarget, targets, msg.obj = new ServiceResultInfo(mOriginalTarget, targets,
ChooserTargetServiceConnection.this); ChooserTargetServiceConnection.this);
mTargetResultHandler.sendMessage(msg); mChooserHandler.sendMessage(msg);
} }
}; };