Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fa82f22f authored by Dianne Hackborn's avatar Dianne Hackborn
Browse files

Fix issue #2093608: Calendar widget takes a few seconds to launch

Avert your eyes!

The key change here is that RemoteViews can now call a Context API to
start its pending intent, which inside of the activity manager we can
use to determine to cancel the timeout delay for external entities
to disrupt the home screen.

Change-Id: If097cf7478cbed7a3c04a304050bd7fd5703d197
parent 9b64ef13
Loading
Loading
Loading
Loading
+95 −43
Original line number Diff line number Diff line
@@ -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"
+40 −35
Original line number Diff line number Diff line
@@ -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);
    }

+7 −6
Original line number Diff line number Diff line
@@ -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();
+21 −0
Original line number Diff line number Diff line
@@ -560,6 +560,27 @@ class ApplicationContext extends Context {
            getOuterContext(), mMainThread.getApplicationThread(), null, null, intent, -1);
    }

    @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());
+4 −3
Original line number Diff line number Diff line
@@ -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;
}
Loading