summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDianne Hackborn <hackbod@google.com>2009-09-17 18:13:26 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2009-09-17 18:13:26 -0700
commit1f3914b7f2f3c233da8b643c426c0ffd42f32f87 (patch)
tree85f6c8bc024bb8dd9166d3aed508049529e98160
parentfb4ef8fd2e046d022f0e3eb550094be28b048b44 (diff)
parentfa82f22f1d8c4c828bdf9b670006be4f4fec772e (diff)
downloadframeworks_base-1f3914b7f2f3c233da8b643c426c0ffd42f32f87.zip
frameworks_base-1f3914b7f2f3c233da8b643c426c0ffd42f32f87.tar.gz
frameworks_base-1f3914b7f2f3c233da8b643c426c0ffd42f32f87.tar.bz2
am fa82f22f: Fix issue #2093608: Calendar widget takes a few seconds to launch
Merge commit 'fa82f22f1d8c4c828bdf9b670006be4f4fec772e' into eclair-plus-aosp * commit 'fa82f22f1d8c4c828bdf9b670006be4f4fec772e': Fix issue #2093608: Calendar widget takes a few seconds to launch
-rw-r--r--api/current.xml138
-rw-r--r--core/java/android/app/Activity.java75
-rw-r--r--core/java/android/app/ActivityManagerNative.java13
-rw-r--r--core/java/android/app/ApplicationContext.java21
-rw-r--r--core/java/android/app/IActivityManager.java7
-rw-r--r--core/java/android/content/Context.java21
-rw-r--r--core/java/android/content/ContextWrapper.java8
-rw-r--r--core/java/android/content/Intent.java7
-rw-r--r--core/java/android/content/IntentSender.java5
-rw-r--r--core/java/android/widget/RemoteViews.java10
-rw-r--r--services/java/com/android/server/am/ActivityManagerService.java17
-rw-r--r--services/java/com/android/server/am/PendingIntentRecord.java1
-rw-r--r--test-runner/android/test/mock/MockContext.java8
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeContext.java8
14 files changed, 244 insertions, 95 deletions
diff --git a/api/current.xml b/api/current.xml
index 46565f2..612b305 100644
--- a/api/current.xml
+++ b/api/current.xml
@@ -17165,27 +17165,6 @@
<parameter name="id" type="int">
</parameter>
</method>
-<method name="startActivity"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="intent" type="android.app.PendingIntent">
-</parameter>
-<parameter name="fillInIntent" type="android.content.Intent">
-</parameter>
-<parameter name="flagsMask" type="int">
-</parameter>
-<parameter name="flagsValues" type="int">
-</parameter>
-<exception name="PendingIntent.CanceledException" type="android.app.PendingIntent.CanceledException">
-</exception>
-</method>
<method name="startActivityForResult"
return="void"
abstract="false"
@@ -17201,7 +17180,7 @@
<parameter name="requestCode" type="int">
</parameter>
</method>
-<method name="startActivityForResult"
+<method name="startActivityFromChild"
return="void"
abstract="false"
native="false"
@@ -17211,21 +17190,15 @@
deprecated="not deprecated"
visibility="public"
>
-<parameter name="intent" type="android.app.PendingIntent">
-</parameter>
-<parameter name="requestCode" type="int">
-</parameter>
-<parameter name="fillInIntent" type="android.content.Intent">
+<parameter name="child" type="android.app.Activity">
</parameter>
-<parameter name="flagsMask" type="int">
+<parameter name="intent" type="android.content.Intent">
</parameter>
-<parameter name="flagsValues" type="int">
+<parameter name="requestCode" type="int">
</parameter>
-<exception name="PendingIntent.CanceledException" type="android.app.PendingIntent.CanceledException">
-</exception>
</method>
-<method name="startActivityFromChild"
- return="void"
+<method name="startActivityIfNeeded"
+ return="boolean"
abstract="false"
native="false"
synchronized="false"
@@ -17234,14 +17207,12 @@
deprecated="not deprecated"
visibility="public"
>
-<parameter name="child" type="android.app.Activity">
-</parameter>
<parameter name="intent" type="android.content.Intent">
</parameter>
<parameter name="requestCode" type="int">
</parameter>
</method>
-<method name="startActivityFromChild"
+<method name="startIntentSenderForResult"
return="void"
abstract="false"
native="false"
@@ -17251,9 +17222,7 @@
deprecated="not deprecated"
visibility="public"
>
-<parameter name="child" type="android.app.Activity">
-</parameter>
-<parameter name="intent" type="android.app.PendingIntent">
+<parameter name="intent" type="android.content.IntentSender">
</parameter>
<parameter name="requestCode" type="int">
</parameter>
@@ -17263,11 +17232,13 @@
</parameter>
<parameter name="flagsValues" type="int">
</parameter>
-<exception name="PendingIntent.CanceledException" type="android.app.PendingIntent.CanceledException">
+<parameter name="extraFlags" type="int">
+</parameter>
+<exception name="IntentSender.SendIntentException" type="android.content.IntentSender.SendIntentException">
</exception>
</method>
-<method name="startActivityIfNeeded"
- return="boolean"
+<method name="startIntentSenderFromChild"
+ return="void"
abstract="false"
native="false"
synchronized="false"
@@ -17276,10 +17247,22 @@
deprecated="not deprecated"
visibility="public"
>
-<parameter name="intent" type="android.content.Intent">
+<parameter name="child" type="android.app.Activity">
+</parameter>
+<parameter name="intent" type="android.content.IntentSender">
</parameter>
<parameter name="requestCode" type="int">
</parameter>
+<parameter name="fillInIntent" type="android.content.Intent">
+</parameter>
+<parameter name="flagsMask" type="int">
+</parameter>
+<parameter name="flagsValues" type="int">
+</parameter>
+<parameter name="extraFlags" type="int">
+</parameter>
+<exception name="IntentSender.SendIntentException" type="android.content.IntentSender.SendIntentException">
+</exception>
</method>
<method name="startManagingCursor"
return="void"
@@ -31782,6 +31765,29 @@
<parameter name="arguments" type="android.os.Bundle">
</parameter>
</method>
+<method name="startIntentSender"
+ return="void"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="intent" type="android.content.IntentSender">
+</parameter>
+<parameter name="fillInIntent" type="android.content.Intent">
+</parameter>
+<parameter name="flagsMask" type="int">
+</parameter>
+<parameter name="flagsValues" type="int">
+</parameter>
+<parameter name="extraFlags" type="int">
+</parameter>
+<exception name="IntentSender.SendIntentException" type="android.content.IntentSender.SendIntentException">
+</exception>
+</method>
<method name="startService"
return="android.content.ComponentName"
abstract="true"
@@ -33095,6 +33101,29 @@
<parameter name="arguments" type="android.os.Bundle">
</parameter>
</method>
+<method name="startIntentSender"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="intent" type="android.content.IntentSender">
+</parameter>
+<parameter name="fillInIntent" type="android.content.Intent">
+</parameter>
+<parameter name="flagsMask" type="int">
+</parameter>
+<parameter name="flagsValues" type="int">
+</parameter>
+<parameter name="extraFlags" type="int">
+</parameter>
+<exception name="IntentSender.SendIntentException" type="android.content.IntentSender.SendIntentException">
+</exception>
+</method>
<method name="startService"
return="android.content.ComponentName"
abstract="false"
@@ -126744,6 +126773,29 @@
<parameter name="arguments" type="android.os.Bundle">
</parameter>
</method>
+<method name="startIntentSender"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="intent" type="android.content.IntentSender">
+</parameter>
+<parameter name="fillInIntent" type="android.content.Intent">
+</parameter>
+<parameter name="flagsMask" type="int">
+</parameter>
+<parameter name="flagsValues" type="int">
+</parameter>
+<parameter name="extraFlags" type="int">
+</parameter>
+<exception name="IntentSender.SendIntentException" type="android.content.IntentSender.SendIntentException">
+</exception>
+</method>
<method name="startService"
return="android.content.ComponentName"
abstract="false"
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index 545db17..f8fec6f 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -24,6 +24,7 @@ import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IIntentSender;
+import android.content.IntentSender;
import android.content.SharedPreferences;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
@@ -2774,48 +2775,50 @@ public class Activity extends ContextThemeWrapper
/**
* Like {@link #startActivityForResult(Intent, int)}, but allowing you
- * to use a PendingIntent to describe the activity to be started. Note
- * that the given PendingIntent <em>must</em> have been created with
- * {@link PendingIntent#getActivity PendingIntent.getActivity}; all other
- * types will result in an IllegalArgumentException being thrown.
- *
- * @param intent The PendingIntent to launch.
+ * to use a IntentSender to describe the activity to be started. If
+ * the IntentSender is for an activity, that activity will be started
+ * as if you had called the regular {@link #startActivityForResult(Intent, int)}
+ * here; otherwise, its associated action will be executed (such as
+ * sending a broadcast) as if you had called
+ * {@link IntentSender#sendIntent IntentSender.sendIntent} on it.
+ *
+ * @param intent The IntentSender to launch.
* @param requestCode If >= 0, this code will be returned in
* onActivityResult() when the activity exits.
* @param fillInIntent If non-null, this will be provided as the
- * intent parameter to {@link PendingIntent#send(Context, int, Intent)
- * PendingIntent.send(Context, int, Intent)}.
- * @param flagsMask Intent flags in the original PendingIntent that you
+ * intent parameter to {@link IntentSender#sendIntent}.
+ * @param flagsMask Intent flags in the original IntentSender that you
* would like to change.
* @param flagsValues Desired values for any bits set in
* <var>flagsMask</var>
+ * @param extraFlags Always set to 0.
*/
- public void startActivityForResult(PendingIntent intent, int requestCode,
- Intent fillInIntent, int flagsMask, int flagsValues)
- throws PendingIntent.CanceledException {
+ public void startIntentSenderForResult(IntentSender intent, int requestCode,
+ Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
+ throws IntentSender.SendIntentException {
if (mParent == null) {
- startActivityForResultInner(intent, requestCode, fillInIntent,
+ startIntentSenderForResultInner(intent, requestCode, fillInIntent,
flagsMask, flagsValues, this);
} else {
- mParent.startActivityFromChild(this, intent, requestCode,
- fillInIntent, flagsMask, flagsValues);
+ mParent.startIntentSenderFromChild(this, intent, requestCode,
+ fillInIntent, flagsMask, flagsValues, extraFlags);
}
}
- private void startActivityForResultInner(PendingIntent intent, int requestCode,
+ private void startIntentSenderForResultInner(IntentSender intent, int requestCode,
Intent fillInIntent, int flagsMask, int flagsValues, Activity activity)
- throws PendingIntent.CanceledException {
+ throws IntentSender.SendIntentException {
try {
String resolvedType = null;
if (fillInIntent != null) {
resolvedType = fillInIntent.resolveTypeIfNeeded(getContentResolver());
}
int result = ActivityManagerNative.getDefault()
- .startActivityPendingIntent(mMainThread.getApplicationThread(), intent,
+ .startActivityIntentSender(mMainThread.getApplicationThread(), intent,
fillInIntent, resolvedType, mToken, activity.mEmbeddedID,
requestCode, flagsMask, flagsValues);
if (result == IActivityManager.START_CANCELED) {
- throw new PendingIntent.CanceledException();
+ throw new IntentSender.SendIntentException();
}
Instrumentation.checkStartActivityResult(result, null);
} catch (RemoteException e) {
@@ -2856,24 +2859,25 @@ public class Activity extends ContextThemeWrapper
}
/**
- * Like {@link #startActivity(Intent)}, but taking a PendingIntent
+ * Like {@link #startActivity(Intent)}, but taking a IntentSender
* to start; see
- * {@link #startActivityForResult(PendingIntent, int, Intent, int, int)}
+ * {@link #startIntentSenderForResult(IntentSender, int, Intent, int, int)}
* for more information.
*
- * @param intent The PendingIntent to launch.
+ * @param intent The IntentSender to launch.
* @param fillInIntent If non-null, this will be provided as the
- * intent parameter to {@link PendingIntent#send(Context, int, Intent)
- * PendingIntent.send(Context, int, Intent)}.
- * @param flagsMask Intent flags in the original PendingIntent that you
+ * intent parameter to {@link IntentSender#sendIntent}.
+ * @param flagsMask Intent flags in the original IntentSender that you
* would like to change.
* @param flagsValues Desired values for any bits set in
* <var>flagsMask</var>
+ * @param extraFlags Always set to 0.
*/
- public void startActivity(PendingIntent intent,
- Intent fillInIntent, int flagsMask, int flagsValues)
- throws PendingIntent.CanceledException {
- startActivityForResult(intent, -1, fillInIntent, flagsMask, flagsValues);
+ public void startIntentSender(IntentSender intent,
+ Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
+ throws IntentSender.SendIntentException {
+ startIntentSenderForResult(intent, -1, fillInIntent, flagsMask,
+ flagsValues, extraFlags);
}
/**
@@ -2998,14 +3002,15 @@ public class Activity extends ContextThemeWrapper
/**
* Like {@link #startActivityFromChild(Activity, Intent, int)}, but
- * taking a PendingIntent; see
- * {@link #startActivityForResult(PendingIntent, int, Intent, int, int)}
+ * taking a IntentSender; see
+ * {@link #startIntentSenderForResult(IntentSender, int, Intent, int, int)}
* for more information.
*/
- public void startActivityFromChild(Activity child, PendingIntent intent,
- int requestCode, Intent fillInIntent, int flagsMask, int flagsValues)
- throws PendingIntent.CanceledException {
- startActivityForResultInner(intent, requestCode, fillInIntent,
+ public void startIntentSenderFromChild(Activity child, IntentSender intent,
+ int requestCode, Intent fillInIntent, int flagsMask, int flagsValues,
+ int extraFlags)
+ throws IntentSender.SendIntentException {
+ startIntentSenderForResultInner(intent, requestCode, fillInIntent,
flagsMask, flagsValues, child);
}
diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java
index 722c75c..82d49e3 100644
--- a/core/java/android/app/ActivityManagerNative.java
+++ b/core/java/android/app/ActivityManagerNative.java
@@ -21,6 +21,7 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.content.IIntentSender;
import android.content.IIntentReceiver;
+import android.content.IntentSender;
import android.content.pm.ApplicationInfo;
import android.content.pm.ConfigurationInfo;
import android.content.pm.IPackageDataObserver;
@@ -145,12 +146,12 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM
return true;
}
- case START_ACTIVITY_PENDING_INTENT_TRANSACTION:
+ case START_ACTIVITY_INTENT_SENDER_TRANSACTION:
{
data.enforceInterface(IActivityManager.descriptor);
IBinder b = data.readStrongBinder();
IApplicationThread app = ApplicationThreadNative.asInterface(b);
- PendingIntent intent = PendingIntent.CREATOR.createFromParcel(data);
+ IntentSender intent = IntentSender.CREATOR.createFromParcel(data);
Intent fillInIntent = null;
if (data.readInt() != 0) {
fillInIntent = Intent.CREATOR.createFromParcel(data);
@@ -161,7 +162,7 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM
int requestCode = data.readInt();
int flagsMask = data.readInt();
int flagsValues = data.readInt();
- int result = startActivityPendingIntent(app, intent,
+ int result = startActivityIntentSender(app, intent,
fillInIntent, resolvedType, resultTo, resultWho,
requestCode, flagsMask, flagsValues);
reply.writeNoException();
@@ -1202,8 +1203,8 @@ class ActivityManagerProxy implements IActivityManager
data.recycle();
return result;
}
- public int startActivityPendingIntent(IApplicationThread caller,
- PendingIntent intent, Intent fillInIntent, String resolvedType,
+ public int startActivityIntentSender(IApplicationThread caller,
+ IntentSender intent, Intent fillInIntent, String resolvedType,
IBinder resultTo, String resultWho, int requestCode,
int flagsMask, int flagsValues) throws RemoteException {
Parcel data = Parcel.obtain();
@@ -1223,7 +1224,7 @@ class ActivityManagerProxy implements IActivityManager
data.writeInt(requestCode);
data.writeInt(flagsMask);
data.writeInt(flagsValues);
- mRemote.transact(START_ACTIVITY_PENDING_INTENT_TRANSACTION, data, reply, 0);
+ mRemote.transact(START_ACTIVITY_INTENT_SENDER_TRANSACTION, data, reply, 0);
reply.readException();
int result = reply.readInt();
reply.recycle();
diff --git a/core/java/android/app/ApplicationContext.java b/core/java/android/app/ApplicationContext.java
index 487cfda..dc8d873 100644
--- a/core/java/android/app/ApplicationContext.java
+++ b/core/java/android/app/ApplicationContext.java
@@ -561,6 +561,27 @@ class ApplicationContext extends Context {
}
@Override
+ public void startIntentSender(IntentSender intent,
+ Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
+ throws IntentSender.SendIntentException {
+ try {
+ String resolvedType = null;
+ if (fillInIntent != null) {
+ resolvedType = fillInIntent.resolveTypeIfNeeded(getContentResolver());
+ }
+ int result = ActivityManagerNative.getDefault()
+ .startActivityIntentSender(mMainThread.getApplicationThread(), intent,
+ fillInIntent, resolvedType, null, null,
+ 0, flagsMask, flagsValues);
+ if (result == IActivityManager.START_CANCELED) {
+ throw new IntentSender.SendIntentException();
+ }
+ Instrumentation.checkStartActivityResult(result, null);
+ } catch (RemoteException e) {
+ }
+ }
+
+ @Override
public void sendBroadcast(Intent intent) {
String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
try {
diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java
index 7d9dd3a..110b72d 100644
--- a/core/java/android/app/IActivityManager.java
+++ b/core/java/android/app/IActivityManager.java
@@ -23,6 +23,7 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.content.IIntentSender;
import android.content.IIntentReceiver;
+import android.content.IntentSender;
import android.content.pm.ApplicationInfo;
import android.content.pm.ConfigurationInfo;
import android.content.pm.IPackageDataObserver;
@@ -83,8 +84,8 @@ public interface IActivityManager extends IInterface {
Intent intent, String resolvedType, Uri[] grantedUriPermissions,
int grantedMode, IBinder resultTo, String resultWho, int requestCode,
boolean onlyIfNeeded, boolean debug) throws RemoteException;
- public int startActivityPendingIntent(IApplicationThread caller,
- PendingIntent intent, Intent fillInIntent, String resolvedType,
+ public int startActivityIntentSender(IApplicationThread caller,
+ IntentSender intent, Intent fillInIntent, String resolvedType,
IBinder resultTo, String resultWho, int requestCode,
int flagsMask, int flagsValues) throws RemoteException;
public boolean startNextMatchingActivity(IBinder callingActivity,
@@ -442,5 +443,5 @@ public interface IActivityManager extends IInterface {
int CLOSE_SYSTEM_DIALOGS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+96;
int GET_PROCESS_MEMORY_INFO_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+97;
int KILL_APPLICATION_PROCESS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+98;
- int START_ACTIVITY_PENDING_INTENT_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+99;
+ int START_ACTIVITY_INTENT_SENDER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+99;
}
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index 60551b8..1a5269e 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -559,6 +559,27 @@ public abstract class Context {
public abstract void startActivity(Intent intent);
/**
+ * Like {@link #startActivity(Intent)}, but taking a IntentSender
+ * to start. If the IntentSender is for an activity, that activity will be started
+ * as if you had called the regular {@link #startActivityForResult(Intent, int)}
+ * here; otherwise, its associated action will be executed (such as
+ * sending a broadcast) as if you had called
+ * {@link IntentSender#sendIntent IntentSender.sendIntent} on it.
+ *
+ * @param intent The IntentSender to launch.
+ * @param fillInIntent If non-null, this will be provided as the
+ * intent parameter to {@link IntentSender#sendIntent}.
+ * @param flagsMask Intent flags in the original IntentSender that you
+ * would like to change.
+ * @param flagsValues Desired values for any bits set in
+ * <var>flagsMask</var>
+ * @param extraFlags Always set to 0.
+ */
+ public abstract void startIntentSender(IntentSender intent,
+ Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
+ throws IntentSender.SendIntentException;
+
+ /**
* Broadcast the given intent to all interested BroadcastReceivers. This
* call is asynchronous; it returns immediately, and you will continue
* executing while the receivers are run. No results are propagated from
diff --git a/core/java/android/content/ContextWrapper.java b/core/java/android/content/ContextWrapper.java
index 15612ce..d580c47 100644
--- a/core/java/android/content/ContextWrapper.java
+++ b/core/java/android/content/ContextWrapper.java
@@ -249,6 +249,14 @@ public class ContextWrapper extends Context {
}
@Override
+ public void startIntentSender(IntentSender intent,
+ Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
+ throws IntentSender.SendIntentException {
+ mBase.startIntentSender(intent, fillInIntent, flagsMask,
+ flagsValues, extraFlags);
+ }
+
+ @Override
public void sendBroadcast(Intent intent) {
mBase.sendBroadcast(intent);
}
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index fc977c8..1359761 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -2334,6 +2334,13 @@ public class Intent implements Parcelable {
*/
public static final int FLAG_RECEIVER_BOOT_UPGRADE = 0x10000000;
+ /**
+ * @hide Flags that can't be changed with PendingIntent.
+ */
+ public static final int IMMUTABLE_FLAGS =
+ FLAG_GRANT_READ_URI_PERMISSION
+ | FLAG_GRANT_WRITE_URI_PERMISSION;
+
// ---------------------------------------------------------------------
// ---------------------------------------------------------------------
// toUri() and parseUri() options.
diff --git a/core/java/android/content/IntentSender.java b/core/java/android/content/IntentSender.java
index 0e4d984..c8f7aa9 100644
--- a/core/java/android/content/IntentSender.java
+++ b/core/java/android/content/IntentSender.java
@@ -249,6 +249,11 @@ public class IntentSender implements Parcelable {
}
/** @hide */
+ public IIntentSender getTarget() {
+ return mTarget;
+ }
+
+ /** @hide */
public IntentSender(IIntentSender target) {
mTarget = target;
}
diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java
index 2dac652..8ef65db 100644
--- a/core/java/android/widget/RemoteViews.java
+++ b/core/java/android/widget/RemoteViews.java
@@ -17,8 +17,9 @@
package android.widget;
import android.app.PendingIntent;
-import android.app.PendingIntent.CanceledException;
import android.content.Context;
+import android.content.Intent;
+import android.content.IntentSender;
import android.content.pm.PackageManager.NameNotFoundException;
import android.graphics.Bitmap;
import android.graphics.PorterDuff;
@@ -137,8 +138,11 @@ public class RemoteViews implements Parcelable, Filter {
public void onClick(View v) {
try {
// TODO: Unregister this handler if PendingIntent.FLAG_ONE_SHOT?
- pendingIntent.send();
- } catch (CanceledException e) {
+ v.getContext().startIntentSender(
+ pendingIntent.getIntentSender(), null,
+ Intent.FLAG_ACTIVITY_NEW_TASK,
+ Intent.FLAG_ACTIVITY_NEW_TASK, 0);
+ } catch (IntentSender.SendIntentException e) {
throw new ActionException(e.toString());
}
}
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index 62b71f2..e330614 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -33,7 +33,6 @@ import android.app.AlertDialog;
import android.app.ApplicationErrorReport;
import android.app.Dialog;
import android.app.IActivityController;
-import android.app.IActivityManager;
import android.app.IActivityWatcher;
import android.app.IApplicationThread;
import android.app.IInstrumentationWatcher;
@@ -53,6 +52,7 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.content.IIntentReceiver;
import android.content.IIntentSender;
+import android.content.IntentSender;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.ConfigurationInfo;
@@ -3613,8 +3613,8 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
}
}
- public int startActivityPendingIntent(IApplicationThread caller,
- PendingIntent intent, Intent fillInIntent, String resolvedType,
+ public int startActivityIntentSender(IApplicationThread caller,
+ IntentSender intent, Intent fillInIntent, String resolvedType,
IBinder resultTo, String resultWho, int requestCode,
int flagsMask, int flagsValues) {
// Refuse possible leaked file descriptors
@@ -3628,8 +3628,15 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
}
PendingIntentRecord pir = (PendingIntentRecord)sender;
- if (pir.key.type != IActivityManager.INTENT_SENDER_ACTIVITY) {
- return START_NOT_ACTIVITY;
+
+ synchronized (this) {
+ // If this is coming from the currently resumed activity, it is
+ // effectively saying that app switches are allowed at this point.
+ if (mResumedActivity != null
+ && mResumedActivity.info.applicationInfo.uid ==
+ Binder.getCallingUid()) {
+ mAppSwitchesAllowedTime = 0;
+ }
}
return pir.sendInner(0, fillInIntent, resolvedType,
diff --git a/services/java/com/android/server/am/PendingIntentRecord.java b/services/java/com/android/server/am/PendingIntentRecord.java
index d994362..a753d05 100644
--- a/services/java/com/android/server/am/PendingIntentRecord.java
+++ b/services/java/com/android/server/am/PendingIntentRecord.java
@@ -198,6 +198,7 @@ class PendingIntentRecord extends IIntentSender.Stub {
} else {
resolvedType = key.requestResolvedType;
}
+ flagsMask &= ~Intent.IMMUTABLE_FLAGS;
flagsValues &= flagsMask;
finalIntent.setFlags((finalIntent.getFlags()&~flagsMask) | flagsValues);
diff --git a/test-runner/android/test/mock/MockContext.java b/test-runner/android/test/mock/MockContext.java
index 9fb1e61..5368526 100644
--- a/test-runner/android/test/mock/MockContext.java
+++ b/test-runner/android/test/mock/MockContext.java
@@ -22,6 +22,7 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.BroadcastReceiver;
+import android.content.IntentSender;
import android.content.ServiceConnection;
import android.content.SharedPreferences;
import android.content.pm.ApplicationInfo;
@@ -228,6 +229,13 @@ public class MockContext extends Context {
}
@Override
+ public void startIntentSender(IntentSender intent,
+ Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
+ throws IntentSender.SendIntentException {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public void sendBroadcast(Intent intent) {
throw new UnsupportedOperationException();
}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeContext.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeContext.java
index f48c8db..4e7e925 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeContext.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/BridgeContext.java
@@ -27,6 +27,7 @@ import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.content.IntentSender;
import android.content.ServiceConnection;
import android.content.SharedPreferences;
import android.content.pm.ApplicationInfo;
@@ -1124,6 +1125,13 @@ public final class BridgeContext extends Context {
}
@Override
+ public void startIntentSender(IntentSender intent,
+ Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
+ throws IntentSender.SendIntentException {
+ // TODO Auto-generated method stub
+ }
+
+ @Override
public boolean startInstrumentation(ComponentName arg0, String arg1,
Bundle arg2) {
// TODO Auto-generated method stub