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 19860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackbornimport android.app.ActivityManagerNative; 201ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapuimport android.content.Context; 211ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapuimport android.content.Intent; 221ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapuimport android.content.IIntentSender; 231ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapuimport android.content.IIntentReceiver; 241ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapuimport android.os.Bundle; 251ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapuimport android.os.RemoteException; 261ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapuimport android.os.Handler; 271ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapuimport android.os.IBinder; 281ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapuimport android.os.Parcel; 291ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapuimport android.os.Parcelable; 30f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackbornimport android.os.UserHandle; 311ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapuimport android.util.AndroidException; 321ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu 331ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu 341ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu/** 351ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * A description of an Intent and target action to perform with it. 361ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * The returned object can be 371ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * handed to other applications so that they can perform the action you 381ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * described on your behalf at a later time. 391ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * 401ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * <p>By giving a IntentSender to another application, 411ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * you are granting it the right to perform the operation you have specified 421ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * as if the other application was yourself (with the same permissions and 431ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * identity). As such, you should be careful about how you build the IntentSender: 441ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * often, for example, the base Intent you supply will have the component 451ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * name explicitly set to one of your own components, to ensure it is ultimately 461ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * sent there and nowhere else. 471ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * 481ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * <p>A IntentSender itself is simply a reference to a token maintained by 491ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * the system describing the original data used to retrieve it. This means 501ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * that, even if its owning application's process is killed, the 511ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * IntentSender itself will remain usable from other processes that 521ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * have been given it. If the creating application later re-retrieves the 531ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * same kind of IntentSender (same operation, same Intent action, data, 541ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * categories, and components, and same flags), it will receive a IntentSender 551ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * representing the same token if that is still valid. 561ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * 577f2054392e9957d3ba8579ef08c29cfb27df564eDianne Hackborn * <p>Instances of this class can not be made directly, but rather must be 587f2054392e9957d3ba8579ef08c29cfb27df564eDianne Hackborn * created from an existing {@link android.app.PendingIntent} with 597f2054392e9957d3ba8579ef08c29cfb27df564eDianne Hackborn * {@link android.app.PendingIntent#getIntentSender() PendingIntent.getIntentSender()}. 601ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu */ 611ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapupublic class IntentSender implements Parcelable { 621ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu private final IIntentSender mTarget; 631ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu 641ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu /** 651ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * Exception thrown when trying to send through a PendingIntent that 661ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * has been canceled or is otherwise no longer able to execute the request. 671ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu */ 681ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu public static class SendIntentException extends AndroidException { 691ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu public SendIntentException() { 701ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu } 711ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu 721ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu public SendIntentException(String name) { 731ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu super(name); 741ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu } 751ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu 761ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu public SendIntentException(Exception cause) { 771ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu super(cause); 781ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu } 791ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu } 801ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu 811ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu /** 821ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * Callback interface for discovering when a send operation has 831ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * completed. Primarily for use with a IntentSender that is 841ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * performing a broadcast, this provides the same information as 851ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * calling {@link Context#sendOrderedBroadcast(Intent, String, 861ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * android.content.BroadcastReceiver, Handler, int, String, Bundle) 871ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * Context.sendBroadcast()} with a final BroadcastReceiver. 881ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu */ 891ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu public interface OnFinished { 901ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu /** 911ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * Called when a send operation as completed. 921ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * 931ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * @param IntentSender The IntentSender this operation was sent through. 941ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * @param intent The original Intent that was sent. 951ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * @param resultCode The final result code determined by the send. 961ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * @param resultData The final data collected by a broadcast. 971ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * @param resultExtras The final extras collected by a broadcast. 981ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu */ 991ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu void onSendFinished(IntentSender IntentSender, Intent intent, 1001ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu int resultCode, String resultData, Bundle resultExtras); 1011ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu } 1021ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu 1031ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu private static class FinishedDispatcher extends IIntentReceiver.Stub 1041ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu implements Runnable { 1051ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu private final IntentSender mIntentSender; 1061ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu private final OnFinished mWho; 1071ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu private final Handler mHandler; 1081ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu private Intent mIntent; 1091ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu private int mResultCode; 1101ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu private String mResultData; 1111ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu private Bundle mResultExtras; 1121ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu FinishedDispatcher(IntentSender pi, OnFinished who, Handler handler) { 1131ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu mIntentSender = pi; 1141ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu mWho = who; 1151ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu mHandler = handler; 1161ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu } 11720e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn public void performReceive(Intent intent, int resultCode, String data, 11820e809870d8ac1e5b848f2daf51b2272ef89bdfcDianne Hackborn Bundle extras, boolean serialized, boolean sticky, int sendingUser) { 1191ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu mIntent = intent; 1201ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu mResultCode = resultCode; 1211ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu mResultData = data; 1221ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu mResultExtras = extras; 1231ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu if (mHandler == null) { 1241ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu run(); 1251ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu } else { 1261ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu mHandler.post(this); 1271ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu } 1281ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu } 1291ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu public void run() { 1301ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu mWho.onSendFinished(mIntentSender, mIntent, mResultCode, 1311ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu mResultData, mResultExtras); 1321ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu } 1331ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu } 1341ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu 1351ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu /** 1361ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * Perform the operation associated with this IntentSender, allowing the 1371ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * caller to specify information about the Intent to use and be notified 1381ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * when the send has completed. 1391ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * 1401ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * @param context The Context of the caller. This may be null if 1411ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * <var>intent</var> is also null. 1421ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * @param code Result code to supply back to the IntentSender's target. 1431ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * @param intent Additional Intent data. See {@link Intent#fillIn 1441ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * Intent.fillIn()} for information on how this is applied to the 1451ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * original Intent. Use null to not modify the original Intent. 1461ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * @param onFinished The object to call back on when the send has 1471ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * completed, or null for no callback. 1481ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * @param handler Handler identifying the thread on which the callback 1491ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * should happen. If null, the callback will happen from the thread 1501ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * pool of the process. 1511ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * 1521ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * 1531ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * @throws SendIntentException Throws CanceledIntentException if the IntentSender 1541ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * is no longer allowing more intents to be sent through it. 1551ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu */ 1561ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu public void sendIntent(Context context, int code, Intent intent, 1571ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu OnFinished onFinished, Handler handler) throws SendIntentException { 1586c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn sendIntent(context, code, intent, onFinished, handler, null); 1596c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn } 1606c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn 1616c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn /** 1626c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn * Perform the operation associated with this IntentSender, allowing the 1636c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn * caller to specify information about the Intent to use and be notified 1646c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn * when the send has completed. 1656c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn * 1666c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn * @param context The Context of the caller. This may be null if 1676c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn * <var>intent</var> is also null. 1686c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn * @param code Result code to supply back to the IntentSender's target. 1696c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn * @param intent Additional Intent data. See {@link Intent#fillIn 1706c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn * Intent.fillIn()} for information on how this is applied to the 1716c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn * original Intent. Use null to not modify the original Intent. 1726c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn * @param onFinished The object to call back on when the send has 1736c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn * completed, or null for no callback. 1746c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn * @param handler Handler identifying the thread on which the callback 1756c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn * should happen. If null, the callback will happen from the thread 1766c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn * pool of the process. 1776c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn * @param requiredPermission Name of permission that a recipient of the PendingIntent 1786c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn * is required to hold. This is only valid for broadcast intents, and 1796c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn * corresponds to the permission argument in 1806c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn * {@link Context#sendBroadcast(Intent, String) Context.sendOrderedBroadcast(Intent, String)}. 1816c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn * If null, no permission is required. 1826c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn * 1836c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn * 1846c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn * @throws SendIntentException Throws CanceledIntentException if the IntentSender 1856c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn * is no longer allowing more intents to be sent through it. 1866c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn */ 1876c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn public void sendIntent(Context context, int code, Intent intent, 1886c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn OnFinished onFinished, Handler handler, String requiredPermission) 1896c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn throws SendIntentException { 1901ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu try { 1911ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu String resolvedType = intent != null ? 1921ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu intent.resolveTypeIfNeeded(context.getContentResolver()) 1931ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu : null; 1941ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu int res = mTarget.send(code, intent, resolvedType, 1951ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu onFinished != null 1966c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn ? new FinishedDispatcher(this, onFinished, handler) 1976c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn : null, 1986c418d585e0a91054b168fde3130188afd006c98Dianne Hackborn requiredPermission); 1991ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu if (res < 0) { 2001ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu throw new SendIntentException(); 2011ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu } 2021ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu } catch (RemoteException e) { 2031ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu throw new SendIntentException(); 2041ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu } 2051ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu } 2061ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu 2071ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu /** 2088832c18d8b63367929c2d394c9c508f56003d400Dianne Hackborn * @deprecated Renamed to {@link #getCreatorPackage()}. 2098832c18d8b63367929c2d394c9c508f56003d400Dianne Hackborn */ 2108832c18d8b63367929c2d394c9c508f56003d400Dianne Hackborn @Deprecated 2118832c18d8b63367929c2d394c9c508f56003d400Dianne Hackborn public String getTargetPackage() { 2128832c18d8b63367929c2d394c9c508f56003d400Dianne Hackborn try { 2138832c18d8b63367929c2d394c9c508f56003d400Dianne Hackborn return ActivityManagerNative.getDefault() 2148832c18d8b63367929c2d394c9c508f56003d400Dianne Hackborn .getPackageForIntentSender(mTarget); 2158832c18d8b63367929c2d394c9c508f56003d400Dianne Hackborn } catch (RemoteException e) { 2168832c18d8b63367929c2d394c9c508f56003d400Dianne Hackborn // Should never happen. 2178832c18d8b63367929c2d394c9c508f56003d400Dianne Hackborn return null; 2188832c18d8b63367929c2d394c9c508f56003d400Dianne Hackborn } 2198832c18d8b63367929c2d394c9c508f56003d400Dianne Hackborn } 2208832c18d8b63367929c2d394c9c508f56003d400Dianne Hackborn 2218832c18d8b63367929c2d394c9c508f56003d400Dianne Hackborn /** 222860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn * Return the package name of the application that created this 223860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn * IntentSender, that is the identity under which you will actually be 224860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn * sending the Intent. The returned string is supplied by the system, so 225860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn * that an application can not spoof its package. 226860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn * 227860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn * @return The package name of the PendingIntent, or null if there is 228860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn * none associated with it. 229860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn */ 2308832c18d8b63367929c2d394c9c508f56003d400Dianne Hackborn public String getCreatorPackage() { 231860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn try { 232860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn return ActivityManagerNative.getDefault() 233860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn .getPackageForIntentSender(mTarget); 234860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn } catch (RemoteException e) { 235860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn // Should never happen. 236860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn return null; 237860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn } 238860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn } 239860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn 240860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn /** 241c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn * Return the uid of the application that created this 242c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn * PendingIntent, that is the identity under which you will actually be 243c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn * sending the Intent. The returned integer is supplied by the system, so 244c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn * that an application can not spoof its uid. 245c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn * 246c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn * @return The uid of the PendingIntent, or -1 if there is 247c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn * none associated with it. 248c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn */ 2498832c18d8b63367929c2d394c9c508f56003d400Dianne Hackborn public int getCreatorUid() { 250c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn try { 251c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn return ActivityManagerNative.getDefault() 252c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn .getUidForIntentSender(mTarget); 253c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn } catch (RemoteException e) { 254c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn // Should never happen. 255c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn return -1; 256c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn } 257c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn } 258c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn 259c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn /** 260c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn * Return the user handle of the application that created this 261c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn * PendingIntent, that is the user under which you will actually be 26279af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn * sending the Intent. The returned UserHandle is supplied by the system, so 263c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn * that an application can not spoof its user. See 264c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn * {@link android.os.Process#myUserHandle() Process.myUserHandle()} for 265c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn * more explanation of user handles. 266c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn * 26779af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn * @return The user handle of the PendingIntent, or null if there is 268c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn * none associated with it. 269c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn */ 2708832c18d8b63367929c2d394c9c508f56003d400Dianne Hackborn public UserHandle getCreatorUserHandle() { 271c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn try { 272c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn int uid = ActivityManagerNative.getDefault() 273c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn .getUidForIntentSender(mTarget); 27479af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn return uid > 0 ? new UserHandle(UserHandle.getUserId(uid)) : null; 275c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn } catch (RemoteException e) { 276c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn // Should never happen. 27779af1dd54c16cde063152922b42c96d72ae9eca8Dianne Hackborn return null; 278c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn } 279c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn } 280c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn 281c7501279ee36a80fc8dc98d8eb3e6393a2217909Dianne Hackborn /** 2821ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * Comparison operator on two IntentSender objects, such that true 2831ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * is returned then they both represent the same operation from the 2841ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * same package. 2851ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu */ 2861ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu @Override 2871ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu public boolean equals(Object otherObj) { 2881ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu if (otherObj instanceof IntentSender) { 2891ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu return mTarget.asBinder().equals(((IntentSender)otherObj) 2901ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu .mTarget.asBinder()); 2911ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu } 2921ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu return false; 2931ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu } 2941ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu 2951ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu @Override 2961ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu public int hashCode() { 2971ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu return mTarget.asBinder().hashCode(); 2981ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu } 2991ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu 3001ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu @Override 3011ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu public String toString() { 3021ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu StringBuilder sb = new StringBuilder(128); 3031ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu sb.append("IntentSender{"); 3041ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu sb.append(Integer.toHexString(System.identityHashCode(this))); 3051ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu sb.append(": "); 3061ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu sb.append(mTarget != null ? mTarget.asBinder() : null); 3071ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu sb.append('}'); 3081ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu return sb.toString(); 3091ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu } 3101ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu 3111ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu public int describeContents() { 3121ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu return 0; 3131ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu } 3141ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu 3151ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu public void writeToParcel(Parcel out, int flags) { 3161ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu out.writeStrongBinder(mTarget.asBinder()); 3171ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu } 3181ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu 3191ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu public static final Parcelable.Creator<IntentSender> CREATOR 3201ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu = new Parcelable.Creator<IntentSender>() { 3211ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu public IntentSender createFromParcel(Parcel in) { 3221ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu IBinder target = in.readStrongBinder(); 3231ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu return target != null ? new IntentSender(target) : null; 3241ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu } 3251ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu 3261ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu public IntentSender[] newArray(int size) { 3271ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu return new IntentSender[size]; 3281ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu } 3291ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu }; 3301ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu 3311ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu /** 3321ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * Convenience function for writing either a IntentSender or null pointer to 3331ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * a Parcel. You must use this with {@link #readIntentSenderOrNullFromParcel} 3341ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * for later reading it. 3351ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * 3361ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * @param sender The IntentSender to write, or null. 3371ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * @param out Where to write the IntentSender. 3381ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu */ 3391ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu public static void writeIntentSenderOrNullToParcel(IntentSender sender, 3401ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu Parcel out) { 3411ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu out.writeStrongBinder(sender != null ? sender.mTarget.asBinder() 3421ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu : null); 3431ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu } 3441ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu 3451ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu /** 3461ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * Convenience function for reading either a Messenger or null pointer from 3471ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * a Parcel. You must have previously written the Messenger with 3481ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * {@link #writeIntentSenderOrNullToParcel}. 3491ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * 3501ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * @param in The Parcel containing the written Messenger. 3511ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * 3521ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * @return Returns the Messenger read from the Parcel, or null if null had 3531ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu * been written. 3541ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu */ 3551ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu public static IntentSender readIntentSenderOrNullFromParcel(Parcel in) { 3561ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu IBinder b = in.readStrongBinder(); 3571ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu return b != null ? new IntentSender(b) : null; 3581ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu } 3591ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu 3607f2054392e9957d3ba8579ef08c29cfb27df564eDianne Hackborn /** @hide */ 361fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn public IIntentSender getTarget() { 362fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn return mTarget; 363fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn } 364fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn 365fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn /** @hide */ 3667f2054392e9957d3ba8579ef08c29cfb27df564eDianne Hackborn public IntentSender(IIntentSender target) { 3671ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu mTarget = target; 3681ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu } 3691ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu 3707f2054392e9957d3ba8579ef08c29cfb27df564eDianne Hackborn /** @hide */ 3717f2054392e9957d3ba8579ef08c29cfb27df564eDianne Hackborn public IntentSender(IBinder target) { 3721ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu mTarget = IIntentSender.Stub.asInterface(target); 3731ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu } 3741ccac75e1f1b97eccb916a8de04fc1012b30f6e5Suchi Amalapurapu} 375