11ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu/*
21ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * Copyright (C) 2006 The Android Open Source Project
31ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu *
41ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * Licensed under the Apache License, Version 2.0 (the "License");
51ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * you may not use this file except in compliance with the License.
61ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * You may obtain a copy of the License at
71ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu *
81ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu *      http://www.apache.org/licenses/LICENSE-2.0
91ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu *
101ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * Unless required by applicable law or agreed to in writing, software
111ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * distributed under the License is distributed on an "AS IS" BASIS,
121ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * See the License for the specific language governing permissions and
141ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * limitations under the License.
151ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu */
161ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu
171ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapupackage android.content;
181ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu
19dc589ac82b5fe2063f4cfd94c8ae26d43d5420a0Sudheer Shankaimport android.app.ActivityManager;
201ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapuimport android.os.Bundle;
211ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapuimport android.os.RemoteException;
221ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapuimport android.os.Handler;
231ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapuimport android.os.IBinder;
241ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapuimport android.os.Parcel;
251ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapuimport android.os.Parcelable;
26f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackbornimport android.os.UserHandle;
271ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapuimport android.util.AndroidException;
281ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu
291ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu
301ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu/**
311ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * A description of an Intent and target action to perform with it.
321ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * The returned object can be
331ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * handed to other applications so that they can perform the action you
341ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * described on your behalf at a later time.
351ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu *
361ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * <p>By giving a IntentSender to another application,
371ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * you are granting it the right to perform the operation you have specified
381ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * as if the other application was yourself (with the same permissions and
391ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * identity).  As such, you should be careful about how you build the IntentSender:
401ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * often, for example, the base Intent you supply will have the component
411ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * name explicitly set to one of your own components, to ensure it is ultimately
421ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * sent there and nowhere else.
431ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu *
441ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * <p>A IntentSender itself is simply a reference to a token maintained by
451ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * the system describing the original data used to retrieve it.  This means
461ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * that, even if its owning application's process is killed, the
471ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * IntentSender itself will remain usable from other processes that
481ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * have been given it.  If the creating application later re-retrieves the
491ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * same kind of IntentSender (same operation, same Intent action, data,
501ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * categories, and components, and same flags), it will receive a IntentSender
511ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * representing the same token if that is still valid.
521ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu *
537f2054392e9957d3ba8579ef08c29cfb27df564eDianne Hackborn * <p>Instances of this class can not be made directly, but rather must be
547f2054392e9957d3ba8579ef08c29cfb27df564eDianne Hackborn * created from an existing {@link android.app.PendingIntent} with
557f2054392e9957d3ba8579ef08c29cfb27df564eDianne Hackborn * {@link android.app.PendingIntent#getIntentSender() PendingIntent.getIntentSender()}.
561ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu */
571ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapupublic class IntentSender implements Parcelable {
581ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu    private final IIntentSender mTarget;
59983055231b999e450def3e3df377fb4e23420711Dianne Hackborn    IBinder mWhitelistToken;
601ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu
611ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu    /**
621ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     * Exception thrown when trying to send through a PendingIntent that
631ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     * has been canceled or is otherwise no longer able to execute the request.
641ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     */
651ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu    public static class SendIntentException extends AndroidException {
661ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        public SendIntentException() {
671ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        }
681ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu
691ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        public SendIntentException(String name) {
701ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu            super(name);
711ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        }
721ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu
731ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        public SendIntentException(Exception cause) {
741ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu            super(cause);
751ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        }
761ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu    }
771ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu
781ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu    /**
791ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     * Callback interface for discovering when a send operation has
801ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     * completed.  Primarily for use with a IntentSender that is
811ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     * performing a broadcast, this provides the same information as
821ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     * calling {@link Context#sendOrderedBroadcast(Intent, String,
831ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     * android.content.BroadcastReceiver, Handler, int, String, Bundle)
841ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     * Context.sendBroadcast()} with a final BroadcastReceiver.
851ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     */
861ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu    public interface OnFinished {
871ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        /**
881ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu         * Called when a send operation as completed.
891ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu         *
901ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu         * @param IntentSender The IntentSender this operation was sent through.
911ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu         * @param intent The original Intent that was sent.
921ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu         * @param resultCode The final result code determined by the send.
931ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu         * @param resultData The final data collected by a broadcast.
941ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu         * @param resultExtras The final extras collected by a broadcast.
951ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu         */
961ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        void onSendFinished(IntentSender IntentSender, Intent intent,
971ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu                int resultCode, String resultData, Bundle resultExtras);
981ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu    }
991ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu
1001ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu    private static class FinishedDispatcher extends IIntentReceiver.Stub
1011ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu            implements Runnable {
1021ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        private final IntentSender mIntentSender;
1031ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        private final OnFinished mWho;
1041ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        private final Handler mHandler;
1051ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        private Intent mIntent;
1061ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        private int mResultCode;
1071ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        private String mResultData;
1081ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        private Bundle mResultExtras;
1091ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        FinishedDispatcher(IntentSender pi, OnFinished who, Handler handler) {
1101ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu            mIntentSender = pi;
1111ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu            mWho = who;
1121ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu            mHandler = handler;
1131ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        }
11420e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn        public void performReceive(Intent intent, int resultCode, String data,
11520e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn                Bundle extras, boolean serialized, boolean sticky, int sendingUser) {
1161ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu            mIntent = intent;
1171ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu            mResultCode = resultCode;
1181ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu            mResultData = data;
1191ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu            mResultExtras = extras;
1201ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu            if (mHandler == null) {
1211ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu                run();
1221ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu            } else {
1231ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu                mHandler.post(this);
1241ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu            }
1251ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        }
1261ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        public void run() {
1271ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu            mWho.onSendFinished(mIntentSender, mIntent, mResultCode,
1281ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu                    mResultData, mResultExtras);
1291ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        }
1301ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu    }
1311ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu
1321ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu    /**
1331ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     * Perform the operation associated with this IntentSender, allowing the
1341ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     * caller to specify information about the Intent to use and be notified
1351ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     * when the send has completed.
1361ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     *
1371ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     * @param context The Context of the caller.  This may be null if
1381ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     * <var>intent</var> is also null.
1391ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     * @param code Result code to supply back to the IntentSender's target.
1401ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     * @param intent Additional Intent data.  See {@link Intent#fillIn
1411ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     * Intent.fillIn()} for information on how this is applied to the
1421ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     * original Intent.  Use null to not modify the original Intent.
1431ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     * @param onFinished The object to call back on when the send has
1441ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     * completed, or null for no callback.
1451ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     * @param handler Handler identifying the thread on which the callback
1461ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     * should happen.  If null, the callback will happen from the thread
1471ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     * pool of the process.
1481ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     *
1491ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     *
1501ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     * @throws SendIntentException Throws CanceledIntentException if the IntentSender
1511ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     * is no longer allowing more intents to be sent through it.
1521ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     */
1531ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu    public void sendIntent(Context context, int code, Intent intent,
1541ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu            OnFinished onFinished, Handler handler) throws SendIntentException {
1556c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn        sendIntent(context, code, intent, onFinished, handler, null);
1566c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn    }
1576c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn
1586c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn    /**
1596c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn     * Perform the operation associated with this IntentSender, allowing the
1606c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn     * caller to specify information about the Intent to use and be notified
1616c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn     * when the send has completed.
1626c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn     *
1636c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn     * @param context The Context of the caller.  This may be null if
1646c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn     * <var>intent</var> is also null.
1656c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn     * @param code Result code to supply back to the IntentSender's target.
1666c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn     * @param intent Additional Intent data.  See {@link Intent#fillIn
1676c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn     * Intent.fillIn()} for information on how this is applied to the
1686c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn     * original Intent.  Use null to not modify the original Intent.
1696c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn     * @param onFinished The object to call back on when the send has
1706c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn     * completed, or null for no callback.
1716c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn     * @param handler Handler identifying the thread on which the callback
1726c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn     * should happen.  If null, the callback will happen from the thread
1736c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn     * pool of the process.
1746c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn     * @param requiredPermission Name of permission that a recipient of the PendingIntent
1756c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn     * is required to hold.  This is only valid for broadcast intents, and
1766c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn     * corresponds to the permission argument in
1776c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn     * {@link Context#sendBroadcast(Intent, String) Context.sendOrderedBroadcast(Intent, String)}.
1786c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn     * If null, no permission is required.
1796c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn     *
1806c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn     *
1816c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn     * @throws SendIntentException Throws CanceledIntentException if the IntentSender
1826c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn     * is no longer allowing more intents to be sent through it.
1836c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn     */
1846c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn    public void sendIntent(Context context, int code, Intent intent,
1856c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn            OnFinished onFinished, Handler handler, String requiredPermission)
1866c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn            throws SendIntentException {
1871ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        try {
1881ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu            String resolvedType = intent != null ?
1891ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu                    intent.resolveTypeIfNeeded(context.getContentResolver())
1901ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu                    : null;
191983055231b999e450def3e3df377fb4e23420711Dianne Hackborn            int res = ActivityManager.getService().sendIntentSender(mTarget, mWhitelistToken,
1920c4e6a8da3405f742e5cef8afdf579d58b6f1246Dianne Hackborn                    code, intent, resolvedType,
1931ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu                    onFinished != null
1946c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn                            ? new FinishedDispatcher(this, onFinished, handler)
1956c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn                            : null,
196a750a63d639f6936af456df904fa6b9ba941885eDianne Hackborn                    requiredPermission, null);
1971ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu            if (res < 0) {
1981ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu                throw new SendIntentException();
1991ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu            }
2001ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        } catch (RemoteException e) {
2011ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu            throw new SendIntentException();
2021ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        }
2031ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu    }
2041ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu
2051ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu    /**
2068832c18d8b63367929c2d394c9c508f56003d400Dianne Hackborn     * @deprecated Renamed to {@link #getCreatorPackage()}.
2078832c18d8b63367929c2d394c9c508f56003d400Dianne Hackborn     */
2088832c18d8b63367929c2d394c9c508f56003d400Dianne Hackborn    @Deprecated
2098832c18d8b63367929c2d394c9c508f56003d400Dianne Hackborn    public String getTargetPackage() {
2108832c18d8b63367929c2d394c9c508f56003d400Dianne Hackborn        try {
211dc589ac82b5fe2063f4cfd94c8ae26d43d5420a0Sudheer Shanka            return ActivityManager.getService()
2128832c18d8b63367929c2d394c9c508f56003d400Dianne Hackborn                .getPackageForIntentSender(mTarget);
2138832c18d8b63367929c2d394c9c508f56003d400Dianne Hackborn        } catch (RemoteException e) {
2148832c18d8b63367929c2d394c9c508f56003d400Dianne Hackborn            // Should never happen.
2158832c18d8b63367929c2d394c9c508f56003d400Dianne Hackborn            return null;
2168832c18d8b63367929c2d394c9c508f56003d400Dianne Hackborn        }
2178832c18d8b63367929c2d394c9c508f56003d400Dianne Hackborn    }
2188832c18d8b63367929c2d394c9c508f56003d400Dianne Hackborn
2198832c18d8b63367929c2d394c9c508f56003d400Dianne Hackborn    /**
220860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn     * Return the package name of the application that created this
221860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn     * IntentSender, that is the identity under which you will actually be
222860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn     * sending the Intent.  The returned string is supplied by the system, so
223860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn     * that an application can not spoof its package.
224860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn     *
225860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn     * @return The package name of the PendingIntent, or null if there is
226860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn     * none associated with it.
227860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn     */
2288832c18d8b63367929c2d394c9c508f56003d400Dianne Hackborn    public String getCreatorPackage() {
229860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn        try {
230dc589ac82b5fe2063f4cfd94c8ae26d43d5420a0Sudheer Shanka            return ActivityManager.getService()
231860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn                .getPackageForIntentSender(mTarget);
232860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn        } catch (RemoteException e) {
233860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn            // Should never happen.
234860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn            return null;
235860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn        }
236860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn    }
237860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn
238860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn    /**
239c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn     * Return the uid of the application that created this
240c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn     * PendingIntent, that is the identity under which you will actually be
241c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn     * sending the Intent.  The returned integer is supplied by the system, so
242c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn     * that an application can not spoof its uid.
243c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn     *
244c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn     * @return The uid of the PendingIntent, or -1 if there is
245c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn     * none associated with it.
246c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn     */
2478832c18d8b63367929c2d394c9c508f56003d400Dianne Hackborn    public int getCreatorUid() {
248c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn        try {
249dc589ac82b5fe2063f4cfd94c8ae26d43d5420a0Sudheer Shanka            return ActivityManager.getService()
250c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn                .getUidForIntentSender(mTarget);
251c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn        } catch (RemoteException e) {
252c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn            // Should never happen.
253c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn            return -1;
254c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn        }
255c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn    }
256c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn
257c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn    /**
258c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn     * Return the user handle of the application that created this
259c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn     * PendingIntent, that is the user under which you will actually be
26079af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn     * sending the Intent.  The returned UserHandle is supplied by the system, so
261c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn     * that an application can not spoof its user.  See
262c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn     * {@link android.os.Process#myUserHandle() Process.myUserHandle()} for
263c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn     * more explanation of user handles.
264c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn     *
26579af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn     * @return The user handle of the PendingIntent, or null if there is
266c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn     * none associated with it.
267c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn     */
2688832c18d8b63367929c2d394c9c508f56003d400Dianne Hackborn    public UserHandle getCreatorUserHandle() {
269c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn        try {
270dc589ac82b5fe2063f4cfd94c8ae26d43d5420a0Sudheer Shanka            int uid = ActivityManager.getService()
271c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn                .getUidForIntentSender(mTarget);
27279af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn            return uid > 0 ? new UserHandle(UserHandle.getUserId(uid)) : null;
273c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn        } catch (RemoteException e) {
274c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn            // Should never happen.
27579af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn            return null;
276c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn        }
277c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn    }
278c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn
279c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn    /**
2801ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     * Comparison operator on two IntentSender objects, such that true
2811ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     * is returned then they both represent the same operation from the
2821ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     * same package.
2831ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     */
2841ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu    @Override
2851ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu    public boolean equals(Object otherObj) {
2861ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        if (otherObj instanceof IntentSender) {
2871ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu            return mTarget.asBinder().equals(((IntentSender)otherObj)
2881ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu                    .mTarget.asBinder());
2891ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        }
2901ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        return false;
2911ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu    }
2921ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu
2931ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu    @Override
2941ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu    public int hashCode() {
2951ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        return mTarget.asBinder().hashCode();
2961ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu    }
2971ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu
2981ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu    @Override
2991ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu    public String toString() {
3001ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        StringBuilder sb = new StringBuilder(128);
3011ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        sb.append("IntentSender{");
3021ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        sb.append(Integer.toHexString(System.identityHashCode(this)));
3031ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        sb.append(": ");
3041ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        sb.append(mTarget != null ? mTarget.asBinder() : null);
3051ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        sb.append('}');
3061ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        return sb.toString();
3071ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu    }
3081ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu
3091ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu    public int describeContents() {
3101ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        return 0;
3111ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu    }
3121ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu
3131ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu    public void writeToParcel(Parcel out, int flags) {
3141ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        out.writeStrongBinder(mTarget.asBinder());
3151ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu    }
3161ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu
3171ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu    public static final Parcelable.Creator<IntentSender> CREATOR
3181ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu            = new Parcelable.Creator<IntentSender>() {
3191ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        public IntentSender createFromParcel(Parcel in) {
3201ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu            IBinder target = in.readStrongBinder();
3211ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu            return target != null ? new IntentSender(target) : null;
3221ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        }
3231ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu
3241ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        public IntentSender[] newArray(int size) {
3251ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu            return new IntentSender[size];
3261ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        }
3271ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu    };
3281ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu
3291ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu    /**
3301ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     * Convenience function for writing either a IntentSender or null pointer to
3311ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     * a Parcel.  You must use this with {@link #readIntentSenderOrNullFromParcel}
3321ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     * for later reading it.
3331ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     *
3341ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     * @param sender The IntentSender to write, or null.
3351ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     * @param out Where to write the IntentSender.
3361ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     */
3371ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu    public static void writeIntentSenderOrNullToParcel(IntentSender sender,
3381ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu            Parcel out) {
3391ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        out.writeStrongBinder(sender != null ? sender.mTarget.asBinder()
3401ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu                : null);
3411ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu    }
3421ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu
3431ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu    /**
3441ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     * Convenience function for reading either a Messenger or null pointer from
3451ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     * a Parcel.  You must have previously written the Messenger with
3461ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     * {@link #writeIntentSenderOrNullToParcel}.
3471ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     *
3481ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     * @param in The Parcel containing the written Messenger.
3491ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     *
3501ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     * @return Returns the Messenger read from the Parcel, or null if null had
3511ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     * been written.
3521ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu     */
3531ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu    public static IntentSender readIntentSenderOrNullFromParcel(Parcel in) {
3541ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        IBinder b = in.readStrongBinder();
3551ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        return b != null ? new IntentSender(b) : null;
3561ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu    }
3571ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu
3587f2054392e9957d3ba8579ef08c29cfb27df564eDianne Hackborn    /** @hide */
359fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn    public IIntentSender getTarget() {
360fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn        return mTarget;
361fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn    }
362fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn
363fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn    /** @hide */
3643e6e3855ea10c92a0328c360fc8414e85fb3ad61Dianne Hackborn    public IBinder getWhitelistToken() {
3653e6e3855ea10c92a0328c360fc8414e85fb3ad61Dianne Hackborn        return mWhitelistToken;
3663e6e3855ea10c92a0328c360fc8414e85fb3ad61Dianne Hackborn    }
3673e6e3855ea10c92a0328c360fc8414e85fb3ad61Dianne Hackborn
3683e6e3855ea10c92a0328c360fc8414e85fb3ad61Dianne Hackborn    /** @hide */
3697f2054392e9957d3ba8579ef08c29cfb27df564eDianne Hackborn    public IntentSender(IIntentSender target) {
3701ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        mTarget = target;
3711ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu    }
3721ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu
3737f2054392e9957d3ba8579ef08c29cfb27df564eDianne Hackborn    /** @hide */
374983055231b999e450def3e3df377fb4e23420711Dianne Hackborn    public IntentSender(IIntentSender target, IBinder whitelistToken) {
375983055231b999e450def3e3df377fb4e23420711Dianne Hackborn        mTarget = target;
376983055231b999e450def3e3df377fb4e23420711Dianne Hackborn        mWhitelistToken = whitelistToken;
377983055231b999e450def3e3df377fb4e23420711Dianne Hackborn    }
378983055231b999e450def3e3df377fb4e23420711Dianne Hackborn
379983055231b999e450def3e3df377fb4e23420711Dianne Hackborn    /** @hide */
3807f2054392e9957d3ba8579ef08c29cfb27df564eDianne Hackborn    public IntentSender(IBinder target) {
3811ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu        mTarget = IIntentSender.Stub.asInterface(target);
3821ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu    }
3831ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu}
384