• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2006 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.content;
18 
19 import static android.content.ContentProvider.maybeAddUserId;
20 
21 import android.annotation.AnyRes;
22 import android.annotation.BroadcastBehavior;
23 import android.annotation.IntDef;
24 import android.annotation.NonNull;
25 import android.annotation.Nullable;
26 import android.annotation.SdkConstant;
27 import android.annotation.SdkConstant.SdkConstantType;
28 import android.annotation.SystemApi;
29 import android.content.pm.ActivityInfo;
30 import android.content.pm.ApplicationInfo;
31 import android.content.pm.ComponentInfo;
32 import android.content.pm.PackageManager;
33 import android.content.pm.ResolveInfo;
34 import android.content.res.Resources;
35 import android.content.res.TypedArray;
36 import android.graphics.Rect;
37 import android.net.Uri;
38 import android.os.Build;
39 import android.os.Bundle;
40 import android.os.IBinder;
41 import android.os.Parcel;
42 import android.os.Parcelable;
43 import android.os.Process;
44 import android.os.ResultReceiver;
45 import android.os.ShellCommand;
46 import android.os.StrictMode;
47 import android.os.UserHandle;
48 import android.provider.ContactsContract.QuickContact;
49 import android.provider.DocumentsContract;
50 import android.provider.DocumentsProvider;
51 import android.provider.MediaStore;
52 import android.provider.OpenableColumns;
53 import android.util.ArraySet;
54 import android.util.AttributeSet;
55 import android.util.Log;
56 
57 import com.android.internal.util.XmlUtils;
58 
59 import org.xmlpull.v1.XmlPullParser;
60 import org.xmlpull.v1.XmlPullParserException;
61 import org.xmlpull.v1.XmlSerializer;
62 
63 import java.io.IOException;
64 import java.io.PrintWriter;
65 import java.io.Serializable;
66 import java.lang.annotation.Retention;
67 import java.lang.annotation.RetentionPolicy;
68 import java.net.URISyntaxException;
69 import java.util.ArrayList;
70 import java.util.HashSet;
71 import java.util.List;
72 import java.util.Locale;
73 import java.util.Objects;
74 import java.util.Set;
75 
76 /**
77  * An intent is an abstract description of an operation to be performed.  It
78  * can be used with {@link Context#startActivity(Intent) startActivity} to
79  * launch an {@link android.app.Activity},
80  * {@link android.content.Context#sendBroadcast(Intent) broadcastIntent} to
81  * send it to any interested {@link BroadcastReceiver BroadcastReceiver} components,
82  * and {@link android.content.Context#startService} or
83  * {@link android.content.Context#bindService} to communicate with a
84  * background {@link android.app.Service}.
85  *
86  * <p>An Intent provides a facility for performing late runtime binding between the code in
87  * different applications. Its most significant use is in the launching of activities, where it
88  * can be thought of as the glue between activities. It is basically a passive data structure
89  * holding an abstract description of an action to be performed.</p>
90  *
91  * <div class="special reference">
92  * <h3>Developer Guides</h3>
93  * <p>For information about how to create and resolve intents, read the
94  * <a href="{@docRoot}guide/topics/intents/intents-filters.html">Intents and Intent Filters</a>
95  * developer guide.</p>
96  * </div>
97  *
98  * <a name="IntentStructure"></a>
99  * <h3>Intent Structure</h3>
100  * <p>The primary pieces of information in an intent are:</p>
101  *
102  * <ul>
103  *   <li> <p><b>action</b> -- The general action to be performed, such as
104  *     {@link #ACTION_VIEW}, {@link #ACTION_EDIT}, {@link #ACTION_MAIN},
105  *     etc.</p>
106  *   </li>
107  *   <li> <p><b>data</b> -- The data to operate on, such as a person record
108  *     in the contacts database, expressed as a {@link android.net.Uri}.</p>
109  *   </li>
110  * </ul>
111  *
112  *
113  * <p>Some examples of action/data pairs are:</p>
114  *
115  * <ul>
116  *   <li> <p><b>{@link #ACTION_VIEW} <i>content://contacts/people/1</i></b> -- Display
117  *     information about the person whose identifier is "1".</p>
118  *   </li>
119  *   <li> <p><b>{@link #ACTION_DIAL} <i>content://contacts/people/1</i></b> -- Display
120  *     the phone dialer with the person filled in.</p>
121  *   </li>
122  *   <li> <p><b>{@link #ACTION_VIEW} <i>tel:123</i></b> -- Display
123  *     the phone dialer with the given number filled in.  Note how the
124  *     VIEW action does what is considered the most reasonable thing for
125  *     a particular URI.</p>
126  *   </li>
127  *   <li> <p><b>{@link #ACTION_DIAL} <i>tel:123</i></b> -- Display
128  *     the phone dialer with the given number filled in.</p>
129  *   </li>
130  *   <li> <p><b>{@link #ACTION_EDIT} <i>content://contacts/people/1</i></b> -- Edit
131  *     information about the person whose identifier is "1".</p>
132  *   </li>
133  *   <li> <p><b>{@link #ACTION_VIEW} <i>content://contacts/people/</i></b> -- Display
134  *     a list of people, which the user can browse through.  This example is a
135  *     typical top-level entry into the Contacts application, showing you the
136  *     list of people. Selecting a particular person to view would result in a
137  *     new intent { <b>{@link #ACTION_VIEW} <i>content://contacts/people/N</i></b> }
138  *     being used to start an activity to display that person.</p>
139  *   </li>
140  * </ul>
141  *
142  * <p>In addition to these primary attributes, there are a number of secondary
143  * attributes that you can also include with an intent:</p>
144  *
145  * <ul>
146  *     <li> <p><b>category</b> -- Gives additional information about the action
147  *         to execute.  For example, {@link #CATEGORY_LAUNCHER} means it should
148  *         appear in the Launcher as a top-level application, while
149  *         {@link #CATEGORY_ALTERNATIVE} means it should be included in a list
150  *         of alternative actions the user can perform on a piece of data.</p>
151  *     <li> <p><b>type</b> -- Specifies an explicit type (a MIME type) of the
152  *         intent data.  Normally the type is inferred from the data itself.
153  *         By setting this attribute, you disable that evaluation and force
154  *         an explicit type.</p>
155  *     <li> <p><b>component</b> -- Specifies an explicit name of a component
156  *         class to use for the intent.  Normally this is determined by looking
157  *         at the other information in the intent (the action, data/type, and
158  *         categories) and matching that with a component that can handle it.
159  *         If this attribute is set then none of the evaluation is performed,
160  *         and this component is used exactly as is.  By specifying this attribute,
161  *         all of the other Intent attributes become optional.</p>
162  *     <li> <p><b>extras</b> -- This is a {@link Bundle} of any additional information.
163  *         This can be used to provide extended information to the component.
164  *         For example, if we have a action to send an e-mail message, we could
165  *         also include extra pieces of data here to supply a subject, body,
166  *         etc.</p>
167  * </ul>
168  *
169  * <p>Here are some examples of other operations you can specify as intents
170  * using these additional parameters:</p>
171  *
172  * <ul>
173  *   <li> <p><b>{@link #ACTION_MAIN} with category {@link #CATEGORY_HOME}</b> --
174  *     Launch the home screen.</p>
175  *   </li>
176  *   <li> <p><b>{@link #ACTION_GET_CONTENT} with MIME type
177  *     <i>{@link android.provider.Contacts.Phones#CONTENT_URI
178  *     vnd.android.cursor.item/phone}</i></b>
179  *     -- Display the list of people's phone numbers, allowing the user to
180  *     browse through them and pick one and return it to the parent activity.</p>
181  *   </li>
182  *   <li> <p><b>{@link #ACTION_GET_CONTENT} with MIME type
183  *     <i>*{@literal /}*</i> and category {@link #CATEGORY_OPENABLE}</b>
184  *     -- Display all pickers for data that can be opened with
185  *     {@link ContentResolver#openInputStream(Uri) ContentResolver.openInputStream()},
186  *     allowing the user to pick one of them and then some data inside of it
187  *     and returning the resulting URI to the caller.  This can be used,
188  *     for example, in an e-mail application to allow the user to pick some
189  *     data to include as an attachment.</p>
190  *   </li>
191  * </ul>
192  *
193  * <p>There are a variety of standard Intent action and category constants
194  * defined in the Intent class, but applications can also define their own.
195  * These strings use Java-style scoping, to ensure they are unique -- for
196  * example, the standard {@link #ACTION_VIEW} is called
197  * "android.intent.action.VIEW".</p>
198  *
199  * <p>Put together, the set of actions, data types, categories, and extra data
200  * defines a language for the system allowing for the expression of phrases
201  * such as "call john smith's cell".  As applications are added to the system,
202  * they can extend this language by adding new actions, types, and categories, or
203  * they can modify the behavior of existing phrases by supplying their own
204  * activities that handle them.</p>
205  *
206  * <a name="IntentResolution"></a>
207  * <h3>Intent Resolution</h3>
208  *
209  * <p>There are two primary forms of intents you will use.
210  *
211  * <ul>
212  *     <li> <p><b>Explicit Intents</b> have specified a component (via
213  *     {@link #setComponent} or {@link #setClass}), which provides the exact
214  *     class to be run.  Often these will not include any other information,
215  *     simply being a way for an application to launch various internal
216  *     activities it has as the user interacts with the application.
217  *
218  *     <li> <p><b>Implicit Intents</b> have not specified a component;
219  *     instead, they must include enough information for the system to
220  *     determine which of the available components is best to run for that
221  *     intent.
222  * </ul>
223  *
224  * <p>When using implicit intents, given such an arbitrary intent we need to
225  * know what to do with it. This is handled by the process of <em>Intent
226  * resolution</em>, which maps an Intent to an {@link android.app.Activity},
227  * {@link BroadcastReceiver}, or {@link android.app.Service} (or sometimes two or
228  * more activities/receivers) that can handle it.</p>
229  *
230  * <p>The intent resolution mechanism basically revolves around matching an
231  * Intent against all of the &lt;intent-filter&gt; descriptions in the
232  * installed application packages.  (Plus, in the case of broadcasts, any {@link BroadcastReceiver}
233  * objects explicitly registered with {@link Context#registerReceiver}.)  More
234  * details on this can be found in the documentation on the {@link
235  * IntentFilter} class.</p>
236  *
237  * <p>There are three pieces of information in the Intent that are used for
238  * resolution: the action, type, and category.  Using this information, a query
239  * is done on the {@link PackageManager} for a component that can handle the
240  * intent. The appropriate component is determined based on the intent
241  * information supplied in the <code>AndroidManifest.xml</code> file as
242  * follows:</p>
243  *
244  * <ul>
245  *     <li> <p>The <b>action</b>, if given, must be listed by the component as
246  *         one it handles.</p>
247  *     <li> <p>The <b>type</b> is retrieved from the Intent's data, if not
248  *         already supplied in the Intent.  Like the action, if a type is
249  *         included in the intent (either explicitly or implicitly in its
250  *         data), then this must be listed by the component as one it handles.</p>
251  *     <li> For data that is not a <code>content:</code> URI and where no explicit
252  *         type is included in the Intent, instead the <b>scheme</b> of the
253  *         intent data (such as <code>http:</code> or <code>mailto:</code>) is
254  *         considered. Again like the action, if we are matching a scheme it
255  *         must be listed by the component as one it can handle.
256  *     <li> <p>The <b>categories</b>, if supplied, must <em>all</em> be listed
257  *         by the activity as categories it handles.  That is, if you include
258  *         the categories {@link #CATEGORY_LAUNCHER} and
259  *         {@link #CATEGORY_ALTERNATIVE}, then you will only resolve to components
260  *         with an intent that lists <em>both</em> of those categories.
261  *         Activities will very often need to support the
262  *         {@link #CATEGORY_DEFAULT} so that they can be found by
263  *         {@link Context#startActivity Context.startActivity()}.</p>
264  * </ul>
265  *
266  * <p>For example, consider the Note Pad sample application that
267  * allows user to browse through a list of notes data and view details about
268  * individual items.  Text in italics indicate places were you would replace a
269  * name with one specific to your own package.</p>
270  *
271  * <pre> &lt;manifest xmlns:android="http://schemas.android.com/apk/res/android"
272  *       package="<i>com.android.notepad</i>"&gt;
273  *     &lt;application android:icon="@drawable/app_notes"
274  *             android:label="@string/app_name"&gt;
275  *
276  *         &lt;provider class=".NotePadProvider"
277  *                 android:authorities="<i>com.google.provider.NotePad</i>" /&gt;
278  *
279  *         &lt;activity class=".NotesList" android:label="@string/title_notes_list"&gt;
280  *             &lt;intent-filter&gt;
281  *                 &lt;action android:name="android.intent.action.MAIN" /&gt;
282  *                 &lt;category android:name="android.intent.category.LAUNCHER" /&gt;
283  *             &lt;/intent-filter&gt;
284  *             &lt;intent-filter&gt;
285  *                 &lt;action android:name="android.intent.action.VIEW" /&gt;
286  *                 &lt;action android:name="android.intent.action.EDIT" /&gt;
287  *                 &lt;action android:name="android.intent.action.PICK" /&gt;
288  *                 &lt;category android:name="android.intent.category.DEFAULT" /&gt;
289  *                 &lt;data android:mimeType="vnd.android.cursor.dir/<i>vnd.google.note</i>" /&gt;
290  *             &lt;/intent-filter&gt;
291  *             &lt;intent-filter&gt;
292  *                 &lt;action android:name="android.intent.action.GET_CONTENT" /&gt;
293  *                 &lt;category android:name="android.intent.category.DEFAULT" /&gt;
294  *                 &lt;data android:mimeType="vnd.android.cursor.item/<i>vnd.google.note</i>" /&gt;
295  *             &lt;/intent-filter&gt;
296  *         &lt;/activity&gt;
297  *
298  *         &lt;activity class=".NoteEditor" android:label="@string/title_note"&gt;
299  *             &lt;intent-filter android:label="@string/resolve_edit"&gt;
300  *                 &lt;action android:name="android.intent.action.VIEW" /&gt;
301  *                 &lt;action android:name="android.intent.action.EDIT" /&gt;
302  *                 &lt;category android:name="android.intent.category.DEFAULT" /&gt;
303  *                 &lt;data android:mimeType="vnd.android.cursor.item/<i>vnd.google.note</i>" /&gt;
304  *             &lt;/intent-filter&gt;
305  *
306  *             &lt;intent-filter&gt;
307  *                 &lt;action android:name="android.intent.action.INSERT" /&gt;
308  *                 &lt;category android:name="android.intent.category.DEFAULT" /&gt;
309  *                 &lt;data android:mimeType="vnd.android.cursor.dir/<i>vnd.google.note</i>" /&gt;
310  *             &lt;/intent-filter&gt;
311  *
312  *         &lt;/activity&gt;
313  *
314  *         &lt;activity class=".TitleEditor" android:label="@string/title_edit_title"
315  *                 android:theme="@android:style/Theme.Dialog"&gt;
316  *             &lt;intent-filter android:label="@string/resolve_title"&gt;
317  *                 &lt;action android:name="<i>com.android.notepad.action.EDIT_TITLE</i>" /&gt;
318  *                 &lt;category android:name="android.intent.category.DEFAULT" /&gt;
319  *                 &lt;category android:name="android.intent.category.ALTERNATIVE" /&gt;
320  *                 &lt;category android:name="android.intent.category.SELECTED_ALTERNATIVE" /&gt;
321  *                 &lt;data android:mimeType="vnd.android.cursor.item/<i>vnd.google.note</i>" /&gt;
322  *             &lt;/intent-filter&gt;
323  *         &lt;/activity&gt;
324  *
325  *     &lt;/application&gt;
326  * &lt;/manifest&gt;</pre>
327  *
328  * <p>The first activity,
329  * <code>com.android.notepad.NotesList</code>, serves as our main
330  * entry into the app.  It can do three things as described by its three intent
331  * templates:
332  * <ol>
333  * <li><pre>
334  * &lt;intent-filter&gt;
335  *     &lt;action android:name="{@link #ACTION_MAIN android.intent.action.MAIN}" /&gt;
336  *     &lt;category android:name="{@link #CATEGORY_LAUNCHER android.intent.category.LAUNCHER}" /&gt;
337  * &lt;/intent-filter&gt;</pre>
338  * <p>This provides a top-level entry into the NotePad application: the standard
339  * MAIN action is a main entry point (not requiring any other information in
340  * the Intent), and the LAUNCHER category says that this entry point should be
341  * listed in the application launcher.</p>
342  * <li><pre>
343  * &lt;intent-filter&gt;
344  *     &lt;action android:name="{@link #ACTION_VIEW android.intent.action.VIEW}" /&gt;
345  *     &lt;action android:name="{@link #ACTION_EDIT android.intent.action.EDIT}" /&gt;
346  *     &lt;action android:name="{@link #ACTION_PICK android.intent.action.PICK}" /&gt;
347  *     &lt;category android:name="{@link #CATEGORY_DEFAULT android.intent.category.DEFAULT}" /&gt;
348  *     &lt;data android:mimeType="vnd.android.cursor.dir/<i>vnd.google.note</i>" /&gt;
349  * &lt;/intent-filter&gt;</pre>
350  * <p>This declares the things that the activity can do on a directory of
351  * notes.  The type being supported is given with the &lt;type&gt; tag, where
352  * <code>vnd.android.cursor.dir/vnd.google.note</code> is a URI from which
353  * a Cursor of zero or more items (<code>vnd.android.cursor.dir</code>) can
354  * be retrieved which holds our note pad data (<code>vnd.google.note</code>).
355  * The activity allows the user to view or edit the directory of data (via
356  * the VIEW and EDIT actions), or to pick a particular note and return it
357  * to the caller (via the PICK action).  Note also the DEFAULT category
358  * supplied here: this is <em>required</em> for the
359  * {@link Context#startActivity Context.startActivity} method to resolve your
360  * activity when its component name is not explicitly specified.</p>
361  * <li><pre>
362  * &lt;intent-filter&gt;
363  *     &lt;action android:name="{@link #ACTION_GET_CONTENT android.intent.action.GET_CONTENT}" /&gt;
364  *     &lt;category android:name="{@link #CATEGORY_DEFAULT android.intent.category.DEFAULT}" /&gt;
365  *     &lt;data android:mimeType="vnd.android.cursor.item/<i>vnd.google.note</i>" /&gt;
366  * &lt;/intent-filter&gt;</pre>
367  * <p>This filter describes the ability to return to the caller a note selected by
368  * the user without needing to know where it came from.  The data type
369  * <code>vnd.android.cursor.item/vnd.google.note</code> is a URI from which
370  * a Cursor of exactly one (<code>vnd.android.cursor.item</code>) item can
371  * be retrieved which contains our note pad data (<code>vnd.google.note</code>).
372  * The GET_CONTENT action is similar to the PICK action, where the activity
373  * will return to its caller a piece of data selected by the user.  Here,
374  * however, the caller specifies the type of data they desire instead of
375  * the type of data the user will be picking from.</p>
376  * </ol>
377  *
378  * <p>Given these capabilities, the following intents will resolve to the
379  * NotesList activity:</p>
380  *
381  * <ul>
382  *     <li> <p><b>{ action=android.app.action.MAIN }</b> matches all of the
383  *         activities that can be used as top-level entry points into an
384  *         application.</p>
385  *     <li> <p><b>{ action=android.app.action.MAIN,
386  *         category=android.app.category.LAUNCHER }</b> is the actual intent
387  *         used by the Launcher to populate its top-level list.</p>
388  *     <li> <p><b>{ action=android.intent.action.VIEW
389  *          data=content://com.google.provider.NotePad/notes }</b>
390  *         displays a list of all the notes under
391  *         "content://com.google.provider.NotePad/notes", which
392  *         the user can browse through and see the details on.</p>
393  *     <li> <p><b>{ action=android.app.action.PICK
394  *          data=content://com.google.provider.NotePad/notes }</b>
395  *         provides a list of the notes under
396  *         "content://com.google.provider.NotePad/notes", from which
397  *         the user can pick a note whose data URL is returned back to the caller.</p>
398  *     <li> <p><b>{ action=android.app.action.GET_CONTENT
399  *          type=vnd.android.cursor.item/vnd.google.note }</b>
400  *         is similar to the pick action, but allows the caller to specify the
401  *         kind of data they want back so that the system can find the appropriate
402  *         activity to pick something of that data type.</p>
403  * </ul>
404  *
405  * <p>The second activity,
406  * <code>com.android.notepad.NoteEditor</code>, shows the user a single
407  * note entry and allows them to edit it.  It can do two things as described
408  * by its two intent templates:
409  * <ol>
410  * <li><pre>
411  * &lt;intent-filter android:label="@string/resolve_edit"&gt;
412  *     &lt;action android:name="{@link #ACTION_VIEW android.intent.action.VIEW}" /&gt;
413  *     &lt;action android:name="{@link #ACTION_EDIT android.intent.action.EDIT}" /&gt;
414  *     &lt;category android:name="{@link #CATEGORY_DEFAULT android.intent.category.DEFAULT}" /&gt;
415  *     &lt;data android:mimeType="vnd.android.cursor.item/<i>vnd.google.note</i>" /&gt;
416  * &lt;/intent-filter&gt;</pre>
417  * <p>The first, primary, purpose of this activity is to let the user interact
418  * with a single note, as decribed by the MIME type
419  * <code>vnd.android.cursor.item/vnd.google.note</code>.  The activity can
420  * either VIEW a note or allow the user to EDIT it.  Again we support the
421  * DEFAULT category to allow the activity to be launched without explicitly
422  * specifying its component.</p>
423  * <li><pre>
424  * &lt;intent-filter&gt;
425  *     &lt;action android:name="{@link #ACTION_INSERT android.intent.action.INSERT}" /&gt;
426  *     &lt;category android:name="{@link #CATEGORY_DEFAULT android.intent.category.DEFAULT}" /&gt;
427  *     &lt;data android:mimeType="vnd.android.cursor.dir/<i>vnd.google.note</i>" /&gt;
428  * &lt;/intent-filter&gt;</pre>
429  * <p>The secondary use of this activity is to insert a new note entry into
430  * an existing directory of notes.  This is used when the user creates a new
431  * note: the INSERT action is executed on the directory of notes, causing
432  * this activity to run and have the user create the new note data which
433  * it then adds to the content provider.</p>
434  * </ol>
435  *
436  * <p>Given these capabilities, the following intents will resolve to the
437  * NoteEditor activity:</p>
438  *
439  * <ul>
440  *     <li> <p><b>{ action=android.intent.action.VIEW
441  *          data=content://com.google.provider.NotePad/notes/<var>{ID}</var> }</b>
442  *         shows the user the content of note <var>{ID}</var>.</p>
443  *     <li> <p><b>{ action=android.app.action.EDIT
444  *          data=content://com.google.provider.NotePad/notes/<var>{ID}</var> }</b>
445  *         allows the user to edit the content of note <var>{ID}</var>.</p>
446  *     <li> <p><b>{ action=android.app.action.INSERT
447  *          data=content://com.google.provider.NotePad/notes }</b>
448  *         creates a new, empty note in the notes list at
449  *         "content://com.google.provider.NotePad/notes"
450  *         and allows the user to edit it.  If they keep their changes, the URI
451  *         of the newly created note is returned to the caller.</p>
452  * </ul>
453  *
454  * <p>The last activity,
455  * <code>com.android.notepad.TitleEditor</code>, allows the user to
456  * edit the title of a note.  This could be implemented as a class that the
457  * application directly invokes (by explicitly setting its component in
458  * the Intent), but here we show a way you can publish alternative
459  * operations on existing data:</p>
460  *
461  * <pre>
462  * &lt;intent-filter android:label="@string/resolve_title"&gt;
463  *     &lt;action android:name="<i>com.android.notepad.action.EDIT_TITLE</i>" /&gt;
464  *     &lt;category android:name="{@link #CATEGORY_DEFAULT android.intent.category.DEFAULT}" /&gt;
465  *     &lt;category android:name="{@link #CATEGORY_ALTERNATIVE android.intent.category.ALTERNATIVE}" /&gt;
466  *     &lt;category android:name="{@link #CATEGORY_SELECTED_ALTERNATIVE android.intent.category.SELECTED_ALTERNATIVE}" /&gt;
467  *     &lt;data android:mimeType="vnd.android.cursor.item/<i>vnd.google.note</i>" /&gt;
468  * &lt;/intent-filter&gt;</pre>
469  *
470  * <p>In the single intent template here, we
471  * have created our own private action called
472  * <code>com.android.notepad.action.EDIT_TITLE</code> which means to
473  * edit the title of a note.  It must be invoked on a specific note
474  * (data type <code>vnd.android.cursor.item/vnd.google.note</code>) like the previous
475  * view and edit actions, but here displays and edits the title contained
476  * in the note data.
477  *
478  * <p>In addition to supporting the default category as usual, our title editor
479  * also supports two other standard categories: ALTERNATIVE and
480  * SELECTED_ALTERNATIVE.  Implementing
481  * these categories allows others to find the special action it provides
482  * without directly knowing about it, through the
483  * {@link android.content.pm.PackageManager#queryIntentActivityOptions} method, or
484  * more often to build dynamic menu items with
485  * {@link android.view.Menu#addIntentOptions}.  Note that in the intent
486  * template here was also supply an explicit name for the template
487  * (via <code>android:label="@string/resolve_title"</code>) to better control
488  * what the user sees when presented with this activity as an alternative
489  * action to the data they are viewing.
490  *
491  * <p>Given these capabilities, the following intent will resolve to the
492  * TitleEditor activity:</p>
493  *
494  * <ul>
495  *     <li> <p><b>{ action=com.android.notepad.action.EDIT_TITLE
496  *          data=content://com.google.provider.NotePad/notes/<var>{ID}</var> }</b>
497  *         displays and allows the user to edit the title associated
498  *         with note <var>{ID}</var>.</p>
499  * </ul>
500  *
501  * <h3>Standard Activity Actions</h3>
502  *
503  * <p>These are the current standard actions that Intent defines for launching
504  * activities (usually through {@link Context#startActivity}.  The most
505  * important, and by far most frequently used, are {@link #ACTION_MAIN} and
506  * {@link #ACTION_EDIT}.
507  *
508  * <ul>
509  *     <li> {@link #ACTION_MAIN}
510  *     <li> {@link #ACTION_VIEW}
511  *     <li> {@link #ACTION_ATTACH_DATA}
512  *     <li> {@link #ACTION_EDIT}
513  *     <li> {@link #ACTION_PICK}
514  *     <li> {@link #ACTION_CHOOSER}
515  *     <li> {@link #ACTION_GET_CONTENT}
516  *     <li> {@link #ACTION_DIAL}
517  *     <li> {@link #ACTION_CALL}
518  *     <li> {@link #ACTION_SEND}
519  *     <li> {@link #ACTION_SENDTO}
520  *     <li> {@link #ACTION_ANSWER}
521  *     <li> {@link #ACTION_INSERT}
522  *     <li> {@link #ACTION_DELETE}
523  *     <li> {@link #ACTION_RUN}
524  *     <li> {@link #ACTION_SYNC}
525  *     <li> {@link #ACTION_PICK_ACTIVITY}
526  *     <li> {@link #ACTION_SEARCH}
527  *     <li> {@link #ACTION_WEB_SEARCH}
528  *     <li> {@link #ACTION_FACTORY_TEST}
529  * </ul>
530  *
531  * <h3>Standard Broadcast Actions</h3>
532  *
533  * <p>These are the current standard actions that Intent defines for receiving
534  * broadcasts (usually through {@link Context#registerReceiver} or a
535  * &lt;receiver&gt; tag in a manifest).
536  *
537  * <ul>
538  *     <li> {@link #ACTION_TIME_TICK}
539  *     <li> {@link #ACTION_TIME_CHANGED}
540  *     <li> {@link #ACTION_TIMEZONE_CHANGED}
541  *     <li> {@link #ACTION_BOOT_COMPLETED}
542  *     <li> {@link #ACTION_PACKAGE_ADDED}
543  *     <li> {@link #ACTION_PACKAGE_CHANGED}
544  *     <li> {@link #ACTION_PACKAGE_REMOVED}
545  *     <li> {@link #ACTION_PACKAGE_RESTARTED}
546  *     <li> {@link #ACTION_PACKAGE_DATA_CLEARED}
547  *     <li> {@link #ACTION_PACKAGES_SUSPENDED}
548  *     <li> {@link #ACTION_PACKAGES_UNSUSPENDED}
549  *     <li> {@link #ACTION_UID_REMOVED}
550  *     <li> {@link #ACTION_BATTERY_CHANGED}
551  *     <li> {@link #ACTION_POWER_CONNECTED}
552  *     <li> {@link #ACTION_POWER_DISCONNECTED}
553  *     <li> {@link #ACTION_SHUTDOWN}
554  * </ul>
555  *
556  * <h3>Standard Categories</h3>
557  *
558  * <p>These are the current standard categories that can be used to further
559  * clarify an Intent via {@link #addCategory}.
560  *
561  * <ul>
562  *     <li> {@link #CATEGORY_DEFAULT}
563  *     <li> {@link #CATEGORY_BROWSABLE}
564  *     <li> {@link #CATEGORY_TAB}
565  *     <li> {@link #CATEGORY_ALTERNATIVE}
566  *     <li> {@link #CATEGORY_SELECTED_ALTERNATIVE}
567  *     <li> {@link #CATEGORY_LAUNCHER}
568  *     <li> {@link #CATEGORY_INFO}
569  *     <li> {@link #CATEGORY_HOME}
570  *     <li> {@link #CATEGORY_PREFERENCE}
571  *     <li> {@link #CATEGORY_TEST}
572  *     <li> {@link #CATEGORY_CAR_DOCK}
573  *     <li> {@link #CATEGORY_DESK_DOCK}
574  *     <li> {@link #CATEGORY_LE_DESK_DOCK}
575  *     <li> {@link #CATEGORY_HE_DESK_DOCK}
576  *     <li> {@link #CATEGORY_CAR_MODE}
577  *     <li> {@link #CATEGORY_APP_MARKET}
578  *     <li> {@link #CATEGORY_VR_HOME}
579  * </ul>
580  *
581  * <h3>Standard Extra Data</h3>
582  *
583  * <p>These are the current standard fields that can be used as extra data via
584  * {@link #putExtra}.
585  *
586  * <ul>
587  *     <li> {@link #EXTRA_ALARM_COUNT}
588  *     <li> {@link #EXTRA_BCC}
589  *     <li> {@link #EXTRA_CC}
590  *     <li> {@link #EXTRA_CHANGED_COMPONENT_NAME}
591  *     <li> {@link #EXTRA_DATA_REMOVED}
592  *     <li> {@link #EXTRA_DOCK_STATE}
593  *     <li> {@link #EXTRA_DOCK_STATE_HE_DESK}
594  *     <li> {@link #EXTRA_DOCK_STATE_LE_DESK}
595  *     <li> {@link #EXTRA_DOCK_STATE_CAR}
596  *     <li> {@link #EXTRA_DOCK_STATE_DESK}
597  *     <li> {@link #EXTRA_DOCK_STATE_UNDOCKED}
598  *     <li> {@link #EXTRA_DONT_KILL_APP}
599  *     <li> {@link #EXTRA_EMAIL}
600  *     <li> {@link #EXTRA_INITIAL_INTENTS}
601  *     <li> {@link #EXTRA_INTENT}
602  *     <li> {@link #EXTRA_KEY_EVENT}
603  *     <li> {@link #EXTRA_ORIGINATING_URI}
604  *     <li> {@link #EXTRA_PHONE_NUMBER}
605  *     <li> {@link #EXTRA_REFERRER}
606  *     <li> {@link #EXTRA_REMOTE_INTENT_TOKEN}
607  *     <li> {@link #EXTRA_REPLACING}
608  *     <li> {@link #EXTRA_SHORTCUT_ICON}
609  *     <li> {@link #EXTRA_SHORTCUT_ICON_RESOURCE}
610  *     <li> {@link #EXTRA_SHORTCUT_INTENT}
611  *     <li> {@link #EXTRA_STREAM}
612  *     <li> {@link #EXTRA_SHORTCUT_NAME}
613  *     <li> {@link #EXTRA_SUBJECT}
614  *     <li> {@link #EXTRA_TEMPLATE}
615  *     <li> {@link #EXTRA_TEXT}
616  *     <li> {@link #EXTRA_TITLE}
617  *     <li> {@link #EXTRA_UID}
618  * </ul>
619  *
620  * <h3>Flags</h3>
621  *
622  * <p>These are the possible flags that can be used in the Intent via
623  * {@link #setFlags} and {@link #addFlags}.  See {@link #setFlags} for a list
624  * of all possible flags.
625  */
626 public class Intent implements Parcelable, Cloneable {
627     private static final String ATTR_ACTION = "action";
628     private static final String TAG_CATEGORIES = "categories";
629     private static final String ATTR_CATEGORY = "category";
630     private static final String TAG_EXTRA = "extra";
631     private static final String ATTR_TYPE = "type";
632     private static final String ATTR_COMPONENT = "component";
633     private static final String ATTR_DATA = "data";
634     private static final String ATTR_FLAGS = "flags";
635 
636     // ---------------------------------------------------------------------
637     // ---------------------------------------------------------------------
638     // Standard intent activity actions (see action variable).
639 
640     /**
641      *  Activity Action: Start as a main entry point, does not expect to
642      *  receive data.
643      *  <p>Input: nothing
644      *  <p>Output: nothing
645      */
646     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
647     public static final String ACTION_MAIN = "android.intent.action.MAIN";
648 
649     /**
650      * Activity Action: Display the data to the user.  This is the most common
651      * action performed on data -- it is the generic action you can use on
652      * a piece of data to get the most reasonable thing to occur.  For example,
653      * when used on a contacts entry it will view the entry; when used on a
654      * mailto: URI it will bring up a compose window filled with the information
655      * supplied by the URI; when used with a tel: URI it will invoke the
656      * dialer.
657      * <p>Input: {@link #getData} is URI from which to retrieve data.
658      * <p>Output: nothing.
659      */
660     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
661     public static final String ACTION_VIEW = "android.intent.action.VIEW";
662 
663     /**
664      * Extra that can be included on activity intents coming from the storage UI
665      * when it launches sub-activities to manage various types of storage.  For example,
666      * it may use {@link #ACTION_VIEW} with a "image/*" MIME type to have an app show
667      * the images on the device, and in that case also include this extra to tell the
668      * app it is coming from the storage UI so should help the user manage storage of
669      * this type.
670      */
671     public static final String EXTRA_FROM_STORAGE = "android.intent.extra.FROM_STORAGE";
672 
673     /**
674      * A synonym for {@link #ACTION_VIEW}, the "standard" action that is
675      * performed on a piece of data.
676      */
677     public static final String ACTION_DEFAULT = ACTION_VIEW;
678 
679     /**
680      * Activity Action: Quick view the data. Launches a quick viewer for
681      * a URI or a list of URIs.
682      * <p>Activities handling this intent action should handle the vast majority of
683      * MIME types rather than only specific ones.
684      * <p>Quick viewers must render the quick view image locally, and must not send
685      * file content outside current device.
686      * <p>Input: {@link #getData} is a mandatory content URI of the item to
687      * preview. {@link #getClipData} contains an optional list of content URIs
688      * if there is more than one item to preview. {@link #EXTRA_INDEX} is an
689      * optional index of the URI in the clip data to show first.
690      * {@link #EXTRA_QUICK_VIEW_FEATURES} is an optional extra indicating the features
691      * that can be shown in the quick view UI.
692      * <p>Output: nothing.
693      * @see #EXTRA_INDEX
694      * @see #EXTRA_QUICK_VIEW_FEATURES
695      */
696     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
697     public static final String ACTION_QUICK_VIEW = "android.intent.action.QUICK_VIEW";
698 
699     /**
700      * Used to indicate that some piece of data should be attached to some other
701      * place.  For example, image data could be attached to a contact.  It is up
702      * to the recipient to decide where the data should be attached; the intent
703      * does not specify the ultimate destination.
704      * <p>Input: {@link #getData} is URI of data to be attached.
705      * <p>Output: nothing.
706      */
707     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
708     public static final String ACTION_ATTACH_DATA = "android.intent.action.ATTACH_DATA";
709 
710     /**
711      * Activity Action: Provide explicit editable access to the given data.
712      * <p>Input: {@link #getData} is URI of data to be edited.
713      * <p>Output: nothing.
714      */
715     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
716     public static final String ACTION_EDIT = "android.intent.action.EDIT";
717 
718     /**
719      * Activity Action: Pick an existing item, or insert a new item, and then edit it.
720      * <p>Input: {@link #getType} is the desired MIME type of the item to create or edit.
721      * The extras can contain type specific data to pass through to the editing/creating
722      * activity.
723      * <p>Output: The URI of the item that was picked.  This must be a content:
724      * URI so that any receiver can access it.
725      */
726     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
727     public static final String ACTION_INSERT_OR_EDIT = "android.intent.action.INSERT_OR_EDIT";
728 
729     /**
730      * Activity Action: Pick an item from the data, returning what was selected.
731      * <p>Input: {@link #getData} is URI containing a directory of data
732      * (vnd.android.cursor.dir/*) from which to pick an item.
733      * <p>Output: The URI of the item that was picked.
734      */
735     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
736     public static final String ACTION_PICK = "android.intent.action.PICK";
737 
738     /**
739      * Activity Action: Creates a shortcut.
740      * <p>Input: Nothing.</p>
741      * <p>Output: An Intent representing the {@link android.content.pm.ShortcutInfo} result.</p>
742      * <p>For compatibility with older versions of android the intent may also contain three
743      * extras: SHORTCUT_INTENT (value: Intent), SHORTCUT_NAME (value: String),
744      * and SHORTCUT_ICON (value: Bitmap) or SHORTCUT_ICON_RESOURCE
745      * (value: ShortcutIconResource).</p>
746      *
747      * @see android.content.pm.ShortcutManager#createShortcutResultIntent
748      * @see #EXTRA_SHORTCUT_INTENT
749      * @see #EXTRA_SHORTCUT_NAME
750      * @see #EXTRA_SHORTCUT_ICON
751      * @see #EXTRA_SHORTCUT_ICON_RESOURCE
752      * @see android.content.Intent.ShortcutIconResource
753      */
754     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
755     public static final String ACTION_CREATE_SHORTCUT = "android.intent.action.CREATE_SHORTCUT";
756 
757     /**
758      * The name of the extra used to define the Intent of a shortcut.
759      *
760      * @see #ACTION_CREATE_SHORTCUT
761      * @deprecated Replaced with {@link android.content.pm.ShortcutManager#createShortcutResultIntent}
762      */
763     @Deprecated
764     public static final String EXTRA_SHORTCUT_INTENT = "android.intent.extra.shortcut.INTENT";
765     /**
766      * The name of the extra used to define the name of a shortcut.
767      *
768      * @see #ACTION_CREATE_SHORTCUT
769      * @deprecated Replaced with {@link android.content.pm.ShortcutManager#createShortcutResultIntent}
770      */
771     @Deprecated
772     public static final String EXTRA_SHORTCUT_NAME = "android.intent.extra.shortcut.NAME";
773     /**
774      * The name of the extra used to define the icon, as a Bitmap, of a shortcut.
775      *
776      * @see #ACTION_CREATE_SHORTCUT
777      * @deprecated Replaced with {@link android.content.pm.ShortcutManager#createShortcutResultIntent}
778      */
779     @Deprecated
780     public static final String EXTRA_SHORTCUT_ICON = "android.intent.extra.shortcut.ICON";
781     /**
782      * The name of the extra used to define the icon, as a ShortcutIconResource, of a shortcut.
783      *
784      * @see #ACTION_CREATE_SHORTCUT
785      * @see android.content.Intent.ShortcutIconResource
786      * @deprecated Replaced with {@link android.content.pm.ShortcutManager#createShortcutResultIntent}
787      */
788     @Deprecated
789     public static final String EXTRA_SHORTCUT_ICON_RESOURCE =
790             "android.intent.extra.shortcut.ICON_RESOURCE";
791 
792     /**
793      * An activity that provides a user interface for adjusting application preferences.
794      * Optional but recommended settings for all applications which have settings.
795      */
796     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
797     public static final String ACTION_APPLICATION_PREFERENCES
798             = "android.intent.action.APPLICATION_PREFERENCES";
799 
800     /**
801      * Activity Action: Launch an activity showing the app information.
802      * For applications which install other applications (such as app stores), it is recommended
803      * to handle this action for providing the app information to the user.
804      *
805      * <p>Input: {@link #EXTRA_PACKAGE_NAME} specifies the package whose information needs
806      * to be displayed.
807      * <p>Output: Nothing.
808      */
809     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
810     public static final String ACTION_SHOW_APP_INFO
811             = "android.intent.action.SHOW_APP_INFO";
812 
813     /**
814      * Represents a shortcut/live folder icon resource.
815      *
816      * @see Intent#ACTION_CREATE_SHORTCUT
817      * @see Intent#EXTRA_SHORTCUT_ICON_RESOURCE
818      * @see android.provider.LiveFolders#ACTION_CREATE_LIVE_FOLDER
819      * @see android.provider.LiveFolders#EXTRA_LIVE_FOLDER_ICON
820      */
821     public static class ShortcutIconResource implements Parcelable {
822         /**
823          * The package name of the application containing the icon.
824          */
825         public String packageName;
826 
827         /**
828          * The resource name of the icon, including package, name and type.
829          */
830         public String resourceName;
831 
832         /**
833          * Creates a new ShortcutIconResource for the specified context and resource
834          * identifier.
835          *
836          * @param context The context of the application.
837          * @param resourceId The resource identifier for the icon.
838          * @return A new ShortcutIconResource with the specified's context package name
839          *         and icon resource identifier.``
840          */
fromContext(Context context, @AnyRes int resourceId)841         public static ShortcutIconResource fromContext(Context context, @AnyRes int resourceId) {
842             ShortcutIconResource icon = new ShortcutIconResource();
843             icon.packageName = context.getPackageName();
844             icon.resourceName = context.getResources().getResourceName(resourceId);
845             return icon;
846         }
847 
848         /**
849          * Used to read a ShortcutIconResource from a Parcel.
850          */
851         public static final Parcelable.Creator<ShortcutIconResource> CREATOR =
852             new Parcelable.Creator<ShortcutIconResource>() {
853 
854                 public ShortcutIconResource createFromParcel(Parcel source) {
855                     ShortcutIconResource icon = new ShortcutIconResource();
856                     icon.packageName = source.readString();
857                     icon.resourceName = source.readString();
858                     return icon;
859                 }
860 
861                 public ShortcutIconResource[] newArray(int size) {
862                     return new ShortcutIconResource[size];
863                 }
864             };
865 
866         /**
867          * No special parcel contents.
868          */
describeContents()869         public int describeContents() {
870             return 0;
871         }
872 
writeToParcel(Parcel dest, int flags)873         public void writeToParcel(Parcel dest, int flags) {
874             dest.writeString(packageName);
875             dest.writeString(resourceName);
876         }
877 
878         @Override
toString()879         public String toString() {
880             return resourceName;
881         }
882     }
883 
884     /**
885      * Activity Action: Display an activity chooser, allowing the user to pick
886      * what they want to before proceeding.  This can be used as an alternative
887      * to the standard activity picker that is displayed by the system when
888      * you try to start an activity with multiple possible matches, with these
889      * differences in behavior:
890      * <ul>
891      * <li>You can specify the title that will appear in the activity chooser.
892      * <li>The user does not have the option to make one of the matching
893      * activities a preferred activity, and all possible activities will
894      * always be shown even if one of them is currently marked as the
895      * preferred activity.
896      * </ul>
897      * <p>
898      * This action should be used when the user will naturally expect to
899      * select an activity in order to proceed.  An example if when not to use
900      * it is when the user clicks on a "mailto:" link.  They would naturally
901      * expect to go directly to their mail app, so startActivity() should be
902      * called directly: it will
903      * either launch the current preferred app, or put up a dialog allowing the
904      * user to pick an app to use and optionally marking that as preferred.
905      * <p>
906      * In contrast, if the user is selecting a menu item to send a picture
907      * they are viewing to someone else, there are many different things they
908      * may want to do at this point: send it through e-mail, upload it to a
909      * web service, etc.  In this case the CHOOSER action should be used, to
910      * always present to the user a list of the things they can do, with a
911      * nice title given by the caller such as "Send this photo with:".
912      * <p>
913      * If you need to grant URI permissions through a chooser, you must specify
914      * the permissions to be granted on the ACTION_CHOOSER Intent
915      * <em>in addition</em> to the EXTRA_INTENT inside.  This means using
916      * {@link #setClipData} to specify the URIs to be granted as well as
917      * {@link #FLAG_GRANT_READ_URI_PERMISSION} and/or
918      * {@link #FLAG_GRANT_WRITE_URI_PERMISSION} as appropriate.
919      * <p>
920      * As a convenience, an Intent of this form can be created with the
921      * {@link #createChooser} function.
922      * <p>
923      * Input: No data should be specified.  get*Extra must have
924      * a {@link #EXTRA_INTENT} field containing the Intent being executed,
925      * and can optionally have a {@link #EXTRA_TITLE} field containing the
926      * title text to display in the chooser.
927      * <p>
928      * Output: Depends on the protocol of {@link #EXTRA_INTENT}.
929      */
930     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
931     public static final String ACTION_CHOOSER = "android.intent.action.CHOOSER";
932 
933     /**
934      * Convenience function for creating a {@link #ACTION_CHOOSER} Intent.
935      *
936      * <p>Builds a new {@link #ACTION_CHOOSER} Intent that wraps the given
937      * target intent, also optionally supplying a title.  If the target
938      * intent has specified {@link #FLAG_GRANT_READ_URI_PERMISSION} or
939      * {@link #FLAG_GRANT_WRITE_URI_PERMISSION}, then these flags will also be
940      * set in the returned chooser intent, with its ClipData set appropriately:
941      * either a direct reflection of {@link #getClipData()} if that is non-null,
942      * or a new ClipData built from {@link #getData()}.
943      *
944      * @param target The Intent that the user will be selecting an activity
945      * to perform.
946      * @param title Optional title that will be displayed in the chooser.
947      * @return Return a new Intent object that you can hand to
948      * {@link Context#startActivity(Intent) Context.startActivity()} and
949      * related methods.
950      */
createChooser(Intent target, CharSequence title)951     public static Intent createChooser(Intent target, CharSequence title) {
952         return createChooser(target, title, null);
953     }
954 
955     /**
956      * Convenience function for creating a {@link #ACTION_CHOOSER} Intent.
957      *
958      * <p>Builds a new {@link #ACTION_CHOOSER} Intent that wraps the given
959      * target intent, also optionally supplying a title.  If the target
960      * intent has specified {@link #FLAG_GRANT_READ_URI_PERMISSION} or
961      * {@link #FLAG_GRANT_WRITE_URI_PERMISSION}, then these flags will also be
962      * set in the returned chooser intent, with its ClipData set appropriately:
963      * either a direct reflection of {@link #getClipData()} if that is non-null,
964      * or a new ClipData built from {@link #getData()}.</p>
965      *
966      * <p>The caller may optionally supply an {@link IntentSender} to receive a callback
967      * when the user makes a choice. This can be useful if the calling application wants
968      * to remember the last chosen target and surface it as a more prominent or one-touch
969      * affordance elsewhere in the UI for next time.</p>
970      *
971      * @param target The Intent that the user will be selecting an activity
972      * to perform.
973      * @param title Optional title that will be displayed in the chooser.
974      * @param sender Optional IntentSender to be called when a choice is made.
975      * @return Return a new Intent object that you can hand to
976      * {@link Context#startActivity(Intent) Context.startActivity()} and
977      * related methods.
978      */
createChooser(Intent target, CharSequence title, IntentSender sender)979     public static Intent createChooser(Intent target, CharSequence title, IntentSender sender) {
980         Intent intent = new Intent(ACTION_CHOOSER);
981         intent.putExtra(EXTRA_INTENT, target);
982         if (title != null) {
983             intent.putExtra(EXTRA_TITLE, title);
984         }
985 
986         if (sender != null) {
987             intent.putExtra(EXTRA_CHOSEN_COMPONENT_INTENT_SENDER, sender);
988         }
989 
990         // Migrate any clip data and flags from target.
991         int permFlags = target.getFlags() & (FLAG_GRANT_READ_URI_PERMISSION
992                 | FLAG_GRANT_WRITE_URI_PERMISSION | FLAG_GRANT_PERSISTABLE_URI_PERMISSION
993                 | FLAG_GRANT_PREFIX_URI_PERMISSION);
994         if (permFlags != 0) {
995             ClipData targetClipData = target.getClipData();
996             if (targetClipData == null && target.getData() != null) {
997                 ClipData.Item item = new ClipData.Item(target.getData());
998                 String[] mimeTypes;
999                 if (target.getType() != null) {
1000                     mimeTypes = new String[] { target.getType() };
1001                 } else {
1002                     mimeTypes = new String[] { };
1003                 }
1004                 targetClipData = new ClipData(null, mimeTypes, item);
1005             }
1006             if (targetClipData != null) {
1007                 intent.setClipData(targetClipData);
1008                 intent.addFlags(permFlags);
1009             }
1010         }
1011 
1012         return intent;
1013     }
1014 
1015     /**
1016      * Activity Action: Allow the user to select a particular kind of data and
1017      * return it.  This is different than {@link #ACTION_PICK} in that here we
1018      * just say what kind of data is desired, not a URI of existing data from
1019      * which the user can pick.  An ACTION_GET_CONTENT could allow the user to
1020      * create the data as it runs (for example taking a picture or recording a
1021      * sound), let them browse over the web and download the desired data,
1022      * etc.
1023      * <p>
1024      * There are two main ways to use this action: if you want a specific kind
1025      * of data, such as a person contact, you set the MIME type to the kind of
1026      * data you want and launch it with {@link Context#startActivity(Intent)}.
1027      * The system will then launch the best application to select that kind
1028      * of data for you.
1029      * <p>
1030      * You may also be interested in any of a set of types of content the user
1031      * can pick.  For example, an e-mail application that wants to allow the
1032      * user to add an attachment to an e-mail message can use this action to
1033      * bring up a list of all of the types of content the user can attach.
1034      * <p>
1035      * In this case, you should wrap the GET_CONTENT intent with a chooser
1036      * (through {@link #createChooser}), which will give the proper interface
1037      * for the user to pick how to send your data and allow you to specify
1038      * a prompt indicating what they are doing.  You will usually specify a
1039      * broad MIME type (such as image/* or {@literal *}/*), resulting in a
1040      * broad range of content types the user can select from.
1041      * <p>
1042      * When using such a broad GET_CONTENT action, it is often desirable to
1043      * only pick from data that can be represented as a stream.  This is
1044      * accomplished by requiring the {@link #CATEGORY_OPENABLE} in the Intent.
1045      * <p>
1046      * Callers can optionally specify {@link #EXTRA_LOCAL_ONLY} to request that
1047      * the launched content chooser only returns results representing data that
1048      * is locally available on the device.  For example, if this extra is set
1049      * to true then an image picker should not show any pictures that are available
1050      * from a remote server but not already on the local device (thus requiring
1051      * they be downloaded when opened).
1052      * <p>
1053      * If the caller can handle multiple returned items (the user performing
1054      * multiple selection), then it can specify {@link #EXTRA_ALLOW_MULTIPLE}
1055      * to indicate this.
1056      * <p>
1057      * Input: {@link #getType} is the desired MIME type to retrieve.  Note
1058      * that no URI is supplied in the intent, as there are no constraints on
1059      * where the returned data originally comes from.  You may also include the
1060      * {@link #CATEGORY_OPENABLE} if you can only accept data that can be
1061      * opened as a stream.  You may use {@link #EXTRA_LOCAL_ONLY} to limit content
1062      * selection to local data.  You may use {@link #EXTRA_ALLOW_MULTIPLE} to
1063      * allow the user to select multiple items.
1064      * <p>
1065      * Output: The URI of the item that was picked.  This must be a content:
1066      * URI so that any receiver can access it.
1067      */
1068     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1069     public static final String ACTION_GET_CONTENT = "android.intent.action.GET_CONTENT";
1070     /**
1071      * Activity Action: Dial a number as specified by the data.  This shows a
1072      * UI with the number being dialed, allowing the user to explicitly
1073      * initiate the call.
1074      * <p>Input: If nothing, an empty dialer is started; else {@link #getData}
1075      * is URI of a phone number to be dialed or a tel: URI of an explicit phone
1076      * number.
1077      * <p>Output: nothing.
1078      */
1079     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1080     public static final String ACTION_DIAL = "android.intent.action.DIAL";
1081     /**
1082      * Activity Action: Perform a call to someone specified by the data.
1083      * <p>Input: If nothing, an empty dialer is started; else {@link #getData}
1084      * is URI of a phone number to be dialed or a tel: URI of an explicit phone
1085      * number.
1086      * <p>Output: nothing.
1087      *
1088      * <p>Note: there will be restrictions on which applications can initiate a
1089      * call; most applications should use the {@link #ACTION_DIAL}.
1090      * <p>Note: this Intent <strong>cannot</strong> be used to call emergency
1091      * numbers.  Applications can <strong>dial</strong> emergency numbers using
1092      * {@link #ACTION_DIAL}, however.
1093      *
1094      * <p>Note: if you app targets {@link android.os.Build.VERSION_CODES#M M}
1095      * and above and declares as using the {@link android.Manifest.permission#CALL_PHONE}
1096      * permission which is not granted, then attempting to use this action will
1097      * result in a {@link java.lang.SecurityException}.
1098      */
1099     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1100     public static final String ACTION_CALL = "android.intent.action.CALL";
1101     /**
1102      * Activity Action: Perform a call to an emergency number specified by the
1103      * data.
1104      * <p>Input: {@link #getData} is URI of a phone number to be dialed or a
1105      * tel: URI of an explicit phone number.
1106      * <p>Output: nothing.
1107      * @hide
1108      */
1109     @SystemApi
1110     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1111     public static final String ACTION_CALL_EMERGENCY = "android.intent.action.CALL_EMERGENCY";
1112     /**
1113      * Activity action: Perform a call to any number (emergency or not)
1114      * specified by the data.
1115      * <p>Input: {@link #getData} is URI of a phone number to be dialed or a
1116      * tel: URI of an explicit phone number.
1117      * <p>Output: nothing.
1118      * @hide
1119      */
1120     @SystemApi
1121     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1122     public static final String ACTION_CALL_PRIVILEGED = "android.intent.action.CALL_PRIVILEGED";
1123 
1124     /**
1125      * Activity Action: Main entry point for carrier setup apps.
1126      * <p>Carrier apps that provide an implementation for this action may be invoked to configure
1127      * carrier service and typically require
1128      * {@link android.telephony.TelephonyManager#hasCarrierPrivileges() carrier privileges} to
1129      * fulfill their duties.
1130      */
1131     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1132     public static final String ACTION_CARRIER_SETUP = "android.intent.action.CARRIER_SETUP";
1133     /**
1134      * Activity Action: Send a message to someone specified by the data.
1135      * <p>Input: {@link #getData} is URI describing the target.
1136      * <p>Output: nothing.
1137      */
1138     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1139     public static final String ACTION_SENDTO = "android.intent.action.SENDTO";
1140     /**
1141      * Activity Action: Deliver some data to someone else.  Who the data is
1142      * being delivered to is not specified; it is up to the receiver of this
1143      * action to ask the user where the data should be sent.
1144      * <p>
1145      * When launching a SEND intent, you should usually wrap it in a chooser
1146      * (through {@link #createChooser}), which will give the proper interface
1147      * for the user to pick how to send your data and allow you to specify
1148      * a prompt indicating what they are doing.
1149      * <p>
1150      * Input: {@link #getType} is the MIME type of the data being sent.
1151      * get*Extra can have either a {@link #EXTRA_TEXT}
1152      * or {@link #EXTRA_STREAM} field, containing the data to be sent.  If
1153      * using EXTRA_TEXT, the MIME type should be "text/plain"; otherwise it
1154      * should be the MIME type of the data in EXTRA_STREAM.  Use {@literal *}/*
1155      * if the MIME type is unknown (this will only allow senders that can
1156      * handle generic data streams).  If using {@link #EXTRA_TEXT}, you can
1157      * also optionally supply {@link #EXTRA_HTML_TEXT} for clients to retrieve
1158      * your text with HTML formatting.
1159      * <p>
1160      * As of {@link android.os.Build.VERSION_CODES#JELLY_BEAN}, the data
1161      * being sent can be supplied through {@link #setClipData(ClipData)}.  This
1162      * allows you to use {@link #FLAG_GRANT_READ_URI_PERMISSION} when sharing
1163      * content: URIs and other advanced features of {@link ClipData}.  If
1164      * using this approach, you still must supply the same data through the
1165      * {@link #EXTRA_TEXT} or {@link #EXTRA_STREAM} fields described below
1166      * for compatibility with old applications.  If you don't set a ClipData,
1167      * it will be copied there for you when calling {@link Context#startActivity(Intent)}.
1168      * <p>
1169      * Starting from {@link android.os.Build.VERSION_CODES#O}, if
1170      * {@link #CATEGORY_TYPED_OPENABLE} is passed, then the Uris passed in
1171      * either {@link #EXTRA_STREAM} or via {@link #setClipData(ClipData)} may
1172      * be openable only as asset typed files using
1173      * {@link ContentResolver#openTypedAssetFileDescriptor(Uri, String, Bundle)}.
1174      * <p>
1175      * Optional standard extras, which may be interpreted by some recipients as
1176      * appropriate, are: {@link #EXTRA_EMAIL}, {@link #EXTRA_CC},
1177      * {@link #EXTRA_BCC}, {@link #EXTRA_SUBJECT}.
1178      * <p>
1179      * Output: nothing.
1180      */
1181     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1182     public static final String ACTION_SEND = "android.intent.action.SEND";
1183     /**
1184      * Activity Action: Deliver multiple data to someone else.
1185      * <p>
1186      * Like {@link #ACTION_SEND}, except the data is multiple.
1187      * <p>
1188      * Input: {@link #getType} is the MIME type of the data being sent.
1189      * get*ArrayListExtra can have either a {@link #EXTRA_TEXT} or {@link
1190      * #EXTRA_STREAM} field, containing the data to be sent.  If using
1191      * {@link #EXTRA_TEXT}, you can also optionally supply {@link #EXTRA_HTML_TEXT}
1192      * for clients to retrieve your text with HTML formatting.
1193      * <p>
1194      * Multiple types are supported, and receivers should handle mixed types
1195      * whenever possible. The right way for the receiver to check them is to
1196      * use the content resolver on each URI. The intent sender should try to
1197      * put the most concrete mime type in the intent type, but it can fall
1198      * back to {@literal <type>/*} or {@literal *}/* as needed.
1199      * <p>
1200      * e.g. if you are sending image/jpg and image/jpg, the intent's type can
1201      * be image/jpg, but if you are sending image/jpg and image/png, then the
1202      * intent's type should be image/*.
1203      * <p>
1204      * As of {@link android.os.Build.VERSION_CODES#JELLY_BEAN}, the data
1205      * being sent can be supplied through {@link #setClipData(ClipData)}.  This
1206      * allows you to use {@link #FLAG_GRANT_READ_URI_PERMISSION} when sharing
1207      * content: URIs and other advanced features of {@link ClipData}.  If
1208      * using this approach, you still must supply the same data through the
1209      * {@link #EXTRA_TEXT} or {@link #EXTRA_STREAM} fields described below
1210      * for compatibility with old applications.  If you don't set a ClipData,
1211      * it will be copied there for you when calling {@link Context#startActivity(Intent)}.
1212      * <p>
1213      * Starting from {@link android.os.Build.VERSION_CODES#O}, if
1214      * {@link #CATEGORY_TYPED_OPENABLE} is passed, then the Uris passed in
1215      * either {@link #EXTRA_STREAM} or via {@link #setClipData(ClipData)} may
1216      * be openable only as asset typed files using
1217      * {@link ContentResolver#openTypedAssetFileDescriptor(Uri, String, Bundle)}.
1218      * <p>
1219      * Optional standard extras, which may be interpreted by some recipients as
1220      * appropriate, are: {@link #EXTRA_EMAIL}, {@link #EXTRA_CC},
1221      * {@link #EXTRA_BCC}, {@link #EXTRA_SUBJECT}.
1222      * <p>
1223      * Output: nothing.
1224      */
1225     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1226     public static final String ACTION_SEND_MULTIPLE = "android.intent.action.SEND_MULTIPLE";
1227     /**
1228      * Activity Action: Handle an incoming phone call.
1229      * <p>Input: nothing.
1230      * <p>Output: nothing.
1231      */
1232     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1233     public static final String ACTION_ANSWER = "android.intent.action.ANSWER";
1234     /**
1235      * Activity Action: Insert an empty item into the given container.
1236      * <p>Input: {@link #getData} is URI of the directory (vnd.android.cursor.dir/*)
1237      * in which to place the data.
1238      * <p>Output: URI of the new data that was created.
1239      */
1240     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1241     public static final String ACTION_INSERT = "android.intent.action.INSERT";
1242     /**
1243      * Activity Action: Create a new item in the given container, initializing it
1244      * from the current contents of the clipboard.
1245      * <p>Input: {@link #getData} is URI of the directory (vnd.android.cursor.dir/*)
1246      * in which to place the data.
1247      * <p>Output: URI of the new data that was created.
1248      */
1249     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1250     public static final String ACTION_PASTE = "android.intent.action.PASTE";
1251     /**
1252      * Activity Action: Delete the given data from its container.
1253      * <p>Input: {@link #getData} is URI of data to be deleted.
1254      * <p>Output: nothing.
1255      */
1256     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1257     public static final String ACTION_DELETE = "android.intent.action.DELETE";
1258     /**
1259      * Activity Action: Run the data, whatever that means.
1260      * <p>Input: ?  (Note: this is currently specific to the test harness.)
1261      * <p>Output: nothing.
1262      */
1263     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1264     public static final String ACTION_RUN = "android.intent.action.RUN";
1265     /**
1266      * Activity Action: Perform a data synchronization.
1267      * <p>Input: ?
1268      * <p>Output: ?
1269      */
1270     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1271     public static final String ACTION_SYNC = "android.intent.action.SYNC";
1272     /**
1273      * Activity Action: Pick an activity given an intent, returning the class
1274      * selected.
1275      * <p>Input: get*Extra field {@link #EXTRA_INTENT} is an Intent
1276      * used with {@link PackageManager#queryIntentActivities} to determine the
1277      * set of activities from which to pick.
1278      * <p>Output: Class name of the activity that was selected.
1279      */
1280     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1281     public static final String ACTION_PICK_ACTIVITY = "android.intent.action.PICK_ACTIVITY";
1282     /**
1283      * Activity Action: Perform a search.
1284      * <p>Input: {@link android.app.SearchManager#QUERY getStringExtra(SearchManager.QUERY)}
1285      * is the text to search for.  If empty, simply
1286      * enter your search results Activity with the search UI activated.
1287      * <p>Output: nothing.
1288      */
1289     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1290     public static final String ACTION_SEARCH = "android.intent.action.SEARCH";
1291     /**
1292      * Activity Action: Start the platform-defined tutorial
1293      * <p>Input: {@link android.app.SearchManager#QUERY getStringExtra(SearchManager.QUERY)}
1294      * is the text to search for.  If empty, simply
1295      * enter your search results Activity with the search UI activated.
1296      * <p>Output: nothing.
1297      */
1298     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1299     public static final String ACTION_SYSTEM_TUTORIAL = "android.intent.action.SYSTEM_TUTORIAL";
1300     /**
1301      * Activity Action: Perform a web search.
1302      * <p>
1303      * Input: {@link android.app.SearchManager#QUERY
1304      * getStringExtra(SearchManager.QUERY)} is the text to search for. If it is
1305      * a url starts with http or https, the site will be opened. If it is plain
1306      * text, Google search will be applied.
1307      * <p>
1308      * Output: nothing.
1309      */
1310     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1311     public static final String ACTION_WEB_SEARCH = "android.intent.action.WEB_SEARCH";
1312 
1313     /**
1314      * Activity Action: Perform assist action.
1315      * <p>
1316      * Input: {@link #EXTRA_ASSIST_PACKAGE}, {@link #EXTRA_ASSIST_CONTEXT}, can provide
1317      * additional optional contextual information about where the user was when they
1318      * requested the assist; {@link #EXTRA_REFERRER} may be set with additional referrer
1319      * information.
1320      * Output: nothing.
1321      */
1322     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1323     public static final String ACTION_ASSIST = "android.intent.action.ASSIST";
1324 
1325     /**
1326      * Activity Action: Perform voice assist action.
1327      * <p>
1328      * Input: {@link #EXTRA_ASSIST_PACKAGE}, {@link #EXTRA_ASSIST_CONTEXT}, can provide
1329      * additional optional contextual information about where the user was when they
1330      * requested the voice assist.
1331      * Output: nothing.
1332      * @hide
1333      */
1334     @SystemApi
1335     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1336     public static final String ACTION_VOICE_ASSIST = "android.intent.action.VOICE_ASSIST";
1337 
1338     /**
1339      * An optional field on {@link #ACTION_ASSIST} containing the name of the current foreground
1340      * application package at the time the assist was invoked.
1341      */
1342     public static final String EXTRA_ASSIST_PACKAGE
1343             = "android.intent.extra.ASSIST_PACKAGE";
1344 
1345     /**
1346      * An optional field on {@link #ACTION_ASSIST} containing the uid of the current foreground
1347      * application package at the time the assist was invoked.
1348      */
1349     public static final String EXTRA_ASSIST_UID
1350             = "android.intent.extra.ASSIST_UID";
1351 
1352     /**
1353      * An optional field on {@link #ACTION_ASSIST} and containing additional contextual
1354      * information supplied by the current foreground app at the time of the assist request.
1355      * This is a {@link Bundle} of additional data.
1356      */
1357     public static final String EXTRA_ASSIST_CONTEXT
1358             = "android.intent.extra.ASSIST_CONTEXT";
1359 
1360     /**
1361      * An optional field on {@link #ACTION_ASSIST} suggesting that the user will likely use a
1362      * keyboard as the primary input device for assistance.
1363      */
1364     public static final String EXTRA_ASSIST_INPUT_HINT_KEYBOARD =
1365             "android.intent.extra.ASSIST_INPUT_HINT_KEYBOARD";
1366 
1367     /**
1368      * An optional field on {@link #ACTION_ASSIST} containing the InputDevice id
1369      * that was used to invoke the assist.
1370      */
1371     public static final String EXTRA_ASSIST_INPUT_DEVICE_ID =
1372             "android.intent.extra.ASSIST_INPUT_DEVICE_ID";
1373 
1374     /**
1375      * Activity Action: List all available applications.
1376      * <p>Input: Nothing.
1377      * <p>Output: nothing.
1378      */
1379     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1380     public static final String ACTION_ALL_APPS = "android.intent.action.ALL_APPS";
1381     /**
1382      * Activity Action: Show settings for choosing wallpaper.
1383      * <p>Input: Nothing.
1384      * <p>Output: Nothing.
1385      */
1386     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1387     public static final String ACTION_SET_WALLPAPER = "android.intent.action.SET_WALLPAPER";
1388 
1389     /**
1390      * Activity Action: Show activity for reporting a bug.
1391      * <p>Input: Nothing.
1392      * <p>Output: Nothing.
1393      */
1394     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1395     public static final String ACTION_BUG_REPORT = "android.intent.action.BUG_REPORT";
1396 
1397     /**
1398      *  Activity Action: Main entry point for factory tests.  Only used when
1399      *  the device is booting in factory test node.  The implementing package
1400      *  must be installed in the system image.
1401      *  <p>Input: nothing
1402      *  <p>Output: nothing
1403      */
1404     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1405     public static final String ACTION_FACTORY_TEST = "android.intent.action.FACTORY_TEST";
1406 
1407     /**
1408      * Activity Action: The user pressed the "call" button to go to the dialer
1409      * or other appropriate UI for placing a call.
1410      * <p>Input: Nothing.
1411      * <p>Output: Nothing.
1412      */
1413     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1414     public static final String ACTION_CALL_BUTTON = "android.intent.action.CALL_BUTTON";
1415 
1416     /**
1417      * Activity Action: Start Voice Command.
1418      * <p>Input: Nothing.
1419      * <p>Output: Nothing.
1420      */
1421     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1422     public static final String ACTION_VOICE_COMMAND = "android.intent.action.VOICE_COMMAND";
1423 
1424     /**
1425      * Activity Action: Start action associated with long pressing on the
1426      * search key.
1427      * <p>Input: Nothing.
1428      * <p>Output: Nothing.
1429      */
1430     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1431     public static final String ACTION_SEARCH_LONG_PRESS = "android.intent.action.SEARCH_LONG_PRESS";
1432 
1433     /**
1434      * Activity Action: The user pressed the "Report" button in the crash/ANR dialog.
1435      * This intent is delivered to the package which installed the application, usually
1436      * Google Play.
1437      * <p>Input: No data is specified. The bug report is passed in using
1438      * an {@link #EXTRA_BUG_REPORT} field.
1439      * <p>Output: Nothing.
1440      *
1441      * @see #EXTRA_BUG_REPORT
1442      */
1443     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1444     public static final String ACTION_APP_ERROR = "android.intent.action.APP_ERROR";
1445 
1446     /**
1447      * Activity Action: Show power usage information to the user.
1448      * <p>Input: Nothing.
1449      * <p>Output: Nothing.
1450      */
1451     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1452     public static final String ACTION_POWER_USAGE_SUMMARY = "android.intent.action.POWER_USAGE_SUMMARY";
1453 
1454     /**
1455      * Activity Action: Setup wizard action provided for OTA provisioning to determine if it needs
1456      * to run.
1457      * <p>Input: Nothing.
1458      * <p>Output: Nothing.
1459      * @deprecated As of {@link android.os.Build.VERSION_CODES#M}, setup wizard can be identified
1460      * using {@link #ACTION_MAIN} and {@link #CATEGORY_SETUP_WIZARD}
1461      * @hide
1462      * @removed
1463      */
1464     @Deprecated
1465     @SystemApi
1466     public static final String ACTION_DEVICE_INITIALIZATION_WIZARD =
1467             "android.intent.action.DEVICE_INITIALIZATION_WIZARD";
1468 
1469     /**
1470      * Activity Action: Setup wizard to launch after a platform update.  This
1471      * activity should have a string meta-data field associated with it,
1472      * {@link #METADATA_SETUP_VERSION}, which defines the current version of
1473      * the platform for setup.  The activity will be launched only if
1474      * {@link android.provider.Settings.Secure#LAST_SETUP_SHOWN} is not the
1475      * same value.
1476      * <p>Input: Nothing.
1477      * <p>Output: Nothing.
1478      * @hide
1479      */
1480     @SystemApi
1481     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1482     public static final String ACTION_UPGRADE_SETUP = "android.intent.action.UPGRADE_SETUP";
1483 
1484     /**
1485      * Activity Action: Start the Keyboard Shortcuts Helper screen.
1486      * <p>Input: Nothing.
1487      * <p>Output: Nothing.
1488      * @hide
1489      */
1490     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
1491     public static final String ACTION_SHOW_KEYBOARD_SHORTCUTS =
1492             "com.android.intent.action.SHOW_KEYBOARD_SHORTCUTS";
1493 
1494     /**
1495      * Activity Action: Dismiss the Keyboard Shortcuts Helper screen.
1496      * <p>Input: Nothing.
1497      * <p>Output: Nothing.
1498      * @hide
1499      */
1500     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
1501     public static final String ACTION_DISMISS_KEYBOARD_SHORTCUTS =
1502             "com.android.intent.action.DISMISS_KEYBOARD_SHORTCUTS";
1503 
1504     /**
1505      * Activity Action: Show settings for managing network data usage of a
1506      * specific application. Applications should define an activity that offers
1507      * options to control data usage.
1508      */
1509     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1510     public static final String ACTION_MANAGE_NETWORK_USAGE =
1511             "android.intent.action.MANAGE_NETWORK_USAGE";
1512 
1513     /**
1514      * Activity Action: Launch application installer.
1515      * <p>
1516      * Input: The data must be a content: URI at which the application
1517      * can be retrieved.  As of {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1},
1518      * you can also use "package:<package-name>" to install an application for the
1519      * current user that is already installed for another user. You can optionally supply
1520      * {@link #EXTRA_INSTALLER_PACKAGE_NAME}, {@link #EXTRA_NOT_UNKNOWN_SOURCE},
1521      * {@link #EXTRA_ALLOW_REPLACE}, and {@link #EXTRA_RETURN_RESULT}.
1522      * <p>
1523      * Output: If {@link #EXTRA_RETURN_RESULT}, returns whether the install
1524      * succeeded.
1525      * <p>
1526      * <strong>Note:</strong>If your app is targeting API level higher than 25 you
1527      * need to hold {@link android.Manifest.permission#REQUEST_INSTALL_PACKAGES}
1528      * in order to launch the application installer.
1529      * </p>
1530      *
1531      * @see #EXTRA_INSTALLER_PACKAGE_NAME
1532      * @see #EXTRA_NOT_UNKNOWN_SOURCE
1533      * @see #EXTRA_RETURN_RESULT
1534      */
1535     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1536     public static final String ACTION_INSTALL_PACKAGE = "android.intent.action.INSTALL_PACKAGE";
1537 
1538     /**
1539      * Activity Action: Activity to handle split installation failures.
1540      * <p>Splits may be installed dynamically. This happens when an Activity is launched,
1541      * but the split that contains the application isn't installed. When a split is
1542      * installed in this manner, the containing package usually doesn't know this is
1543      * happening. However, if an error occurs during installation, the containing
1544      * package can define a single activity handling this action to deal with such
1545      * failures.
1546      * <p>The activity handling this action must be in the base package.
1547      * <p>
1548      * Input: {@link #EXTRA_INTENT} the original intent that started split installation.
1549      * {@link #EXTRA_SPLIT_NAME} the name of the split that failed to be installed.
1550      */
1551     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1552     public static final String ACTION_INSTALL_FAILURE = "android.intent.action.INSTALL_FAILURE";
1553 
1554     /**
1555      * @hide
1556      * @removed
1557      * @deprecated Do not use. This will go away.
1558      *     Replace with {@link #ACTION_INSTALL_INSTANT_APP_PACKAGE}.
1559      */
1560     @SystemApi
1561     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1562     public static final String ACTION_INSTALL_EPHEMERAL_PACKAGE
1563             = "android.intent.action.INSTALL_EPHEMERAL_PACKAGE";
1564     /**
1565      * Activity Action: Launch instant application installer.
1566      * <p class="note">
1567      * This is a protected intent that can only be sent by the system.
1568      * </p>
1569      *
1570      * @hide
1571      */
1572     @SystemApi
1573     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1574     public static final String ACTION_INSTALL_INSTANT_APP_PACKAGE
1575             = "android.intent.action.INSTALL_INSTANT_APP_PACKAGE";
1576 
1577     /**
1578      * @hide
1579      * @removed
1580      * @deprecated Do not use. This will go away.
1581      *     Replace with {@link #ACTION_RESOLVE_INSTANT_APP_PACKAGE}.
1582      */
1583     @SystemApi
1584     @SdkConstant(SdkConstantType.SERVICE_ACTION)
1585     public static final String ACTION_RESOLVE_EPHEMERAL_PACKAGE
1586             = "android.intent.action.RESOLVE_EPHEMERAL_PACKAGE";
1587     /**
1588      * Service Action: Resolve instant application.
1589      * <p>
1590      * The system will have a persistent connection to this service.
1591      * This is a protected intent that can only be sent by the system.
1592      * </p>
1593      *
1594      * @hide
1595      */
1596     @SystemApi
1597     @SdkConstant(SdkConstantType.SERVICE_ACTION)
1598     public static final String ACTION_RESOLVE_INSTANT_APP_PACKAGE
1599             = "android.intent.action.RESOLVE_INSTANT_APP_PACKAGE";
1600 
1601     /**
1602      * @hide
1603      * @removed
1604      * @deprecated Do not use. This will go away.
1605      *     Replace with {@link #ACTION_INSTANT_APP_RESOLVER_SETTINGS}.
1606      */
1607     @SystemApi
1608     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1609     public static final String ACTION_EPHEMERAL_RESOLVER_SETTINGS
1610             = "android.intent.action.EPHEMERAL_RESOLVER_SETTINGS";
1611     /**
1612      * Activity Action: Launch instant app settings.
1613      *
1614      * <p class="note">
1615      * This is a protected intent that can only be sent by the system.
1616      * </p>
1617      *
1618      * @hide
1619      */
1620     @SystemApi
1621     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1622     public static final String ACTION_INSTANT_APP_RESOLVER_SETTINGS
1623             = "android.intent.action.INSTANT_APP_RESOLVER_SETTINGS";
1624 
1625     /**
1626      * Used as a string extra field with {@link #ACTION_INSTALL_PACKAGE} to install a
1627      * package.  Specifies the installer package name; this package will receive the
1628      * {@link #ACTION_APP_ERROR} intent.
1629      */
1630     public static final String EXTRA_INSTALLER_PACKAGE_NAME
1631             = "android.intent.extra.INSTALLER_PACKAGE_NAME";
1632 
1633     /**
1634      * Used as a boolean extra field with {@link #ACTION_INSTALL_PACKAGE} to install a
1635      * package.  Specifies that the application being installed should not be
1636      * treated as coming from an unknown source, but as coming from the app
1637      * invoking the Intent.  For this to work you must start the installer with
1638      * startActivityForResult().
1639      */
1640     public static final String EXTRA_NOT_UNKNOWN_SOURCE
1641             = "android.intent.extra.NOT_UNKNOWN_SOURCE";
1642 
1643     /**
1644      * Used as a URI extra field with {@link #ACTION_INSTALL_PACKAGE} and
1645      * {@link #ACTION_VIEW} to indicate the URI from which the local APK in the Intent
1646      * data field originated from.
1647      */
1648     public static final String EXTRA_ORIGINATING_URI
1649             = "android.intent.extra.ORIGINATING_URI";
1650 
1651     /**
1652      * This extra can be used with any Intent used to launch an activity, supplying information
1653      * about who is launching that activity.  This field contains a {@link android.net.Uri}
1654      * object, typically an http: or https: URI of the web site that the referral came from;
1655      * it can also use the {@link #URI_ANDROID_APP_SCHEME android-app:} scheme to identify
1656      * a native application that it came from.
1657      *
1658      * <p>To retrieve this value in a client, use {@link android.app.Activity#getReferrer}
1659      * instead of directly retrieving the extra.  It is also valid for applications to
1660      * instead supply {@link #EXTRA_REFERRER_NAME} for cases where they can only create
1661      * a string, not a Uri; the field here, if supplied, will always take precedence,
1662      * however.</p>
1663      *
1664      * @see #EXTRA_REFERRER_NAME
1665      */
1666     public static final String EXTRA_REFERRER
1667             = "android.intent.extra.REFERRER";
1668 
1669     /**
1670      * Alternate version of {@link #EXTRA_REFERRER} that supplies the URI as a String rather
1671      * than a {@link android.net.Uri} object.  Only for use in cases where Uri objects can
1672      * not be created, in particular when Intent extras are supplied through the
1673      * {@link #URI_INTENT_SCHEME intent:} or {@link #URI_ANDROID_APP_SCHEME android-app:}
1674      * schemes.
1675      *
1676      * @see #EXTRA_REFERRER
1677      */
1678     public static final String EXTRA_REFERRER_NAME
1679             = "android.intent.extra.REFERRER_NAME";
1680 
1681     /**
1682      * Used as an int extra field with {@link #ACTION_INSTALL_PACKAGE} and
1683      * {@link #ACTION_VIEW} to indicate the uid of the package that initiated the install
1684      * Currently only a system app that hosts the provider authority "downloads" or holds the
1685      * permission {@link android.Manifest.permission.MANAGE_DOCUMENTS} can use this.
1686      * @hide
1687      */
1688     @SystemApi
1689     public static final String EXTRA_ORIGINATING_UID
1690             = "android.intent.extra.ORIGINATING_UID";
1691 
1692     /**
1693      * Used as a boolean extra field with {@link #ACTION_INSTALL_PACKAGE} to install a
1694      * package.  Tells the installer UI to skip the confirmation with the user
1695      * if the .apk is replacing an existing one.
1696      * @deprecated As of {@link android.os.Build.VERSION_CODES#JELLY_BEAN}, Android
1697      * will no longer show an interstitial message about updating existing
1698      * applications so this is no longer needed.
1699      */
1700     @Deprecated
1701     public static final String EXTRA_ALLOW_REPLACE
1702             = "android.intent.extra.ALLOW_REPLACE";
1703 
1704     /**
1705      * Used as a boolean extra field with {@link #ACTION_INSTALL_PACKAGE} or
1706      * {@link #ACTION_UNINSTALL_PACKAGE}.  Specifies that the installer UI should
1707      * return to the application the result code of the install/uninstall.  The returned result
1708      * code will be {@link android.app.Activity#RESULT_OK} on success or
1709      * {@link android.app.Activity#RESULT_FIRST_USER} on failure.
1710      */
1711     public static final String EXTRA_RETURN_RESULT
1712             = "android.intent.extra.RETURN_RESULT";
1713 
1714     /**
1715      * Package manager install result code.  @hide because result codes are not
1716      * yet ready to be exposed.
1717      */
1718     public static final String EXTRA_INSTALL_RESULT
1719             = "android.intent.extra.INSTALL_RESULT";
1720 
1721     /**
1722      * Activity Action: Launch application uninstaller.
1723      * <p>
1724      * Input: The data must be a package: URI whose scheme specific part is
1725      * the package name of the current installed package to be uninstalled.
1726      * You can optionally supply {@link #EXTRA_RETURN_RESULT}.
1727      * <p>
1728      * Output: If {@link #EXTRA_RETURN_RESULT}, returns whether the install
1729      * succeeded.
1730      */
1731     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1732     public static final String ACTION_UNINSTALL_PACKAGE = "android.intent.action.UNINSTALL_PACKAGE";
1733 
1734     /**
1735      * Specify whether the package should be uninstalled for all users.
1736      * @hide because these should not be part of normal application flow.
1737      */
1738     public static final String EXTRA_UNINSTALL_ALL_USERS
1739             = "android.intent.extra.UNINSTALL_ALL_USERS";
1740 
1741     /**
1742      * A string associated with a {@link #ACTION_UPGRADE_SETUP} activity
1743      * describing the last run version of the platform that was setup.
1744      * @hide
1745      */
1746     public static final String METADATA_SETUP_VERSION = "android.SETUP_VERSION";
1747 
1748     /**
1749      * Activity action: Launch UI to manage the permissions of an app.
1750      * <p>
1751      * Input: {@link #EXTRA_PACKAGE_NAME} specifies the package whose permissions
1752      * will be managed by the launched UI.
1753      * </p>
1754      * <p>
1755      * Output: Nothing.
1756      * </p>
1757      *
1758      * @see #EXTRA_PACKAGE_NAME
1759      *
1760      * @hide
1761      */
1762     @SystemApi
1763     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1764     public static final String ACTION_MANAGE_APP_PERMISSIONS =
1765             "android.intent.action.MANAGE_APP_PERMISSIONS";
1766 
1767     /**
1768      * Activity action: Launch UI to manage permissions.
1769      * <p>
1770      * Input: Nothing.
1771      * </p>
1772      * <p>
1773      * Output: Nothing.
1774      * </p>
1775      *
1776      * @hide
1777      */
1778     @SystemApi
1779     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1780     public static final String ACTION_MANAGE_PERMISSIONS =
1781             "android.intent.action.MANAGE_PERMISSIONS";
1782 
1783     /**
1784      * Activity action: Launch UI to review permissions for an app.
1785      * The system uses this intent if permission review for apps not
1786      * supporting the new runtime permissions model is enabled. In
1787      * this mode a permission review is required before any of the
1788      * app components can run.
1789      * <p>
1790      * Input: {@link #EXTRA_PACKAGE_NAME} specifies the package whose
1791      * permissions will be reviewed (mandatory).
1792      * </p>
1793      * <p>
1794      * Input: {@link #EXTRA_INTENT} specifies a pending intent to
1795      * be fired after the permission review (optional).
1796      * </p>
1797      * <p>
1798      * Input: {@link #EXTRA_REMOTE_CALLBACK} specifies a callback to
1799      * be invoked after the permission review (optional).
1800      * </p>
1801      * <p>
1802      * Input: {@link #EXTRA_RESULT_NEEDED} specifies whether the intent
1803      * passed via {@link #EXTRA_INTENT} needs a result (optional).
1804      * </p>
1805      * <p>
1806      * Output: Nothing.
1807      * </p>
1808      *
1809      * @see #EXTRA_PACKAGE_NAME
1810      * @see #EXTRA_INTENT
1811      * @see #EXTRA_REMOTE_CALLBACK
1812      * @see #EXTRA_RESULT_NEEDED
1813      *
1814      * @hide
1815      */
1816     @SystemApi
1817     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1818     public static final String ACTION_REVIEW_PERMISSIONS =
1819             "android.intent.action.REVIEW_PERMISSIONS";
1820 
1821     /**
1822      * Intent extra: A callback for reporting remote result as a bundle.
1823      * <p>
1824      * Type: IRemoteCallback
1825      * </p>
1826      *
1827      * @hide
1828      */
1829     @SystemApi
1830     public static final String EXTRA_REMOTE_CALLBACK = "android.intent.extra.REMOTE_CALLBACK";
1831 
1832     /**
1833      * Intent extra: An app package name.
1834      * <p>
1835      * Type: String
1836      * </p>
1837      *
1838      */
1839     public static final String EXTRA_PACKAGE_NAME = "android.intent.extra.PACKAGE_NAME";
1840 
1841     /**
1842      * Intent extra: An app split name.
1843      * <p>
1844      * Type: String
1845      * </p>
1846      */
1847     public static final String EXTRA_SPLIT_NAME = "android.intent.extra.SPLIT_NAME";
1848 
1849     /**
1850      * Intent extra: A {@link ComponentName} value.
1851      * <p>
1852      * Type: String
1853      * </p>
1854      */
1855     public static final String EXTRA_COMPONENT_NAME = "android.intent.extra.COMPONENT_NAME";
1856 
1857     /**
1858      * Intent extra: An extra for specifying whether a result is needed.
1859      * <p>
1860      * Type: boolean
1861      * </p>
1862      *
1863      * @hide
1864      */
1865     @SystemApi
1866     public static final String EXTRA_RESULT_NEEDED = "android.intent.extra.RESULT_NEEDED";
1867 
1868     /**
1869      * Activity action: Launch UI to manage which apps have a given permission.
1870      * <p>
1871      * Input: {@link #EXTRA_PERMISSION_NAME} specifies the permission access
1872      * to which will be managed by the launched UI.
1873      * </p>
1874      * <p>
1875      * Output: Nothing.
1876      * </p>
1877      *
1878      * @see #EXTRA_PERMISSION_NAME
1879      *
1880      * @hide
1881      */
1882     @SystemApi
1883     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
1884     public static final String ACTION_MANAGE_PERMISSION_APPS =
1885             "android.intent.action.MANAGE_PERMISSION_APPS";
1886 
1887     /**
1888      * Intent extra: The name of a permission.
1889      * <p>
1890      * Type: String
1891      * </p>
1892      *
1893      * @hide
1894      */
1895     @SystemApi
1896     public static final String EXTRA_PERMISSION_NAME = "android.intent.extra.PERMISSION_NAME";
1897 
1898     // ---------------------------------------------------------------------
1899     // ---------------------------------------------------------------------
1900     // Standard intent broadcast actions (see action variable).
1901 
1902     /**
1903      * Broadcast Action: Sent when the device goes to sleep and becomes non-interactive.
1904      * <p>
1905      * For historical reasons, the name of this broadcast action refers to the power
1906      * state of the screen but it is actually sent in response to changes in the
1907      * overall interactive state of the device.
1908      * </p><p>
1909      * This broadcast is sent when the device becomes non-interactive which may have
1910      * nothing to do with the screen turning off.  To determine the
1911      * actual state of the screen, use {@link android.view.Display#getState}.
1912      * </p><p>
1913      * See {@link android.os.PowerManager#isInteractive} for details.
1914      * </p>
1915      * You <em>cannot</em> receive this through components declared in
1916      * manifests, only by explicitly registering for it with
1917      * {@link Context#registerReceiver(BroadcastReceiver, IntentFilter)
1918      * Context.registerReceiver()}.
1919      *
1920      * <p class="note">This is a protected intent that can only be sent
1921      * by the system.
1922      */
1923     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
1924     public static final String ACTION_SCREEN_OFF = "android.intent.action.SCREEN_OFF";
1925 
1926     /**
1927      * Broadcast Action: Sent when the device wakes up and becomes interactive.
1928      * <p>
1929      * For historical reasons, the name of this broadcast action refers to the power
1930      * state of the screen but it is actually sent in response to changes in the
1931      * overall interactive state of the device.
1932      * </p><p>
1933      * This broadcast is sent when the device becomes interactive which may have
1934      * nothing to do with the screen turning on.  To determine the
1935      * actual state of the screen, use {@link android.view.Display#getState}.
1936      * </p><p>
1937      * See {@link android.os.PowerManager#isInteractive} for details.
1938      * </p>
1939      * You <em>cannot</em> receive this through components declared in
1940      * manifests, only by explicitly registering for it with
1941      * {@link Context#registerReceiver(BroadcastReceiver, IntentFilter)
1942      * Context.registerReceiver()}.
1943      *
1944      * <p class="note">This is a protected intent that can only be sent
1945      * by the system.
1946      */
1947     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
1948     public static final String ACTION_SCREEN_ON = "android.intent.action.SCREEN_ON";
1949 
1950     /**
1951      * Broadcast Action: Sent after the system stops dreaming.
1952      *
1953      * <p class="note">This is a protected intent that can only be sent by the system.
1954      * It is only sent to registered receivers.</p>
1955      */
1956     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
1957     public static final String ACTION_DREAMING_STOPPED = "android.intent.action.DREAMING_STOPPED";
1958 
1959     /**
1960      * Broadcast Action: Sent after the system starts dreaming.
1961      *
1962      * <p class="note">This is a protected intent that can only be sent by the system.
1963      * It is only sent to registered receivers.</p>
1964      */
1965     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
1966     public static final String ACTION_DREAMING_STARTED = "android.intent.action.DREAMING_STARTED";
1967 
1968     /**
1969      * Broadcast Action: Sent when the user is present after device wakes up (e.g when the
1970      * keyguard is gone).
1971      *
1972      * <p class="note">This is a protected intent that can only be sent
1973      * by the system.
1974      */
1975     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
1976     public static final String ACTION_USER_PRESENT = "android.intent.action.USER_PRESENT";
1977 
1978     /**
1979      * Broadcast Action: The current time has changed.  Sent every
1980      * minute.  You <em>cannot</em> receive this through components declared
1981      * in manifests, only by explicitly registering for it with
1982      * {@link Context#registerReceiver(BroadcastReceiver, IntentFilter)
1983      * Context.registerReceiver()}.
1984      *
1985      * <p class="note">This is a protected intent that can only be sent
1986      * by the system.
1987      */
1988     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
1989     public static final String ACTION_TIME_TICK = "android.intent.action.TIME_TICK";
1990     /**
1991      * Broadcast Action: The time was set.
1992      */
1993     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
1994     public static final String ACTION_TIME_CHANGED = "android.intent.action.TIME_SET";
1995     /**
1996      * Broadcast Action: The date has changed.
1997      */
1998     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
1999     public static final String ACTION_DATE_CHANGED = "android.intent.action.DATE_CHANGED";
2000     /**
2001      * Broadcast Action: The timezone has changed. The intent will have the following extra values:</p>
2002      * <ul>
2003      *   <li><em>time-zone</em> - The java.util.TimeZone.getID() value identifying the new time zone.</li>
2004      * </ul>
2005      *
2006      * <p class="note">This is a protected intent that can only be sent
2007      * by the system.
2008      */
2009     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2010     public static final String ACTION_TIMEZONE_CHANGED = "android.intent.action.TIMEZONE_CHANGED";
2011     /**
2012      * Clear DNS Cache Action: This is broadcast when networks have changed and old
2013      * DNS entries should be tossed.
2014      * @hide
2015      */
2016     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2017     public static final String ACTION_CLEAR_DNS_CACHE = "android.intent.action.CLEAR_DNS_CACHE";
2018     /**
2019      * Alarm Changed Action: This is broadcast when the AlarmClock
2020      * application's alarm is set or unset.  It is used by the
2021      * AlarmClock application and the StatusBar service.
2022      * @hide
2023      */
2024     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2025     public static final String ACTION_ALARM_CHANGED = "android.intent.action.ALARM_CHANGED";
2026 
2027     /**
2028      * Broadcast Action: This is broadcast once, after the user has finished
2029      * booting, but while still in the "locked" state. It can be used to perform
2030      * application-specific initialization, such as installing alarms. You must
2031      * hold the {@link android.Manifest.permission#RECEIVE_BOOT_COMPLETED}
2032      * permission in order to receive this broadcast.
2033      * <p>
2034      * This broadcast is sent immediately at boot by all devices (regardless of
2035      * direct boot support) running {@link android.os.Build.VERSION_CODES#N} or
2036      * higher. Upon receipt of this broadcast, the user is still locked and only
2037      * device-protected storage can be accessed safely. If you want to access
2038      * credential-protected storage, you need to wait for the user to be
2039      * unlocked (typically by entering their lock pattern or PIN for the first
2040      * time), after which the {@link #ACTION_USER_UNLOCKED} and
2041      * {@link #ACTION_BOOT_COMPLETED} broadcasts are sent.
2042      * <p>
2043      * To receive this broadcast, your receiver component must be marked as
2044      * being {@link ComponentInfo#directBootAware}.
2045      * <p class="note">
2046      * This is a protected intent that can only be sent by the system.
2047      *
2048      * @see Context#createDeviceProtectedStorageContext()
2049      */
2050     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2051     public static final String ACTION_LOCKED_BOOT_COMPLETED = "android.intent.action.LOCKED_BOOT_COMPLETED";
2052 
2053     /**
2054      * Broadcast Action: This is broadcast once, after the user has finished
2055      * booting. It can be used to perform application-specific initialization,
2056      * such as installing alarms. You must hold the
2057      * {@link android.Manifest.permission#RECEIVE_BOOT_COMPLETED} permission in
2058      * order to receive this broadcast.
2059      * <p>
2060      * This broadcast is sent at boot by all devices (both with and without
2061      * direct boot support). Upon receipt of this broadcast, the user is
2062      * unlocked and both device-protected and credential-protected storage can
2063      * accessed safely.
2064      * <p>
2065      * If you need to run while the user is still locked (before they've entered
2066      * their lock pattern or PIN for the first time), you can listen for the
2067      * {@link #ACTION_LOCKED_BOOT_COMPLETED} broadcast.
2068      * <p class="note">
2069      * This is a protected intent that can only be sent by the system.
2070      */
2071     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2072     @BroadcastBehavior(includeBackground = true)
2073     public static final String ACTION_BOOT_COMPLETED = "android.intent.action.BOOT_COMPLETED";
2074 
2075     /**
2076      * Broadcast Action: This is broadcast when a user action should request a
2077      * temporary system dialog to dismiss.  Some examples of temporary system
2078      * dialogs are the notification window-shade and the recent tasks dialog.
2079      */
2080     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2081     public static final String ACTION_CLOSE_SYSTEM_DIALOGS = "android.intent.action.CLOSE_SYSTEM_DIALOGS";
2082     /**
2083      * Broadcast Action: Trigger the download and eventual installation
2084      * of a package.
2085      * <p>Input: {@link #getData} is the URI of the package file to download.
2086      *
2087      * <p class="note">This is a protected intent that can only be sent
2088      * by the system.
2089      *
2090      * @deprecated This constant has never been used.
2091      */
2092     @Deprecated
2093     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2094     public static final String ACTION_PACKAGE_INSTALL = "android.intent.action.PACKAGE_INSTALL";
2095     /**
2096      * Broadcast Action: A new application package has been installed on the
2097      * device. The data contains the name of the package.  Note that the
2098      * newly installed package does <em>not</em> receive this broadcast.
2099      * <p>May include the following extras:
2100      * <ul>
2101      * <li> {@link #EXTRA_UID} containing the integer uid assigned to the new package.
2102      * <li> {@link #EXTRA_REPLACING} is set to true if this is following
2103      * an {@link #ACTION_PACKAGE_REMOVED} broadcast for the same package.
2104      * </ul>
2105      *
2106      * <p class="note">This is a protected intent that can only be sent
2107      * by the system.
2108      */
2109     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2110     public static final String ACTION_PACKAGE_ADDED = "android.intent.action.PACKAGE_ADDED";
2111     /**
2112      * Broadcast Action: A new version of an application package has been
2113      * installed, replacing an existing version that was previously installed.
2114      * The data contains the name of the package.
2115      * <p>May include the following extras:
2116      * <ul>
2117      * <li> {@link #EXTRA_UID} containing the integer uid assigned to the new package.
2118      * </ul>
2119      *
2120      * <p class="note">This is a protected intent that can only be sent
2121      * by the system.
2122      */
2123     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2124     public static final String ACTION_PACKAGE_REPLACED = "android.intent.action.PACKAGE_REPLACED";
2125     /**
2126      * Broadcast Action: A new version of your application has been installed
2127      * over an existing one.  This is only sent to the application that was
2128      * replaced.  It does not contain any additional data; to receive it, just
2129      * use an intent filter for this action.
2130      *
2131      * <p class="note">This is a protected intent that can only be sent
2132      * by the system.
2133      */
2134     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2135     public static final String ACTION_MY_PACKAGE_REPLACED = "android.intent.action.MY_PACKAGE_REPLACED";
2136     /**
2137      * Broadcast Action: An existing application package has been removed from
2138      * the device.  The data contains the name of the package.  The package
2139      * that is being removed does <em>not</em> receive this Intent.
2140      * <ul>
2141      * <li> {@link #EXTRA_UID} containing the integer uid previously assigned
2142      * to the package.
2143      * <li> {@link #EXTRA_DATA_REMOVED} is set to true if the entire
2144      * application -- data and code -- is being removed.
2145      * <li> {@link #EXTRA_REPLACING} is set to true if this will be followed
2146      * by an {@link #ACTION_PACKAGE_ADDED} broadcast for the same package.
2147      * </ul>
2148      *
2149      * <p class="note">This is a protected intent that can only be sent
2150      * by the system.
2151      */
2152     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2153     public static final String ACTION_PACKAGE_REMOVED = "android.intent.action.PACKAGE_REMOVED";
2154     /**
2155      * Broadcast Action: An existing application package has been completely
2156      * removed from the device.  The data contains the name of the package.
2157      * This is like {@link #ACTION_PACKAGE_REMOVED}, but only set when
2158      * {@link #EXTRA_DATA_REMOVED} is true and
2159      * {@link #EXTRA_REPLACING} is false of that broadcast.
2160      *
2161      * <ul>
2162      * <li> {@link #EXTRA_UID} containing the integer uid previously assigned
2163      * to the package.
2164      * </ul>
2165      *
2166      * <p class="note">This is a protected intent that can only be sent
2167      * by the system.
2168      */
2169     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2170     public static final String ACTION_PACKAGE_FULLY_REMOVED
2171             = "android.intent.action.PACKAGE_FULLY_REMOVED";
2172     /**
2173      * Broadcast Action: An existing application package has been changed (for
2174      * example, a component has been enabled or disabled).  The data contains
2175      * the name of the package.
2176      * <ul>
2177      * <li> {@link #EXTRA_UID} containing the integer uid assigned to the package.
2178      * <li> {@link #EXTRA_CHANGED_COMPONENT_NAME_LIST} containing the class name
2179      * of the changed components (or the package name itself).
2180      * <li> {@link #EXTRA_DONT_KILL_APP} containing boolean field to override the
2181      * default action of restarting the application.
2182      * </ul>
2183      *
2184      * <p class="note">This is a protected intent that can only be sent
2185      * by the system.
2186      */
2187     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2188     public static final String ACTION_PACKAGE_CHANGED = "android.intent.action.PACKAGE_CHANGED";
2189     /**
2190      * @hide
2191      * Broadcast Action: Ask system services if there is any reason to
2192      * restart the given package.  The data contains the name of the
2193      * package.
2194      * <ul>
2195      * <li> {@link #EXTRA_UID} containing the integer uid assigned to the package.
2196      * <li> {@link #EXTRA_PACKAGES} String array of all packages to check.
2197      * </ul>
2198      *
2199      * <p class="note">This is a protected intent that can only be sent
2200      * by the system.
2201      */
2202     @SystemApi
2203     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2204     public static final String ACTION_QUERY_PACKAGE_RESTART = "android.intent.action.QUERY_PACKAGE_RESTART";
2205     /**
2206      * Broadcast Action: The user has restarted a package, and all of its
2207      * processes have been killed.  All runtime state
2208      * associated with it (processes, alarms, notifications, etc) should
2209      * be removed.  Note that the restarted package does <em>not</em>
2210      * receive this broadcast.
2211      * The data contains the name of the package.
2212      * <ul>
2213      * <li> {@link #EXTRA_UID} containing the integer uid assigned to the package.
2214      * </ul>
2215      *
2216      * <p class="note">This is a protected intent that can only be sent
2217      * by the system.
2218      */
2219     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2220     public static final String ACTION_PACKAGE_RESTARTED = "android.intent.action.PACKAGE_RESTARTED";
2221     /**
2222      * Broadcast Action: The user has cleared the data of a package.  This should
2223      * be preceded by {@link #ACTION_PACKAGE_RESTARTED}, after which all of
2224      * its persistent data is erased and this broadcast sent.
2225      * Note that the cleared package does <em>not</em>
2226      * receive this broadcast. The data contains the name of the package.
2227      * <ul>
2228      * <li> {@link #EXTRA_UID} containing the integer uid assigned to the package. If the
2229      *      package whose data was cleared is an uninstalled instant app, then the UID
2230      *      will be -1. The platform keeps some meta-data associated with instant apps
2231      *      after they are uninstalled.
2232      * <li> {@link #EXTRA_PACKAGE_NAME} containing the package name only if the cleared
2233      *      data was for an instant app.
2234      * </ul>
2235      *
2236      * <p class="note">This is a protected intent that can only be sent
2237      * by the system.
2238      */
2239     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2240     public static final String ACTION_PACKAGE_DATA_CLEARED = "android.intent.action.PACKAGE_DATA_CLEARED";
2241     /**
2242      * Broadcast Action: Packages have been suspended.
2243      * <p>Includes the following extras:
2244      * <ul>
2245      * <li> {@link #EXTRA_CHANGED_PACKAGE_LIST} is the set of packages which have been suspended
2246      * </ul>
2247      *
2248      * <p class="note">This is a protected intent that can only be sent
2249      * by the system. It is only sent to registered receivers.
2250      */
2251     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2252     public static final String ACTION_PACKAGES_SUSPENDED = "android.intent.action.PACKAGES_SUSPENDED";
2253     /**
2254      * Broadcast Action: Packages have been unsuspended.
2255      * <p>Includes the following extras:
2256      * <ul>
2257      * <li> {@link #EXTRA_CHANGED_PACKAGE_LIST} is the set of packages which have been unsuspended
2258      * </ul>
2259      *
2260      * <p class="note">This is a protected intent that can only be sent
2261      * by the system. It is only sent to registered receivers.
2262      */
2263     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2264     public static final String ACTION_PACKAGES_UNSUSPENDED = "android.intent.action.PACKAGES_UNSUSPENDED";
2265     /**
2266      * Broadcast Action: A user ID has been removed from the system.  The user
2267      * ID number is stored in the extra data under {@link #EXTRA_UID}.
2268      *
2269      * <p class="note">This is a protected intent that can only be sent
2270      * by the system.
2271      */
2272     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2273     public static final String ACTION_UID_REMOVED = "android.intent.action.UID_REMOVED";
2274 
2275     /**
2276      * Broadcast Action: Sent to the installer package of an application when
2277      * that application is first launched (that is the first time it is moved
2278      * out of the stopped state).  The data contains the name of the package.
2279      *
2280      * <p class="note">This is a protected intent that can only be sent
2281      * by the system.
2282      */
2283     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2284     public static final String ACTION_PACKAGE_FIRST_LAUNCH = "android.intent.action.PACKAGE_FIRST_LAUNCH";
2285 
2286     /**
2287      * Broadcast Action: Sent to the system package verifier when a package
2288      * needs to be verified. The data contains the package URI.
2289      * <p class="note">
2290      * This is a protected intent that can only be sent by the system.
2291      * </p>
2292      */
2293     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2294     public static final String ACTION_PACKAGE_NEEDS_VERIFICATION = "android.intent.action.PACKAGE_NEEDS_VERIFICATION";
2295 
2296     /**
2297      * Broadcast Action: Sent to the system package verifier when a package is
2298      * verified. The data contains the package URI.
2299      * <p class="note">
2300      * This is a protected intent that can only be sent by the system.
2301      */
2302     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2303     public static final String ACTION_PACKAGE_VERIFIED = "android.intent.action.PACKAGE_VERIFIED";
2304 
2305     /**
2306      * Broadcast Action: Sent to the system intent filter verifier when an
2307      * intent filter needs to be verified. The data contains the filter data
2308      * hosts to be verified against.
2309      * <p class="note">
2310      * This is a protected intent that can only be sent by the system.
2311      * </p>
2312      *
2313      * @hide
2314      */
2315     @SystemApi
2316     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2317     public static final String ACTION_INTENT_FILTER_NEEDS_VERIFICATION = "android.intent.action.INTENT_FILTER_NEEDS_VERIFICATION";
2318 
2319     /**
2320      * Broadcast Action: Resources for a set of packages (which were
2321      * previously unavailable) are currently
2322      * available since the media on which they exist is available.
2323      * The extra data {@link #EXTRA_CHANGED_PACKAGE_LIST} contains a
2324      * list of packages whose availability changed.
2325      * The extra data {@link #EXTRA_CHANGED_UID_LIST} contains a
2326      * list of uids of packages whose availability changed.
2327      * Note that the
2328      * packages in this list do <em>not</em> receive this broadcast.
2329      * The specified set of packages are now available on the system.
2330      * <p>Includes the following extras:
2331      * <ul>
2332      * <li> {@link #EXTRA_CHANGED_PACKAGE_LIST} is the set of packages
2333      * whose resources(were previously unavailable) are currently available.
2334      * {@link #EXTRA_CHANGED_UID_LIST} is the set of uids of the
2335      * packages whose resources(were previously unavailable)
2336      * are  currently available.
2337      * </ul>
2338      *
2339      * <p class="note">This is a protected intent that can only be sent
2340      * by the system.
2341      */
2342     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2343     public static final String ACTION_EXTERNAL_APPLICATIONS_AVAILABLE =
2344         "android.intent.action.EXTERNAL_APPLICATIONS_AVAILABLE";
2345 
2346     /**
2347      * Broadcast Action: Resources for a set of packages are currently
2348      * unavailable since the media on which they exist is unavailable.
2349      * The extra data {@link #EXTRA_CHANGED_PACKAGE_LIST} contains a
2350      * list of packages whose availability changed.
2351      * The extra data {@link #EXTRA_CHANGED_UID_LIST} contains a
2352      * list of uids of packages whose availability changed.
2353      * The specified set of packages can no longer be
2354      * launched and are practically unavailable on the system.
2355      * <p>Inclues the following extras:
2356      * <ul>
2357      * <li> {@link #EXTRA_CHANGED_PACKAGE_LIST} is the set of packages
2358      * whose resources are no longer available.
2359      * {@link #EXTRA_CHANGED_UID_LIST} is the set of packages
2360      * whose resources are no longer available.
2361      * </ul>
2362      *
2363      * <p class="note">This is a protected intent that can only be sent
2364      * by the system.
2365      */
2366     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2367     public static final String ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE =
2368         "android.intent.action.EXTERNAL_APPLICATIONS_UNAVAILABLE";
2369 
2370     /**
2371      * Broadcast Action: preferred activities have changed *explicitly*.
2372      *
2373      * <p>Note there are cases where a preferred activity is invalidated *implicitly*, e.g.
2374      * when an app is installed or uninstalled, but in such cases this broadcast will *not*
2375      * be sent.
2376      *
2377      * {@link #EXTRA_USER_HANDLE} contains the user ID in question.
2378      *
2379      * @hide
2380      */
2381     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2382     public static final String ACTION_PREFERRED_ACTIVITY_CHANGED =
2383             "android.intent.action.ACTION_PREFERRED_ACTIVITY_CHANGED";
2384 
2385 
2386     /**
2387      * Broadcast Action:  The current system wallpaper has changed.  See
2388      * {@link android.app.WallpaperManager} for retrieving the new wallpaper.
2389      * This should <em>only</em> be used to determine when the wallpaper
2390      * has changed to show the new wallpaper to the user.  You should certainly
2391      * never, in response to this, change the wallpaper or other attributes of
2392      * it such as the suggested size.  That would be crazy, right?  You'd cause
2393      * all kinds of loops, especially if other apps are doing similar things,
2394      * right?  Of course.  So please don't do this.
2395      *
2396      * @deprecated Modern applications should use
2397      * {@link android.view.WindowManager.LayoutParams#FLAG_SHOW_WALLPAPER
2398      * WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER} to have the wallpaper
2399      * shown behind their UI, rather than watching for this broadcast and
2400      * rendering the wallpaper on their own.
2401      */
2402     @Deprecated @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2403     public static final String ACTION_WALLPAPER_CHANGED = "android.intent.action.WALLPAPER_CHANGED";
2404     /**
2405      * Broadcast Action: The current device {@link android.content.res.Configuration}
2406      * (orientation, locale, etc) has changed.  When such a change happens, the
2407      * UIs (view hierarchy) will need to be rebuilt based on this new
2408      * information; for the most part, applications don't need to worry about
2409      * this, because the system will take care of stopping and restarting the
2410      * application to make sure it sees the new changes.  Some system code that
2411      * can not be restarted will need to watch for this action and handle it
2412      * appropriately.
2413      *
2414      * <p class="note">
2415      * You <em>cannot</em> receive this through components declared
2416      * in manifests, only by explicitly registering for it with
2417      * {@link Context#registerReceiver(BroadcastReceiver, IntentFilter)
2418      * Context.registerReceiver()}.
2419      *
2420      * <p class="note">This is a protected intent that can only be sent
2421      * by the system.
2422      *
2423      * @see android.content.res.Configuration
2424      */
2425     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2426     public static final String ACTION_CONFIGURATION_CHANGED = "android.intent.action.CONFIGURATION_CHANGED";
2427     /**
2428      * Broadcast Action: The current device's locale has changed.
2429      *
2430      * <p class="note">This is a protected intent that can only be sent
2431      * by the system.
2432      */
2433     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2434     public static final String ACTION_LOCALE_CHANGED = "android.intent.action.LOCALE_CHANGED";
2435     /**
2436      * Broadcast Action:  This is a <em>sticky broadcast</em> containing the
2437      * charging state, level, and other information about the battery.
2438      * See {@link android.os.BatteryManager} for documentation on the
2439      * contents of the Intent.
2440      *
2441      * <p class="note">
2442      * You <em>cannot</em> receive this through components declared
2443      * in manifests, only by explicitly registering for it with
2444      * {@link Context#registerReceiver(BroadcastReceiver, IntentFilter)
2445      * Context.registerReceiver()}.  See {@link #ACTION_BATTERY_LOW},
2446      * {@link #ACTION_BATTERY_OKAY}, {@link #ACTION_POWER_CONNECTED},
2447      * and {@link #ACTION_POWER_DISCONNECTED} for distinct battery-related
2448      * broadcasts that are sent and can be received through manifest
2449      * receivers.
2450      *
2451      * <p class="note">This is a protected intent that can only be sent
2452      * by the system.
2453      */
2454     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2455     public static final String ACTION_BATTERY_CHANGED = "android.intent.action.BATTERY_CHANGED";
2456     /**
2457      * Broadcast Action:  Indicates low battery condition on the device.
2458      * This broadcast corresponds to the "Low battery warning" system dialog.
2459      *
2460      * <p class="note">This is a protected intent that can only be sent
2461      * by the system.
2462      */
2463     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2464     public static final String ACTION_BATTERY_LOW = "android.intent.action.BATTERY_LOW";
2465     /**
2466      * Broadcast Action:  Indicates the battery is now okay after being low.
2467      * This will be sent after {@link #ACTION_BATTERY_LOW} once the battery has
2468      * gone back up to an okay state.
2469      *
2470      * <p class="note">This is a protected intent that can only be sent
2471      * by the system.
2472      */
2473     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2474     public static final String ACTION_BATTERY_OKAY = "android.intent.action.BATTERY_OKAY";
2475     /**
2476      * Broadcast Action:  External power has been connected to the device.
2477      * This is intended for applications that wish to register specifically to this notification.
2478      * Unlike ACTION_BATTERY_CHANGED, applications will be woken for this and so do not have to
2479      * stay active to receive this notification.  This action can be used to implement actions
2480      * that wait until power is available to trigger.
2481      *
2482      * <p class="note">This is a protected intent that can only be sent
2483      * by the system.
2484      */
2485     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2486     public static final String ACTION_POWER_CONNECTED = "android.intent.action.ACTION_POWER_CONNECTED";
2487     /**
2488      * Broadcast Action:  External power has been removed from the device.
2489      * This is intended for applications that wish to register specifically to this notification.
2490      * Unlike ACTION_BATTERY_CHANGED, applications will be woken for this and so do not have to
2491      * stay active to receive this notification.  This action can be used to implement actions
2492      * that wait until power is available to trigger.
2493      *
2494      * <p class="note">This is a protected intent that can only be sent
2495      * by the system.
2496      */
2497     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2498     public static final String ACTION_POWER_DISCONNECTED =
2499             "android.intent.action.ACTION_POWER_DISCONNECTED";
2500     /**
2501      * Broadcast Action:  Device is shutting down.
2502      * This is broadcast when the device is being shut down (completely turned
2503      * off, not sleeping).  Once the broadcast is complete, the final shutdown
2504      * will proceed and all unsaved data lost.  Apps will not normally need
2505      * to handle this, since the foreground activity will be paused as well.
2506      *
2507      * <p class="note">This is a protected intent that can only be sent
2508      * by the system.
2509      * <p>May include the following extras:
2510      * <ul>
2511      * <li> {@link #EXTRA_SHUTDOWN_USERSPACE_ONLY} a boolean that is set to true if this
2512      * shutdown is only for userspace processes.  If not set, assumed to be false.
2513      * </ul>
2514      */
2515     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2516     public static final String ACTION_SHUTDOWN = "android.intent.action.ACTION_SHUTDOWN";
2517     /**
2518      * Activity Action:  Start this activity to request system shutdown.
2519      * The optional boolean extra field {@link #EXTRA_KEY_CONFIRM} can be set to true
2520      * to request confirmation from the user before shutting down. The optional boolean
2521      * extra field {@link #EXTRA_USER_REQUESTED_SHUTDOWN} can be set to true to
2522      * indicate that the shutdown is requested by the user.
2523      *
2524      * <p class="note">This is a protected intent that can only be sent
2525      * by the system.
2526      *
2527      * {@hide}
2528      */
2529     public static final String ACTION_REQUEST_SHUTDOWN
2530             = "com.android.internal.intent.action.REQUEST_SHUTDOWN";
2531     /**
2532      * Broadcast Action: A sticky broadcast that indicates low storage space
2533      * condition on the device
2534      * <p class="note">
2535      * This is a protected intent that can only be sent by the system.
2536      *
2537      * @deprecated if your app targets {@link android.os.Build.VERSION_CODES#O}
2538      *             or above, this broadcast will no longer be delivered to any
2539      *             {@link BroadcastReceiver} defined in your manifest. Instead,
2540      *             apps are strongly encouraged to use the improved
2541      *             {@link Context#getCacheDir()} behavior so the system can
2542      *             automatically free up storage when needed.
2543      */
2544     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2545     @Deprecated
2546     public static final String ACTION_DEVICE_STORAGE_LOW = "android.intent.action.DEVICE_STORAGE_LOW";
2547     /**
2548      * Broadcast Action: Indicates low storage space condition on the device no
2549      * longer exists
2550      * <p class="note">
2551      * This is a protected intent that can only be sent by the system.
2552      *
2553      * @deprecated if your app targets {@link android.os.Build.VERSION_CODES#O}
2554      *             or above, this broadcast will no longer be delivered to any
2555      *             {@link BroadcastReceiver} defined in your manifest. Instead,
2556      *             apps are strongly encouraged to use the improved
2557      *             {@link Context#getCacheDir()} behavior so the system can
2558      *             automatically free up storage when needed.
2559      */
2560     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2561     @Deprecated
2562     public static final String ACTION_DEVICE_STORAGE_OK = "android.intent.action.DEVICE_STORAGE_OK";
2563     /**
2564      * Broadcast Action: A sticky broadcast that indicates a storage space full
2565      * condition on the device. This is intended for activities that want to be
2566      * able to fill the data partition completely, leaving only enough free
2567      * space to prevent system-wide SQLite failures.
2568      * <p class="note">
2569      * This is a protected intent that can only be sent by the system.
2570      *
2571      * @deprecated if your app targets {@link android.os.Build.VERSION_CODES#O}
2572      *             or above, this broadcast will no longer be delivered to any
2573      *             {@link BroadcastReceiver} defined in your manifest. Instead,
2574      *             apps are strongly encouraged to use the improved
2575      *             {@link Context#getCacheDir()} behavior so the system can
2576      *             automatically free up storage when needed.
2577      * @hide
2578      */
2579     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2580     @Deprecated
2581     public static final String ACTION_DEVICE_STORAGE_FULL = "android.intent.action.DEVICE_STORAGE_FULL";
2582     /**
2583      * Broadcast Action: Indicates storage space full condition on the device no
2584      * longer exists.
2585      * <p class="note">
2586      * This is a protected intent that can only be sent by the system.
2587      *
2588      * @deprecated if your app targets {@link android.os.Build.VERSION_CODES#O}
2589      *             or above, this broadcast will no longer be delivered to any
2590      *             {@link BroadcastReceiver} defined in your manifest. Instead,
2591      *             apps are strongly encouraged to use the improved
2592      *             {@link Context#getCacheDir()} behavior so the system can
2593      *             automatically free up storage when needed.
2594      * @hide
2595      */
2596     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2597     @Deprecated
2598     public static final String ACTION_DEVICE_STORAGE_NOT_FULL = "android.intent.action.DEVICE_STORAGE_NOT_FULL";
2599     /**
2600      * Broadcast Action:  Indicates low memory condition notification acknowledged by user
2601      * and package management should be started.
2602      * This is triggered by the user from the ACTION_DEVICE_STORAGE_LOW
2603      * notification.
2604      */
2605     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2606     public static final String ACTION_MANAGE_PACKAGE_STORAGE = "android.intent.action.MANAGE_PACKAGE_STORAGE";
2607     /**
2608      * Broadcast Action:  The device has entered USB Mass Storage mode.
2609      * This is used mainly for the USB Settings panel.
2610      * Apps should listen for ACTION_MEDIA_MOUNTED and ACTION_MEDIA_UNMOUNTED broadcasts to be notified
2611      * when the SD card file system is mounted or unmounted
2612      * @deprecated replaced by android.os.storage.StorageEventListener
2613      */
2614     @Deprecated
2615     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2616     public static final String ACTION_UMS_CONNECTED = "android.intent.action.UMS_CONNECTED";
2617 
2618     /**
2619      * Broadcast Action:  The device has exited USB Mass Storage mode.
2620      * This is used mainly for the USB Settings panel.
2621      * Apps should listen for ACTION_MEDIA_MOUNTED and ACTION_MEDIA_UNMOUNTED broadcasts to be notified
2622      * when the SD card file system is mounted or unmounted
2623      * @deprecated replaced by android.os.storage.StorageEventListener
2624      */
2625     @Deprecated
2626     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2627     public static final String ACTION_UMS_DISCONNECTED = "android.intent.action.UMS_DISCONNECTED";
2628 
2629     /**
2630      * Broadcast Action:  External media has been removed.
2631      * The path to the mount point for the removed media is contained in the Intent.mData field.
2632      */
2633     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2634     public static final String ACTION_MEDIA_REMOVED = "android.intent.action.MEDIA_REMOVED";
2635 
2636     /**
2637      * Broadcast Action:  External media is present, but not mounted at its mount point.
2638      * The path to the mount point for the unmounted media is contained in the Intent.mData field.
2639      */
2640     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2641     public static final String ACTION_MEDIA_UNMOUNTED = "android.intent.action.MEDIA_UNMOUNTED";
2642 
2643     /**
2644      * Broadcast Action:  External media is present, and being disk-checked
2645      * The path to the mount point for the checking media is contained in the Intent.mData field.
2646      */
2647     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2648     public static final String ACTION_MEDIA_CHECKING = "android.intent.action.MEDIA_CHECKING";
2649 
2650     /**
2651      * Broadcast Action:  External media is present, but is using an incompatible fs (or is blank)
2652      * The path to the mount point for the checking media is contained in the Intent.mData field.
2653      */
2654     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2655     public static final String ACTION_MEDIA_NOFS = "android.intent.action.MEDIA_NOFS";
2656 
2657     /**
2658      * Broadcast Action:  External media is present and mounted at its mount point.
2659      * The path to the mount point for the mounted media is contained in the Intent.mData field.
2660      * The Intent contains an extra with name "read-only" and Boolean value to indicate if the
2661      * media was mounted read only.
2662      */
2663     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2664     public static final String ACTION_MEDIA_MOUNTED = "android.intent.action.MEDIA_MOUNTED";
2665 
2666     /**
2667      * Broadcast Action:  External media is unmounted because it is being shared via USB mass storage.
2668      * The path to the mount point for the shared media is contained in the Intent.mData field.
2669      */
2670     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2671     public static final String ACTION_MEDIA_SHARED = "android.intent.action.MEDIA_SHARED";
2672 
2673     /**
2674      * Broadcast Action:  External media is no longer being shared via USB mass storage.
2675      * The path to the mount point for the previously shared media is contained in the Intent.mData field.
2676      *
2677      * @hide
2678      */
2679     public static final String ACTION_MEDIA_UNSHARED = "android.intent.action.MEDIA_UNSHARED";
2680 
2681     /**
2682      * Broadcast Action:  External media was removed from SD card slot, but mount point was not unmounted.
2683      * The path to the mount point for the removed media is contained in the Intent.mData field.
2684      */
2685     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2686     public static final String ACTION_MEDIA_BAD_REMOVAL = "android.intent.action.MEDIA_BAD_REMOVAL";
2687 
2688     /**
2689      * Broadcast Action:  External media is present but cannot be mounted.
2690      * The path to the mount point for the unmountable media is contained in the Intent.mData field.
2691      */
2692     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2693     public static final String ACTION_MEDIA_UNMOUNTABLE = "android.intent.action.MEDIA_UNMOUNTABLE";
2694 
2695    /**
2696      * Broadcast Action:  User has expressed the desire to remove the external storage media.
2697      * Applications should close all files they have open within the mount point when they receive this intent.
2698      * The path to the mount point for the media to be ejected is contained in the Intent.mData field.
2699      */
2700     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2701     public static final String ACTION_MEDIA_EJECT = "android.intent.action.MEDIA_EJECT";
2702 
2703     /**
2704      * Broadcast Action:  The media scanner has started scanning a directory.
2705      * The path to the directory being scanned is contained in the Intent.mData field.
2706      */
2707     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2708     public static final String ACTION_MEDIA_SCANNER_STARTED = "android.intent.action.MEDIA_SCANNER_STARTED";
2709 
2710    /**
2711      * Broadcast Action:  The media scanner has finished scanning a directory.
2712      * The path to the scanned directory is contained in the Intent.mData field.
2713      */
2714     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2715     public static final String ACTION_MEDIA_SCANNER_FINISHED = "android.intent.action.MEDIA_SCANNER_FINISHED";
2716 
2717    /**
2718      * Broadcast Action:  Request the media scanner to scan a file and add it to the media database.
2719      * The path to the file is contained in the Intent.mData field.
2720      */
2721     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2722     public static final String ACTION_MEDIA_SCANNER_SCAN_FILE = "android.intent.action.MEDIA_SCANNER_SCAN_FILE";
2723 
2724    /**
2725      * Broadcast Action:  The "Media Button" was pressed.  Includes a single
2726      * extra field, {@link #EXTRA_KEY_EVENT}, containing the key event that
2727      * caused the broadcast.
2728      */
2729     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2730     public static final String ACTION_MEDIA_BUTTON = "android.intent.action.MEDIA_BUTTON";
2731 
2732     /**
2733      * Broadcast Action:  The "Camera Button" was pressed.  Includes a single
2734      * extra field, {@link #EXTRA_KEY_EVENT}, containing the key event that
2735      * caused the broadcast.
2736      */
2737     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2738     public static final String ACTION_CAMERA_BUTTON = "android.intent.action.CAMERA_BUTTON";
2739 
2740     // *** NOTE: @todo(*) The following really should go into a more domain-specific
2741     // location; they are not general-purpose actions.
2742 
2743     /**
2744      * Broadcast Action: A GTalk connection has been established.
2745      */
2746     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2747     public static final String ACTION_GTALK_SERVICE_CONNECTED =
2748             "android.intent.action.GTALK_CONNECTED";
2749 
2750     /**
2751      * Broadcast Action: A GTalk connection has been disconnected.
2752      */
2753     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2754     public static final String ACTION_GTALK_SERVICE_DISCONNECTED =
2755             "android.intent.action.GTALK_DISCONNECTED";
2756 
2757     /**
2758      * Broadcast Action: An input method has been changed.
2759      */
2760     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2761     public static final String ACTION_INPUT_METHOD_CHANGED =
2762             "android.intent.action.INPUT_METHOD_CHANGED";
2763 
2764     /**
2765      * <p>Broadcast Action: The user has switched the phone into or out of Airplane Mode. One or
2766      * more radios have been turned off or on. The intent will have the following extra value:</p>
2767      * <ul>
2768      *   <li><em>state</em> - A boolean value indicating whether Airplane Mode is on. If true,
2769      *   then cell radio and possibly other radios such as bluetooth or WiFi may have also been
2770      *   turned off</li>
2771      * </ul>
2772      *
2773      * <p class="note">This is a protected intent that can only be sent by the system.</p>
2774      */
2775     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2776     public static final String ACTION_AIRPLANE_MODE_CHANGED = "android.intent.action.AIRPLANE_MODE";
2777 
2778     /**
2779      * Broadcast Action: Some content providers have parts of their namespace
2780      * where they publish new events or items that the user may be especially
2781      * interested in. For these things, they may broadcast this action when the
2782      * set of interesting items change.
2783      *
2784      * For example, GmailProvider sends this notification when the set of unread
2785      * mail in the inbox changes.
2786      *
2787      * <p>The data of the intent identifies which part of which provider
2788      * changed. When queried through the content resolver, the data URI will
2789      * return the data set in question.
2790      *
2791      * <p>The intent will have the following extra values:
2792      * <ul>
2793      *   <li><em>count</em> - The number of items in the data set. This is the
2794      *       same as the number of items in the cursor returned by querying the
2795      *       data URI. </li>
2796      * </ul>
2797      *
2798      * This intent will be sent at boot (if the count is non-zero) and when the
2799      * data set changes. It is possible for the data set to change without the
2800      * count changing (for example, if a new unread message arrives in the same
2801      * sync operation in which a message is archived). The phone should still
2802      * ring/vibrate/etc as normal in this case.
2803      */
2804     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2805     public static final String ACTION_PROVIDER_CHANGED =
2806             "android.intent.action.PROVIDER_CHANGED";
2807 
2808     /**
2809      * Broadcast Action: Wired Headset plugged in or unplugged.
2810      *
2811      * Same as {@link android.media.AudioManager#ACTION_HEADSET_PLUG}, to be consulted for value
2812      *   and documentation.
2813      * <p>If the minimum SDK version of your application is
2814      * {@link android.os.Build.VERSION_CODES#LOLLIPOP}, it is recommended to refer
2815      * to the <code>AudioManager</code> constant in your receiver registration code instead.
2816      */
2817     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2818     public static final String ACTION_HEADSET_PLUG = android.media.AudioManager.ACTION_HEADSET_PLUG;
2819 
2820     /**
2821      * <p>Broadcast Action: The user has switched on advanced settings in the settings app:</p>
2822      * <ul>
2823      *   <li><em>state</em> - A boolean value indicating whether the settings is on or off.</li>
2824      * </ul>
2825      *
2826      * <p class="note">This is a protected intent that can only be sent
2827      * by the system.
2828      *
2829      * @hide
2830      */
2831     //@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2832     public static final String ACTION_ADVANCED_SETTINGS_CHANGED
2833             = "android.intent.action.ADVANCED_SETTINGS";
2834 
2835     /**
2836      *  Broadcast Action: Sent after application restrictions are changed.
2837      *
2838      * <p class="note">This is a protected intent that can only be sent
2839      * by the system.</p>
2840      */
2841     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2842     public static final String ACTION_APPLICATION_RESTRICTIONS_CHANGED =
2843             "android.intent.action.APPLICATION_RESTRICTIONS_CHANGED";
2844 
2845     /**
2846      * Broadcast Action: An outgoing call is about to be placed.
2847      *
2848      * <p>The Intent will have the following extra value:</p>
2849      * <ul>
2850      *   <li><em>{@link android.content.Intent#EXTRA_PHONE_NUMBER}</em> -
2851      *       the phone number originally intended to be dialed.</li>
2852      * </ul>
2853      * <p>Once the broadcast is finished, the resultData is used as the actual
2854      * number to call.  If  <code>null</code>, no call will be placed.</p>
2855      * <p>It is perfectly acceptable for multiple receivers to process the
2856      * outgoing call in turn: for example, a parental control application
2857      * might verify that the user is authorized to place the call at that
2858      * time, then a number-rewriting application might add an area code if
2859      * one was not specified.</p>
2860      * <p>For consistency, any receiver whose purpose is to prohibit phone
2861      * calls should have a priority of 0, to ensure it will see the final
2862      * phone number to be dialed.
2863      * Any receiver whose purpose is to rewrite phone numbers to be called
2864      * should have a positive priority.
2865      * Negative priorities are reserved for the system for this broadcast;
2866      * using them may cause problems.</p>
2867      * <p>Any BroadcastReceiver receiving this Intent <em>must not</em>
2868      * abort the broadcast.</p>
2869      * <p>Emergency calls cannot be intercepted using this mechanism, and
2870      * other calls cannot be modified to call emergency numbers using this
2871      * mechanism.
2872      * <p>Some apps (such as VoIP apps) may want to redirect the outgoing
2873      * call to use their own service instead. Those apps should first prevent
2874      * the call from being placed by setting resultData to <code>null</code>
2875      * and then start their own app to make the call.
2876      * <p>You must hold the
2877      * {@link android.Manifest.permission#PROCESS_OUTGOING_CALLS}
2878      * permission to receive this Intent.</p>
2879      *
2880      * <p class="note">This is a protected intent that can only be sent
2881      * by the system.
2882      */
2883     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2884     public static final String ACTION_NEW_OUTGOING_CALL =
2885             "android.intent.action.NEW_OUTGOING_CALL";
2886 
2887     /**
2888      * Broadcast Action: Have the device reboot.  This is only for use by
2889      * system code.
2890      *
2891      * <p class="note">This is a protected intent that can only be sent
2892      * by the system.
2893      */
2894     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2895     public static final String ACTION_REBOOT =
2896             "android.intent.action.REBOOT";
2897 
2898     /**
2899      * Broadcast Action:  A sticky broadcast for changes in the physical
2900      * docking state of the device.
2901      *
2902      * <p>The intent will have the following extra values:
2903      * <ul>
2904      *   <li><em>{@link #EXTRA_DOCK_STATE}</em> - the current dock
2905      *       state, indicating which dock the device is physically in.</li>
2906      * </ul>
2907      * <p>This is intended for monitoring the current physical dock state.
2908      * See {@link android.app.UiModeManager} for the normal API dealing with
2909      * dock mode changes.
2910      */
2911     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2912     public static final String ACTION_DOCK_EVENT =
2913             "android.intent.action.DOCK_EVENT";
2914 
2915     /**
2916      * Broadcast Action: A broadcast when idle maintenance can be started.
2917      * This means that the user is not interacting with the device and is
2918      * not expected to do so soon. Typical use of the idle maintenance is
2919      * to perform somehow expensive tasks that can be postponed at a moment
2920      * when they will not degrade user experience.
2921      * <p>
2922      * <p class="note">In order to keep the device responsive in case of an
2923      * unexpected user interaction, implementations of a maintenance task
2924      * should be interruptible. In such a scenario a broadcast with action
2925      * {@link #ACTION_IDLE_MAINTENANCE_END} will be sent. In other words, you
2926      * should not do the maintenance work in
2927      * {@link BroadcastReceiver#onReceive(Context, Intent)}, rather start a
2928      * maintenance service by {@link Context#startService(Intent)}. Also
2929      * you should hold a wake lock while your maintenance service is running
2930      * to prevent the device going to sleep.
2931      * </p>
2932      * <p>
2933      * <p class="note">This is a protected intent that can only be sent by
2934      * the system.
2935      * </p>
2936      *
2937      * @see #ACTION_IDLE_MAINTENANCE_END
2938      *
2939      * @hide
2940      */
2941     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2942     public static final String ACTION_IDLE_MAINTENANCE_START =
2943             "android.intent.action.ACTION_IDLE_MAINTENANCE_START";
2944 
2945     /**
2946      * Broadcast Action:  A broadcast when idle maintenance should be stopped.
2947      * This means that the user was not interacting with the device as a result
2948      * of which a broadcast with action {@link #ACTION_IDLE_MAINTENANCE_START}
2949      * was sent and now the user started interacting with the device. Typical
2950      * use of the idle maintenance is to perform somehow expensive tasks that
2951      * can be postponed at a moment when they will not degrade user experience.
2952      * <p>
2953      * <p class="note">In order to keep the device responsive in case of an
2954      * unexpected user interaction, implementations of a maintenance task
2955      * should be interruptible. Hence, on receiving a broadcast with this
2956      * action, the maintenance task should be interrupted as soon as possible.
2957      * In other words, you should not do the maintenance work in
2958      * {@link BroadcastReceiver#onReceive(Context, Intent)}, rather stop the
2959      * maintenance service that was started on receiving of
2960      * {@link #ACTION_IDLE_MAINTENANCE_START}.Also you should release the wake
2961      * lock you acquired when your maintenance service started.
2962      * </p>
2963      * <p class="note">This is a protected intent that can only be sent
2964      * by the system.
2965      *
2966      * @see #ACTION_IDLE_MAINTENANCE_START
2967      *
2968      * @hide
2969      */
2970     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
2971     public static final String ACTION_IDLE_MAINTENANCE_END =
2972             "android.intent.action.ACTION_IDLE_MAINTENANCE_END";
2973 
2974     /**
2975      * Broadcast Action: a remote intent is to be broadcasted.
2976      *
2977      * A remote intent is used for remote RPC between devices. The remote intent
2978      * is serialized and sent from one device to another device. The receiving
2979      * device parses the remote intent and broadcasts it. Note that anyone can
2980      * broadcast a remote intent. However, if the intent receiver of the remote intent
2981      * does not trust intent broadcasts from arbitrary intent senders, it should require
2982      * the sender to hold certain permissions so only trusted sender's broadcast will be
2983      * let through.
2984      * @hide
2985      */
2986     public static final String ACTION_REMOTE_INTENT =
2987             "com.google.android.c2dm.intent.RECEIVE";
2988 
2989     /**
2990      * Broadcast Action: This is broadcast once when the user is booting after a
2991      * system update. It can be used to perform cleanup or upgrades after a
2992      * system update.
2993      * <p>
2994      * This broadcast is sent after the {@link #ACTION_LOCKED_BOOT_COMPLETED}
2995      * broadcast but before the {@link #ACTION_BOOT_COMPLETED} broadcast. It's
2996      * only sent when the {@link Build#FINGERPRINT} has changed, and it's only
2997      * sent to receivers in the system image.
2998      *
2999      * @hide
3000      */
3001     @SystemApi
3002     public static final String ACTION_PRE_BOOT_COMPLETED =
3003             "android.intent.action.PRE_BOOT_COMPLETED";
3004 
3005     /**
3006      * Broadcast to a specific application to query any supported restrictions to impose
3007      * on restricted users. The broadcast intent contains an extra
3008      * {@link #EXTRA_RESTRICTIONS_BUNDLE} with the currently persisted
3009      * restrictions as a Bundle of key/value pairs. The value types can be Boolean, String or
3010      * String[] depending on the restriction type.<p/>
3011      * The response should contain an extra {@link #EXTRA_RESTRICTIONS_LIST},
3012      * which is of type <code>ArrayList&lt;RestrictionEntry&gt;</code>. It can also
3013      * contain an extra {@link #EXTRA_RESTRICTIONS_INTENT}, which is of type <code>Intent</code>.
3014      * The activity specified by that intent will be launched for a result which must contain
3015      * one of the extras {@link #EXTRA_RESTRICTIONS_LIST} or {@link #EXTRA_RESTRICTIONS_BUNDLE}.
3016      * The keys and values of the returned restrictions will be persisted.
3017      * @see RestrictionEntry
3018      */
3019     public static final String ACTION_GET_RESTRICTION_ENTRIES =
3020             "android.intent.action.GET_RESTRICTION_ENTRIES";
3021 
3022     /**
3023      * Sent the first time a user is starting, to allow system apps to
3024      * perform one time initialization.  (This will not be seen by third
3025      * party applications because a newly initialized user does not have any
3026      * third party applications installed for it.)  This is sent early in
3027      * starting the user, around the time the home app is started, before
3028      * {@link #ACTION_BOOT_COMPLETED} is sent.  This is sent as a foreground
3029      * broadcast, since it is part of a visible user interaction; be as quick
3030      * as possible when handling it.
3031      */
3032     public static final String ACTION_USER_INITIALIZE =
3033             "android.intent.action.USER_INITIALIZE";
3034 
3035     /**
3036      * Sent when a user switch is happening, causing the process's user to be
3037      * brought to the foreground.  This is only sent to receivers registered
3038      * through {@link Context#registerReceiver(BroadcastReceiver, IntentFilter)
3039      * Context.registerReceiver}.  It is sent to the user that is going to the
3040      * foreground.  This is sent as a foreground
3041      * broadcast, since it is part of a visible user interaction; be as quick
3042      * as possible when handling it.
3043      */
3044     public static final String ACTION_USER_FOREGROUND =
3045             "android.intent.action.USER_FOREGROUND";
3046 
3047     /**
3048      * Sent when a user switch is happening, causing the process's user to be
3049      * sent to the background.  This is only sent to receivers registered
3050      * through {@link Context#registerReceiver(BroadcastReceiver, IntentFilter)
3051      * Context.registerReceiver}.  It is sent to the user that is going to the
3052      * background.  This is sent as a foreground
3053      * broadcast, since it is part of a visible user interaction; be as quick
3054      * as possible when handling it.
3055      */
3056     public static final String ACTION_USER_BACKGROUND =
3057             "android.intent.action.USER_BACKGROUND";
3058 
3059     /**
3060      * Broadcast sent to the system when a user is added. Carries an extra
3061      * EXTRA_USER_HANDLE that has the userHandle of the new user.  It is sent to
3062      * all running users.  You must hold
3063      * {@link android.Manifest.permission#MANAGE_USERS} to receive this broadcast.
3064      * @hide
3065      */
3066     public static final String ACTION_USER_ADDED =
3067             "android.intent.action.USER_ADDED";
3068 
3069     /**
3070      * Broadcast sent by the system when a user is started. Carries an extra
3071      * EXTRA_USER_HANDLE that has the userHandle of the user.  This is only sent to
3072      * registered receivers, not manifest receivers.  It is sent to the user
3073      * that has been started.  This is sent as a foreground
3074      * broadcast, since it is part of a visible user interaction; be as quick
3075      * as possible when handling it.
3076      * @hide
3077      */
3078     public static final String ACTION_USER_STARTED =
3079             "android.intent.action.USER_STARTED";
3080 
3081     /**
3082      * Broadcast sent when a user is in the process of starting.  Carries an extra
3083      * EXTRA_USER_HANDLE that has the userHandle of the user.  This is only
3084      * sent to registered receivers, not manifest receivers.  It is sent to all
3085      * users (including the one that is being started).  You must hold
3086      * {@link android.Manifest.permission#INTERACT_ACROSS_USERS} to receive
3087      * this broadcast.  This is sent as a background broadcast, since
3088      * its result is not part of the primary UX flow; to safely keep track of
3089      * started/stopped state of a user you can use this in conjunction with
3090      * {@link #ACTION_USER_STOPPING}.  It is <b>not</b> generally safe to use with
3091      * other user state broadcasts since those are foreground broadcasts so can
3092      * execute in a different order.
3093      * @hide
3094      */
3095     public static final String ACTION_USER_STARTING =
3096             "android.intent.action.USER_STARTING";
3097 
3098     /**
3099      * Broadcast sent when a user is going to be stopped.  Carries an extra
3100      * EXTRA_USER_HANDLE that has the userHandle of the user.  This is only
3101      * sent to registered receivers, not manifest receivers.  It is sent to all
3102      * users (including the one that is being stopped).  You must hold
3103      * {@link android.Manifest.permission#INTERACT_ACROSS_USERS} to receive
3104      * this broadcast.  The user will not stop until all receivers have
3105      * handled the broadcast.  This is sent as a background broadcast, since
3106      * its result is not part of the primary UX flow; to safely keep track of
3107      * started/stopped state of a user you can use this in conjunction with
3108      * {@link #ACTION_USER_STARTING}.  It is <b>not</b> generally safe to use with
3109      * other user state broadcasts since those are foreground broadcasts so can
3110      * execute in a different order.
3111      * @hide
3112      */
3113     public static final String ACTION_USER_STOPPING =
3114             "android.intent.action.USER_STOPPING";
3115 
3116     /**
3117      * Broadcast sent to the system when a user is stopped. Carries an extra
3118      * EXTRA_USER_HANDLE that has the userHandle of the user.  This is similar to
3119      * {@link #ACTION_PACKAGE_RESTARTED}, but for an entire user instead of a
3120      * specific package.  This is only sent to registered receivers, not manifest
3121      * receivers.  It is sent to all running users <em>except</em> the one that
3122      * has just been stopped (which is no longer running).
3123      * @hide
3124      */
3125     public static final String ACTION_USER_STOPPED =
3126             "android.intent.action.USER_STOPPED";
3127 
3128     /**
3129      * Broadcast sent to the system when a user is removed. Carries an extra EXTRA_USER_HANDLE that has
3130      * the userHandle of the user.  It is sent to all running users except the
3131      * one that has been removed. The user will not be completely removed until all receivers have
3132      * handled the broadcast. You must hold
3133      * {@link android.Manifest.permission#MANAGE_USERS} to receive this broadcast.
3134      * @hide
3135      */
3136     @SystemApi
3137     public static final String ACTION_USER_REMOVED =
3138             "android.intent.action.USER_REMOVED";
3139 
3140     /**
3141      * Broadcast sent to the system when the user switches. Carries an extra EXTRA_USER_HANDLE that has
3142      * the userHandle of the user to become the current one. This is only sent to
3143      * registered receivers, not manifest receivers.  It is sent to all running users.
3144      * You must hold
3145      * {@link android.Manifest.permission#MANAGE_USERS} to receive this broadcast.
3146      * @hide
3147      */
3148     public static final String ACTION_USER_SWITCHED =
3149             "android.intent.action.USER_SWITCHED";
3150 
3151     /**
3152      * Broadcast Action: Sent when the credential-encrypted private storage has
3153      * become unlocked for the target user. This is only sent to registered
3154      * receivers, not manifest receivers.
3155      */
3156     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
3157     public static final String ACTION_USER_UNLOCKED = "android.intent.action.USER_UNLOCKED";
3158 
3159     /**
3160      * Broadcast sent to the system when a user's information changes. Carries an extra
3161      * {@link #EXTRA_USER_HANDLE} to indicate which user's information changed.
3162      * This is only sent to registered receivers, not manifest receivers. It is sent to all users.
3163      * @hide
3164      */
3165     public static final String ACTION_USER_INFO_CHANGED =
3166             "android.intent.action.USER_INFO_CHANGED";
3167 
3168     /**
3169      * Broadcast sent to the primary user when an associated managed profile is added (the profile
3170      * was created and is ready to be used). Carries an extra {@link #EXTRA_USER} that specifies
3171      * the UserHandle of the profile that was added. Only applications (for example Launchers)
3172      * that need to display merged content across both primary and managed profiles need to
3173      * worry about this broadcast. This is only sent to registered receivers,
3174      * not manifest receivers.
3175      */
3176     public static final String ACTION_MANAGED_PROFILE_ADDED =
3177             "android.intent.action.MANAGED_PROFILE_ADDED";
3178 
3179     /**
3180      * Broadcast sent to the primary user when an associated managed profile is removed. Carries an
3181      * extra {@link #EXTRA_USER} that specifies the UserHandle of the profile that was removed.
3182      * Only applications (for example Launchers) that need to display merged content across both
3183      * primary and managed profiles need to worry about this broadcast. This is only sent to
3184      * registered receivers, not manifest receivers.
3185      */
3186     public static final String ACTION_MANAGED_PROFILE_REMOVED =
3187             "android.intent.action.MANAGED_PROFILE_REMOVED";
3188 
3189     /**
3190      * Broadcast sent to the primary user when the credential-encrypted private storage for
3191      * an associated managed profile is unlocked. Carries an extra {@link #EXTRA_USER} that
3192      * specifies the UserHandle of the profile that was unlocked. Only applications (for example
3193      * Launchers) that need to display merged content across both primary and managed profiles
3194      * need to worry about this broadcast. This is only sent to registered receivers,
3195      * not manifest receivers.
3196      */
3197     public static final String ACTION_MANAGED_PROFILE_UNLOCKED =
3198             "android.intent.action.MANAGED_PROFILE_UNLOCKED";
3199 
3200     /**
3201      * Broadcast sent to the primary user when an associated managed profile has become available.
3202      * Currently this includes when the user disables quiet mode for the profile. Carries an extra
3203      * {@link #EXTRA_USER} that specifies the UserHandle of the profile. When quiet mode is changed,
3204      * this broadcast will carry a boolean extra {@link #EXTRA_QUIET_MODE} indicating the new state
3205      * of quiet mode. This is only sent to registered receivers, not manifest receivers.
3206      */
3207     public static final String ACTION_MANAGED_PROFILE_AVAILABLE =
3208             "android.intent.action.MANAGED_PROFILE_AVAILABLE";
3209 
3210     /**
3211      * Broadcast sent to the primary user when an associated managed profile has become unavailable.
3212      * Currently this includes when the user enables quiet mode for the profile. Carries an extra
3213      * {@link #EXTRA_USER} that specifies the UserHandle of the profile. When quiet mode is changed,
3214      * this broadcast will carry a boolean extra {@link #EXTRA_QUIET_MODE} indicating the new state
3215      * of quiet mode. This is only sent to registered receivers, not manifest receivers.
3216      */
3217     public static final String ACTION_MANAGED_PROFILE_UNAVAILABLE =
3218             "android.intent.action.MANAGED_PROFILE_UNAVAILABLE";
3219 
3220     /**
3221      * Broadcast sent to the system user when the 'device locked' state changes for any user.
3222      * Carries an extra {@link #EXTRA_USER_HANDLE} that specifies the ID of the user for which
3223      * the device was locked or unlocked.
3224      *
3225      * This is only sent to registered receivers.
3226      *
3227      * @hide
3228      */
3229     public static final String ACTION_DEVICE_LOCKED_CHANGED =
3230             "android.intent.action.DEVICE_LOCKED_CHANGED";
3231 
3232     /**
3233      * Sent when the user taps on the clock widget in the system's "quick settings" area.
3234      */
3235     public static final String ACTION_QUICK_CLOCK =
3236             "android.intent.action.QUICK_CLOCK";
3237 
3238     /**
3239      * Activity Action: Shows the brightness setting dialog.
3240      * @hide
3241      */
3242     public static final String ACTION_SHOW_BRIGHTNESS_DIALOG =
3243             "com.android.intent.action.SHOW_BRIGHTNESS_DIALOG";
3244 
3245     /**
3246      * Broadcast Action:  A global button was pressed.  Includes a single
3247      * extra field, {@link #EXTRA_KEY_EVENT}, containing the key event that
3248      * caused the broadcast.
3249      * @hide
3250      */
3251     @SystemApi
3252     public static final String ACTION_GLOBAL_BUTTON = "android.intent.action.GLOBAL_BUTTON";
3253 
3254     /**
3255      * Broadcast Action: Sent when media resource is granted.
3256      * <p>
3257      * {@link #EXTRA_PACKAGES} specifies the packages on the process holding the media resource
3258      * granted.
3259      * </p>
3260      * <p class="note">
3261      * This is a protected intent that can only be sent by the system.
3262      * </p>
3263      * <p class="note">
3264      * This requires {@link android.Manifest.permission#RECEIVE_MEDIA_RESOURCE_USAGE} permission.
3265      * </p>
3266      *
3267      * @hide
3268      */
3269     public static final String ACTION_MEDIA_RESOURCE_GRANTED =
3270             "android.intent.action.MEDIA_RESOURCE_GRANTED";
3271 
3272     /**
3273      * Broadcast Action: An overlay package has changed. The data contains the
3274      * name of the overlay package which has changed. This is broadcast on all
3275      * changes to the OverlayInfo returned by {@link
3276      * android.content.om.IOverlayManager#getOverlayInfo(String, int)}. The
3277      * most common change is a state change that will change whether the
3278      * overlay is enabled or not.
3279      * @hide
3280      */
3281     public static final String ACTION_OVERLAY_CHANGED = "android.intent.action.OVERLAY_CHANGED";
3282 
3283     /**
3284      * Activity Action: Allow the user to select and return one or more existing
3285      * documents. When invoked, the system will display the various
3286      * {@link DocumentsProvider} instances installed on the device, letting the
3287      * user interactively navigate through them. These documents include local
3288      * media, such as photos and video, and documents provided by installed
3289      * cloud storage providers.
3290      * <p>
3291      * Each document is represented as a {@code content://} URI backed by a
3292      * {@link DocumentsProvider}, which can be opened as a stream with
3293      * {@link ContentResolver#openFileDescriptor(Uri, String)}, or queried for
3294      * {@link android.provider.DocumentsContract.Document} metadata.
3295      * <p>
3296      * All selected documents are returned to the calling application with
3297      * persistable read and write permission grants. If you want to maintain
3298      * access to the documents across device reboots, you need to explicitly
3299      * take the persistable permissions using
3300      * {@link ContentResolver#takePersistableUriPermission(Uri, int)}.
3301      * <p>
3302      * Callers must indicate the acceptable document MIME types through
3303      * {@link #setType(String)}. For example, to select photos, use
3304      * {@code image/*}. If multiple disjoint MIME types are acceptable, define
3305      * them in {@link #EXTRA_MIME_TYPES} and {@link #setType(String)} to
3306      * {@literal *}/*.
3307      * <p>
3308      * If the caller can handle multiple returned items (the user performing
3309      * multiple selection), then you can specify {@link #EXTRA_ALLOW_MULTIPLE}
3310      * to indicate this.
3311      * <p>
3312      * Callers must include {@link #CATEGORY_OPENABLE} in the Intent to obtain
3313      * URIs that can be opened with
3314      * {@link ContentResolver#openFileDescriptor(Uri, String)}.
3315      * <p>
3316      * Callers can set a document URI through
3317      * {@link DocumentsContract#EXTRA_INITIAL_URI} to indicate the initial
3318      * location of documents navigator. System will do its best to launch the
3319      * navigator in the specified document if it's a folder, or the folder that
3320      * contains the specified document if not.
3321      * <p>
3322      * Output: The URI of the item that was picked, returned in
3323      * {@link #getData()}. This must be a {@code content://} URI so that any
3324      * receiver can access it. If multiple documents were selected, they are
3325      * returned in {@link #getClipData()}.
3326      *
3327      * @see DocumentsContract
3328      * @see #ACTION_OPEN_DOCUMENT_TREE
3329      * @see #ACTION_CREATE_DOCUMENT
3330      * @see #FLAG_GRANT_PERSISTABLE_URI_PERMISSION
3331      */
3332     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
3333     public static final String ACTION_OPEN_DOCUMENT = "android.intent.action.OPEN_DOCUMENT";
3334 
3335     /**
3336      * Activity Action: Allow the user to create a new document. When invoked,
3337      * the system will display the various {@link DocumentsProvider} instances
3338      * installed on the device, letting the user navigate through them. The
3339      * returned document may be a newly created document with no content, or it
3340      * may be an existing document with the requested MIME type.
3341      * <p>
3342      * Each document is represented as a {@code content://} URI backed by a
3343      * {@link DocumentsProvider}, which can be opened as a stream with
3344      * {@link ContentResolver#openFileDescriptor(Uri, String)}, or queried for
3345      * {@link android.provider.DocumentsContract.Document} metadata.
3346      * <p>
3347      * Callers must indicate the concrete MIME type of the document being
3348      * created by setting {@link #setType(String)}. This MIME type cannot be
3349      * changed after the document is created.
3350      * <p>
3351      * Callers can provide an initial display name through {@link #EXTRA_TITLE},
3352      * but the user may change this value before creating the file.
3353      * <p>
3354      * Callers must include {@link #CATEGORY_OPENABLE} in the Intent to obtain
3355      * URIs that can be opened with
3356      * {@link ContentResolver#openFileDescriptor(Uri, String)}.
3357      * <p>
3358      * Callers can set a document URI through
3359      * {@link DocumentsContract#EXTRA_INITIAL_URI} to indicate the initial
3360      * location of documents navigator. System will do its best to launch the
3361      * navigator in the specified document if it's a folder, or the folder that
3362      * contains the specified document if not.
3363      * <p>
3364      * Output: The URI of the item that was created. This must be a
3365      * {@code content://} URI so that any receiver can access it.
3366      *
3367      * @see DocumentsContract
3368      * @see #ACTION_OPEN_DOCUMENT
3369      * @see #ACTION_OPEN_DOCUMENT_TREE
3370      * @see #FLAG_GRANT_PERSISTABLE_URI_PERMISSION
3371      */
3372     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
3373     public static final String ACTION_CREATE_DOCUMENT = "android.intent.action.CREATE_DOCUMENT";
3374 
3375     /**
3376      * Activity Action: Allow the user to pick a directory subtree. When
3377      * invoked, the system will display the various {@link DocumentsProvider}
3378      * instances installed on the device, letting the user navigate through
3379      * them. Apps can fully manage documents within the returned directory.
3380      * <p>
3381      * To gain access to descendant (child, grandchild, etc) documents, use
3382      * {@link DocumentsContract#buildDocumentUriUsingTree(Uri, String)} and
3383      * {@link DocumentsContract#buildChildDocumentsUriUsingTree(Uri, String)}
3384      * with the returned URI.
3385      * <p>
3386      * Callers can set a document URI through
3387      * {@link DocumentsContract#EXTRA_INITIAL_URI} to indicate the initial
3388      * location of documents navigator. System will do its best to launch the
3389      * navigator in the specified document if it's a folder, or the folder that
3390      * contains the specified document if not.
3391      * <p>
3392      * Output: The URI representing the selected directory tree.
3393      *
3394      * @see DocumentsContract
3395      */
3396     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
3397     public static final String
3398             ACTION_OPEN_DOCUMENT_TREE = "android.intent.action.OPEN_DOCUMENT_TREE";
3399 
3400     /**
3401      * Broadcast Action: List of dynamic sensor is changed due to new sensor being connected or
3402      * exisiting sensor being disconnected.
3403      *
3404      * <p class="note">This is a protected intent that can only be sent by the system.</p>
3405      *
3406      * {@hide}
3407      */
3408     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
3409     public static final String
3410             ACTION_DYNAMIC_SENSOR_CHANGED = "android.intent.action.DYNAMIC_SENSOR_CHANGED";
3411 
3412     /**
3413      * Deprecated - use ACTION_FACTORY_RESET instead.
3414      * @hide
3415      * @removed
3416      */
3417     @Deprecated
3418     @SystemApi
3419     public static final String ACTION_MASTER_CLEAR = "android.intent.action.MASTER_CLEAR";
3420 
3421     /**
3422      * Broadcast intent sent by the RecoverySystem to inform listeners that a master clear (wipe)
3423      * is about to be performed.
3424      * @hide
3425      */
3426     @SystemApi
3427     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
3428     public static final String ACTION_MASTER_CLEAR_NOTIFICATION
3429             = "android.intent.action.MASTER_CLEAR_NOTIFICATION";
3430 
3431     /**
3432      * Boolean intent extra to be used with {@link #ACTION_MASTER_CLEAR} in order to force a factory
3433      * reset even if {@link android.os.UserManager#DISALLOW_FACTORY_RESET} is set.
3434      *
3435      * <p>Deprecated - use {@link #EXTRA_FORCE_FACTORY_RESET} instead.
3436      *
3437      * @hide
3438      */
3439     @Deprecated
3440     public static final String EXTRA_FORCE_MASTER_CLEAR =
3441             "android.intent.extra.FORCE_MASTER_CLEAR";
3442 
3443     /**
3444      * A broadcast action to trigger a factory reset.
3445      *
3446      * <p> The sender must hold the {@link android.Manifest.permission#MASTER_CLEAR} permission.
3447      *
3448      * <p>Not for use by third-party applications.
3449      *
3450      * @see #EXTRA_FORCE_MASTER_CLEAR
3451      *
3452      * {@hide}
3453      */
3454     @SystemApi
3455     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
3456     public static final String ACTION_FACTORY_RESET = "android.intent.action.FACTORY_RESET";
3457 
3458     /**
3459      * Boolean intent extra to be used with {@link #ACTION_MASTER_CLEAR} in order to force a factory
3460      * reset even if {@link android.os.UserManager#DISALLOW_FACTORY_RESET} is set.
3461      *
3462      * <p>Not for use by third-party applications.
3463      *
3464      * @hide
3465      */
3466     @SystemApi
3467     public static final String EXTRA_FORCE_FACTORY_RESET =
3468             "android.intent.extra.FORCE_FACTORY_RESET";
3469 
3470     /**
3471      * Broadcast action: report that a settings element is being restored from backup. The intent
3472      * contains four extras: EXTRA_SETTING_NAME is a string naming the restored setting,
3473      * EXTRA_SETTING_NEW_VALUE is the value being restored, EXTRA_SETTING_PREVIOUS_VALUE
3474      * is the value of that settings entry prior to the restore operation, and
3475      * EXTRA_SETTING_RESTORED_FROM_SDK_INT is the version of the SDK that the setting has been
3476      * restored from (corresponds to {@link android.os.Build.VERSION#SDK_INT}). The first three
3477      * values are represented as strings, the fourth one as int.
3478      *
3479      * <p>This broadcast is sent only for settings provider entries known to require special handling
3480      * around restore time.  These entries are found in the BROADCAST_ON_RESTORE table within
3481      * the provider's backup agent implementation.
3482      *
3483      * @see #EXTRA_SETTING_NAME
3484      * @see #EXTRA_SETTING_PREVIOUS_VALUE
3485      * @see #EXTRA_SETTING_NEW_VALUE
3486      * @see #EXTRA_SETTING_RESTORED_FROM_SDK_INT
3487      * {@hide}
3488      */
3489     public static final String ACTION_SETTING_RESTORED = "android.os.action.SETTING_RESTORED";
3490 
3491     /** {@hide} */
3492     public static final String EXTRA_SETTING_NAME = "setting_name";
3493     /** {@hide} */
3494     public static final String EXTRA_SETTING_PREVIOUS_VALUE = "previous_value";
3495     /** {@hide} */
3496     public static final String EXTRA_SETTING_NEW_VALUE = "new_value";
3497     /** {@hide} */
3498     public static final String EXTRA_SETTING_RESTORED_FROM_SDK_INT = "restored_from_sdk_int";
3499 
3500     /**
3501      * Activity Action: Process a piece of text.
3502      * <p>Input: {@link #EXTRA_PROCESS_TEXT} contains the text to be processed.
3503      * {@link #EXTRA_PROCESS_TEXT_READONLY} states if the resulting text will be read-only.</p>
3504      * <p>Output: {@link #EXTRA_PROCESS_TEXT} contains the processed text.</p>
3505      */
3506     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
3507     public static final String ACTION_PROCESS_TEXT = "android.intent.action.PROCESS_TEXT";
3508 
3509     /**
3510      * Broadcast Action: The sim card state has changed.
3511      * For more details see TelephonyIntents.ACTION_SIM_STATE_CHANGED. This is here
3512      * because TelephonyIntents is an internal class.
3513      * @hide
3514      */
3515     @SystemApi
3516     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
3517     public static final String ACTION_SIM_STATE_CHANGED = "android.intent.action.SIM_STATE_CHANGED";
3518 
3519     /**
3520      * Broadcast Action: indicate that the phone service state has changed.
3521      * The intent will have the following extra values:</p>
3522      * <p>
3523      * @see #EXTRA_VOICE_REG_STATE
3524      * @see #EXTRA_DATA_REG_STATE
3525      * @see #EXTRA_VOICE_ROAMING_TYPE
3526      * @see #EXTRA_DATA_ROAMING_TYPE
3527      * @see #EXTRA_OPERATOR_ALPHA_LONG
3528      * @see #EXTRA_OPERATOR_ALPHA_SHORT
3529      * @see #EXTRA_OPERATOR_NUMERIC
3530      * @see #EXTRA_DATA_OPERATOR_ALPHA_LONG
3531      * @see #EXTRA_DATA_OPERATOR_ALPHA_SHORT
3532      * @see #EXTRA_DATA_OPERATOR_NUMERIC
3533      * @see #EXTRA_MANUAL
3534      * @see #EXTRA_VOICE_RADIO_TECH
3535      * @see #EXTRA_DATA_RADIO_TECH
3536      * @see #EXTRA_CSS_INDICATOR
3537      * @see #EXTRA_NETWORK_ID
3538      * @see #EXTRA_SYSTEM_ID
3539      * @see #EXTRA_CDMA_ROAMING_INDICATOR
3540      * @see #EXTRA_CDMA_DEFAULT_ROAMING_INDICATOR
3541      * @see #EXTRA_EMERGENCY_ONLY
3542      * @see #EXTRA_IS_DATA_ROAMING_FROM_REGISTRATION
3543      * @see #EXTRA_IS_USING_CARRIER_AGGREGATION
3544      * @see #EXTRA_LTE_EARFCN_RSRP_BOOST
3545      *
3546      * <p class="note">
3547      * Requires the READ_PHONE_STATE permission.
3548      *
3549      * <p class="note">This is a protected intent that can only be sent by the system.
3550      * @hide
3551      * @removed
3552      */
3553     @Deprecated
3554     @SystemApi
3555     @SdkConstant(SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION)
3556     public static final String ACTION_SERVICE_STATE = "android.intent.action.SERVICE_STATE";
3557 
3558     /**
3559      * An int extra used with {@link #ACTION_SERVICE_STATE} which indicates voice registration
3560      * state.
3561      * @see android.telephony.ServiceState#STATE_EMERGENCY_ONLY
3562      * @see android.telephony.ServiceState#STATE_IN_SERVICE
3563      * @see android.telephony.ServiceState#STATE_OUT_OF_SERVICE
3564      * @see android.telephony.ServiceState#STATE_POWER_OFF
3565      * @hide
3566      * @removed
3567      */
3568     @Deprecated
3569     @SystemApi
3570     public static final String EXTRA_VOICE_REG_STATE = "voiceRegState";
3571 
3572     /**
3573      * An int extra used with {@link #ACTION_SERVICE_STATE} which indicates data registration state.
3574      * @see android.telephony.ServiceState#STATE_EMERGENCY_ONLY
3575      * @see android.telephony.ServiceState#STATE_IN_SERVICE
3576      * @see android.telephony.ServiceState#STATE_OUT_OF_SERVICE
3577      * @see android.telephony.ServiceState#STATE_POWER_OFF
3578      * @hide
3579      * @removed
3580      */
3581     @Deprecated
3582     @SystemApi
3583     public static final String EXTRA_DATA_REG_STATE = "dataRegState";
3584 
3585     /**
3586      * An integer extra used with {@link #ACTION_SERVICE_STATE} which indicates the voice roaming
3587      * type.
3588      * @hide
3589      * @removed
3590      */
3591     @Deprecated
3592     @SystemApi
3593     public static final String EXTRA_VOICE_ROAMING_TYPE = "voiceRoamingType";
3594 
3595     /**
3596      * An integer extra used with {@link #ACTION_SERVICE_STATE} which indicates the data roaming
3597      * type.
3598      * @hide
3599      * @removed
3600      */
3601     @Deprecated
3602     @SystemApi
3603     public static final String EXTRA_DATA_ROAMING_TYPE = "dataRoamingType";
3604 
3605     /**
3606      * A string extra used with {@link #ACTION_SERVICE_STATE} which represents the current
3607      * registered voice operator name in long alphanumeric format.
3608      * {@code null} if the operator name is not known or unregistered.
3609      * @hide
3610      * @removed
3611      */
3612     @Deprecated
3613     @SystemApi
3614     public static final String EXTRA_OPERATOR_ALPHA_LONG = "operator-alpha-long";
3615 
3616     /**
3617      * A string extra used with {@link #ACTION_SERVICE_STATE} which represents the current
3618      * registered voice operator name in short alphanumeric format.
3619      * {@code null} if the operator name is not known or unregistered.
3620      * @hide
3621      * @removed
3622      */
3623     @Deprecated
3624     @SystemApi
3625     public static final String EXTRA_OPERATOR_ALPHA_SHORT = "operator-alpha-short";
3626 
3627     /**
3628      * A string extra used with {@link #ACTION_SERVICE_STATE} containing the MCC
3629      * (Mobile Country Code, 3 digits) and MNC (Mobile Network code, 2-3 digits) for the mobile
3630      * network.
3631      * @hide
3632      * @removed
3633      */
3634     @Deprecated
3635     @SystemApi
3636     public static final String EXTRA_OPERATOR_NUMERIC = "operator-numeric";
3637 
3638     /**
3639      * A string extra used with {@link #ACTION_SERVICE_STATE} which represents the current
3640      * registered data operator name in long alphanumeric format.
3641      * {@code null} if the operator name is not known or unregistered.
3642      * @hide
3643      * @removed
3644      */
3645     @Deprecated
3646     @SystemApi
3647     public static final String EXTRA_DATA_OPERATOR_ALPHA_LONG = "data-operator-alpha-long";
3648 
3649     /**
3650      * A string extra used with {@link #ACTION_SERVICE_STATE} which represents the current
3651      * registered data operator name in short alphanumeric format.
3652      * {@code null} if the operator name is not known or unregistered.
3653      * @hide
3654      * @removed
3655      */
3656     @Deprecated
3657     @SystemApi
3658     public static final String EXTRA_DATA_OPERATOR_ALPHA_SHORT = "data-operator-alpha-short";
3659 
3660     /**
3661      * A string extra used with {@link #ACTION_SERVICE_STATE} containing the MCC
3662      * (Mobile Country Code, 3 digits) and MNC (Mobile Network code, 2-3 digits) for the
3663      * data operator.
3664      * @hide
3665      * @removed
3666      */
3667     @Deprecated
3668     @SystemApi
3669     public static final String EXTRA_DATA_OPERATOR_NUMERIC = "data-operator-numeric";
3670 
3671     /**
3672      * A boolean extra used with {@link #ACTION_SERVICE_STATE} which indicates whether the current
3673      * network selection mode is manual.
3674      * Will be {@code true} if manual mode, {@code false} if automatic mode.
3675      * @hide
3676      * @removed
3677      */
3678     @Deprecated
3679     @SystemApi
3680     public static final String EXTRA_MANUAL = "manual";
3681 
3682     /**
3683      * An integer extra used with {@link #ACTION_SERVICE_STATE} which represents the current voice
3684      * radio technology.
3685      * @hide
3686      * @removed
3687      */
3688     @Deprecated
3689     @SystemApi
3690     public static final String EXTRA_VOICE_RADIO_TECH = "radioTechnology";
3691 
3692     /**
3693      * An integer extra used with {@link #ACTION_SERVICE_STATE} which represents the current data
3694      * radio technology.
3695      * @hide
3696      * @removed
3697      */
3698     @Deprecated
3699     @SystemApi
3700     public static final String EXTRA_DATA_RADIO_TECH = "dataRadioTechnology";
3701 
3702     /**
3703      * A boolean extra used with {@link #ACTION_SERVICE_STATE} which represents concurrent service
3704      * support on CDMA network.
3705      * Will be {@code true} if support, {@code false} otherwise.
3706      * @hide
3707      * @removed
3708      */
3709     @Deprecated
3710     @SystemApi
3711     public static final String EXTRA_CSS_INDICATOR = "cssIndicator";
3712 
3713     /**
3714      * An integer extra used with {@link #ACTION_SERVICE_STATE} which represents the CDMA network
3715      * id. {@code Integer.MAX_VALUE} if unknown.
3716      * @hide
3717      * @removed
3718      */
3719     @Deprecated
3720     @SystemApi
3721     public static final String EXTRA_NETWORK_ID = "networkId";
3722 
3723     /**
3724      * An integer extra used with {@link #ACTION_SERVICE_STATE} which represents the CDMA system id.
3725      * {@code Integer.MAX_VALUE} if unknown.
3726      * @hide
3727      * @removed
3728      */
3729     @Deprecated
3730     @SystemApi
3731     public static final String EXTRA_SYSTEM_ID = "systemId";
3732 
3733     /**
3734      * An integer extra used with {@link #ACTION_SERVICE_STATE} represents the TSB-58 roaming
3735      * indicator if registered on a CDMA or EVDO system or {@code -1} if not.
3736      * @hide
3737      * @removed
3738      */
3739     @Deprecated
3740     @SystemApi
3741     public static final String EXTRA_CDMA_ROAMING_INDICATOR = "cdmaRoamingIndicator";
3742 
3743     /**
3744      * An integer extra used with {@link #ACTION_SERVICE_STATE} represents the default roaming
3745      * indicator from the PRL if registered on a CDMA or EVDO system {@code -1} if not.
3746      * @hide
3747      * @removed
3748      */
3749     @Deprecated
3750     @SystemApi
3751     public static final String EXTRA_CDMA_DEFAULT_ROAMING_INDICATOR = "cdmaDefaultRoamingIndicator";
3752 
3753     /**
3754      * A boolean extra used with {@link #ACTION_SERVICE_STATE} which indicates if under emergency
3755      * only mode.
3756      * {@code true} if in emergency only mode, {@code false} otherwise.
3757      * @hide
3758      * @removed
3759      */
3760     @Deprecated
3761     @SystemApi
3762     public static final String EXTRA_EMERGENCY_ONLY = "emergencyOnly";
3763 
3764     /**
3765      * A boolean extra used with {@link #ACTION_SERVICE_STATE} which indicates whether data network
3766      * registration state is roaming.
3767      * {@code true} if registration indicates roaming, {@code false} otherwise
3768      * @hide
3769      * @removed
3770      */
3771     @Deprecated
3772     @SystemApi
3773     public static final String EXTRA_IS_DATA_ROAMING_FROM_REGISTRATION =
3774             "isDataRoamingFromRegistration";
3775 
3776     /**
3777      * A boolean extra used with {@link #ACTION_SERVICE_STATE} which indicates if carrier
3778      * aggregation is in use.
3779      * {@code true} if carrier aggregation is in use, {@code false} otherwise.
3780      * @hide
3781      * @removed
3782      */
3783     @Deprecated
3784     @SystemApi
3785     public static final String EXTRA_IS_USING_CARRIER_AGGREGATION = "isUsingCarrierAggregation";
3786 
3787     /**
3788      * An integer extra used with {@link #ACTION_SERVICE_STATE} representing the offset which
3789      * is reduced from the rsrp threshold while calculating signal strength level.
3790      * @hide
3791      * @removed
3792      */
3793     @Deprecated
3794     @SystemApi
3795     public static final String EXTRA_LTE_EARFCN_RSRP_BOOST = "LteEarfcnRsrpBoost";
3796 
3797     /**
3798      * The name of the extra used to define the text to be processed, as a
3799      * CharSequence. Note that this may be a styled CharSequence, so you must use
3800      * {@link Bundle#getCharSequence(String) Bundle.getCharSequence()} to retrieve it.
3801      */
3802     public static final String EXTRA_PROCESS_TEXT = "android.intent.extra.PROCESS_TEXT";
3803     /**
3804      * The name of the boolean extra used to define if the processed text will be used as read-only.
3805      */
3806     public static final String EXTRA_PROCESS_TEXT_READONLY =
3807             "android.intent.extra.PROCESS_TEXT_READONLY";
3808 
3809     /**
3810      * Broadcast action: reports when a new thermal event has been reached. When the device
3811      * is reaching its maximum temperatue, the thermal level reported
3812      * {@hide}
3813      */
3814     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
3815     public static final String ACTION_THERMAL_EVENT = "android.intent.action.THERMAL_EVENT";
3816 
3817     /** {@hide} */
3818     public static final String EXTRA_THERMAL_STATE = "android.intent.extra.THERMAL_STATE";
3819 
3820     /**
3821      * Thermal state when the device is normal. This state is sent in the
3822      * {@link #ACTION_THERMAL_EVENT} broadcast as {@link #EXTRA_THERMAL_STATE}.
3823      * {@hide}
3824      */
3825     public static final int EXTRA_THERMAL_STATE_NORMAL = 0;
3826 
3827     /**
3828      * Thermal state where the device is approaching its maximum threshold. This state is sent in
3829      * the {@link #ACTION_THERMAL_EVENT} broadcast as {@link #EXTRA_THERMAL_STATE}.
3830      * {@hide}
3831      */
3832     public static final int EXTRA_THERMAL_STATE_WARNING = 1;
3833 
3834     /**
3835      * Thermal state where the device has reached its maximum threshold. This state is sent in the
3836      * {@link #ACTION_THERMAL_EVENT} broadcast as {@link #EXTRA_THERMAL_STATE}.
3837      * {@hide}
3838      */
3839     public static final int EXTRA_THERMAL_STATE_EXCEEDED = 2;
3840 
3841 
3842     // ---------------------------------------------------------------------
3843     // ---------------------------------------------------------------------
3844     // Standard intent categories (see addCategory()).
3845 
3846     /**
3847      * Set if the activity should be an option for the default action
3848      * (center press) to perform on a piece of data.  Setting this will
3849      * hide from the user any activities without it set when performing an
3850      * action on some data.  Note that this is normally -not- set in the
3851      * Intent when initiating an action -- it is for use in intent filters
3852      * specified in packages.
3853      */
3854     @SdkConstant(SdkConstantType.INTENT_CATEGORY)
3855     public static final String CATEGORY_DEFAULT = "android.intent.category.DEFAULT";
3856     /**
3857      * Activities that can be safely invoked from a browser must support this
3858      * category.  For example, if the user is viewing a web page or an e-mail
3859      * and clicks on a link in the text, the Intent generated execute that
3860      * link will require the BROWSABLE category, so that only activities
3861      * supporting this category will be considered as possible actions.  By
3862      * supporting this category, you are promising that there is nothing
3863      * damaging (without user intervention) that can happen by invoking any
3864      * matching Intent.
3865      */
3866     @SdkConstant(SdkConstantType.INTENT_CATEGORY)
3867     public static final String CATEGORY_BROWSABLE = "android.intent.category.BROWSABLE";
3868     /**
3869      * Categories for activities that can participate in voice interaction.
3870      * An activity that supports this category must be prepared to run with
3871      * no UI shown at all (though in some case it may have a UI shown), and
3872      * rely on {@link android.app.VoiceInteractor} to interact with the user.
3873      */
3874     @SdkConstant(SdkConstantType.INTENT_CATEGORY)
3875     public static final String CATEGORY_VOICE = "android.intent.category.VOICE";
3876     /**
3877      * Set if the activity should be considered as an alternative action to
3878      * the data the user is currently viewing.  See also
3879      * {@link #CATEGORY_SELECTED_ALTERNATIVE} for an alternative action that
3880      * applies to the selection in a list of items.
3881      *
3882      * <p>Supporting this category means that you would like your activity to be
3883      * displayed in the set of alternative things the user can do, usually as
3884      * part of the current activity's options menu.  You will usually want to
3885      * include a specific label in the &lt;intent-filter&gt; of this action
3886      * describing to the user what it does.
3887      *
3888      * <p>The action of IntentFilter with this category is important in that it
3889      * describes the specific action the target will perform.  This generally
3890      * should not be a generic action (such as {@link #ACTION_VIEW}, but rather
3891      * a specific name such as "com.android.camera.action.CROP.  Only one
3892      * alternative of any particular action will be shown to the user, so using
3893      * a specific action like this makes sure that your alternative will be
3894      * displayed while also allowing other applications to provide their own
3895      * overrides of that particular action.
3896      */
3897     @SdkConstant(SdkConstantType.INTENT_CATEGORY)
3898     public static final String CATEGORY_ALTERNATIVE = "android.intent.category.ALTERNATIVE";
3899     /**
3900      * Set if the activity should be considered as an alternative selection
3901      * action to the data the user has currently selected.  This is like
3902      * {@link #CATEGORY_ALTERNATIVE}, but is used in activities showing a list
3903      * of items from which the user can select, giving them alternatives to the
3904      * default action that will be performed on it.
3905      */
3906     @SdkConstant(SdkConstantType.INTENT_CATEGORY)
3907     public static final String CATEGORY_SELECTED_ALTERNATIVE = "android.intent.category.SELECTED_ALTERNATIVE";
3908     /**
3909      * Intended to be used as a tab inside of a containing TabActivity.
3910      */
3911     @SdkConstant(SdkConstantType.INTENT_CATEGORY)
3912     public static final String CATEGORY_TAB = "android.intent.category.TAB";
3913     /**
3914      * Should be displayed in the top-level launcher.
3915      */
3916     @SdkConstant(SdkConstantType.INTENT_CATEGORY)
3917     public static final String CATEGORY_LAUNCHER = "android.intent.category.LAUNCHER";
3918     /**
3919      * Indicates an activity optimized for Leanback mode, and that should
3920      * be displayed in the Leanback launcher.
3921      */
3922     @SdkConstant(SdkConstantType.INTENT_CATEGORY)
3923     public static final String CATEGORY_LEANBACK_LAUNCHER = "android.intent.category.LEANBACK_LAUNCHER";
3924     /**
3925      * Indicates a Leanback settings activity to be displayed in the Leanback launcher.
3926      * @hide
3927      */
3928     @SystemApi
3929     public static final String CATEGORY_LEANBACK_SETTINGS = "android.intent.category.LEANBACK_SETTINGS";
3930     /**
3931      * Provides information about the package it is in; typically used if
3932      * a package does not contain a {@link #CATEGORY_LAUNCHER} to provide
3933      * a front-door to the user without having to be shown in the all apps list.
3934      */
3935     @SdkConstant(SdkConstantType.INTENT_CATEGORY)
3936     public static final String CATEGORY_INFO = "android.intent.category.INFO";
3937     /**
3938      * This is the home activity, that is the first activity that is displayed
3939      * when the device boots.
3940      */
3941     @SdkConstant(SdkConstantType.INTENT_CATEGORY)
3942     public static final String CATEGORY_HOME = "android.intent.category.HOME";
3943     /**
3944      * This is the home activity that is displayed when the device is finished setting up and ready
3945      * for use.
3946      * @hide
3947      */
3948     @SdkConstant(SdkConstantType.INTENT_CATEGORY)
3949     public static final String CATEGORY_HOME_MAIN = "android.intent.category.HOME_MAIN";
3950     /**
3951      * This is the setup wizard activity, that is the first activity that is displayed
3952      * when the user sets up the device for the first time.
3953      * @hide
3954      */
3955     @SdkConstant(SdkConstantType.INTENT_CATEGORY)
3956     public static final String CATEGORY_SETUP_WIZARD = "android.intent.category.SETUP_WIZARD";
3957     /**
3958      * This is the home activity, that is the activity that serves as the launcher app
3959      * from there the user can start other apps. Often components with lower/higher
3960      * priority intent filters handle the home intent, for example SetupWizard, to
3961      * setup the device and we need to be able to distinguish the home app from these
3962      * setup helpers.
3963      * @hide
3964      */
3965     @SdkConstant(SdkConstantType.INTENT_CATEGORY)
3966     public static final String CATEGORY_LAUNCHER_APP = "android.intent.category.LAUNCHER_APP";
3967     /**
3968      * This activity is a preference panel.
3969      */
3970     @SdkConstant(SdkConstantType.INTENT_CATEGORY)
3971     public static final String CATEGORY_PREFERENCE = "android.intent.category.PREFERENCE";
3972     /**
3973      * This activity is a development preference panel.
3974      */
3975     @SdkConstant(SdkConstantType.INTENT_CATEGORY)
3976     public static final String CATEGORY_DEVELOPMENT_PREFERENCE = "android.intent.category.DEVELOPMENT_PREFERENCE";
3977     /**
3978      * Capable of running inside a parent activity container.
3979      */
3980     @SdkConstant(SdkConstantType.INTENT_CATEGORY)
3981     public static final String CATEGORY_EMBED = "android.intent.category.EMBED";
3982     /**
3983      * This activity allows the user to browse and download new applications.
3984      */
3985     @SdkConstant(SdkConstantType.INTENT_CATEGORY)
3986     public static final String CATEGORY_APP_MARKET = "android.intent.category.APP_MARKET";
3987     /**
3988      * This activity may be exercised by the monkey or other automated test tools.
3989      */
3990     @SdkConstant(SdkConstantType.INTENT_CATEGORY)
3991     public static final String CATEGORY_MONKEY = "android.intent.category.MONKEY";
3992     /**
3993      * To be used as a test (not part of the normal user experience).
3994      */
3995     public static final String CATEGORY_TEST = "android.intent.category.TEST";
3996     /**
3997      * To be used as a unit test (run through the Test Harness).
3998      */
3999     public static final String CATEGORY_UNIT_TEST = "android.intent.category.UNIT_TEST";
4000     /**
4001      * To be used as a sample code example (not part of the normal user
4002      * experience).
4003      */
4004     public static final String CATEGORY_SAMPLE_CODE = "android.intent.category.SAMPLE_CODE";
4005 
4006     /**
4007      * Used to indicate that an intent only wants URIs that can be opened with
4008      * {@link ContentResolver#openFileDescriptor(Uri, String)}. Openable URIs
4009      * must support at least the columns defined in {@link OpenableColumns} when
4010      * queried.
4011      *
4012      * @see #ACTION_GET_CONTENT
4013      * @see #ACTION_OPEN_DOCUMENT
4014      * @see #ACTION_CREATE_DOCUMENT
4015      */
4016     @SdkConstant(SdkConstantType.INTENT_CATEGORY)
4017     public static final String CATEGORY_OPENABLE = "android.intent.category.OPENABLE";
4018 
4019     /**
4020      * Used to indicate that an intent filter can accept files which are not necessarily
4021      * openable by {@link ContentResolver#openFileDescriptor(Uri, String)}, but
4022      * at least streamable via
4023      * {@link ContentResolver#openTypedAssetFileDescriptor(Uri, String, Bundle)}
4024      * using one of the stream types exposed via
4025      * {@link ContentResolver#getStreamTypes(Uri, String)}.
4026      *
4027      * @see #ACTION_SEND
4028      * @see #ACTION_SEND_MULTIPLE
4029      */
4030     @SdkConstant(SdkConstantType.INTENT_CATEGORY)
4031     public static final String CATEGORY_TYPED_OPENABLE  =
4032             "android.intent.category.TYPED_OPENABLE";
4033 
4034     /**
4035      * To be used as code under test for framework instrumentation tests.
4036      */
4037     public static final String CATEGORY_FRAMEWORK_INSTRUMENTATION_TEST =
4038             "android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST";
4039     /**
4040      * An activity to run when device is inserted into a car dock.
4041      * Used with {@link #ACTION_MAIN} to launch an activity.  For more
4042      * information, see {@link android.app.UiModeManager}.
4043      */
4044     @SdkConstant(SdkConstantType.INTENT_CATEGORY)
4045     public static final String CATEGORY_CAR_DOCK = "android.intent.category.CAR_DOCK";
4046     /**
4047      * An activity to run when device is inserted into a car dock.
4048      * Used with {@link #ACTION_MAIN} to launch an activity.  For more
4049      * information, see {@link android.app.UiModeManager}.
4050      */
4051     @SdkConstant(SdkConstantType.INTENT_CATEGORY)
4052     public static final String CATEGORY_DESK_DOCK = "android.intent.category.DESK_DOCK";
4053     /**
4054      * An activity to run when device is inserted into a analog (low end) dock.
4055      * Used with {@link #ACTION_MAIN} to launch an activity.  For more
4056      * information, see {@link android.app.UiModeManager}.
4057      */
4058     @SdkConstant(SdkConstantType.INTENT_CATEGORY)
4059     public static final String CATEGORY_LE_DESK_DOCK = "android.intent.category.LE_DESK_DOCK";
4060 
4061     /**
4062      * An activity to run when device is inserted into a digital (high end) dock.
4063      * Used with {@link #ACTION_MAIN} to launch an activity.  For more
4064      * information, see {@link android.app.UiModeManager}.
4065      */
4066     @SdkConstant(SdkConstantType.INTENT_CATEGORY)
4067     public static final String CATEGORY_HE_DESK_DOCK = "android.intent.category.HE_DESK_DOCK";
4068 
4069     /**
4070      * Used to indicate that the activity can be used in a car environment.
4071      */
4072     @SdkConstant(SdkConstantType.INTENT_CATEGORY)
4073     public static final String CATEGORY_CAR_MODE = "android.intent.category.CAR_MODE";
4074 
4075     /**
4076      * An activity to use for the launcher when the device is placed in a VR Headset viewer.
4077      * Used with {@link #ACTION_MAIN} to launch an activity.  For more
4078      * information, see {@link android.app.UiModeManager}.
4079      */
4080     @SdkConstant(SdkConstantType.INTENT_CATEGORY)
4081     public static final String CATEGORY_VR_HOME = "android.intent.category.VR_HOME";
4082     // ---------------------------------------------------------------------
4083     // ---------------------------------------------------------------------
4084     // Application launch intent categories (see addCategory()).
4085 
4086     /**
4087      * Used with {@link #ACTION_MAIN} to launch the browser application.
4088      * The activity should be able to browse the Internet.
4089      * <p>NOTE: This should not be used as the primary key of an Intent,
4090      * since it will not result in the app launching with the correct
4091      * action and category.  Instead, use this with
4092      * {@link #makeMainSelectorActivity(String, String)} to generate a main
4093      * Intent with this category in the selector.</p>
4094      */
4095     @SdkConstant(SdkConstantType.INTENT_CATEGORY)
4096     public static final String CATEGORY_APP_BROWSER = "android.intent.category.APP_BROWSER";
4097 
4098     /**
4099      * Used with {@link #ACTION_MAIN} to launch the calculator application.
4100      * The activity should be able to perform standard arithmetic operations.
4101      * <p>NOTE: This should not be used as the primary key of an Intent,
4102      * since it will not result in the app launching with the correct
4103      * action and category.  Instead, use this with
4104      * {@link #makeMainSelectorActivity(String, String)} to generate a main
4105      * Intent with this category in the selector.</p>
4106      */
4107     @SdkConstant(SdkConstantType.INTENT_CATEGORY)
4108     public static final String CATEGORY_APP_CALCULATOR = "android.intent.category.APP_CALCULATOR";
4109 
4110     /**
4111      * Used with {@link #ACTION_MAIN} to launch the calendar application.
4112      * The activity should be able to view and manipulate calendar entries.
4113      * <p>NOTE: This should not be used as the primary key of an Intent,
4114      * since it will not result in the app launching with the correct
4115      * action and category.  Instead, use this with
4116      * {@link #makeMainSelectorActivity(String, String)} to generate a main
4117      * Intent with this category in the selector.</p>
4118      */
4119     @SdkConstant(SdkConstantType.INTENT_CATEGORY)
4120     public static final String CATEGORY_APP_CALENDAR = "android.intent.category.APP_CALENDAR";
4121 
4122     /**
4123      * Used with {@link #ACTION_MAIN} to launch the contacts application.
4124      * The activity should be able to view and manipulate address book entries.
4125      * <p>NOTE: This should not be used as the primary key of an Intent,
4126      * since it will not result in the app launching with the correct
4127      * action and category.  Instead, use this with
4128      * {@link #makeMainSelectorActivity(String, String)} to generate a main
4129      * Intent with this category in the selector.</p>
4130      */
4131     @SdkConstant(SdkConstantType.INTENT_CATEGORY)
4132     public static final String CATEGORY_APP_CONTACTS = "android.intent.category.APP_CONTACTS";
4133 
4134     /**
4135      * Used with {@link #ACTION_MAIN} to launch the email application.
4136      * The activity should be able to send and receive email.
4137      * <p>NOTE: This should not be used as the primary key of an Intent,
4138      * since it will not result in the app launching with the correct
4139      * action and category.  Instead, use this with
4140      * {@link #makeMainSelectorActivity(String, String)} to generate a main
4141      * Intent with this category in the selector.</p>
4142      */
4143     @SdkConstant(SdkConstantType.INTENT_CATEGORY)
4144     public static final String CATEGORY_APP_EMAIL = "android.intent.category.APP_EMAIL";
4145 
4146     /**
4147      * Used with {@link #ACTION_MAIN} to launch the gallery application.
4148      * The activity should be able to view and manipulate image and video files
4149      * stored on the device.
4150      * <p>NOTE: This should not be used as the primary key of an Intent,
4151      * since it will not result in the app launching with the correct
4152      * action and category.  Instead, use this with
4153      * {@link #makeMainSelectorActivity(String, String)} to generate a main
4154      * Intent with this category in the selector.</p>
4155      */
4156     @SdkConstant(SdkConstantType.INTENT_CATEGORY)
4157     public static final String CATEGORY_APP_GALLERY = "android.intent.category.APP_GALLERY";
4158 
4159     /**
4160      * Used with {@link #ACTION_MAIN} to launch the maps application.
4161      * The activity should be able to show the user's current location and surroundings.
4162      * <p>NOTE: This should not be used as the primary key of an Intent,
4163      * since it will not result in the app launching with the correct
4164      * action and category.  Instead, use this with
4165      * {@link #makeMainSelectorActivity(String, String)} to generate a main
4166      * Intent with this category in the selector.</p>
4167      */
4168     @SdkConstant(SdkConstantType.INTENT_CATEGORY)
4169     public static final String CATEGORY_APP_MAPS = "android.intent.category.APP_MAPS";
4170 
4171     /**
4172      * Used with {@link #ACTION_MAIN} to launch the messaging application.
4173      * The activity should be able to send and receive text messages.
4174      * <p>NOTE: This should not be used as the primary key of an Intent,
4175      * since it will not result in the app launching with the correct
4176      * action and category.  Instead, use this with
4177      * {@link #makeMainSelectorActivity(String, String)} to generate a main
4178      * Intent with this category in the selector.</p>
4179      */
4180     @SdkConstant(SdkConstantType.INTENT_CATEGORY)
4181     public static final String CATEGORY_APP_MESSAGING = "android.intent.category.APP_MESSAGING";
4182 
4183     /**
4184      * Used with {@link #ACTION_MAIN} to launch the music application.
4185      * The activity should be able to play, browse, or manipulate music files
4186      * stored on the device.
4187      * <p>NOTE: This should not be used as the primary key of an Intent,
4188      * since it will not result in the app launching with the correct
4189      * action and category.  Instead, use this with
4190      * {@link #makeMainSelectorActivity(String, String)} to generate a main
4191      * Intent with this category in the selector.</p>
4192      */
4193     @SdkConstant(SdkConstantType.INTENT_CATEGORY)
4194     public static final String CATEGORY_APP_MUSIC = "android.intent.category.APP_MUSIC";
4195 
4196     // ---------------------------------------------------------------------
4197     // ---------------------------------------------------------------------
4198     // Standard extra data keys.
4199 
4200     /**
4201      * The initial data to place in a newly created record.  Use with
4202      * {@link #ACTION_INSERT}.  The data here is a Map containing the same
4203      * fields as would be given to the underlying ContentProvider.insert()
4204      * call.
4205      */
4206     public static final String EXTRA_TEMPLATE = "android.intent.extra.TEMPLATE";
4207 
4208     /**
4209      * A constant CharSequence that is associated with the Intent, used with
4210      * {@link #ACTION_SEND} to supply the literal data to be sent.  Note that
4211      * this may be a styled CharSequence, so you must use
4212      * {@link Bundle#getCharSequence(String) Bundle.getCharSequence()} to
4213      * retrieve it.
4214      */
4215     public static final String EXTRA_TEXT = "android.intent.extra.TEXT";
4216 
4217     /**
4218      * A constant String that is associated with the Intent, used with
4219      * {@link #ACTION_SEND} to supply an alternative to {@link #EXTRA_TEXT}
4220      * as HTML formatted text.  Note that you <em>must</em> also supply
4221      * {@link #EXTRA_TEXT}.
4222      */
4223     public static final String EXTRA_HTML_TEXT = "android.intent.extra.HTML_TEXT";
4224 
4225     /**
4226      * A content: URI holding a stream of data associated with the Intent,
4227      * used with {@link #ACTION_SEND} to supply the data being sent.
4228      */
4229     public static final String EXTRA_STREAM = "android.intent.extra.STREAM";
4230 
4231     /**
4232      * A String[] holding e-mail addresses that should be delivered to.
4233      */
4234     public static final String EXTRA_EMAIL       = "android.intent.extra.EMAIL";
4235 
4236     /**
4237      * A String[] holding e-mail addresses that should be carbon copied.
4238      */
4239     public static final String EXTRA_CC       = "android.intent.extra.CC";
4240 
4241     /**
4242      * A String[] holding e-mail addresses that should be blind carbon copied.
4243      */
4244     public static final String EXTRA_BCC      = "android.intent.extra.BCC";
4245 
4246     /**
4247      * A constant string holding the desired subject line of a message.
4248      */
4249     public static final String EXTRA_SUBJECT  = "android.intent.extra.SUBJECT";
4250 
4251     /**
4252      * An Intent describing the choices you would like shown with
4253      * {@link #ACTION_PICK_ACTIVITY} or {@link #ACTION_CHOOSER}.
4254      */
4255     public static final String EXTRA_INTENT = "android.intent.extra.INTENT";
4256 
4257     /**
4258      * An int representing the user id to be used.
4259      *
4260      * @hide
4261      */
4262     public static final String EXTRA_USER_ID = "android.intent.extra.USER_ID";
4263 
4264     /**
4265      * An int representing the task id to be retrieved. This is used when a launch from recents is
4266      * intercepted by another action such as credentials confirmation to remember which task should
4267      * be resumed when complete.
4268      *
4269      * @hide
4270      */
4271     public static final String EXTRA_TASK_ID = "android.intent.extra.TASK_ID";
4272 
4273     /**
4274      * An Intent[] describing additional, alternate choices you would like shown with
4275      * {@link #ACTION_CHOOSER}.
4276      *
4277      * <p>An app may be capable of providing several different payload types to complete a
4278      * user's intended action. For example, an app invoking {@link #ACTION_SEND} to share photos
4279      * with another app may use EXTRA_ALTERNATE_INTENTS to have the chooser transparently offer
4280      * several different supported sending mechanisms for sharing, such as the actual "image/*"
4281      * photo data or a hosted link where the photos can be viewed.</p>
4282      *
4283      * <p>The intent present in {@link #EXTRA_INTENT} will be treated as the
4284      * first/primary/preferred intent in the set. Additional intents specified in
4285      * this extra are ordered; by default intents that appear earlier in the array will be
4286      * preferred over intents that appear later in the array as matches for the same
4287      * target component. To alter this preference, a calling app may also supply
4288      * {@link #EXTRA_CHOOSER_REFINEMENT_INTENT_SENDER}.</p>
4289      */
4290     public static final String EXTRA_ALTERNATE_INTENTS = "android.intent.extra.ALTERNATE_INTENTS";
4291 
4292     /**
4293      * A {@link ComponentName ComponentName[]} describing components that should be filtered out
4294      * and omitted from a list of components presented to the user.
4295      *
4296      * <p>When used with {@link #ACTION_CHOOSER}, the chooser will omit any of the components
4297      * in this array if it otherwise would have shown them. Useful for omitting specific targets
4298      * from your own package or other apps from your organization if the idea of sending to those
4299      * targets would be redundant with other app functionality. Filtered components will not
4300      * be able to present targets from an associated <code>ChooserTargetService</code>.</p>
4301      */
4302     public static final String EXTRA_EXCLUDE_COMPONENTS
4303             = "android.intent.extra.EXCLUDE_COMPONENTS";
4304 
4305     /**
4306      * A {@link android.service.chooser.ChooserTarget ChooserTarget[]} for {@link #ACTION_CHOOSER}
4307      * describing additional high-priority deep-link targets for the chooser to present to the user.
4308      *
4309      * <p>Targets provided in this way will be presented inline with all other targets provided
4310      * by services from other apps. They will be prioritized before other service targets, but
4311      * after those targets provided by sources that the user has manually pinned to the front.</p>
4312      *
4313      * @see #ACTION_CHOOSER
4314      */
4315     public static final String EXTRA_CHOOSER_TARGETS = "android.intent.extra.CHOOSER_TARGETS";
4316 
4317     /**
4318      * An {@link IntentSender} for an Activity that will be invoked when the user makes a selection
4319      * from the chooser activity presented by {@link #ACTION_CHOOSER}.
4320      *
4321      * <p>An app preparing an action for another app to complete may wish to allow the user to
4322      * disambiguate between several options for completing the action based on the chosen target
4323      * or otherwise refine the action before it is invoked.
4324      * </p>
4325      *
4326      * <p>When sent, this IntentSender may be filled in with the following extras:</p>
4327      * <ul>
4328      *     <li>{@link #EXTRA_INTENT} The first intent that matched the user's chosen target</li>
4329      *     <li>{@link #EXTRA_ALTERNATE_INTENTS} Any additional intents that also matched the user's
4330      *     chosen target beyond the first</li>
4331      *     <li>{@link #EXTRA_RESULT_RECEIVER} A {@link ResultReceiver} that the refinement activity
4332      *     should fill in and send once the disambiguation is complete</li>
4333      * </ul>
4334      */
4335     public static final String EXTRA_CHOOSER_REFINEMENT_INTENT_SENDER
4336             = "android.intent.extra.CHOOSER_REFINEMENT_INTENT_SENDER";
4337 
4338     /**
4339      * An {@code ArrayList} of {@code String} annotations describing content for
4340      * {@link #ACTION_CHOOSER}.
4341      *
4342      * <p>If {@link #EXTRA_CONTENT_ANNOTATIONS} is present in an intent used to start a
4343      * {@link #ACTION_CHOOSER} activity, the first three annotations will be used to rank apps.</p>
4344      *
4345      * <p>Annotations should describe the major components or topics of the content. It is up to
4346      * apps initiating {@link #ACTION_CHOOSER} to learn and add annotations. Annotations should be
4347      * learned in advance, e.g., when creating or saving content, to avoid increasing latency to
4348      * start {@link #ACTION_CHOOSER}. Names of customized annotations should not contain the colon
4349      * character. Performance on customized annotations can suffer, if they are rarely used for
4350      * {@link #ACTION_CHOOSER} in the past 14 days. Therefore, it is recommended to use the
4351      * following annotations when applicable.</p>
4352      * <ul>
4353      *     <li>"product" represents that the topic of the content is mainly about products, e.g.,
4354      *     health & beauty, and office supplies.</li>
4355      *     <li>"emotion" represents that the topic of the content is mainly about emotions, e.g.,
4356      *     happy, and sad.</li>
4357      *     <li>"person" represents that the topic of the content is mainly about persons, e.g.,
4358      *     face, finger, standing, and walking.</li>
4359      *     <li>"child" represents that the topic of the content is mainly about children, e.g.,
4360      *     child, and baby.</li>
4361      *     <li>"selfie" represents that the topic of the content is mainly about selfies.</li>
4362      *     <li>"crowd" represents that the topic of the content is mainly about crowds.</li>
4363      *     <li>"party" represents that the topic of the content is mainly about parties.</li>
4364      *     <li>"animal" represent that the topic of the content is mainly about animals.</li>
4365      *     <li>"plant" represents that the topic of the content is mainly about plants, e.g.,
4366      *     flowers.</li>
4367      *     <li>"vacation" represents that the topic of the content is mainly about vacations.</li>
4368      *     <li>"fashion" represents that the topic of the content is mainly about fashion, e.g.
4369      *     sunglasses, jewelry, handbags and clothing.</li>
4370      *     <li>"material" represents that the topic of the content is mainly about materials, e.g.,
4371      *     paper, and silk.</li>
4372      *     <li>"vehicle" represents that the topic of the content is mainly about vehicles, like
4373      *     cars, and boats.</li>
4374      *     <li>"document" represents that the topic of the content is mainly about documents, e.g.
4375      *     posters.</li>
4376      *     <li>"design" represents that the topic of the content is mainly about design, e.g. arts
4377      *     and designs of houses.</li>
4378      *     <li>"holiday" represents that the topic of the content is mainly about holidays, e.g.,
4379      *     Christmas and Thanksgiving.</li>
4380      * </ul>
4381      */
4382     public static final String EXTRA_CONTENT_ANNOTATIONS
4383             = "android.intent.extra.CONTENT_ANNOTATIONS";
4384 
4385     /**
4386      * A {@link ResultReceiver} used to return data back to the sender.
4387      *
4388      * <p>Used to complete an app-specific
4389      * {@link #EXTRA_CHOOSER_REFINEMENT_INTENT_SENDER refinement} for {@link #ACTION_CHOOSER}.</p>
4390      *
4391      * <p>If {@link #EXTRA_CHOOSER_REFINEMENT_INTENT_SENDER} is present in the intent
4392      * used to start a {@link #ACTION_CHOOSER} activity this extra will be
4393      * {@link #fillIn(Intent, int) filled in} to that {@link IntentSender} and sent
4394      * when the user selects a target component from the chooser. It is up to the recipient
4395      * to send a result to this ResultReceiver to signal that disambiguation is complete
4396      * and that the chooser should invoke the user's choice.</p>
4397      *
4398      * <p>The disambiguator should provide a Bundle to the ResultReceiver with an intent
4399      * assigned to the key {@link #EXTRA_INTENT}. This supplied intent will be used by the chooser
4400      * to match and fill in the final Intent or ChooserTarget before starting it.
4401      * The supplied intent must {@link #filterEquals(Intent) match} one of the intents from
4402      * {@link #EXTRA_INTENT} or {@link #EXTRA_ALTERNATE_INTENTS} passed to
4403      * {@link #EXTRA_CHOOSER_REFINEMENT_INTENT_SENDER} to be accepted.</p>
4404      *
4405      * <p>The result code passed to the ResultReceiver should be
4406      * {@link android.app.Activity#RESULT_OK} if the refinement succeeded and the supplied intent's
4407      * target in the chooser should be started, or {@link android.app.Activity#RESULT_CANCELED} if
4408      * the chooser should finish without starting a target.</p>
4409      */
4410     public static final String EXTRA_RESULT_RECEIVER
4411             = "android.intent.extra.RESULT_RECEIVER";
4412 
4413     /**
4414      * A CharSequence dialog title to provide to the user when used with a
4415      * {@link #ACTION_CHOOSER}.
4416      */
4417     public static final String EXTRA_TITLE = "android.intent.extra.TITLE";
4418 
4419     /**
4420      * A Parcelable[] of {@link Intent} or
4421      * {@link android.content.pm.LabeledIntent} objects as set with
4422      * {@link #putExtra(String, Parcelable[])} of additional activities to place
4423      * a the front of the list of choices, when shown to the user with a
4424      * {@link #ACTION_CHOOSER}.
4425      */
4426     public static final String EXTRA_INITIAL_INTENTS = "android.intent.extra.INITIAL_INTENTS";
4427 
4428     /**
4429      * A {@link IntentSender} to start after ephemeral installation success.
4430      * @hide
4431      */
4432     public static final String EXTRA_EPHEMERAL_SUCCESS = "android.intent.extra.EPHEMERAL_SUCCESS";
4433 
4434     /**
4435      * A {@link IntentSender} to start after ephemeral installation failure.
4436      * @hide
4437      */
4438     public static final String EXTRA_EPHEMERAL_FAILURE = "android.intent.extra.EPHEMERAL_FAILURE";
4439 
4440     /**
4441      * The host name that triggered an ephemeral resolution.
4442      * @hide
4443      */
4444     public static final String EXTRA_EPHEMERAL_HOSTNAME = "android.intent.extra.EPHEMERAL_HOSTNAME";
4445 
4446     /**
4447      * An opaque token to track ephemeral resolution.
4448      * @hide
4449      */
4450     public static final String EXTRA_EPHEMERAL_TOKEN = "android.intent.extra.EPHEMERAL_TOKEN";
4451 
4452     /**
4453      * The version code of the app to install components from.
4454      * @hide
4455      */
4456     public static final String EXTRA_VERSION_CODE = "android.intent.extra.VERSION_CODE";
4457 
4458     /**
4459      * The app that triggered the ephemeral installation.
4460      * @hide
4461      */
4462     public static final String EXTRA_CALLING_PACKAGE
4463             = "android.intent.extra.CALLING_PACKAGE";
4464 
4465     /**
4466      * Optional calling app provided bundle containing additional launch information the
4467      * installer may use.
4468      * @hide
4469      */
4470     public static final String EXTRA_VERIFICATION_BUNDLE
4471             = "android.intent.extra.VERIFICATION_BUNDLE";
4472 
4473     /**
4474      * A Bundle forming a mapping of potential target package names to different extras Bundles
4475      * to add to the default intent extras in {@link #EXTRA_INTENT} when used with
4476      * {@link #ACTION_CHOOSER}. Each key should be a package name. The package need not
4477      * be currently installed on the device.
4478      *
4479      * <p>An application may choose to provide alternate extras for the case where a user
4480      * selects an activity from a predetermined set of target packages. If the activity
4481      * the user selects from the chooser belongs to a package with its package name as
4482      * a key in this bundle, the corresponding extras for that package will be merged with
4483      * the extras already present in the intent at {@link #EXTRA_INTENT}. If a replacement
4484      * extra has the same key as an extra already present in the intent it will overwrite
4485      * the extra from the intent.</p>
4486      *
4487      * <p><em>Examples:</em>
4488      * <ul>
4489      *     <li>An application may offer different {@link #EXTRA_TEXT} to an application
4490      *     when sharing with it via {@link #ACTION_SEND}, augmenting a link with additional query
4491      *     parameters for that target.</li>
4492      *     <li>An application may offer additional metadata for known targets of a given intent
4493      *     to pass along information only relevant to that target such as account or content
4494      *     identifiers already known to that application.</li>
4495      * </ul></p>
4496      */
4497     public static final String EXTRA_REPLACEMENT_EXTRAS =
4498             "android.intent.extra.REPLACEMENT_EXTRAS";
4499 
4500     /**
4501      * An {@link IntentSender} that will be notified if a user successfully chooses a target
4502      * component to handle an action in an {@link #ACTION_CHOOSER} activity. The IntentSender
4503      * will have the extra {@link #EXTRA_CHOSEN_COMPONENT} appended to it containing the
4504      * {@link ComponentName} of the chosen component.
4505      *
4506      * <p>In some situations this callback may never come, for example if the user abandons
4507      * the chooser, switches to another task or any number of other reasons. Apps should not
4508      * be written assuming that this callback will always occur.</p>
4509      */
4510     public static final String EXTRA_CHOSEN_COMPONENT_INTENT_SENDER =
4511             "android.intent.extra.CHOSEN_COMPONENT_INTENT_SENDER";
4512 
4513     /**
4514      * The {@link ComponentName} chosen by the user to complete an action.
4515      *
4516      * @see #EXTRA_CHOSEN_COMPONENT_INTENT_SENDER
4517      */
4518     public static final String EXTRA_CHOSEN_COMPONENT = "android.intent.extra.CHOSEN_COMPONENT";
4519 
4520     /**
4521      * A {@link android.view.KeyEvent} object containing the event that
4522      * triggered the creation of the Intent it is in.
4523      */
4524     public static final String EXTRA_KEY_EVENT = "android.intent.extra.KEY_EVENT";
4525 
4526     /**
4527      * Set to true in {@link #ACTION_REQUEST_SHUTDOWN} to request confirmation from the user
4528      * before shutting down.
4529      *
4530      * {@hide}
4531      */
4532     public static final String EXTRA_KEY_CONFIRM = "android.intent.extra.KEY_CONFIRM";
4533 
4534     /**
4535      * Set to true in {@link #ACTION_REQUEST_SHUTDOWN} to indicate that the shutdown is
4536      * requested by the user.
4537      *
4538      * {@hide}
4539      */
4540     public static final String EXTRA_USER_REQUESTED_SHUTDOWN =
4541             "android.intent.extra.USER_REQUESTED_SHUTDOWN";
4542 
4543     /**
4544      * Used as a boolean extra field in {@link android.content.Intent#ACTION_PACKAGE_REMOVED} or
4545      * {@link android.content.Intent#ACTION_PACKAGE_CHANGED} intents to override the default action
4546      * of restarting the application.
4547      */
4548     public static final String EXTRA_DONT_KILL_APP = "android.intent.extra.DONT_KILL_APP";
4549 
4550     /**
4551      * A String holding the phone number originally entered in
4552      * {@link android.content.Intent#ACTION_NEW_OUTGOING_CALL}, or the actual
4553      * number to call in a {@link android.content.Intent#ACTION_CALL}.
4554      */
4555     public static final String EXTRA_PHONE_NUMBER = "android.intent.extra.PHONE_NUMBER";
4556 
4557     /**
4558      * Used as an int extra field in {@link android.content.Intent#ACTION_UID_REMOVED}
4559      * intents to supply the uid the package had been assigned.  Also an optional
4560      * extra in {@link android.content.Intent#ACTION_PACKAGE_REMOVED} or
4561      * {@link android.content.Intent#ACTION_PACKAGE_CHANGED} for the same
4562      * purpose.
4563      */
4564     public static final String EXTRA_UID = "android.intent.extra.UID";
4565 
4566     /**
4567      * @hide String array of package names.
4568      */
4569     @SystemApi
4570     public static final String EXTRA_PACKAGES = "android.intent.extra.PACKAGES";
4571 
4572     /**
4573      * Used as a boolean extra field in {@link android.content.Intent#ACTION_PACKAGE_REMOVED}
4574      * intents to indicate whether this represents a full uninstall (removing
4575      * both the code and its data) or a partial uninstall (leaving its data,
4576      * implying that this is an update).
4577      */
4578     public static final String EXTRA_DATA_REMOVED = "android.intent.extra.DATA_REMOVED";
4579 
4580     /**
4581      * @hide
4582      * Used as a boolean extra field in {@link android.content.Intent#ACTION_PACKAGE_REMOVED}
4583      * intents to indicate that at this point the package has been removed for
4584      * all users on the device.
4585      */
4586     public static final String EXTRA_REMOVED_FOR_ALL_USERS
4587             = "android.intent.extra.REMOVED_FOR_ALL_USERS";
4588 
4589     /**
4590      * Used as a boolean extra field in {@link android.content.Intent#ACTION_PACKAGE_REMOVED}
4591      * intents to indicate that this is a replacement of the package, so this
4592      * broadcast will immediately be followed by an add broadcast for a
4593      * different version of the same package.
4594      */
4595     public static final String EXTRA_REPLACING = "android.intent.extra.REPLACING";
4596 
4597     /**
4598      * Used as an int extra field in {@link android.app.AlarmManager} intents
4599      * to tell the application being invoked how many pending alarms are being
4600      * delievered with the intent.  For one-shot alarms this will always be 1.
4601      * For recurring alarms, this might be greater than 1 if the device was
4602      * asleep or powered off at the time an earlier alarm would have been
4603      * delivered.
4604      */
4605     public static final String EXTRA_ALARM_COUNT = "android.intent.extra.ALARM_COUNT";
4606 
4607     /**
4608      * Used as an int extra field in {@link android.content.Intent#ACTION_DOCK_EVENT}
4609      * intents to request the dock state.  Possible values are
4610      * {@link android.content.Intent#EXTRA_DOCK_STATE_UNDOCKED},
4611      * {@link android.content.Intent#EXTRA_DOCK_STATE_DESK}, or
4612      * {@link android.content.Intent#EXTRA_DOCK_STATE_CAR}, or
4613      * {@link android.content.Intent#EXTRA_DOCK_STATE_LE_DESK}, or
4614      * {@link android.content.Intent#EXTRA_DOCK_STATE_HE_DESK}.
4615      */
4616     public static final String EXTRA_DOCK_STATE = "android.intent.extra.DOCK_STATE";
4617 
4618     /**
4619      * Used as an int value for {@link android.content.Intent#EXTRA_DOCK_STATE}
4620      * to represent that the phone is not in any dock.
4621      */
4622     public static final int EXTRA_DOCK_STATE_UNDOCKED = 0;
4623 
4624     /**
4625      * Used as an int value for {@link android.content.Intent#EXTRA_DOCK_STATE}
4626      * to represent that the phone is in a desk dock.
4627      */
4628     public static final int EXTRA_DOCK_STATE_DESK = 1;
4629 
4630     /**
4631      * Used as an int value for {@link android.content.Intent#EXTRA_DOCK_STATE}
4632      * to represent that the phone is in a car dock.
4633      */
4634     public static final int EXTRA_DOCK_STATE_CAR = 2;
4635 
4636     /**
4637      * Used as an int value for {@link android.content.Intent#EXTRA_DOCK_STATE}
4638      * to represent that the phone is in a analog (low end) dock.
4639      */
4640     public static final int EXTRA_DOCK_STATE_LE_DESK = 3;
4641 
4642     /**
4643      * Used as an int value for {@link android.content.Intent#EXTRA_DOCK_STATE}
4644      * to represent that the phone is in a digital (high end) dock.
4645      */
4646     public static final int EXTRA_DOCK_STATE_HE_DESK = 4;
4647 
4648     /**
4649      * Boolean that can be supplied as meta-data with a dock activity, to
4650      * indicate that the dock should take over the home key when it is active.
4651      */
4652     public static final String METADATA_DOCK_HOME = "android.dock_home";
4653 
4654     /**
4655      * Used as a parcelable extra field in {@link #ACTION_APP_ERROR}, containing
4656      * the bug report.
4657      */
4658     public static final String EXTRA_BUG_REPORT = "android.intent.extra.BUG_REPORT";
4659 
4660     /**
4661      * Used in the extra field in the remote intent. It's astring token passed with the
4662      * remote intent.
4663      */
4664     public static final String EXTRA_REMOTE_INTENT_TOKEN =
4665             "android.intent.extra.remote_intent_token";
4666 
4667     /**
4668      * @deprecated See {@link #EXTRA_CHANGED_COMPONENT_NAME_LIST}; this field
4669      * will contain only the first name in the list.
4670      */
4671     @Deprecated public static final String EXTRA_CHANGED_COMPONENT_NAME =
4672             "android.intent.extra.changed_component_name";
4673 
4674     /**
4675      * This field is part of {@link android.content.Intent#ACTION_PACKAGE_CHANGED},
4676      * and contains a string array of all of the components that have changed.  If
4677      * the state of the overall package has changed, then it will contain an entry
4678      * with the package name itself.
4679      */
4680     public static final String EXTRA_CHANGED_COMPONENT_NAME_LIST =
4681             "android.intent.extra.changed_component_name_list";
4682 
4683     /**
4684      * This field is part of
4685      * {@link android.content.Intent#ACTION_EXTERNAL_APPLICATIONS_AVAILABLE},
4686      * {@link android.content.Intent#ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE},
4687      * {@link android.content.Intent#ACTION_PACKAGES_SUSPENDED},
4688      * {@link android.content.Intent#ACTION_PACKAGES_UNSUSPENDED}
4689      * and contains a string array of all of the components that have changed.
4690      */
4691     public static final String EXTRA_CHANGED_PACKAGE_LIST =
4692             "android.intent.extra.changed_package_list";
4693 
4694     /**
4695      * This field is part of
4696      * {@link android.content.Intent#ACTION_EXTERNAL_APPLICATIONS_AVAILABLE},
4697      * {@link android.content.Intent#ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE}
4698      * and contains an integer array of uids of all of the components
4699      * that have changed.
4700      */
4701     public static final String EXTRA_CHANGED_UID_LIST =
4702             "android.intent.extra.changed_uid_list";
4703 
4704     /**
4705      * @hide
4706      * Magic extra system code can use when binding, to give a label for
4707      * who it is that has bound to a service.  This is an integer giving
4708      * a framework string resource that can be displayed to the user.
4709      */
4710     public static final String EXTRA_CLIENT_LABEL =
4711             "android.intent.extra.client_label";
4712 
4713     /**
4714      * @hide
4715      * Magic extra system code can use when binding, to give a PendingIntent object
4716      * that can be launched for the user to disable the system's use of this
4717      * service.
4718      */
4719     public static final String EXTRA_CLIENT_INTENT =
4720             "android.intent.extra.client_intent";
4721 
4722     /**
4723      * Extra used to indicate that an intent should only return data that is on
4724      * the local device. This is a boolean extra; the default is false. If true,
4725      * an implementation should only allow the user to select data that is
4726      * already on the device, not requiring it be downloaded from a remote
4727      * service when opened.
4728      *
4729      * @see #ACTION_GET_CONTENT
4730      * @see #ACTION_OPEN_DOCUMENT
4731      * @see #ACTION_OPEN_DOCUMENT_TREE
4732      * @see #ACTION_CREATE_DOCUMENT
4733      */
4734     public static final String EXTRA_LOCAL_ONLY =
4735             "android.intent.extra.LOCAL_ONLY";
4736 
4737     /**
4738      * Extra used to indicate that an intent can allow the user to select and
4739      * return multiple items. This is a boolean extra; the default is false. If
4740      * true, an implementation is allowed to present the user with a UI where
4741      * they can pick multiple items that are all returned to the caller. When
4742      * this happens, they should be returned as the {@link #getClipData()} part
4743      * of the result Intent.
4744      *
4745      * @see #ACTION_GET_CONTENT
4746      * @see #ACTION_OPEN_DOCUMENT
4747      */
4748     public static final String EXTRA_ALLOW_MULTIPLE =
4749             "android.intent.extra.ALLOW_MULTIPLE";
4750 
4751     /**
4752      * The integer userHandle carried with broadcast intents related to addition, removal and
4753      * switching of users and managed profiles - {@link #ACTION_USER_ADDED},
4754      * {@link #ACTION_USER_REMOVED} and {@link #ACTION_USER_SWITCHED}.
4755      *
4756      * @hide
4757      */
4758     public static final String EXTRA_USER_HANDLE =
4759             "android.intent.extra.user_handle";
4760 
4761     /**
4762      * The UserHandle carried with broadcasts intents related to addition and removal of managed
4763      * profiles - {@link #ACTION_MANAGED_PROFILE_ADDED} and {@link #ACTION_MANAGED_PROFILE_REMOVED}.
4764      */
4765     public static final String EXTRA_USER =
4766             "android.intent.extra.USER";
4767 
4768     /**
4769      * Extra used in the response from a BroadcastReceiver that handles
4770      * {@link #ACTION_GET_RESTRICTION_ENTRIES}. The type of the extra is
4771      * <code>ArrayList&lt;RestrictionEntry&gt;</code>.
4772      */
4773     public static final String EXTRA_RESTRICTIONS_LIST = "android.intent.extra.restrictions_list";
4774 
4775     /**
4776      * Extra sent in the intent to the BroadcastReceiver that handles
4777      * {@link #ACTION_GET_RESTRICTION_ENTRIES}. The type of the extra is a Bundle containing
4778      * the restrictions as key/value pairs.
4779      */
4780     public static final String EXTRA_RESTRICTIONS_BUNDLE =
4781             "android.intent.extra.restrictions_bundle";
4782 
4783     /**
4784      * Extra used in the response from a BroadcastReceiver that handles
4785      * {@link #ACTION_GET_RESTRICTION_ENTRIES}.
4786      */
4787     public static final String EXTRA_RESTRICTIONS_INTENT =
4788             "android.intent.extra.restrictions_intent";
4789 
4790     /**
4791      * Extra used to communicate a set of acceptable MIME types. The type of the
4792      * extra is {@code String[]}. Values may be a combination of concrete MIME
4793      * types (such as "image/png") and/or partial MIME types (such as
4794      * "audio/*").
4795      *
4796      * @see #ACTION_GET_CONTENT
4797      * @see #ACTION_OPEN_DOCUMENT
4798      */
4799     public static final String EXTRA_MIME_TYPES = "android.intent.extra.MIME_TYPES";
4800 
4801     /**
4802      * Optional extra for {@link #ACTION_SHUTDOWN} that allows the sender to qualify that
4803      * this shutdown is only for the user space of the system, not a complete shutdown.
4804      * When this is true, hardware devices can use this information to determine that
4805      * they shouldn't do a complete shutdown of their device since this is not a
4806      * complete shutdown down to the kernel, but only user space restarting.
4807      * The default if not supplied is false.
4808      */
4809     public static final String EXTRA_SHUTDOWN_USERSPACE_ONLY
4810             = "android.intent.extra.SHUTDOWN_USERSPACE_ONLY";
4811 
4812     /**
4813      * Optional int extra for {@link #ACTION_TIME_CHANGED} that indicates the
4814      * user has set their time format preference. See {@link #EXTRA_TIME_PREF_VALUE_USE_12_HOUR},
4815      * {@link #EXTRA_TIME_PREF_VALUE_USE_24_HOUR} and
4816      * {@link #EXTRA_TIME_PREF_VALUE_USE_LOCALE_DEFAULT}. The value must not be negative.
4817      *
4818      * @hide for internal use only.
4819      */
4820     public static final String EXTRA_TIME_PREF_24_HOUR_FORMAT =
4821             "android.intent.extra.TIME_PREF_24_HOUR_FORMAT";
4822     /** @hide */
4823     public static final int EXTRA_TIME_PREF_VALUE_USE_12_HOUR = 0;
4824     /** @hide */
4825     public static final int EXTRA_TIME_PREF_VALUE_USE_24_HOUR = 1;
4826     /** @hide */
4827     public static final int EXTRA_TIME_PREF_VALUE_USE_LOCALE_DEFAULT = 2;
4828 
4829     /** {@hide} */
4830     public static final String EXTRA_REASON = "android.intent.extra.REASON";
4831 
4832     /**
4833      * {@hide}
4834      * This extra will be send together with {@link #ACTION_FACTORY_RESET}
4835      */
4836     public static final String EXTRA_WIPE_EXTERNAL_STORAGE = "android.intent.extra.WIPE_EXTERNAL_STORAGE";
4837 
4838     /**
4839      * {@hide}
4840      * This extra will be set to true when the user choose to wipe the data on eSIM during factory
4841      * reset for the device with eSIM. This extra will be sent together with
4842      * {@link #ACTION_FACTORY_RESET}
4843      */
4844     public static final String EXTRA_WIPE_ESIMS = "com.android.internal.intent.extra.WIPE_ESIMS";
4845 
4846     /**
4847      * Optional {@link android.app.PendingIntent} extra used to deliver the result of the SIM
4848      * activation request.
4849      * TODO: Add information about the structure and response data used with the pending intent.
4850      * @hide
4851      */
4852     public static final String EXTRA_SIM_ACTIVATION_RESPONSE =
4853             "android.intent.extra.SIM_ACTIVATION_RESPONSE";
4854 
4855     /**
4856      * Optional index with semantics depending on the intent action.
4857      *
4858      * <p>The value must be an integer greater or equal to 0.
4859      * @see #ACTION_QUICK_VIEW
4860      */
4861     public static final String EXTRA_INDEX = "android.intent.extra.INDEX";
4862 
4863     /**
4864      * Tells the quick viewer to show additional UI actions suitable for the passed Uris,
4865      * such as opening in other apps, sharing, opening, editing, printing, deleting,
4866      * casting, etc.
4867      *
4868      * <p>The value is boolean. By default false.
4869      * @see #ACTION_QUICK_VIEW
4870      * @removed
4871      */
4872     @Deprecated
4873     public static final String EXTRA_QUICK_VIEW_ADVANCED =
4874             "android.intent.extra.QUICK_VIEW_ADVANCED";
4875 
4876     /**
4877      * An optional extra of {@code String[]} indicating which quick view features should be made
4878      * available to the user in the quick view UI while handing a
4879      * {@link Intent#ACTION_QUICK_VIEW} intent.
4880      * <li>Enumeration of features here is not meant to restrict capabilities of the quick viewer.
4881      * Quick viewer can implement features not listed below.
4882      * <li>Features included at this time are: {@link QuickViewConstants#FEATURE_VIEW},
4883      * {@link QuickViewConstants#FEATURE_EDIT}, {@link QuickViewConstants#FEATURE_DOWNLOAD},
4884      * {@link QuickViewConstants#FEATURE_SEND}, {@link QuickViewConstants#FEATURE_PRINT}.
4885      * <p>
4886      * Requirements:
4887      * <li>Quick viewer shouldn't show a feature if the feature is absent in
4888      * {@link #EXTRA_QUICK_VIEW_FEATURES}.
4889      * <li>When {@link #EXTRA_QUICK_VIEW_FEATURES} is not present, quick viewer should follow
4890      * internal policies.
4891      * <li>Presence of an feature in {@link #EXTRA_QUICK_VIEW_FEATURES}, does not constitute a
4892      * requirement that the feature be shown. Quick viewer may, according to its own policies,
4893      * disable or hide features.
4894      *
4895      * @see #ACTION_QUICK_VIEW
4896      */
4897     public static final String EXTRA_QUICK_VIEW_FEATURES =
4898             "android.intent.extra.QUICK_VIEW_FEATURES";
4899 
4900     /**
4901      * Optional boolean extra indicating whether quiet mode has been switched on or off.
4902      * When a profile goes into quiet mode, all apps in the profile are killed and the
4903      * profile user is stopped. Widgets originating from the profile are masked, and app
4904      * launcher icons are grayed out.
4905      */
4906     public static final String EXTRA_QUIET_MODE = "android.intent.extra.QUIET_MODE";
4907 
4908     /**
4909      * Used as an int extra field in {@link #ACTION_MEDIA_RESOURCE_GRANTED}
4910      * intents to specify the resource type granted. Possible values are
4911      * {@link #EXTRA_MEDIA_RESOURCE_TYPE_VIDEO_CODEC} or
4912      * {@link #EXTRA_MEDIA_RESOURCE_TYPE_AUDIO_CODEC}.
4913      *
4914      * @hide
4915      */
4916     public static final String EXTRA_MEDIA_RESOURCE_TYPE =
4917             "android.intent.extra.MEDIA_RESOURCE_TYPE";
4918 
4919     /**
4920      * Used as a boolean extra field in {@link #ACTION_CHOOSER} intents to specify
4921      * whether to show the chooser or not when there is only one application available
4922      * to choose from.
4923      *
4924      * @hide
4925      */
4926     public static final String EXTRA_AUTO_LAUNCH_SINGLE_CHOICE =
4927             "android.intent.extra.AUTO_LAUNCH_SINGLE_CHOICE";
4928 
4929     /**
4930      * Used as an int value for {@link #EXTRA_MEDIA_RESOURCE_TYPE}
4931      * to represent that a video codec is allowed to use.
4932      *
4933      * @hide
4934      */
4935     public static final int EXTRA_MEDIA_RESOURCE_TYPE_VIDEO_CODEC = 0;
4936 
4937     /**
4938      * Used as an int value for {@link #EXTRA_MEDIA_RESOURCE_TYPE}
4939      * to represent that a audio codec is allowed to use.
4940      *
4941      * @hide
4942      */
4943     public static final int EXTRA_MEDIA_RESOURCE_TYPE_AUDIO_CODEC = 1;
4944 
4945     // ---------------------------------------------------------------------
4946     // ---------------------------------------------------------------------
4947     // Intent flags (see mFlags variable).
4948 
4949     /** @hide */
4950     @IntDef(flag = true, prefix = { "FLAG_GRANT_" }, value = {
4951             FLAG_GRANT_READ_URI_PERMISSION, FLAG_GRANT_WRITE_URI_PERMISSION,
4952             FLAG_GRANT_PERSISTABLE_URI_PERMISSION, FLAG_GRANT_PREFIX_URI_PERMISSION })
4953     @Retention(RetentionPolicy.SOURCE)
4954     public @interface GrantUriMode {}
4955 
4956     /** @hide */
4957     @IntDef(flag = true, prefix = { "FLAG_GRANT_" }, value = {
4958             FLAG_GRANT_READ_URI_PERMISSION, FLAG_GRANT_WRITE_URI_PERMISSION })
4959     @Retention(RetentionPolicy.SOURCE)
4960     public @interface AccessUriMode {}
4961 
4962     /**
4963      * Test if given mode flags specify an access mode, which must be at least
4964      * read and/or write.
4965      *
4966      * @hide
4967      */
isAccessUriMode(int modeFlags)4968     public static boolean isAccessUriMode(int modeFlags) {
4969         return (modeFlags & (Intent.FLAG_GRANT_READ_URI_PERMISSION
4970                 | Intent.FLAG_GRANT_WRITE_URI_PERMISSION)) != 0;
4971     }
4972 
4973     /** @hide */
4974     @IntDef(flag = true, prefix = { "FLAG_" }, value = {
4975             FLAG_GRANT_READ_URI_PERMISSION,
4976             FLAG_GRANT_WRITE_URI_PERMISSION,
4977             FLAG_FROM_BACKGROUND,
4978             FLAG_DEBUG_LOG_RESOLUTION,
4979             FLAG_EXCLUDE_STOPPED_PACKAGES,
4980             FLAG_INCLUDE_STOPPED_PACKAGES,
4981             FLAG_GRANT_PERSISTABLE_URI_PERMISSION,
4982             FLAG_GRANT_PREFIX_URI_PERMISSION,
4983             FLAG_DEBUG_TRIAGED_MISSING,
4984             FLAG_IGNORE_EPHEMERAL,
4985             FLAG_ACTIVITY_NO_HISTORY,
4986             FLAG_ACTIVITY_SINGLE_TOP,
4987             FLAG_ACTIVITY_NEW_TASK,
4988             FLAG_ACTIVITY_MULTIPLE_TASK,
4989             FLAG_ACTIVITY_CLEAR_TOP,
4990             FLAG_ACTIVITY_FORWARD_RESULT,
4991             FLAG_ACTIVITY_PREVIOUS_IS_TOP,
4992             FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS,
4993             FLAG_ACTIVITY_BROUGHT_TO_FRONT,
4994             FLAG_ACTIVITY_RESET_TASK_IF_NEEDED,
4995             FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY,
4996             FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET,
4997             FLAG_ACTIVITY_NEW_DOCUMENT,
4998             FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET,
4999             FLAG_ACTIVITY_NO_USER_ACTION,
5000             FLAG_ACTIVITY_REORDER_TO_FRONT,
5001             FLAG_ACTIVITY_NO_ANIMATION,
5002             FLAG_ACTIVITY_CLEAR_TASK,
5003             FLAG_ACTIVITY_TASK_ON_HOME,
5004             FLAG_ACTIVITY_RETAIN_IN_RECENTS,
5005             FLAG_ACTIVITY_LAUNCH_ADJACENT,
5006             FLAG_RECEIVER_REGISTERED_ONLY,
5007             FLAG_RECEIVER_REPLACE_PENDING,
5008             FLAG_RECEIVER_FOREGROUND,
5009             FLAG_RECEIVER_NO_ABORT,
5010             FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT,
5011             FLAG_RECEIVER_BOOT_UPGRADE,
5012             FLAG_RECEIVER_INCLUDE_BACKGROUND,
5013             FLAG_RECEIVER_EXCLUDE_BACKGROUND,
5014             FLAG_RECEIVER_FROM_SHELL,
5015             FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS,
5016     })
5017     @Retention(RetentionPolicy.SOURCE)
5018     public @interface Flags {}
5019 
5020     /** @hide */
5021     @IntDef(flag = true, prefix = { "FLAG_" }, value = {
5022             FLAG_FROM_BACKGROUND,
5023             FLAG_DEBUG_LOG_RESOLUTION,
5024             FLAG_EXCLUDE_STOPPED_PACKAGES,
5025             FLAG_INCLUDE_STOPPED_PACKAGES,
5026             FLAG_DEBUG_TRIAGED_MISSING,
5027             FLAG_IGNORE_EPHEMERAL,
5028             FLAG_ACTIVITY_NO_HISTORY,
5029             FLAG_ACTIVITY_SINGLE_TOP,
5030             FLAG_ACTIVITY_NEW_TASK,
5031             FLAG_ACTIVITY_MULTIPLE_TASK,
5032             FLAG_ACTIVITY_CLEAR_TOP,
5033             FLAG_ACTIVITY_FORWARD_RESULT,
5034             FLAG_ACTIVITY_PREVIOUS_IS_TOP,
5035             FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS,
5036             FLAG_ACTIVITY_BROUGHT_TO_FRONT,
5037             FLAG_ACTIVITY_RESET_TASK_IF_NEEDED,
5038             FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY,
5039             FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET,
5040             FLAG_ACTIVITY_NEW_DOCUMENT,
5041             FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET,
5042             FLAG_ACTIVITY_NO_USER_ACTION,
5043             FLAG_ACTIVITY_REORDER_TO_FRONT,
5044             FLAG_ACTIVITY_NO_ANIMATION,
5045             FLAG_ACTIVITY_CLEAR_TASK,
5046             FLAG_ACTIVITY_TASK_ON_HOME,
5047             FLAG_ACTIVITY_RETAIN_IN_RECENTS,
5048             FLAG_ACTIVITY_LAUNCH_ADJACENT,
5049             FLAG_RECEIVER_REGISTERED_ONLY,
5050             FLAG_RECEIVER_REPLACE_PENDING,
5051             FLAG_RECEIVER_FOREGROUND,
5052             FLAG_RECEIVER_NO_ABORT,
5053             FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT,
5054             FLAG_RECEIVER_BOOT_UPGRADE,
5055             FLAG_RECEIVER_INCLUDE_BACKGROUND,
5056             FLAG_RECEIVER_EXCLUDE_BACKGROUND,
5057             FLAG_RECEIVER_FROM_SHELL,
5058             FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS,
5059     })
5060     @Retention(RetentionPolicy.SOURCE)
5061     public @interface MutableFlags {}
5062 
5063     /**
5064      * If set, the recipient of this Intent will be granted permission to
5065      * perform read operations on the URI in the Intent's data and any URIs
5066      * specified in its ClipData.  When applying to an Intent's ClipData,
5067      * all URIs as well as recursive traversals through data or other ClipData
5068      * in Intent items will be granted; only the grant flags of the top-level
5069      * Intent are used.
5070      */
5071     public static final int FLAG_GRANT_READ_URI_PERMISSION = 0x00000001;
5072     /**
5073      * If set, the recipient of this Intent will be granted permission to
5074      * perform write operations on the URI in the Intent's data and any URIs
5075      * specified in its ClipData.  When applying to an Intent's ClipData,
5076      * all URIs as well as recursive traversals through data or other ClipData
5077      * in Intent items will be granted; only the grant flags of the top-level
5078      * Intent are used.
5079      */
5080     public static final int FLAG_GRANT_WRITE_URI_PERMISSION = 0x00000002;
5081     /**
5082      * Can be set by the caller to indicate that this Intent is coming from
5083      * a background operation, not from direct user interaction.
5084      */
5085     public static final int FLAG_FROM_BACKGROUND = 0x00000004;
5086     /**
5087      * A flag you can enable for debugging: when set, log messages will be
5088      * printed during the resolution of this intent to show you what has
5089      * been found to create the final resolved list.
5090      */
5091     public static final int FLAG_DEBUG_LOG_RESOLUTION = 0x00000008;
5092     /**
5093      * If set, this intent will not match any components in packages that
5094      * are currently stopped.  If this is not set, then the default behavior
5095      * is to include such applications in the result.
5096      */
5097     public static final int FLAG_EXCLUDE_STOPPED_PACKAGES = 0x00000010;
5098     /**
5099      * If set, this intent will always match any components in packages that
5100      * are currently stopped.  This is the default behavior when
5101      * {@link #FLAG_EXCLUDE_STOPPED_PACKAGES} is not set.  If both of these
5102      * flags are set, this one wins (it allows overriding of exclude for
5103      * places where the framework may automatically set the exclude flag).
5104      */
5105     public static final int FLAG_INCLUDE_STOPPED_PACKAGES = 0x00000020;
5106 
5107     /**
5108      * When combined with {@link #FLAG_GRANT_READ_URI_PERMISSION} and/or
5109      * {@link #FLAG_GRANT_WRITE_URI_PERMISSION}, the URI permission grant can be
5110      * persisted across device reboots until explicitly revoked with
5111      * {@link Context#revokeUriPermission(Uri, int)}. This flag only offers the
5112      * grant for possible persisting; the receiving application must call
5113      * {@link ContentResolver#takePersistableUriPermission(Uri, int)} to
5114      * actually persist.
5115      *
5116      * @see ContentResolver#takePersistableUriPermission(Uri, int)
5117      * @see ContentResolver#releasePersistableUriPermission(Uri, int)
5118      * @see ContentResolver#getPersistedUriPermissions()
5119      * @see ContentResolver#getOutgoingPersistedUriPermissions()
5120      */
5121     public static final int FLAG_GRANT_PERSISTABLE_URI_PERMISSION = 0x00000040;
5122 
5123     /**
5124      * When combined with {@link #FLAG_GRANT_READ_URI_PERMISSION} and/or
5125      * {@link #FLAG_GRANT_WRITE_URI_PERMISSION}, the URI permission grant
5126      * applies to any URI that is a prefix match against the original granted
5127      * URI. (Without this flag, the URI must match exactly for access to be
5128      * granted.) Another URI is considered a prefix match only when scheme,
5129      * authority, and all path segments defined by the prefix are an exact
5130      * match.
5131      */
5132     public static final int FLAG_GRANT_PREFIX_URI_PERMISSION = 0x00000080;
5133 
5134     /**
5135      * Internal flag used to indicate that a system component has done their
5136      * homework and verified that they correctly handle packages and components
5137      * that come and go over time. In particular:
5138      * <ul>
5139      * <li>Apps installed on external storage, which will appear to be
5140      * uninstalled while the the device is ejected.
5141      * <li>Apps with encryption unaware components, which will appear to not
5142      * exist while the device is locked.
5143      * </ul>
5144      *
5145      * @hide
5146      */
5147     public static final int FLAG_DEBUG_TRIAGED_MISSING = 0x00000100;
5148 
5149     /**
5150      * Internal flag used to indicate ephemeral applications should not be
5151      * considered when resolving the intent.
5152      *
5153      * @hide
5154      */
5155     public static final int FLAG_IGNORE_EPHEMERAL = 0x00000200;
5156 
5157     /**
5158      * If set, the new activity is not kept in the history stack.  As soon as
5159      * the user navigates away from it, the activity is finished.  This may also
5160      * be set with the {@link android.R.styleable#AndroidManifestActivity_noHistory
5161      * noHistory} attribute.
5162      *
5163      * <p>If set, {@link android.app.Activity#onActivityResult onActivityResult()}
5164      * is never invoked when the current activity starts a new activity which
5165      * sets a result and finishes.
5166      */
5167     public static final int FLAG_ACTIVITY_NO_HISTORY = 0x40000000;
5168     /**
5169      * If set, the activity will not be launched if it is already running
5170      * at the top of the history stack.
5171      */
5172     public static final int FLAG_ACTIVITY_SINGLE_TOP = 0x20000000;
5173     /**
5174      * If set, this activity will become the start of a new task on this
5175      * history stack.  A task (from the activity that started it to the
5176      * next task activity) defines an atomic group of activities that the
5177      * user can move to.  Tasks can be moved to the foreground and background;
5178      * all of the activities inside of a particular task always remain in
5179      * the same order.  See
5180      * <a href="{@docRoot}guide/topics/fundamentals/tasks-and-back-stack.html">Tasks and Back
5181      * Stack</a> for more information about tasks.
5182      *
5183      * <p>This flag is generally used by activities that want
5184      * to present a "launcher" style behavior: they give the user a list of
5185      * separate things that can be done, which otherwise run completely
5186      * independently of the activity launching them.
5187      *
5188      * <p>When using this flag, if a task is already running for the activity
5189      * you are now starting, then a new activity will not be started; instead,
5190      * the current task will simply be brought to the front of the screen with
5191      * the state it was last in.  See {@link #FLAG_ACTIVITY_MULTIPLE_TASK} for a flag
5192      * to disable this behavior.
5193      *
5194      * <p>This flag can not be used when the caller is requesting a result from
5195      * the activity being launched.
5196      */
5197     public static final int FLAG_ACTIVITY_NEW_TASK = 0x10000000;
5198     /**
5199      * This flag is used to create a new task and launch an activity into it.
5200      * This flag is always paired with either {@link #FLAG_ACTIVITY_NEW_DOCUMENT}
5201      * or {@link #FLAG_ACTIVITY_NEW_TASK}. In both cases these flags alone would
5202      * search through existing tasks for ones matching this Intent. Only if no such
5203      * task is found would a new task be created. When paired with
5204      * FLAG_ACTIVITY_MULTIPLE_TASK both of these behaviors are modified to skip
5205      * the search for a matching task and unconditionally start a new task.
5206      *
5207      * <strong>When used with {@link #FLAG_ACTIVITY_NEW_TASK} do not use this
5208      * flag unless you are implementing your own
5209      * top-level application launcher.</strong>  Used in conjunction with
5210      * {@link #FLAG_ACTIVITY_NEW_TASK} to disable the
5211      * behavior of bringing an existing task to the foreground.  When set,
5212      * a new task is <em>always</em> started to host the Activity for the
5213      * Intent, regardless of whether there is already an existing task running
5214      * the same thing.
5215      *
5216      * <p><strong>Because the default system does not include graphical task management,
5217      * you should not use this flag unless you provide some way for a user to
5218      * return back to the tasks you have launched.</strong>
5219      *
5220      * See {@link #FLAG_ACTIVITY_NEW_DOCUMENT} for details of this flag's use for
5221      * creating new document tasks.
5222      *
5223      * <p>This flag is ignored if one of {@link #FLAG_ACTIVITY_NEW_TASK} or
5224      * {@link #FLAG_ACTIVITY_NEW_DOCUMENT} is not also set.
5225      *
5226      * <p>See
5227      * <a href="{@docRoot}guide/topics/fundamentals/tasks-and-back-stack.html">Tasks and Back
5228      * Stack</a> for more information about tasks.
5229      *
5230      * @see #FLAG_ACTIVITY_NEW_DOCUMENT
5231      * @see #FLAG_ACTIVITY_NEW_TASK
5232      */
5233     public static final int FLAG_ACTIVITY_MULTIPLE_TASK = 0x08000000;
5234     /**
5235      * If set, and the activity being launched is already running in the
5236      * current task, then instead of launching a new instance of that activity,
5237      * all of the other activities on top of it will be closed and this Intent
5238      * will be delivered to the (now on top) old activity as a new Intent.
5239      *
5240      * <p>For example, consider a task consisting of the activities: A, B, C, D.
5241      * If D calls startActivity() with an Intent that resolves to the component
5242      * of activity B, then C and D will be finished and B receive the given
5243      * Intent, resulting in the stack now being: A, B.
5244      *
5245      * <p>The currently running instance of activity B in the above example will
5246      * either receive the new intent you are starting here in its
5247      * onNewIntent() method, or be itself finished and restarted with the
5248      * new intent.  If it has declared its launch mode to be "multiple" (the
5249      * default) and you have not set {@link #FLAG_ACTIVITY_SINGLE_TOP} in
5250      * the same intent, then it will be finished and re-created; for all other
5251      * launch modes or if {@link #FLAG_ACTIVITY_SINGLE_TOP} is set then this
5252      * Intent will be delivered to the current instance's onNewIntent().
5253      *
5254      * <p>This launch mode can also be used to good effect in conjunction with
5255      * {@link #FLAG_ACTIVITY_NEW_TASK}: if used to start the root activity
5256      * of a task, it will bring any currently running instance of that task
5257      * to the foreground, and then clear it to its root state.  This is
5258      * especially useful, for example, when launching an activity from the
5259      * notification manager.
5260      *
5261      * <p>See
5262      * <a href="{@docRoot}guide/topics/fundamentals/tasks-and-back-stack.html">Tasks and Back
5263      * Stack</a> for more information about tasks.
5264      */
5265     public static final int FLAG_ACTIVITY_CLEAR_TOP = 0x04000000;
5266     /**
5267      * If set and this intent is being used to launch a new activity from an
5268      * existing one, then the reply target of the existing activity will be
5269      * transfered to the new activity.  This way the new activity can call
5270      * {@link android.app.Activity#setResult} and have that result sent back to
5271      * the reply target of the original activity.
5272      */
5273     public static final int FLAG_ACTIVITY_FORWARD_RESULT = 0x02000000;
5274     /**
5275      * If set and this intent is being used to launch a new activity from an
5276      * existing one, the current activity will not be counted as the top
5277      * activity for deciding whether the new intent should be delivered to
5278      * the top instead of starting a new one.  The previous activity will
5279      * be used as the top, with the assumption being that the current activity
5280      * will finish itself immediately.
5281      */
5282     public static final int FLAG_ACTIVITY_PREVIOUS_IS_TOP = 0x01000000;
5283     /**
5284      * If set, the new activity is not kept in the list of recently launched
5285      * activities.
5286      */
5287     public static final int FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS = 0x00800000;
5288     /**
5289      * This flag is not normally set by application code, but set for you by
5290      * the system as described in the
5291      * {@link android.R.styleable#AndroidManifestActivity_launchMode
5292      * launchMode} documentation for the singleTask mode.
5293      */
5294     public static final int FLAG_ACTIVITY_BROUGHT_TO_FRONT = 0x00400000;
5295     /**
5296      * If set, and this activity is either being started in a new task or
5297      * bringing to the top an existing task, then it will be launched as
5298      * the front door of the task.  This will result in the application of
5299      * any affinities needed to have that task in the proper state (either
5300      * moving activities to or from it), or simply resetting that task to
5301      * its initial state if needed.
5302      */
5303     public static final int FLAG_ACTIVITY_RESET_TASK_IF_NEEDED = 0x00200000;
5304     /**
5305      * This flag is not normally set by application code, but set for you by
5306      * the system if this activity is being launched from history
5307      * (longpress home key).
5308      */
5309     public static final int FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY = 0x00100000;
5310     /**
5311      * @deprecated As of API 21 this performs identically to
5312      * {@link #FLAG_ACTIVITY_NEW_DOCUMENT} which should be used instead of this.
5313      */
5314     @Deprecated
5315     public static final int FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET = 0x00080000;
5316     /**
5317      * This flag is used to open a document into a new task rooted at the activity launched
5318      * by this Intent. Through the use of this flag, or its equivalent attribute,
5319      * {@link android.R.attr#documentLaunchMode} multiple instances of the same activity
5320      * containing different documents will appear in the recent tasks list.
5321      *
5322      * <p>The use of the activity attribute form of this,
5323      * {@link android.R.attr#documentLaunchMode}, is
5324      * preferred over the Intent flag described here. The attribute form allows the
5325      * Activity to specify multiple document behavior for all launchers of the Activity
5326      * whereas using this flag requires each Intent that launches the Activity to specify it.
5327      *
5328      * <p>Note that the default semantics of this flag w.r.t. whether the recents entry for
5329      * it is kept after the activity is finished is different than the use of
5330      * {@link #FLAG_ACTIVITY_NEW_TASK} and {@link android.R.attr#documentLaunchMode} -- if
5331      * this flag is being used to create a new recents entry, then by default that entry
5332      * will be removed once the activity is finished.  You can modify this behavior with
5333      * {@link #FLAG_ACTIVITY_RETAIN_IN_RECENTS}.
5334      *
5335      * <p>FLAG_ACTIVITY_NEW_DOCUMENT may be used in conjunction with {@link
5336      * #FLAG_ACTIVITY_MULTIPLE_TASK}. When used alone it is the
5337      * equivalent of the Activity manifest specifying {@link
5338      * android.R.attr#documentLaunchMode}="intoExisting". When used with
5339      * FLAG_ACTIVITY_MULTIPLE_TASK it is the equivalent of the Activity manifest specifying
5340      * {@link android.R.attr#documentLaunchMode}="always".
5341      *
5342      * Refer to {@link android.R.attr#documentLaunchMode} for more information.
5343      *
5344      * @see android.R.attr#documentLaunchMode
5345      * @see #FLAG_ACTIVITY_MULTIPLE_TASK
5346      */
5347     public static final int FLAG_ACTIVITY_NEW_DOCUMENT = FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET;
5348     /**
5349      * If set, this flag will prevent the normal {@link android.app.Activity#onUserLeaveHint}
5350      * callback from occurring on the current frontmost activity before it is
5351      * paused as the newly-started activity is brought to the front.
5352      *
5353      * <p>Typically, an activity can rely on that callback to indicate that an
5354      * explicit user action has caused their activity to be moved out of the
5355      * foreground. The callback marks an appropriate point in the activity's
5356      * lifecycle for it to dismiss any notifications that it intends to display
5357      * "until the user has seen them," such as a blinking LED.
5358      *
5359      * <p>If an activity is ever started via any non-user-driven events such as
5360      * phone-call receipt or an alarm handler, this flag should be passed to {@link
5361      * Context#startActivity Context.startActivity}, ensuring that the pausing
5362      * activity does not think the user has acknowledged its notification.
5363      */
5364     public static final int FLAG_ACTIVITY_NO_USER_ACTION = 0x00040000;
5365     /**
5366      * If set in an Intent passed to {@link Context#startActivity Context.startActivity()},
5367      * this flag will cause the launched activity to be brought to the front of its
5368      * task's history stack if it is already running.
5369      *
5370      * <p>For example, consider a task consisting of four activities: A, B, C, D.
5371      * If D calls startActivity() with an Intent that resolves to the component
5372      * of activity B, then B will be brought to the front of the history stack,
5373      * with this resulting order:  A, C, D, B.
5374      *
5375      * This flag will be ignored if {@link #FLAG_ACTIVITY_CLEAR_TOP} is also
5376      * specified.
5377      */
5378     public static final int FLAG_ACTIVITY_REORDER_TO_FRONT = 0X00020000;
5379     /**
5380      * If set in an Intent passed to {@link Context#startActivity Context.startActivity()},
5381      * this flag will prevent the system from applying an activity transition
5382      * animation to go to the next activity state.  This doesn't mean an
5383      * animation will never run -- if another activity change happens that doesn't
5384      * specify this flag before the activity started here is displayed, then
5385      * that transition will be used.  This flag can be put to good use
5386      * when you are going to do a series of activity operations but the
5387      * animation seen by the user shouldn't be driven by the first activity
5388      * change but rather a later one.
5389      */
5390     public static final int FLAG_ACTIVITY_NO_ANIMATION = 0X00010000;
5391     /**
5392      * If set in an Intent passed to {@link Context#startActivity Context.startActivity()},
5393      * this flag will cause any existing task that would be associated with the
5394      * activity to be cleared before the activity is started.  That is, the activity
5395      * becomes the new root of an otherwise empty task, and any old activities
5396      * are finished.  This can only be used in conjunction with {@link #FLAG_ACTIVITY_NEW_TASK}.
5397      */
5398     public static final int FLAG_ACTIVITY_CLEAR_TASK = 0X00008000;
5399     /**
5400      * If set in an Intent passed to {@link Context#startActivity Context.startActivity()},
5401      * this flag will cause a newly launching task to be placed on top of the current
5402      * home activity task (if there is one).  That is, pressing back from the task
5403      * will always return the user to home even if that was not the last activity they
5404      * saw.   This can only be used in conjunction with {@link #FLAG_ACTIVITY_NEW_TASK}.
5405      */
5406     public static final int FLAG_ACTIVITY_TASK_ON_HOME = 0X00004000;
5407     /**
5408      * By default a document created by {@link #FLAG_ACTIVITY_NEW_DOCUMENT} will
5409      * have its entry in recent tasks removed when the user closes it (with back
5410      * or however else it may finish()). If you would like to instead allow the
5411      * document to be kept in recents so that it can be re-launched, you can use
5412      * this flag. When set and the task's activity is finished, the recents
5413      * entry will remain in the interface for the user to re-launch it, like a
5414      * recents entry for a top-level application.
5415      * <p>
5416      * The receiving activity can override this request with
5417      * {@link android.R.attr#autoRemoveFromRecents} or by explcitly calling
5418      * {@link android.app.Activity#finishAndRemoveTask()
5419      * Activity.finishAndRemoveTask()}.
5420      */
5421     public static final int FLAG_ACTIVITY_RETAIN_IN_RECENTS = 0x00002000;
5422 
5423     /**
5424      * This flag is only used in split-screen multi-window mode. The new activity will be displayed
5425      * adjacent to the one launching it. This can only be used in conjunction with
5426      * {@link #FLAG_ACTIVITY_NEW_TASK}. Also, setting {@link #FLAG_ACTIVITY_MULTIPLE_TASK} is
5427      * required if you want a new instance of an existing activity to be created.
5428      */
5429     public static final int FLAG_ACTIVITY_LAUNCH_ADJACENT = 0x00001000;
5430 
5431     /**
5432      * If set, when sending a broadcast only registered receivers will be
5433      * called -- no BroadcastReceiver components will be launched.
5434      */
5435     public static final int FLAG_RECEIVER_REGISTERED_ONLY = 0x40000000;
5436     /**
5437      * If set, when sending a broadcast the new broadcast will replace
5438      * any existing pending broadcast that matches it.  Matching is defined
5439      * by {@link Intent#filterEquals(Intent) Intent.filterEquals} returning
5440      * true for the intents of the two broadcasts.  When a match is found,
5441      * the new broadcast (and receivers associated with it) will replace the
5442      * existing one in the pending broadcast list, remaining at the same
5443      * position in the list.
5444      *
5445      * <p>This flag is most typically used with sticky broadcasts, which
5446      * only care about delivering the most recent values of the broadcast
5447      * to their receivers.
5448      */
5449     public static final int FLAG_RECEIVER_REPLACE_PENDING = 0x20000000;
5450     /**
5451      * If set, when sending a broadcast the recipient is allowed to run at
5452      * foreground priority, with a shorter timeout interval.  During normal
5453      * broadcasts the receivers are not automatically hoisted out of the
5454      * background priority class.
5455      */
5456     public static final int FLAG_RECEIVER_FOREGROUND = 0x10000000;
5457     /**
5458      * If this is an ordered broadcast, don't allow receivers to abort the broadcast.
5459      * They can still propagate results through to later receivers, but they can not prevent
5460      * later receivers from seeing the broadcast.
5461      */
5462     public static final int FLAG_RECEIVER_NO_ABORT = 0x08000000;
5463     /**
5464      * If set, when sending a broadcast <i>before boot has completed</i> only
5465      * registered receivers will be called -- no BroadcastReceiver components
5466      * will be launched.  Sticky intent state will be recorded properly even
5467      * if no receivers wind up being called.  If {@link #FLAG_RECEIVER_REGISTERED_ONLY}
5468      * is specified in the broadcast intent, this flag is unnecessary.
5469      *
5470      * <p>This flag is only for use by system sevices as a convenience to
5471      * avoid having to implement a more complex mechanism around detection
5472      * of boot completion.
5473      *
5474      * @hide
5475      */
5476     public static final int FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT = 0x04000000;
5477     /**
5478      * Set when this broadcast is for a boot upgrade, a special mode that
5479      * allows the broadcast to be sent before the system is ready and launches
5480      * the app process with no providers running in it.
5481      * @hide
5482      */
5483     public static final int FLAG_RECEIVER_BOOT_UPGRADE = 0x02000000;
5484     /**
5485      * If set, the broadcast will always go to manifest receivers in background (cached
5486      * or not running) apps, regardless of whether that would be done by default.  By
5487      * default they will only receive broadcasts if the broadcast has specified an
5488      * explicit component or package name.
5489      *
5490      * NOTE: dumpstate uses this flag numerically, so when its value is changed
5491      * the broadcast code there must also be changed to match.
5492      *
5493      * @hide
5494      */
5495     public static final int FLAG_RECEIVER_INCLUDE_BACKGROUND = 0x01000000;
5496     /**
5497      * If set, the broadcast will never go to manifest receivers in background (cached
5498      * or not running) apps, regardless of whether that would be done by default.  By
5499      * default they will receive broadcasts if the broadcast has specified an
5500      * explicit component or package name.
5501      * @hide
5502      */
5503     public static final int FLAG_RECEIVER_EXCLUDE_BACKGROUND = 0x00800000;
5504     /**
5505      * If set, this broadcast is being sent from the shell.
5506      * @hide
5507      */
5508     public static final int FLAG_RECEIVER_FROM_SHELL = 0x00400000;
5509 
5510     /**
5511      * If set, the broadcast will be visible to receivers in Instant Apps. By default Instant Apps
5512      * will not receive broadcasts.
5513      *
5514      * <em>This flag has no effect when used by an Instant App.</em>
5515      */
5516     public static final int FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS = 0x00200000;
5517 
5518     /**
5519      * @hide Flags that can't be changed with PendingIntent.
5520      */
5521     public static final int IMMUTABLE_FLAGS = FLAG_GRANT_READ_URI_PERMISSION
5522             | FLAG_GRANT_WRITE_URI_PERMISSION | FLAG_GRANT_PERSISTABLE_URI_PERMISSION
5523             | FLAG_GRANT_PREFIX_URI_PERMISSION;
5524 
5525     // ---------------------------------------------------------------------
5526     // ---------------------------------------------------------------------
5527     // toUri() and parseUri() options.
5528 
5529     /** @hide */
5530     @IntDef(flag = true, prefix = { "URI_" }, value = {
5531             URI_ALLOW_UNSAFE,
5532             URI_ANDROID_APP_SCHEME,
5533             URI_INTENT_SCHEME,
5534     })
5535     @Retention(RetentionPolicy.SOURCE)
5536     public @interface UriFlags {}
5537 
5538     /**
5539      * Flag for use with {@link #toUri} and {@link #parseUri}: the URI string
5540      * always has the "intent:" scheme.  This syntax can be used when you want
5541      * to later disambiguate between URIs that are intended to describe an
5542      * Intent vs. all others that should be treated as raw URIs.  When used
5543      * with {@link #parseUri}, any other scheme will result in a generic
5544      * VIEW action for that raw URI.
5545      */
5546     public static final int URI_INTENT_SCHEME = 1<<0;
5547 
5548     /**
5549      * Flag for use with {@link #toUri} and {@link #parseUri}: the URI string
5550      * always has the "android-app:" scheme.  This is a variation of
5551      * {@link #URI_INTENT_SCHEME} whose format is simpler for the case of an
5552      * http/https URI being delivered to a specific package name.  The format
5553      * is:
5554      *
5555      * <pre class="prettyprint">
5556      * android-app://{package_id}[/{scheme}[/{host}[/{path}]]][#Intent;{...}]</pre>
5557      *
5558      * <p>In this scheme, only the <code>package_id</code> is required.  If you include a host,
5559      * you must also include a scheme; including a path also requires both a host and a scheme.
5560      * The final #Intent; fragment can be used without a scheme, host, or path.
5561      * Note that this can not be
5562      * used with intents that have a {@link #setSelector}, since the base intent
5563      * will always have an explicit package name.</p>
5564      *
5565      * <p>Some examples of how this scheme maps to Intent objects:</p>
5566      * <table border="2" width="85%" align="center" frame="hsides" rules="rows">
5567      *     <colgroup align="left" />
5568      *     <colgroup align="left" />
5569      *     <thead>
5570      *     <tr><th>URI</th> <th>Intent</th></tr>
5571      *     </thead>
5572      *
5573      *     <tbody>
5574      *     <tr><td><code>android-app://com.example.app</code></td>
5575      *         <td><table style="margin:0;border:0;cellpadding:0;cellspacing:0">
5576      *             <tr><td>Action: </td><td>{@link #ACTION_MAIN}</td></tr>
5577      *             <tr><td>Package: </td><td><code>com.example.app</code></td></tr>
5578      *         </table></td>
5579      *     </tr>
5580      *     <tr><td><code>android-app://com.example.app/http/example.com</code></td>
5581      *         <td><table style="margin:0;border:0;cellpadding:0;cellspacing:0">
5582      *             <tr><td>Action: </td><td>{@link #ACTION_VIEW}</td></tr>
5583      *             <tr><td>Data: </td><td><code>http://example.com/</code></td></tr>
5584      *             <tr><td>Package: </td><td><code>com.example.app</code></td></tr>
5585      *         </table></td>
5586      *     </tr>
5587      *     <tr><td><code>android-app://com.example.app/http/example.com/foo?1234</code></td>
5588      *         <td><table style="margin:0;border:0;cellpadding:0;cellspacing:0">
5589      *             <tr><td>Action: </td><td>{@link #ACTION_VIEW}</td></tr>
5590      *             <tr><td>Data: </td><td><code>http://example.com/foo?1234</code></td></tr>
5591      *             <tr><td>Package: </td><td><code>com.example.app</code></td></tr>
5592      *         </table></td>
5593      *     </tr>
5594      *     <tr><td><code>android-app://com.example.app/<br />#Intent;action=com.example.MY_ACTION;end</code></td>
5595      *         <td><table style="margin:0;border:0;cellpadding:0;cellspacing:0">
5596      *             <tr><td>Action: </td><td><code>com.example.MY_ACTION</code></td></tr>
5597      *             <tr><td>Package: </td><td><code>com.example.app</code></td></tr>
5598      *         </table></td>
5599      *     </tr>
5600      *     <tr><td><code>android-app://com.example.app/http/example.com/foo?1234<br />#Intent;action=com.example.MY_ACTION;end</code></td>
5601      *         <td><table style="margin:0;border:0;cellpadding:0;cellspacing:0">
5602      *             <tr><td>Action: </td><td><code>com.example.MY_ACTION</code></td></tr>
5603      *             <tr><td>Data: </td><td><code>http://example.com/foo?1234</code></td></tr>
5604      *             <tr><td>Package: </td><td><code>com.example.app</code></td></tr>
5605      *         </table></td>
5606      *     </tr>
5607      *     <tr><td><code>android-app://com.example.app/<br />#Intent;action=com.example.MY_ACTION;<br />i.some_int=100;S.some_str=hello;end</code></td>
5608      *         <td><table border="" style="margin:0" >
5609      *             <tr><td>Action: </td><td><code>com.example.MY_ACTION</code></td></tr>
5610      *             <tr><td>Package: </td><td><code>com.example.app</code></td></tr>
5611      *             <tr><td>Extras: </td><td><code>some_int=(int)100<br />some_str=(String)hello</code></td></tr>
5612      *         </table></td>
5613      *     </tr>
5614      *     </tbody>
5615      * </table>
5616      */
5617     public static final int URI_ANDROID_APP_SCHEME = 1<<1;
5618 
5619     /**
5620      * Flag for use with {@link #toUri} and {@link #parseUri}: allow parsing
5621      * of unsafe information.  In particular, the flags {@link #FLAG_GRANT_READ_URI_PERMISSION},
5622      * {@link #FLAG_GRANT_WRITE_URI_PERMISSION}, {@link #FLAG_GRANT_PERSISTABLE_URI_PERMISSION},
5623      * and {@link #FLAG_GRANT_PREFIX_URI_PERMISSION} flags can not be set, so that the
5624      * generated Intent can not cause unexpected data access to happen.
5625      *
5626      * <p>If you do not trust the source of the URI being parsed, you should still do further
5627      * processing to protect yourself from it.  In particular, when using it to start an
5628      * activity you should usually add in {@link #CATEGORY_BROWSABLE} to limit the activities
5629      * that can handle it.</p>
5630      */
5631     public static final int URI_ALLOW_UNSAFE = 1<<2;
5632 
5633     // ---------------------------------------------------------------------
5634 
5635     private String mAction;
5636     private Uri mData;
5637     private String mType;
5638     private String mPackage;
5639     private ComponentName mComponent;
5640     private int mFlags;
5641     private ArraySet<String> mCategories;
5642     private Bundle mExtras;
5643     private Rect mSourceBounds;
5644     private Intent mSelector;
5645     private ClipData mClipData;
5646     private int mContentUserHint = UserHandle.USER_CURRENT;
5647     /** Token to track instant app launches. Local only; do not copy cross-process. */
5648     private String mLaunchToken;
5649 
5650     // ---------------------------------------------------------------------
5651 
5652     private static final int COPY_MODE_ALL = 0;
5653     private static final int COPY_MODE_FILTER = 1;
5654     private static final int COPY_MODE_HISTORY = 2;
5655 
5656     /** @hide */
5657     @IntDef(value = {COPY_MODE_ALL, COPY_MODE_FILTER, COPY_MODE_HISTORY})
5658     @Retention(RetentionPolicy.SOURCE)
5659     public @interface CopyMode {}
5660 
5661 
5662     /**
5663      * Create an empty intent.
5664      */
Intent()5665     public Intent() {
5666     }
5667 
5668     /**
5669      * Copy constructor.
5670      */
Intent(Intent o)5671     public Intent(Intent o) {
5672         this(o, COPY_MODE_ALL);
5673     }
5674 
Intent(Intent o, @CopyMode int copyMode)5675     private Intent(Intent o, @CopyMode int copyMode) {
5676         this.mAction = o.mAction;
5677         this.mData = o.mData;
5678         this.mType = o.mType;
5679         this.mPackage = o.mPackage;
5680         this.mComponent = o.mComponent;
5681 
5682         if (o.mCategories != null) {
5683             this.mCategories = new ArraySet<>(o.mCategories);
5684         }
5685 
5686         if (copyMode != COPY_MODE_FILTER) {
5687             this.mFlags = o.mFlags;
5688             this.mContentUserHint = o.mContentUserHint;
5689             this.mLaunchToken = o.mLaunchToken;
5690             if (o.mSourceBounds != null) {
5691                 this.mSourceBounds = new Rect(o.mSourceBounds);
5692             }
5693             if (o.mSelector != null) {
5694                 this.mSelector = new Intent(o.mSelector);
5695             }
5696 
5697             if (copyMode != COPY_MODE_HISTORY) {
5698                 if (o.mExtras != null) {
5699                     this.mExtras = new Bundle(o.mExtras);
5700                 }
5701                 if (o.mClipData != null) {
5702                     this.mClipData = new ClipData(o.mClipData);
5703                 }
5704             } else {
5705                 if (o.mExtras != null && !o.mExtras.maybeIsEmpty()) {
5706                     this.mExtras = Bundle.STRIPPED;
5707                 }
5708 
5709                 // Also set "stripped" clip data when we ever log mClipData in the (broadcast)
5710                 // history.
5711             }
5712         }
5713     }
5714 
5715     @Override
clone()5716     public Object clone() {
5717         return new Intent(this);
5718     }
5719 
5720     /**
5721      * Make a clone of only the parts of the Intent that are relevant for
5722      * filter matching: the action, data, type, component, and categories.
5723      */
cloneFilter()5724     public @NonNull Intent cloneFilter() {
5725         return new Intent(this, COPY_MODE_FILTER);
5726     }
5727 
5728     /**
5729      * Create an intent with a given action.  All other fields (data, type,
5730      * class) are null.  Note that the action <em>must</em> be in a
5731      * namespace because Intents are used globally in the system -- for
5732      * example the system VIEW action is android.intent.action.VIEW; an
5733      * application's custom action would be something like
5734      * com.google.app.myapp.CUSTOM_ACTION.
5735      *
5736      * @param action The Intent action, such as ACTION_VIEW.
5737      */
Intent(String action)5738     public Intent(String action) {
5739         setAction(action);
5740     }
5741 
5742     /**
5743      * Create an intent with a given action and for a given data url.  Note
5744      * that the action <em>must</em> be in a namespace because Intents are
5745      * used globally in the system -- for example the system VIEW action is
5746      * android.intent.action.VIEW; an application's custom action would be
5747      * something like com.google.app.myapp.CUSTOM_ACTION.
5748      *
5749      * <p><em>Note: scheme and host name matching in the Android framework is
5750      * case-sensitive, unlike the formal RFC.  As a result,
5751      * you should always ensure that you write your Uri with these elements
5752      * using lower case letters, and normalize any Uris you receive from
5753      * outside of Android to ensure the scheme and host is lower case.</em></p>
5754      *
5755      * @param action The Intent action, such as ACTION_VIEW.
5756      * @param uri The Intent data URI.
5757      */
Intent(String action, Uri uri)5758     public Intent(String action, Uri uri) {
5759         setAction(action);
5760         mData = uri;
5761     }
5762 
5763     /**
5764      * Create an intent for a specific component.  All other fields (action, data,
5765      * type, class) are null, though they can be modified later with explicit
5766      * calls.  This provides a convenient way to create an intent that is
5767      * intended to execute a hard-coded class name, rather than relying on the
5768      * system to find an appropriate class for you; see {@link #setComponent}
5769      * for more information on the repercussions of this.
5770      *
5771      * @param packageContext A Context of the application package implementing
5772      * this class.
5773      * @param cls The component class that is to be used for the intent.
5774      *
5775      * @see #setClass
5776      * @see #setComponent
5777      * @see #Intent(String, android.net.Uri , Context, Class)
5778      */
Intent(Context packageContext, Class<?> cls)5779     public Intent(Context packageContext, Class<?> cls) {
5780         mComponent = new ComponentName(packageContext, cls);
5781     }
5782 
5783     /**
5784      * Create an intent for a specific component with a specified action and data.
5785      * This is equivalent to using {@link #Intent(String, android.net.Uri)} to
5786      * construct the Intent and then calling {@link #setClass} to set its
5787      * class.
5788      *
5789      * <p><em>Note: scheme and host name matching in the Android framework is
5790      * case-sensitive, unlike the formal RFC.  As a result,
5791      * you should always ensure that you write your Uri with these elements
5792      * using lower case letters, and normalize any Uris you receive from
5793      * outside of Android to ensure the scheme and host is lower case.</em></p>
5794      *
5795      * @param action The Intent action, such as ACTION_VIEW.
5796      * @param uri The Intent data URI.
5797      * @param packageContext A Context of the application package implementing
5798      * this class.
5799      * @param cls The component class that is to be used for the intent.
5800      *
5801      * @see #Intent(String, android.net.Uri)
5802      * @see #Intent(Context, Class)
5803      * @see #setClass
5804      * @see #setComponent
5805      */
Intent(String action, Uri uri, Context packageContext, Class<?> cls)5806     public Intent(String action, Uri uri,
5807             Context packageContext, Class<?> cls) {
5808         setAction(action);
5809         mData = uri;
5810         mComponent = new ComponentName(packageContext, cls);
5811     }
5812 
5813     /**
5814      * Create an intent to launch the main (root) activity of a task.  This
5815      * is the Intent that is started when the application's is launched from
5816      * Home.  For anything else that wants to launch an application in the
5817      * same way, it is important that they use an Intent structured the same
5818      * way, and can use this function to ensure this is the case.
5819      *
5820      * <p>The returned Intent has the given Activity component as its explicit
5821      * component, {@link #ACTION_MAIN} as its action, and includes the
5822      * category {@link #CATEGORY_LAUNCHER}.  This does <em>not</em> have
5823      * {@link #FLAG_ACTIVITY_NEW_TASK} set, though typically you will want
5824      * to do that through {@link #addFlags(int)} on the returned Intent.
5825      *
5826      * @param mainActivity The main activity component that this Intent will
5827      * launch.
5828      * @return Returns a newly created Intent that can be used to launch the
5829      * activity as a main application entry.
5830      *
5831      * @see #setClass
5832      * @see #setComponent
5833      */
makeMainActivity(ComponentName mainActivity)5834     public static Intent makeMainActivity(ComponentName mainActivity) {
5835         Intent intent = new Intent(ACTION_MAIN);
5836         intent.setComponent(mainActivity);
5837         intent.addCategory(CATEGORY_LAUNCHER);
5838         return intent;
5839     }
5840 
5841     /**
5842      * Make an Intent for the main activity of an application, without
5843      * specifying a specific activity to run but giving a selector to find
5844      * the activity.  This results in a final Intent that is structured
5845      * the same as when the application is launched from
5846      * Home.  For anything else that wants to launch an application in the
5847      * same way, it is important that they use an Intent structured the same
5848      * way, and can use this function to ensure this is the case.
5849      *
5850      * <p>The returned Intent has {@link #ACTION_MAIN} as its action, and includes the
5851      * category {@link #CATEGORY_LAUNCHER}.  This does <em>not</em> have
5852      * {@link #FLAG_ACTIVITY_NEW_TASK} set, though typically you will want
5853      * to do that through {@link #addFlags(int)} on the returned Intent.
5854      *
5855      * @param selectorAction The action name of the Intent's selector.
5856      * @param selectorCategory The name of a category to add to the Intent's
5857      * selector.
5858      * @return Returns a newly created Intent that can be used to launch the
5859      * activity as a main application entry.
5860      *
5861      * @see #setSelector(Intent)
5862      */
makeMainSelectorActivity(String selectorAction, String selectorCategory)5863     public static Intent makeMainSelectorActivity(String selectorAction,
5864             String selectorCategory) {
5865         Intent intent = new Intent(ACTION_MAIN);
5866         intent.addCategory(CATEGORY_LAUNCHER);
5867         Intent selector = new Intent();
5868         selector.setAction(selectorAction);
5869         selector.addCategory(selectorCategory);
5870         intent.setSelector(selector);
5871         return intent;
5872     }
5873 
5874     /**
5875      * Make an Intent that can be used to re-launch an application's task
5876      * in its base state.  This is like {@link #makeMainActivity(ComponentName)},
5877      * but also sets the flags {@link #FLAG_ACTIVITY_NEW_TASK} and
5878      * {@link #FLAG_ACTIVITY_CLEAR_TASK}.
5879      *
5880      * @param mainActivity The activity component that is the root of the
5881      * task; this is the activity that has been published in the application's
5882      * manifest as the main launcher icon.
5883      *
5884      * @return Returns a newly created Intent that can be used to relaunch the
5885      * activity's task in its root state.
5886      */
makeRestartActivityTask(ComponentName mainActivity)5887     public static Intent makeRestartActivityTask(ComponentName mainActivity) {
5888         Intent intent = makeMainActivity(mainActivity);
5889         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
5890                 | Intent.FLAG_ACTIVITY_CLEAR_TASK);
5891         return intent;
5892     }
5893 
5894     /**
5895      * Call {@link #parseUri} with 0 flags.
5896      * @deprecated Use {@link #parseUri} instead.
5897      */
5898     @Deprecated
getIntent(String uri)5899     public static Intent getIntent(String uri) throws URISyntaxException {
5900         return parseUri(uri, 0);
5901     }
5902 
5903     /**
5904      * Create an intent from a URI.  This URI may encode the action,
5905      * category, and other intent fields, if it was returned by
5906      * {@link #toUri}.  If the Intent was not generate by toUri(), its data
5907      * will be the entire URI and its action will be ACTION_VIEW.
5908      *
5909      * <p>The URI given here must not be relative -- that is, it must include
5910      * the scheme and full path.
5911      *
5912      * @param uri The URI to turn into an Intent.
5913      * @param flags Additional processing flags.
5914      *
5915      * @return Intent The newly created Intent object.
5916      *
5917      * @throws URISyntaxException Throws URISyntaxError if the basic URI syntax
5918      * it bad (as parsed by the Uri class) or the Intent data within the
5919      * URI is invalid.
5920      *
5921      * @see #toUri
5922      */
parseUri(String uri, @UriFlags int flags)5923     public static Intent parseUri(String uri, @UriFlags int flags) throws URISyntaxException {
5924         int i = 0;
5925         try {
5926             final boolean androidApp = uri.startsWith("android-app:");
5927 
5928             // Validate intent scheme if requested.
5929             if ((flags&(URI_INTENT_SCHEME|URI_ANDROID_APP_SCHEME)) != 0) {
5930                 if (!uri.startsWith("intent:") && !androidApp) {
5931                     Intent intent = new Intent(ACTION_VIEW);
5932                     try {
5933                         intent.setData(Uri.parse(uri));
5934                     } catch (IllegalArgumentException e) {
5935                         throw new URISyntaxException(uri, e.getMessage());
5936                     }
5937                     return intent;
5938                 }
5939             }
5940 
5941             i = uri.lastIndexOf("#");
5942             // simple case
5943             if (i == -1) {
5944                 if (!androidApp) {
5945                     return new Intent(ACTION_VIEW, Uri.parse(uri));
5946                 }
5947 
5948             // old format Intent URI
5949             } else if (!uri.startsWith("#Intent;", i)) {
5950                 if (!androidApp) {
5951                     return getIntentOld(uri, flags);
5952                 } else {
5953                     i = -1;
5954                 }
5955             }
5956 
5957             // new format
5958             Intent intent = new Intent(ACTION_VIEW);
5959             Intent baseIntent = intent;
5960             boolean explicitAction = false;
5961             boolean inSelector = false;
5962 
5963             // fetch data part, if present
5964             String scheme = null;
5965             String data;
5966             if (i >= 0) {
5967                 data = uri.substring(0, i);
5968                 i += 8; // length of "#Intent;"
5969             } else {
5970                 data = uri;
5971             }
5972 
5973             // loop over contents of Intent, all name=value;
5974             while (i >= 0 && !uri.startsWith("end", i)) {
5975                 int eq = uri.indexOf('=', i);
5976                 if (eq < 0) eq = i-1;
5977                 int semi = uri.indexOf(';', i);
5978                 String value = eq < semi ? Uri.decode(uri.substring(eq + 1, semi)) : "";
5979 
5980                 // action
5981                 if (uri.startsWith("action=", i)) {
5982                     intent.setAction(value);
5983                     if (!inSelector) {
5984                         explicitAction = true;
5985                     }
5986                 }
5987 
5988                 // categories
5989                 else if (uri.startsWith("category=", i)) {
5990                     intent.addCategory(value);
5991                 }
5992 
5993                 // type
5994                 else if (uri.startsWith("type=", i)) {
5995                     intent.mType = value;
5996                 }
5997 
5998                 // launch flags
5999                 else if (uri.startsWith("launchFlags=", i)) {
6000                     intent.mFlags = Integer.decode(value).intValue();
6001                     if ((flags& URI_ALLOW_UNSAFE) == 0) {
6002                         intent.mFlags &= ~IMMUTABLE_FLAGS;
6003                     }
6004                 }
6005 
6006                 // package
6007                 else if (uri.startsWith("package=", i)) {
6008                     intent.mPackage = value;
6009                 }
6010 
6011                 // component
6012                 else if (uri.startsWith("component=", i)) {
6013                     intent.mComponent = ComponentName.unflattenFromString(value);
6014                 }
6015 
6016                 // scheme
6017                 else if (uri.startsWith("scheme=", i)) {
6018                     if (inSelector) {
6019                         intent.mData = Uri.parse(value + ":");
6020                     } else {
6021                         scheme = value;
6022                     }
6023                 }
6024 
6025                 // source bounds
6026                 else if (uri.startsWith("sourceBounds=", i)) {
6027                     intent.mSourceBounds = Rect.unflattenFromString(value);
6028                 }
6029 
6030                 // selector
6031                 else if (semi == (i+3) && uri.startsWith("SEL", i)) {
6032                     intent = new Intent();
6033                     inSelector = true;
6034                 }
6035 
6036                 // extra
6037                 else {
6038                     String key = Uri.decode(uri.substring(i + 2, eq));
6039                     // create Bundle if it doesn't already exist
6040                     if (intent.mExtras == null) intent.mExtras = new Bundle();
6041                     Bundle b = intent.mExtras;
6042                     // add EXTRA
6043                     if      (uri.startsWith("S.", i)) b.putString(key, value);
6044                     else if (uri.startsWith("B.", i)) b.putBoolean(key, Boolean.parseBoolean(value));
6045                     else if (uri.startsWith("b.", i)) b.putByte(key, Byte.parseByte(value));
6046                     else if (uri.startsWith("c.", i)) b.putChar(key, value.charAt(0));
6047                     else if (uri.startsWith("d.", i)) b.putDouble(key, Double.parseDouble(value));
6048                     else if (uri.startsWith("f.", i)) b.putFloat(key, Float.parseFloat(value));
6049                     else if (uri.startsWith("i.", i)) b.putInt(key, Integer.parseInt(value));
6050                     else if (uri.startsWith("l.", i)) b.putLong(key, Long.parseLong(value));
6051                     else if (uri.startsWith("s.", i)) b.putShort(key, Short.parseShort(value));
6052                     else throw new URISyntaxException(uri, "unknown EXTRA type", i);
6053                 }
6054 
6055                 // move to the next item
6056                 i = semi + 1;
6057             }
6058 
6059             if (inSelector) {
6060                 // The Intent had a selector; fix it up.
6061                 if (baseIntent.mPackage == null) {
6062                     baseIntent.setSelector(intent);
6063                 }
6064                 intent = baseIntent;
6065             }
6066 
6067             if (data != null) {
6068                 if (data.startsWith("intent:")) {
6069                     data = data.substring(7);
6070                     if (scheme != null) {
6071                         data = scheme + ':' + data;
6072                     }
6073                 } else if (data.startsWith("android-app:")) {
6074                     if (data.charAt(12) == '/' && data.charAt(13) == '/') {
6075                         // Correctly formed android-app, first part is package name.
6076                         int end = data.indexOf('/', 14);
6077                         if (end < 0) {
6078                             // All we have is a package name.
6079                             intent.mPackage = data.substring(14);
6080                             if (!explicitAction) {
6081                                 intent.setAction(ACTION_MAIN);
6082                             }
6083                             data = "";
6084                         } else {
6085                             // Target the Intent at the given package name always.
6086                             String authority = null;
6087                             intent.mPackage = data.substring(14, end);
6088                             int newEnd;
6089                             if ((end+1) < data.length()) {
6090                                 if ((newEnd=data.indexOf('/', end+1)) >= 0) {
6091                                     // Found a scheme, remember it.
6092                                     scheme = data.substring(end+1, newEnd);
6093                                     end = newEnd;
6094                                     if (end < data.length() && (newEnd=data.indexOf('/', end+1)) >= 0) {
6095                                         // Found a authority, remember it.
6096                                         authority = data.substring(end+1, newEnd);
6097                                         end = newEnd;
6098                                     }
6099                                 } else {
6100                                     // All we have is a scheme.
6101                                     scheme = data.substring(end+1);
6102                                 }
6103                             }
6104                             if (scheme == null) {
6105                                 // If there was no scheme, then this just targets the package.
6106                                 if (!explicitAction) {
6107                                     intent.setAction(ACTION_MAIN);
6108                                 }
6109                                 data = "";
6110                             } else if (authority == null) {
6111                                 data = scheme + ":";
6112                             } else {
6113                                 data = scheme + "://" + authority + data.substring(end);
6114                             }
6115                         }
6116                     } else {
6117                         data = "";
6118                     }
6119                 }
6120 
6121                 if (data.length() > 0) {
6122                     try {
6123                         intent.mData = Uri.parse(data);
6124                     } catch (IllegalArgumentException e) {
6125                         throw new URISyntaxException(uri, e.getMessage());
6126                     }
6127                 }
6128             }
6129 
6130             return intent;
6131 
6132         } catch (IndexOutOfBoundsException e) {
6133             throw new URISyntaxException(uri, "illegal Intent URI format", i);
6134         }
6135     }
6136 
6137     public static Intent getIntentOld(String uri) throws URISyntaxException {
6138         return getIntentOld(uri, 0);
6139     }
6140 
6141     private static Intent getIntentOld(String uri, int flags) throws URISyntaxException {
6142         Intent intent;
6143 
6144         int i = uri.lastIndexOf('#');
6145         if (i >= 0) {
6146             String action = null;
6147             final int intentFragmentStart = i;
6148             boolean isIntentFragment = false;
6149 
6150             i++;
6151 
6152             if (uri.regionMatches(i, "action(", 0, 7)) {
6153                 isIntentFragment = true;
6154                 i += 7;
6155                 int j = uri.indexOf(')', i);
6156                 action = uri.substring(i, j);
6157                 i = j + 1;
6158             }
6159 
6160             intent = new Intent(action);
6161 
6162             if (uri.regionMatches(i, "categories(", 0, 11)) {
6163                 isIntentFragment = true;
6164                 i += 11;
6165                 int j = uri.indexOf(')', i);
6166                 while (i < j) {
6167                     int sep = uri.indexOf('!', i);
6168                     if (sep < 0 || sep > j) sep = j;
6169                     if (i < sep) {
6170                         intent.addCategory(uri.substring(i, sep));
6171                     }
6172                     i = sep + 1;
6173                 }
6174                 i = j + 1;
6175             }
6176 
6177             if (uri.regionMatches(i, "type(", 0, 5)) {
6178                 isIntentFragment = true;
6179                 i += 5;
6180                 int j = uri.indexOf(')', i);
6181                 intent.mType = uri.substring(i, j);
6182                 i = j + 1;
6183             }
6184 
6185             if (uri.regionMatches(i, "launchFlags(", 0, 12)) {
6186                 isIntentFragment = true;
6187                 i += 12;
6188                 int j = uri.indexOf(')', i);
6189                 intent.mFlags = Integer.decode(uri.substring(i, j)).intValue();
6190                 if ((flags& URI_ALLOW_UNSAFE) == 0) {
6191                     intent.mFlags &= ~IMMUTABLE_FLAGS;
6192                 }
6193                 i = j + 1;
6194             }
6195 
6196             if (uri.regionMatches(i, "component(", 0, 10)) {
6197                 isIntentFragment = true;
6198                 i += 10;
6199                 int j = uri.indexOf(')', i);
6200                 int sep = uri.indexOf('!', i);
6201                 if (sep >= 0 && sep < j) {
6202                     String pkg = uri.substring(i, sep);
6203                     String cls = uri.substring(sep + 1, j);
6204                     intent.mComponent = new ComponentName(pkg, cls);
6205                 }
6206                 i = j + 1;
6207             }
6208 
6209             if (uri.regionMatches(i, "extras(", 0, 7)) {
6210                 isIntentFragment = true;
6211                 i += 7;
6212 
6213                 final int closeParen = uri.indexOf(')', i);
6214                 if (closeParen == -1) throw new URISyntaxException(uri,
6215                         "EXTRA missing trailing ')'", i);
6216 
6217                 while (i < closeParen) {
6218                     // fetch the key value
6219                     int j = uri.indexOf('=', i);
6220                     if (j <= i + 1 || i >= closeParen) {
6221                         throw new URISyntaxException(uri, "EXTRA missing '='", i);
6222                     }
6223                     char type = uri.charAt(i);
6224                     i++;
6225                     String key = uri.substring(i, j);
6226                     i = j + 1;
6227 
6228                     // get type-value
6229                     j = uri.indexOf('!', i);
6230                     if (j == -1 || j >= closeParen) j = closeParen;
6231                     if (i >= j) throw new URISyntaxException(uri, "EXTRA missing '!'", i);
6232                     String value = uri.substring(i, j);
6233                     i = j;
6234 
6235                     // create Bundle if it doesn't already exist
6236                     if (intent.mExtras == null) intent.mExtras = new Bundle();
6237 
6238                     // add item to bundle
6239                     try {
6240                         switch (type) {
6241                             case 'S':
6242                                 intent.mExtras.putString(key, Uri.decode(value));
6243                                 break;
6244                             case 'B':
6245                                 intent.mExtras.putBoolean(key, Boolean.parseBoolean(value));
6246                                 break;
6247                             case 'b':
6248                                 intent.mExtras.putByte(key, Byte.parseByte(value));
6249                                 break;
6250                             case 'c':
6251                                 intent.mExtras.putChar(key, Uri.decode(value).charAt(0));
6252                                 break;
6253                             case 'd':
6254                                 intent.mExtras.putDouble(key, Double.parseDouble(value));
6255                                 break;
6256                             case 'f':
6257                                 intent.mExtras.putFloat(key, Float.parseFloat(value));
6258                                 break;
6259                             case 'i':
6260                                 intent.mExtras.putInt(key, Integer.parseInt(value));
6261                                 break;
6262                             case 'l':
6263                                 intent.mExtras.putLong(key, Long.parseLong(value));
6264                                 break;
6265                             case 's':
6266                                 intent.mExtras.putShort(key, Short.parseShort(value));
6267                                 break;
6268                             default:
6269                                 throw new URISyntaxException(uri, "EXTRA has unknown type", i);
6270                         }
6271                     } catch (NumberFormatException e) {
6272                         throw new URISyntaxException(uri, "EXTRA value can't be parsed", i);
6273                     }
6274 
6275                     char ch = uri.charAt(i);
6276                     if (ch == ')') break;
6277                     if (ch != '!') throw new URISyntaxException(uri, "EXTRA missing '!'", i);
6278                     i++;
6279                 }
6280             }
6281 
6282             if (isIntentFragment) {
6283                 intent.mData = Uri.parse(uri.substring(0, intentFragmentStart));
6284             } else {
6285                 intent.mData = Uri.parse(uri);
6286             }
6287 
6288             if (intent.mAction == null) {
6289                 // By default, if no action is specified, then use VIEW.
6290                 intent.mAction = ACTION_VIEW;
6291             }
6292 
6293         } else {
6294             intent = new Intent(ACTION_VIEW, Uri.parse(uri));
6295         }
6296 
6297         return intent;
6298     }
6299 
6300     /** @hide */
6301     public interface CommandOptionHandler {
6302         boolean handleOption(String opt, ShellCommand cmd);
6303     }
6304 
6305     /** @hide */
parseCommandArgs(ShellCommand cmd, CommandOptionHandler optionHandler)6306     public static Intent parseCommandArgs(ShellCommand cmd, CommandOptionHandler optionHandler)
6307             throws URISyntaxException {
6308         Intent intent = new Intent();
6309         Intent baseIntent = intent;
6310         boolean hasIntentInfo = false;
6311 
6312         Uri data = null;
6313         String type = null;
6314 
6315         String opt;
6316         while ((opt=cmd.getNextOption()) != null) {
6317             switch (opt) {
6318                 case "-a":
6319                     intent.setAction(cmd.getNextArgRequired());
6320                     if (intent == baseIntent) {
6321                         hasIntentInfo = true;
6322                     }
6323                     break;
6324                 case "-d":
6325                     data = Uri.parse(cmd.getNextArgRequired());
6326                     if (intent == baseIntent) {
6327                         hasIntentInfo = true;
6328                     }
6329                     break;
6330                 case "-t":
6331                     type = cmd.getNextArgRequired();
6332                     if (intent == baseIntent) {
6333                         hasIntentInfo = true;
6334                     }
6335                     break;
6336                 case "-c":
6337                     intent.addCategory(cmd.getNextArgRequired());
6338                     if (intent == baseIntent) {
6339                         hasIntentInfo = true;
6340                     }
6341                     break;
6342                 case "-e":
6343                 case "--es": {
6344                     String key = cmd.getNextArgRequired();
6345                     String value = cmd.getNextArgRequired();
6346                     intent.putExtra(key, value);
6347                 }
6348                 break;
6349                 case "--esn": {
6350                     String key = cmd.getNextArgRequired();
6351                     intent.putExtra(key, (String) null);
6352                 }
6353                 break;
6354                 case "--ei": {
6355                     String key = cmd.getNextArgRequired();
6356                     String value = cmd.getNextArgRequired();
6357                     intent.putExtra(key, Integer.decode(value));
6358                 }
6359                 break;
6360                 case "--eu": {
6361                     String key = cmd.getNextArgRequired();
6362                     String value = cmd.getNextArgRequired();
6363                     intent.putExtra(key, Uri.parse(value));
6364                 }
6365                 break;
6366                 case "--ecn": {
6367                     String key = cmd.getNextArgRequired();
6368                     String value = cmd.getNextArgRequired();
6369                     ComponentName cn = ComponentName.unflattenFromString(value);
6370                     if (cn == null)
6371                         throw new IllegalArgumentException("Bad component name: " + value);
6372                     intent.putExtra(key, cn);
6373                 }
6374                 break;
6375                 case "--eia": {
6376                     String key = cmd.getNextArgRequired();
6377                     String value = cmd.getNextArgRequired();
6378                     String[] strings = value.split(",");
6379                     int[] list = new int[strings.length];
6380                     for (int i = 0; i < strings.length; i++) {
6381                         list[i] = Integer.decode(strings[i]);
6382                     }
6383                     intent.putExtra(key, list);
6384                 }
6385                 break;
6386                 case "--eial": {
6387                     String key = cmd.getNextArgRequired();
6388                     String value = cmd.getNextArgRequired();
6389                     String[] strings = value.split(",");
6390                     ArrayList<Integer> list = new ArrayList<>(strings.length);
6391                     for (int i = 0; i < strings.length; i++) {
6392                         list.add(Integer.decode(strings[i]));
6393                     }
6394                     intent.putExtra(key, list);
6395                 }
6396                 break;
6397                 case "--el": {
6398                     String key = cmd.getNextArgRequired();
6399                     String value = cmd.getNextArgRequired();
6400                     intent.putExtra(key, Long.valueOf(value));
6401                 }
6402                 break;
6403                 case "--ela": {
6404                     String key = cmd.getNextArgRequired();
6405                     String value = cmd.getNextArgRequired();
6406                     String[] strings = value.split(",");
6407                     long[] list = new long[strings.length];
6408                     for (int i = 0; i < strings.length; i++) {
6409                         list[i] = Long.valueOf(strings[i]);
6410                     }
6411                     intent.putExtra(key, list);
6412                     hasIntentInfo = true;
6413                 }
6414                 break;
6415                 case "--elal": {
6416                     String key = cmd.getNextArgRequired();
6417                     String value = cmd.getNextArgRequired();
6418                     String[] strings = value.split(",");
6419                     ArrayList<Long> list = new ArrayList<>(strings.length);
6420                     for (int i = 0; i < strings.length; i++) {
6421                         list.add(Long.valueOf(strings[i]));
6422                     }
6423                     intent.putExtra(key, list);
6424                     hasIntentInfo = true;
6425                 }
6426                 break;
6427                 case "--ef": {
6428                     String key = cmd.getNextArgRequired();
6429                     String value = cmd.getNextArgRequired();
6430                     intent.putExtra(key, Float.valueOf(value));
6431                     hasIntentInfo = true;
6432                 }
6433                 break;
6434                 case "--efa": {
6435                     String key = cmd.getNextArgRequired();
6436                     String value = cmd.getNextArgRequired();
6437                     String[] strings = value.split(",");
6438                     float[] list = new float[strings.length];
6439                     for (int i = 0; i < strings.length; i++) {
6440                         list[i] = Float.valueOf(strings[i]);
6441                     }
6442                     intent.putExtra(key, list);
6443                     hasIntentInfo = true;
6444                 }
6445                 break;
6446                 case "--efal": {
6447                     String key = cmd.getNextArgRequired();
6448                     String value = cmd.getNextArgRequired();
6449                     String[] strings = value.split(",");
6450                     ArrayList<Float> list = new ArrayList<>(strings.length);
6451                     for (int i = 0; i < strings.length; i++) {
6452                         list.add(Float.valueOf(strings[i]));
6453                     }
6454                     intent.putExtra(key, list);
6455                     hasIntentInfo = true;
6456                 }
6457                 break;
6458                 case "--esa": {
6459                     String key = cmd.getNextArgRequired();
6460                     String value = cmd.getNextArgRequired();
6461                     // Split on commas unless they are preceeded by an escape.
6462                     // The escape character must be escaped for the string and
6463                     // again for the regex, thus four escape characters become one.
6464                     String[] strings = value.split("(?<!\\\\),");
6465                     intent.putExtra(key, strings);
6466                     hasIntentInfo = true;
6467                 }
6468                 break;
6469                 case "--esal": {
6470                     String key = cmd.getNextArgRequired();
6471                     String value = cmd.getNextArgRequired();
6472                     // Split on commas unless they are preceeded by an escape.
6473                     // The escape character must be escaped for the string and
6474                     // again for the regex, thus four escape characters become one.
6475                     String[] strings = value.split("(?<!\\\\),");
6476                     ArrayList<String> list = new ArrayList<>(strings.length);
6477                     for (int i = 0; i < strings.length; i++) {
6478                         list.add(strings[i]);
6479                     }
6480                     intent.putExtra(key, list);
6481                     hasIntentInfo = true;
6482                 }
6483                 break;
6484                 case "--ez": {
6485                     String key = cmd.getNextArgRequired();
6486                     String value = cmd.getNextArgRequired().toLowerCase();
6487                     // Boolean.valueOf() results in false for anything that is not "true", which is
6488                     // error-prone in shell commands
6489                     boolean arg;
6490                     if ("true".equals(value) || "t".equals(value)) {
6491                         arg = true;
6492                     } else if ("false".equals(value) || "f".equals(value)) {
6493                         arg = false;
6494                     } else {
6495                         try {
6496                             arg = Integer.decode(value) != 0;
6497                         } catch (NumberFormatException ex) {
6498                             throw new IllegalArgumentException("Invalid boolean value: " + value);
6499                         }
6500                     }
6501 
6502                     intent.putExtra(key, arg);
6503                 }
6504                 break;
6505                 case "-n": {
6506                     String str = cmd.getNextArgRequired();
6507                     ComponentName cn = ComponentName.unflattenFromString(str);
6508                     if (cn == null)
6509                         throw new IllegalArgumentException("Bad component name: " + str);
6510                     intent.setComponent(cn);
6511                     if (intent == baseIntent) {
6512                         hasIntentInfo = true;
6513                     }
6514                 }
6515                 break;
6516                 case "-p": {
6517                     String str = cmd.getNextArgRequired();
6518                     intent.setPackage(str);
6519                     if (intent == baseIntent) {
6520                         hasIntentInfo = true;
6521                     }
6522                 }
6523                 break;
6524                 case "-f":
6525                     String str = cmd.getNextArgRequired();
6526                     intent.setFlags(Integer.decode(str).intValue());
6527                     break;
6528                 case "--grant-read-uri-permission":
6529                     intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
6530                     break;
6531                 case "--grant-write-uri-permission":
6532                     intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
6533                     break;
6534                 case "--grant-persistable-uri-permission":
6535                     intent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
6536                     break;
6537                 case "--grant-prefix-uri-permission":
6538                     intent.addFlags(Intent.FLAG_GRANT_PREFIX_URI_PERMISSION);
6539                     break;
6540                 case "--exclude-stopped-packages":
6541                     intent.addFlags(Intent.FLAG_EXCLUDE_STOPPED_PACKAGES);
6542                     break;
6543                 case "--include-stopped-packages":
6544                     intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
6545                     break;
6546                 case "--debug-log-resolution":
6547                     intent.addFlags(Intent.FLAG_DEBUG_LOG_RESOLUTION);
6548                     break;
6549                 case "--activity-brought-to-front":
6550                     intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
6551                     break;
6552                 case "--activity-clear-top":
6553                     intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
6554                     break;
6555                 case "--activity-clear-when-task-reset":
6556                     intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
6557                     break;
6558                 case "--activity-exclude-from-recents":
6559                     intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
6560                     break;
6561                 case "--activity-launched-from-history":
6562                     intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY);
6563                     break;
6564                 case "--activity-multiple-task":
6565                     intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
6566                     break;
6567                 case "--activity-no-animation":
6568                     intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
6569                     break;
6570                 case "--activity-no-history":
6571                     intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
6572                     break;
6573                 case "--activity-no-user-action":
6574                     intent.addFlags(Intent.FLAG_ACTIVITY_NO_USER_ACTION);
6575                     break;
6576                 case "--activity-previous-is-top":
6577                     intent.addFlags(Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP);
6578                     break;
6579                 case "--activity-reorder-to-front":
6580                     intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
6581                     break;
6582                 case "--activity-reset-task-if-needed":
6583                     intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
6584                     break;
6585                 case "--activity-single-top":
6586                     intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
6587                     break;
6588                 case "--activity-clear-task":
6589                     intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
6590                     break;
6591                 case "--activity-task-on-home":
6592                     intent.addFlags(Intent.FLAG_ACTIVITY_TASK_ON_HOME);
6593                     break;
6594                 case "--receiver-registered-only":
6595                     intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
6596                     break;
6597                 case "--receiver-replace-pending":
6598                     intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);
6599                     break;
6600                 case "--receiver-foreground":
6601                     intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
6602                     break;
6603                 case "--receiver-no-abort":
6604                     intent.addFlags(Intent.FLAG_RECEIVER_NO_ABORT);
6605                     break;
6606                 case "--receiver-include-background":
6607                     intent.addFlags(Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);
6608                     break;
6609                 case "--selector":
6610                     intent.setDataAndType(data, type);
6611                     intent = new Intent();
6612                     break;
6613                 default:
6614                     if (optionHandler != null && optionHandler.handleOption(opt, cmd)) {
6615                         // Okay, caller handled this option.
6616                     } else {
6617                         throw new IllegalArgumentException("Unknown option: " + opt);
6618                     }
6619                     break;
6620             }
6621         }
6622         intent.setDataAndType(data, type);
6623 
6624         final boolean hasSelector = intent != baseIntent;
6625         if (hasSelector) {
6626             // A selector was specified; fix up.
6627             baseIntent.setSelector(intent);
6628             intent = baseIntent;
6629         }
6630 
6631         String arg = cmd.getNextArg();
6632         baseIntent = null;
6633         if (arg == null) {
6634             if (hasSelector) {
6635                 // If a selector has been specified, and no arguments
6636                 // have been supplied for the main Intent, then we can
6637                 // assume it is ACTION_MAIN CATEGORY_LAUNCHER; we don't
6638                 // need to have a component name specified yet, the
6639                 // selector will take care of that.
6640                 baseIntent = new Intent(Intent.ACTION_MAIN);
6641                 baseIntent.addCategory(Intent.CATEGORY_LAUNCHER);
6642             }
6643         } else if (arg.indexOf(':') >= 0) {
6644             // The argument is a URI.  Fully parse it, and use that result
6645             // to fill in any data not specified so far.
6646             baseIntent = Intent.parseUri(arg, Intent.URI_INTENT_SCHEME
6647                     | Intent.URI_ANDROID_APP_SCHEME | Intent.URI_ALLOW_UNSAFE);
6648         } else if (arg.indexOf('/') >= 0) {
6649             // The argument is a component name.  Build an Intent to launch
6650             // it.
6651             baseIntent = new Intent(Intent.ACTION_MAIN);
6652             baseIntent.addCategory(Intent.CATEGORY_LAUNCHER);
6653             baseIntent.setComponent(ComponentName.unflattenFromString(arg));
6654         } else {
6655             // Assume the argument is a package name.
6656             baseIntent = new Intent(Intent.ACTION_MAIN);
6657             baseIntent.addCategory(Intent.CATEGORY_LAUNCHER);
6658             baseIntent.setPackage(arg);
6659         }
6660         if (baseIntent != null) {
6661             Bundle extras = intent.getExtras();
6662             intent.replaceExtras((Bundle)null);
6663             Bundle uriExtras = baseIntent.getExtras();
6664             baseIntent.replaceExtras((Bundle)null);
6665             if (intent.getAction() != null && baseIntent.getCategories() != null) {
6666                 HashSet<String> cats = new HashSet<String>(baseIntent.getCategories());
6667                 for (String c : cats) {
6668                     baseIntent.removeCategory(c);
6669                 }
6670             }
6671             intent.fillIn(baseIntent, Intent.FILL_IN_COMPONENT | Intent.FILL_IN_SELECTOR);
6672             if (extras == null) {
6673                 extras = uriExtras;
6674             } else if (uriExtras != null) {
6675                 uriExtras.putAll(extras);
6676                 extras = uriExtras;
6677             }
6678             intent.replaceExtras(extras);
6679             hasIntentInfo = true;
6680         }
6681 
6682         if (!hasIntentInfo) throw new IllegalArgumentException("No intent supplied");
6683         return intent;
6684     }
6685 
6686     /** @hide */
printIntentArgsHelp(PrintWriter pw, String prefix)6687     public static void printIntentArgsHelp(PrintWriter pw, String prefix) {
6688         final String[] lines = new String[] {
6689                 "<INTENT> specifications include these flags and arguments:",
6690                 "    [-a <ACTION>] [-d <DATA_URI>] [-t <MIME_TYPE>]",
6691                 "    [-c <CATEGORY> [-c <CATEGORY>] ...]",
6692                 "    [-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...]",
6693                 "    [--esn <EXTRA_KEY> ...]",
6694                 "    [--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...]",
6695                 "    [--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...]",
6696                 "    [--el <EXTRA_KEY> <EXTRA_LONG_VALUE> ...]",
6697                 "    [--ef <EXTRA_KEY> <EXTRA_FLOAT_VALUE> ...]",
6698                 "    [--eu <EXTRA_KEY> <EXTRA_URI_VALUE> ...]",
6699                 "    [--ecn <EXTRA_KEY> <EXTRA_COMPONENT_NAME_VALUE>]",
6700                 "    [--eia <EXTRA_KEY> <EXTRA_INT_VALUE>[,<EXTRA_INT_VALUE...]]",
6701                 "        (mutiple extras passed as Integer[])",
6702                 "    [--eial <EXTRA_KEY> <EXTRA_INT_VALUE>[,<EXTRA_INT_VALUE...]]",
6703                 "        (mutiple extras passed as List<Integer>)",
6704                 "    [--ela <EXTRA_KEY> <EXTRA_LONG_VALUE>[,<EXTRA_LONG_VALUE...]]",
6705                 "        (mutiple extras passed as Long[])",
6706                 "    [--elal <EXTRA_KEY> <EXTRA_LONG_VALUE>[,<EXTRA_LONG_VALUE...]]",
6707                 "        (mutiple extras passed as List<Long>)",
6708                 "    [--efa <EXTRA_KEY> <EXTRA_FLOAT_VALUE>[,<EXTRA_FLOAT_VALUE...]]",
6709                 "        (mutiple extras passed as Float[])",
6710                 "    [--efal <EXTRA_KEY> <EXTRA_FLOAT_VALUE>[,<EXTRA_FLOAT_VALUE...]]",
6711                 "        (mutiple extras passed as List<Float>)",
6712                 "    [--esa <EXTRA_KEY> <EXTRA_STRING_VALUE>[,<EXTRA_STRING_VALUE...]]",
6713                 "        (mutiple extras passed as String[]; to embed a comma into a string,",
6714                 "         escape it using \"\\,\")",
6715                 "    [--esal <EXTRA_KEY> <EXTRA_STRING_VALUE>[,<EXTRA_STRING_VALUE...]]",
6716                 "        (mutiple extras passed as List<String>; to embed a comma into a string,",
6717                 "         escape it using \"\\,\")",
6718                 "    [-f <FLAG>]",
6719                 "    [--grant-read-uri-permission] [--grant-write-uri-permission]",
6720                 "    [--grant-persistable-uri-permission] [--grant-prefix-uri-permission]",
6721                 "    [--debug-log-resolution] [--exclude-stopped-packages]",
6722                 "    [--include-stopped-packages]",
6723                 "    [--activity-brought-to-front] [--activity-clear-top]",
6724                 "    [--activity-clear-when-task-reset] [--activity-exclude-from-recents]",
6725                 "    [--activity-launched-from-history] [--activity-multiple-task]",
6726                 "    [--activity-no-animation] [--activity-no-history]",
6727                 "    [--activity-no-user-action] [--activity-previous-is-top]",
6728                 "    [--activity-reorder-to-front] [--activity-reset-task-if-needed]",
6729                 "    [--activity-single-top] [--activity-clear-task]",
6730                 "    [--activity-task-on-home]",
6731                 "    [--receiver-registered-only] [--receiver-replace-pending]",
6732                 "    [--receiver-foreground] [--receiver-no-abort]",
6733                 "    [--receiver-include-background]",
6734                 "    [--selector]",
6735                 "    [<URI> | <PACKAGE> | <COMPONENT>]"
6736         };
6737         for (String line : lines) {
6738             pw.print(prefix);
6739             pw.println(line);
6740         }
6741     }
6742 
6743     /**
6744      * Retrieve the general action to be performed, such as
6745      * {@link #ACTION_VIEW}.  The action describes the general way the rest of
6746      * the information in the intent should be interpreted -- most importantly,
6747      * what to do with the data returned by {@link #getData}.
6748      *
6749      * @return The action of this intent or null if none is specified.
6750      *
6751      * @see #setAction
6752      */
getAction()6753     public @Nullable String getAction() {
6754         return mAction;
6755     }
6756 
6757     /**
6758      * Retrieve data this intent is operating on.  This URI specifies the name
6759      * of the data; often it uses the content: scheme, specifying data in a
6760      * content provider.  Other schemes may be handled by specific activities,
6761      * such as http: by the web browser.
6762      *
6763      * @return The URI of the data this intent is targeting or null.
6764      *
6765      * @see #getScheme
6766      * @see #setData
6767      */
getData()6768     public @Nullable Uri getData() {
6769         return mData;
6770     }
6771 
6772     /**
6773      * The same as {@link #getData()}, but returns the URI as an encoded
6774      * String.
6775      */
getDataString()6776     public @Nullable String getDataString() {
6777         return mData != null ? mData.toString() : null;
6778     }
6779 
6780     /**
6781      * Return the scheme portion of the intent's data.  If the data is null or
6782      * does not include a scheme, null is returned.  Otherwise, the scheme
6783      * prefix without the final ':' is returned, i.e. "http".
6784      *
6785      * <p>This is the same as calling getData().getScheme() (and checking for
6786      * null data).
6787      *
6788      * @return The scheme of this intent.
6789      *
6790      * @see #getData
6791      */
getScheme()6792     public @Nullable String getScheme() {
6793         return mData != null ? mData.getScheme() : null;
6794     }
6795 
6796     /**
6797      * Retrieve any explicit MIME type included in the intent.  This is usually
6798      * null, as the type is determined by the intent data.
6799      *
6800      * @return If a type was manually set, it is returned; else null is
6801      *         returned.
6802      *
6803      * @see #resolveType(ContentResolver)
6804      * @see #setType
6805      */
getType()6806     public @Nullable String getType() {
6807         return mType;
6808     }
6809 
6810     /**
6811      * Return the MIME data type of this intent.  If the type field is
6812      * explicitly set, that is simply returned.  Otherwise, if the data is set,
6813      * the type of that data is returned.  If neither fields are set, a null is
6814      * returned.
6815      *
6816      * @return The MIME type of this intent.
6817      *
6818      * @see #getType
6819      * @see #resolveType(ContentResolver)
6820      */
resolveType(@onNull Context context)6821     public @Nullable String resolveType(@NonNull Context context) {
6822         return resolveType(context.getContentResolver());
6823     }
6824 
6825     /**
6826      * Return the MIME data type of this intent.  If the type field is
6827      * explicitly set, that is simply returned.  Otherwise, if the data is set,
6828      * the type of that data is returned.  If neither fields are set, a null is
6829      * returned.
6830      *
6831      * @param resolver A ContentResolver that can be used to determine the MIME
6832      *                 type of the intent's data.
6833      *
6834      * @return The MIME type of this intent.
6835      *
6836      * @see #getType
6837      * @see #resolveType(Context)
6838      */
resolveType(@onNull ContentResolver resolver)6839     public @Nullable String resolveType(@NonNull ContentResolver resolver) {
6840         if (mType != null) {
6841             return mType;
6842         }
6843         if (mData != null) {
6844             if ("content".equals(mData.getScheme())) {
6845                 return resolver.getType(mData);
6846             }
6847         }
6848         return null;
6849     }
6850 
6851     /**
6852      * Return the MIME data type of this intent, only if it will be needed for
6853      * intent resolution.  This is not generally useful for application code;
6854      * it is used by the frameworks for communicating with back-end system
6855      * services.
6856      *
6857      * @param resolver A ContentResolver that can be used to determine the MIME
6858      *                 type of the intent's data.
6859      *
6860      * @return The MIME type of this intent, or null if it is unknown or not
6861      *         needed.
6862      */
resolveTypeIfNeeded(@onNull ContentResolver resolver)6863     public @Nullable String resolveTypeIfNeeded(@NonNull ContentResolver resolver) {
6864         if (mComponent != null) {
6865             return mType;
6866         }
6867         return resolveType(resolver);
6868     }
6869 
6870     /**
6871      * Check if a category exists in the intent.
6872      *
6873      * @param category The category to check.
6874      *
6875      * @return boolean True if the intent contains the category, else false.
6876      *
6877      * @see #getCategories
6878      * @see #addCategory
6879      */
hasCategory(String category)6880     public boolean hasCategory(String category) {
6881         return mCategories != null && mCategories.contains(category);
6882     }
6883 
6884     /**
6885      * Return the set of all categories in the intent.  If there are no categories,
6886      * returns NULL.
6887      *
6888      * @return The set of categories you can examine.  Do not modify!
6889      *
6890      * @see #hasCategory
6891      * @see #addCategory
6892      */
getCategories()6893     public Set<String> getCategories() {
6894         return mCategories;
6895     }
6896 
6897     /**
6898      * Return the specific selector associated with this Intent.  If there is
6899      * none, returns null.  See {@link #setSelector} for more information.
6900      *
6901      * @see #setSelector
6902      */
getSelector()6903     public @Nullable Intent getSelector() {
6904         return mSelector;
6905     }
6906 
6907     /**
6908      * Return the {@link ClipData} associated with this Intent.  If there is
6909      * none, returns null.  See {@link #setClipData} for more information.
6910      *
6911      * @see #setClipData
6912      */
getClipData()6913     public @Nullable ClipData getClipData() {
6914         return mClipData;
6915     }
6916 
6917     /** @hide */
getContentUserHint()6918     public int getContentUserHint() {
6919         return mContentUserHint;
6920     }
6921 
6922     /** @hide */
getLaunchToken()6923     public String getLaunchToken() {
6924         return mLaunchToken;
6925     }
6926 
6927     /** @hide */
setLaunchToken(String launchToken)6928     public void setLaunchToken(String launchToken) {
6929         mLaunchToken = launchToken;
6930     }
6931 
6932     /**
6933      * Sets the ClassLoader that will be used when unmarshalling
6934      * any Parcelable values from the extras of this Intent.
6935      *
6936      * @param loader a ClassLoader, or null to use the default loader
6937      * at the time of unmarshalling.
6938      */
setExtrasClassLoader(@ullable ClassLoader loader)6939     public void setExtrasClassLoader(@Nullable ClassLoader loader) {
6940         if (mExtras != null) {
6941             mExtras.setClassLoader(loader);
6942         }
6943     }
6944 
6945     /**
6946      * Returns true if an extra value is associated with the given name.
6947      * @param name the extra's name
6948      * @return true if the given extra is present.
6949      */
hasExtra(String name)6950     public boolean hasExtra(String name) {
6951         return mExtras != null && mExtras.containsKey(name);
6952     }
6953 
6954     /**
6955      * Returns true if the Intent's extras contain a parcelled file descriptor.
6956      * @return true if the Intent contains a parcelled file descriptor.
6957      */
hasFileDescriptors()6958     public boolean hasFileDescriptors() {
6959         return mExtras != null && mExtras.hasFileDescriptors();
6960     }
6961 
6962     /** {@hide} */
setAllowFds(boolean allowFds)6963     public void setAllowFds(boolean allowFds) {
6964         if (mExtras != null) {
6965             mExtras.setAllowFds(allowFds);
6966         }
6967     }
6968 
6969     /** {@hide} */
setDefusable(boolean defusable)6970     public void setDefusable(boolean defusable) {
6971         if (mExtras != null) {
6972             mExtras.setDefusable(defusable);
6973         }
6974     }
6975 
6976     /**
6977      * Retrieve extended data from the intent.
6978      *
6979      * @param name The name of the desired item.
6980      *
6981      * @return the value of an item that previously added with putExtra()
6982      * or null if none was found.
6983      *
6984      * @deprecated
6985      * @hide
6986      */
6987     @Deprecated
getExtra(String name)6988     public Object getExtra(String name) {
6989         return getExtra(name, null);
6990     }
6991 
6992     /**
6993      * Retrieve extended data from the intent.
6994      *
6995      * @param name The name of the desired item.
6996      * @param defaultValue the value to be returned if no value of the desired
6997      * type is stored with the given name.
6998      *
6999      * @return the value of an item that previously added with putExtra()
7000      * or the default value if none was found.
7001      *
7002      * @see #putExtra(String, boolean)
7003      */
getBooleanExtra(String name, boolean defaultValue)7004     public boolean getBooleanExtra(String name, boolean defaultValue) {
7005         return mExtras == null ? defaultValue :
7006             mExtras.getBoolean(name, defaultValue);
7007     }
7008 
7009     /**
7010      * Retrieve extended data from the intent.
7011      *
7012      * @param name The name of the desired item.
7013      * @param defaultValue the value to be returned if no value of the desired
7014      * type is stored with the given name.
7015      *
7016      * @return the value of an item that previously added with putExtra()
7017      * or the default value if none was found.
7018      *
7019      * @see #putExtra(String, byte)
7020      */
getByteExtra(String name, byte defaultValue)7021     public byte getByteExtra(String name, byte defaultValue) {
7022         return mExtras == null ? defaultValue :
7023             mExtras.getByte(name, defaultValue);
7024     }
7025 
7026     /**
7027      * Retrieve extended data from the intent.
7028      *
7029      * @param name The name of the desired item.
7030      * @param defaultValue the value to be returned if no value of the desired
7031      * type is stored with the given name.
7032      *
7033      * @return the value of an item that previously added with putExtra()
7034      * or the default value if none was found.
7035      *
7036      * @see #putExtra(String, short)
7037      */
getShortExtra(String name, short defaultValue)7038     public short getShortExtra(String name, short defaultValue) {
7039         return mExtras == null ? defaultValue :
7040             mExtras.getShort(name, defaultValue);
7041     }
7042 
7043     /**
7044      * Retrieve extended data from the intent.
7045      *
7046      * @param name The name of the desired item.
7047      * @param defaultValue the value to be returned if no value of the desired
7048      * type is stored with the given name.
7049      *
7050      * @return the value of an item that previously added with putExtra()
7051      * or the default value if none was found.
7052      *
7053      * @see #putExtra(String, char)
7054      */
getCharExtra(String name, char defaultValue)7055     public char getCharExtra(String name, char defaultValue) {
7056         return mExtras == null ? defaultValue :
7057             mExtras.getChar(name, defaultValue);
7058     }
7059 
7060     /**
7061      * Retrieve extended data from the intent.
7062      *
7063      * @param name The name of the desired item.
7064      * @param defaultValue the value to be returned if no value of the desired
7065      * type is stored with the given name.
7066      *
7067      * @return the value of an item that previously added with putExtra()
7068      * or the default value if none was found.
7069      *
7070      * @see #putExtra(String, int)
7071      */
getIntExtra(String name, int defaultValue)7072     public int getIntExtra(String name, int defaultValue) {
7073         return mExtras == null ? defaultValue :
7074             mExtras.getInt(name, defaultValue);
7075     }
7076 
7077     /**
7078      * Retrieve extended data from the intent.
7079      *
7080      * @param name The name of the desired item.
7081      * @param defaultValue the value to be returned if no value of the desired
7082      * type is stored with the given name.
7083      *
7084      * @return the value of an item that previously added with putExtra()
7085      * or the default value if none was found.
7086      *
7087      * @see #putExtra(String, long)
7088      */
getLongExtra(String name, long defaultValue)7089     public long getLongExtra(String name, long defaultValue) {
7090         return mExtras == null ? defaultValue :
7091             mExtras.getLong(name, defaultValue);
7092     }
7093 
7094     /**
7095      * Retrieve extended data from the intent.
7096      *
7097      * @param name The name of the desired item.
7098      * @param defaultValue the value to be returned if no value of the desired
7099      * type is stored with the given name.
7100      *
7101      * @return the value of an item that previously added with putExtra(),
7102      * or the default value if no such item is present
7103      *
7104      * @see #putExtra(String, float)
7105      */
getFloatExtra(String name, float defaultValue)7106     public float getFloatExtra(String name, float defaultValue) {
7107         return mExtras == null ? defaultValue :
7108             mExtras.getFloat(name, defaultValue);
7109     }
7110 
7111     /**
7112      * Retrieve extended data from the intent.
7113      *
7114      * @param name The name of the desired item.
7115      * @param defaultValue the value to be returned if no value of the desired
7116      * type is stored with the given name.
7117      *
7118      * @return the value of an item that previously added with putExtra()
7119      * or the default value if none was found.
7120      *
7121      * @see #putExtra(String, double)
7122      */
getDoubleExtra(String name, double defaultValue)7123     public double getDoubleExtra(String name, double defaultValue) {
7124         return mExtras == null ? defaultValue :
7125             mExtras.getDouble(name, defaultValue);
7126     }
7127 
7128     /**
7129      * Retrieve extended data from the intent.
7130      *
7131      * @param name The name of the desired item.
7132      *
7133      * @return the value of an item that previously added with putExtra()
7134      * or null if no String value was found.
7135      *
7136      * @see #putExtra(String, String)
7137      */
getStringExtra(String name)7138     public String getStringExtra(String name) {
7139         return mExtras == null ? null : mExtras.getString(name);
7140     }
7141 
7142     /**
7143      * Retrieve extended data from the intent.
7144      *
7145      * @param name The name of the desired item.
7146      *
7147      * @return the value of an item that previously added with putExtra()
7148      * or null if no CharSequence value was found.
7149      *
7150      * @see #putExtra(String, CharSequence)
7151      */
getCharSequenceExtra(String name)7152     public CharSequence getCharSequenceExtra(String name) {
7153         return mExtras == null ? null : mExtras.getCharSequence(name);
7154     }
7155 
7156     /**
7157      * Retrieve extended data from the intent.
7158      *
7159      * @param name The name of the desired item.
7160      *
7161      * @return the value of an item that previously added with putExtra()
7162      * or null if no Parcelable value was found.
7163      *
7164      * @see #putExtra(String, Parcelable)
7165      */
getParcelableExtra(String name)7166     public <T extends Parcelable> T getParcelableExtra(String name) {
7167         return mExtras == null ? null : mExtras.<T>getParcelable(name);
7168     }
7169 
7170     /**
7171      * Retrieve extended data from the intent.
7172      *
7173      * @param name The name of the desired item.
7174      *
7175      * @return the value of an item that previously added with putExtra()
7176      * or null if no Parcelable[] value was found.
7177      *
7178      * @see #putExtra(String, Parcelable[])
7179      */
getParcelableArrayExtra(String name)7180     public Parcelable[] getParcelableArrayExtra(String name) {
7181         return mExtras == null ? null : mExtras.getParcelableArray(name);
7182     }
7183 
7184     /**
7185      * Retrieve extended data from the intent.
7186      *
7187      * @param name The name of the desired item.
7188      *
7189      * @return the value of an item that previously added with putExtra()
7190      * or null if no ArrayList<Parcelable> value was found.
7191      *
7192      * @see #putParcelableArrayListExtra(String, ArrayList)
7193      */
getParcelableArrayListExtra(String name)7194     public <T extends Parcelable> ArrayList<T> getParcelableArrayListExtra(String name) {
7195         return mExtras == null ? null : mExtras.<T>getParcelableArrayList(name);
7196     }
7197 
7198     /**
7199      * Retrieve extended data from the intent.
7200      *
7201      * @param name The name of the desired item.
7202      *
7203      * @return the value of an item that previously added with putExtra()
7204      * or null if no Serializable value was found.
7205      *
7206      * @see #putExtra(String, Serializable)
7207      */
getSerializableExtra(String name)7208     public Serializable getSerializableExtra(String name) {
7209         return mExtras == null ? null : mExtras.getSerializable(name);
7210     }
7211 
7212     /**
7213      * Retrieve extended data from the intent.
7214      *
7215      * @param name The name of the desired item.
7216      *
7217      * @return the value of an item that previously added with putExtra()
7218      * or null if no ArrayList<Integer> value was found.
7219      *
7220      * @see #putIntegerArrayListExtra(String, ArrayList)
7221      */
getIntegerArrayListExtra(String name)7222     public ArrayList<Integer> getIntegerArrayListExtra(String name) {
7223         return mExtras == null ? null : mExtras.getIntegerArrayList(name);
7224     }
7225 
7226     /**
7227      * Retrieve extended data from the intent.
7228      *
7229      * @param name The name of the desired item.
7230      *
7231      * @return the value of an item that previously added with putExtra()
7232      * or null if no ArrayList<String> value was found.
7233      *
7234      * @see #putStringArrayListExtra(String, ArrayList)
7235      */
getStringArrayListExtra(String name)7236     public ArrayList<String> getStringArrayListExtra(String name) {
7237         return mExtras == null ? null : mExtras.getStringArrayList(name);
7238     }
7239 
7240     /**
7241      * Retrieve extended data from the intent.
7242      *
7243      * @param name The name of the desired item.
7244      *
7245      * @return the value of an item that previously added with putExtra()
7246      * or null if no ArrayList<CharSequence> value was found.
7247      *
7248      * @see #putCharSequenceArrayListExtra(String, ArrayList)
7249      */
getCharSequenceArrayListExtra(String name)7250     public ArrayList<CharSequence> getCharSequenceArrayListExtra(String name) {
7251         return mExtras == null ? null : mExtras.getCharSequenceArrayList(name);
7252     }
7253 
7254     /**
7255      * Retrieve extended data from the intent.
7256      *
7257      * @param name The name of the desired item.
7258      *
7259      * @return the value of an item that previously added with putExtra()
7260      * or null if no boolean array value was found.
7261      *
7262      * @see #putExtra(String, boolean[])
7263      */
getBooleanArrayExtra(String name)7264     public boolean[] getBooleanArrayExtra(String name) {
7265         return mExtras == null ? null : mExtras.getBooleanArray(name);
7266     }
7267 
7268     /**
7269      * Retrieve extended data from the intent.
7270      *
7271      * @param name The name of the desired item.
7272      *
7273      * @return the value of an item that previously added with putExtra()
7274      * or null if no byte array value was found.
7275      *
7276      * @see #putExtra(String, byte[])
7277      */
getByteArrayExtra(String name)7278     public byte[] getByteArrayExtra(String name) {
7279         return mExtras == null ? null : mExtras.getByteArray(name);
7280     }
7281 
7282     /**
7283      * Retrieve extended data from the intent.
7284      *
7285      * @param name The name of the desired item.
7286      *
7287      * @return the value of an item that previously added with putExtra()
7288      * or null if no short array value was found.
7289      *
7290      * @see #putExtra(String, short[])
7291      */
getShortArrayExtra(String name)7292     public short[] getShortArrayExtra(String name) {
7293         return mExtras == null ? null : mExtras.getShortArray(name);
7294     }
7295 
7296     /**
7297      * Retrieve extended data from the intent.
7298      *
7299      * @param name The name of the desired item.
7300      *
7301      * @return the value of an item that previously added with putExtra()
7302      * or null if no char array value was found.
7303      *
7304      * @see #putExtra(String, char[])
7305      */
getCharArrayExtra(String name)7306     public char[] getCharArrayExtra(String name) {
7307         return mExtras == null ? null : mExtras.getCharArray(name);
7308     }
7309 
7310     /**
7311      * Retrieve extended data from the intent.
7312      *
7313      * @param name The name of the desired item.
7314      *
7315      * @return the value of an item that previously added with putExtra()
7316      * or null if no int array value was found.
7317      *
7318      * @see #putExtra(String, int[])
7319      */
getIntArrayExtra(String name)7320     public int[] getIntArrayExtra(String name) {
7321         return mExtras == null ? null : mExtras.getIntArray(name);
7322     }
7323 
7324     /**
7325      * Retrieve extended data from the intent.
7326      *
7327      * @param name The name of the desired item.
7328      *
7329      * @return the value of an item that previously added with putExtra()
7330      * or null if no long array value was found.
7331      *
7332      * @see #putExtra(String, long[])
7333      */
getLongArrayExtra(String name)7334     public long[] getLongArrayExtra(String name) {
7335         return mExtras == null ? null : mExtras.getLongArray(name);
7336     }
7337 
7338     /**
7339      * Retrieve extended data from the intent.
7340      *
7341      * @param name The name of the desired item.
7342      *
7343      * @return the value of an item that previously added with putExtra()
7344      * or null if no float array value was found.
7345      *
7346      * @see #putExtra(String, float[])
7347      */
getFloatArrayExtra(String name)7348     public float[] getFloatArrayExtra(String name) {
7349         return mExtras == null ? null : mExtras.getFloatArray(name);
7350     }
7351 
7352     /**
7353      * Retrieve extended data from the intent.
7354      *
7355      * @param name The name of the desired item.
7356      *
7357      * @return the value of an item that previously added with putExtra()
7358      * or null if no double array value was found.
7359      *
7360      * @see #putExtra(String, double[])
7361      */
getDoubleArrayExtra(String name)7362     public double[] getDoubleArrayExtra(String name) {
7363         return mExtras == null ? null : mExtras.getDoubleArray(name);
7364     }
7365 
7366     /**
7367      * Retrieve extended data from the intent.
7368      *
7369      * @param name The name of the desired item.
7370      *
7371      * @return the value of an item that previously added with putExtra()
7372      * or null if no String array value was found.
7373      *
7374      * @see #putExtra(String, String[])
7375      */
getStringArrayExtra(String name)7376     public String[] getStringArrayExtra(String name) {
7377         return mExtras == null ? null : mExtras.getStringArray(name);
7378     }
7379 
7380     /**
7381      * Retrieve extended data from the intent.
7382      *
7383      * @param name The name of the desired item.
7384      *
7385      * @return the value of an item that previously added with putExtra()
7386      * or null if no CharSequence array value was found.
7387      *
7388      * @see #putExtra(String, CharSequence[])
7389      */
getCharSequenceArrayExtra(String name)7390     public CharSequence[] getCharSequenceArrayExtra(String name) {
7391         return mExtras == null ? null : mExtras.getCharSequenceArray(name);
7392     }
7393 
7394     /**
7395      * Retrieve extended data from the intent.
7396      *
7397      * @param name The name of the desired item.
7398      *
7399      * @return the value of an item that previously added with putExtra()
7400      * or null if no Bundle value was found.
7401      *
7402      * @see #putExtra(String, Bundle)
7403      */
getBundleExtra(String name)7404     public Bundle getBundleExtra(String name) {
7405         return mExtras == null ? null : mExtras.getBundle(name);
7406     }
7407 
7408     /**
7409      * Retrieve extended data from the intent.
7410      *
7411      * @param name The name of the desired item.
7412      *
7413      * @return the value of an item that previously added with putExtra()
7414      * or null if no IBinder value was found.
7415      *
7416      * @see #putExtra(String, IBinder)
7417      *
7418      * @deprecated
7419      * @hide
7420      */
7421     @Deprecated
getIBinderExtra(String name)7422     public IBinder getIBinderExtra(String name) {
7423         return mExtras == null ? null : mExtras.getIBinder(name);
7424     }
7425 
7426     /**
7427      * Retrieve extended data from the intent.
7428      *
7429      * @param name The name of the desired item.
7430      * @param defaultValue The default value to return in case no item is
7431      * associated with the key 'name'
7432      *
7433      * @return the value of an item that previously added with putExtra()
7434      * or defaultValue if none was found.
7435      *
7436      * @see #putExtra
7437      *
7438      * @deprecated
7439      * @hide
7440      */
7441     @Deprecated
getExtra(String name, Object defaultValue)7442     public Object getExtra(String name, Object defaultValue) {
7443         Object result = defaultValue;
7444         if (mExtras != null) {
7445             Object result2 = mExtras.get(name);
7446             if (result2 != null) {
7447                 result = result2;
7448             }
7449         }
7450 
7451         return result;
7452     }
7453 
7454     /**
7455      * Retrieves a map of extended data from the intent.
7456      *
7457      * @return the map of all extras previously added with putExtra(),
7458      * or null if none have been added.
7459      */
getExtras()7460     public @Nullable Bundle getExtras() {
7461         return (mExtras != null)
7462                 ? new Bundle(mExtras)
7463                 : null;
7464     }
7465 
7466     /**
7467      * Filter extras to only basic types.
7468      * @hide
7469      */
removeUnsafeExtras()7470     public void removeUnsafeExtras() {
7471         if (mExtras != null) {
7472             mExtras = mExtras.filterValues();
7473         }
7474     }
7475 
7476     /**
7477      * @return Whether {@link #maybeStripForHistory} will return an lightened intent or
7478      * return itself as-is.
7479      * @hide
7480      */
canStripForHistory()7481     public boolean canStripForHistory() {
7482         return ((mExtras != null) && mExtras.isParcelled()) || (mClipData != null);
7483     }
7484 
7485     /**
7486      * Call it when the system needs to keep an intent for logging purposes to remove fields
7487      * that are not needed for logging.
7488      * @hide
7489      */
maybeStripForHistory()7490     public Intent maybeStripForHistory() {
7491         // TODO Scan and remove possibly heavy instances like Bitmaps from unparcelled extras?
7492 
7493         if (!canStripForHistory()) {
7494             return this;
7495         }
7496         return new Intent(this, COPY_MODE_HISTORY);
7497     }
7498 
7499     /**
7500      * Retrieve any special flags associated with this intent.  You will
7501      * normally just set them with {@link #setFlags} and let the system
7502      * take the appropriate action with them.
7503      *
7504      * @return The currently set flags.
7505      * @see #setFlags
7506      * @see #addFlags
7507      * @see #removeFlags
7508      */
getFlags()7509     public @Flags int getFlags() {
7510         return mFlags;
7511     }
7512 
7513     /** @hide */
isExcludingStopped()7514     public boolean isExcludingStopped() {
7515         return (mFlags&(FLAG_EXCLUDE_STOPPED_PACKAGES|FLAG_INCLUDE_STOPPED_PACKAGES))
7516                 == FLAG_EXCLUDE_STOPPED_PACKAGES;
7517     }
7518 
7519     /**
7520      * Retrieve the application package name this Intent is limited to.  When
7521      * resolving an Intent, if non-null this limits the resolution to only
7522      * components in the given application package.
7523      *
7524      * @return The name of the application package for the Intent.
7525      *
7526      * @see #resolveActivity
7527      * @see #setPackage
7528      */
getPackage()7529     public @Nullable String getPackage() {
7530         return mPackage;
7531     }
7532 
7533     /**
7534      * Retrieve the concrete component associated with the intent.  When receiving
7535      * an intent, this is the component that was found to best handle it (that is,
7536      * yourself) and will always be non-null; in all other cases it will be
7537      * null unless explicitly set.
7538      *
7539      * @return The name of the application component to handle the intent.
7540      *
7541      * @see #resolveActivity
7542      * @see #setComponent
7543      */
getComponent()7544     public @Nullable ComponentName getComponent() {
7545         return mComponent;
7546     }
7547 
7548     /**
7549      * Get the bounds of the sender of this intent, in screen coordinates.  This can be
7550      * used as a hint to the receiver for animations and the like.  Null means that there
7551      * is no source bounds.
7552      */
getSourceBounds()7553     public @Nullable Rect getSourceBounds() {
7554         return mSourceBounds;
7555     }
7556 
7557     /**
7558      * Return the Activity component that should be used to handle this intent.
7559      * The appropriate component is determined based on the information in the
7560      * intent, evaluated as follows:
7561      *
7562      * <p>If {@link #getComponent} returns an explicit class, that is returned
7563      * without any further consideration.
7564      *
7565      * <p>The activity must handle the {@link Intent#CATEGORY_DEFAULT} Intent
7566      * category to be considered.
7567      *
7568      * <p>If {@link #getAction} is non-NULL, the activity must handle this
7569      * action.
7570      *
7571      * <p>If {@link #resolveType} returns non-NULL, the activity must handle
7572      * this type.
7573      *
7574      * <p>If {@link #addCategory} has added any categories, the activity must
7575      * handle ALL of the categories specified.
7576      *
7577      * <p>If {@link #getPackage} is non-NULL, only activity components in
7578      * that application package will be considered.
7579      *
7580      * <p>If there are no activities that satisfy all of these conditions, a
7581      * null string is returned.
7582      *
7583      * <p>If multiple activities are found to satisfy the intent, the one with
7584      * the highest priority will be used.  If there are multiple activities
7585      * with the same priority, the system will either pick the best activity
7586      * based on user preference, or resolve to a system class that will allow
7587      * the user to pick an activity and forward from there.
7588      *
7589      * <p>This method is implemented simply by calling
7590      * {@link PackageManager#resolveActivity} with the "defaultOnly" parameter
7591      * true.</p>
7592      * <p> This API is called for you as part of starting an activity from an
7593      * intent.  You do not normally need to call it yourself.</p>
7594      *
7595      * @param pm The package manager with which to resolve the Intent.
7596      *
7597      * @return Name of the component implementing an activity that can
7598      *         display the intent.
7599      *
7600      * @see #setComponent
7601      * @see #getComponent
7602      * @see #resolveActivityInfo
7603      */
resolveActivity(@onNull PackageManager pm)7604     public ComponentName resolveActivity(@NonNull PackageManager pm) {
7605         if (mComponent != null) {
7606             return mComponent;
7607         }
7608 
7609         ResolveInfo info = pm.resolveActivity(
7610             this, PackageManager.MATCH_DEFAULT_ONLY);
7611         if (info != null) {
7612             return new ComponentName(
7613                     info.activityInfo.applicationInfo.packageName,
7614                     info.activityInfo.name);
7615         }
7616 
7617         return null;
7618     }
7619 
7620     /**
7621      * Resolve the Intent into an {@link ActivityInfo}
7622      * describing the activity that should execute the intent.  Resolution
7623      * follows the same rules as described for {@link #resolveActivity}, but
7624      * you get back the completely information about the resolved activity
7625      * instead of just its class name.
7626      *
7627      * @param pm The package manager with which to resolve the Intent.
7628      * @param flags Addition information to retrieve as per
7629      * {@link PackageManager#getActivityInfo(ComponentName, int)
7630      * PackageManager.getActivityInfo()}.
7631      *
7632      * @return PackageManager.ActivityInfo
7633      *
7634      * @see #resolveActivity
7635      */
resolveActivityInfo(@onNull PackageManager pm, @PackageManager.ComponentInfoFlags int flags)7636     public ActivityInfo resolveActivityInfo(@NonNull PackageManager pm,
7637             @PackageManager.ComponentInfoFlags int flags) {
7638         ActivityInfo ai = null;
7639         if (mComponent != null) {
7640             try {
7641                 ai = pm.getActivityInfo(mComponent, flags);
7642             } catch (PackageManager.NameNotFoundException e) {
7643                 // ignore
7644             }
7645         } else {
7646             ResolveInfo info = pm.resolveActivity(
7647                 this, PackageManager.MATCH_DEFAULT_ONLY | flags);
7648             if (info != null) {
7649                 ai = info.activityInfo;
7650             }
7651         }
7652 
7653         return ai;
7654     }
7655 
7656     /**
7657      * Special function for use by the system to resolve service
7658      * intents to system apps.  Throws an exception if there are
7659      * multiple potential matches to the Intent.  Returns null if
7660      * there are no matches.
7661      * @hide
7662      */
resolveSystemService(@onNull PackageManager pm, @PackageManager.ComponentInfoFlags int flags)7663     public @Nullable ComponentName resolveSystemService(@NonNull PackageManager pm,
7664             @PackageManager.ComponentInfoFlags int flags) {
7665         if (mComponent != null) {
7666             return mComponent;
7667         }
7668 
7669         List<ResolveInfo> results = pm.queryIntentServices(this, flags);
7670         if (results == null) {
7671             return null;
7672         }
7673         ComponentName comp = null;
7674         for (int i=0; i<results.size(); i++) {
7675             ResolveInfo ri = results.get(i);
7676             if ((ri.serviceInfo.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM) == 0) {
7677                 continue;
7678             }
7679             ComponentName foundComp = new ComponentName(ri.serviceInfo.applicationInfo.packageName,
7680                     ri.serviceInfo.name);
7681             if (comp != null) {
7682                 throw new IllegalStateException("Multiple system services handle " + this
7683                         + ": " + comp + ", " + foundComp);
7684             }
7685             comp = foundComp;
7686         }
7687         return comp;
7688     }
7689 
7690     /**
7691      * Set the general action to be performed.
7692      *
7693      * @param action An action name, such as ACTION_VIEW.  Application-specific
7694      *               actions should be prefixed with the vendor's package name.
7695      *
7696      * @return Returns the same Intent object, for chaining multiple calls
7697      * into a single statement.
7698      *
7699      * @see #getAction
7700      */
setAction(@ullable String action)7701     public @NonNull Intent setAction(@Nullable String action) {
7702         mAction = action != null ? action.intern() : null;
7703         return this;
7704     }
7705 
7706     /**
7707      * Set the data this intent is operating on.  This method automatically
7708      * clears any type that was previously set by {@link #setType} or
7709      * {@link #setTypeAndNormalize}.
7710      *
7711      * <p><em>Note: scheme matching in the Android framework is
7712      * case-sensitive, unlike the formal RFC. As a result,
7713      * you should always write your Uri with a lower case scheme,
7714      * or use {@link Uri#normalizeScheme} or
7715      * {@link #setDataAndNormalize}
7716      * to ensure that the scheme is converted to lower case.</em>
7717      *
7718      * @param data The Uri of the data this intent is now targeting.
7719      *
7720      * @return Returns the same Intent object, for chaining multiple calls
7721      * into a single statement.
7722      *
7723      * @see #getData
7724      * @see #setDataAndNormalize
7725      * @see android.net.Uri#normalizeScheme()
7726      */
setData(@ullable Uri data)7727     public @NonNull Intent setData(@Nullable Uri data) {
7728         mData = data;
7729         mType = null;
7730         return this;
7731     }
7732 
7733     /**
7734      * Normalize and set the data this intent is operating on.
7735      *
7736      * <p>This method automatically clears any type that was
7737      * previously set (for example, by {@link #setType}).
7738      *
7739      * <p>The data Uri is normalized using
7740      * {@link android.net.Uri#normalizeScheme} before it is set,
7741      * so really this is just a convenience method for
7742      * <pre>
7743      * setData(data.normalize())
7744      * </pre>
7745      *
7746      * @param data The Uri of the data this intent is now targeting.
7747      *
7748      * @return Returns the same Intent object, for chaining multiple calls
7749      * into a single statement.
7750      *
7751      * @see #getData
7752      * @see #setType
7753      * @see android.net.Uri#normalizeScheme
7754      */
setDataAndNormalize(@onNull Uri data)7755     public @NonNull Intent setDataAndNormalize(@NonNull Uri data) {
7756         return setData(data.normalizeScheme());
7757     }
7758 
7759     /**
7760      * Set an explicit MIME data type.
7761      *
7762      * <p>This is used to create intents that only specify a type and not data,
7763      * for example to indicate the type of data to return.
7764      *
7765      * <p>This method automatically clears any data that was
7766      * previously set (for example by {@link #setData}).
7767      *
7768      * <p><em>Note: MIME type matching in the Android framework is
7769      * case-sensitive, unlike formal RFC MIME types.  As a result,
7770      * you should always write your MIME types with lower case letters,
7771      * or use {@link #normalizeMimeType} or {@link #setTypeAndNormalize}
7772      * to ensure that it is converted to lower case.</em>
7773      *
7774      * @param type The MIME type of the data being handled by this intent.
7775      *
7776      * @return Returns the same Intent object, for chaining multiple calls
7777      * into a single statement.
7778      *
7779      * @see #getType
7780      * @see #setTypeAndNormalize
7781      * @see #setDataAndType
7782      * @see #normalizeMimeType
7783      */
setType(@ullable String type)7784     public @NonNull Intent setType(@Nullable String type) {
7785         mData = null;
7786         mType = type;
7787         return this;
7788     }
7789 
7790     /**
7791      * Normalize and set an explicit MIME data type.
7792      *
7793      * <p>This is used to create intents that only specify a type and not data,
7794      * for example to indicate the type of data to return.
7795      *
7796      * <p>This method automatically clears any data that was
7797      * previously set (for example by {@link #setData}).
7798      *
7799      * <p>The MIME type is normalized using
7800      * {@link #normalizeMimeType} before it is set,
7801      * so really this is just a convenience method for
7802      * <pre>
7803      * setType(Intent.normalizeMimeType(type))
7804      * </pre>
7805      *
7806      * @param type The MIME type of the data being handled by this intent.
7807      *
7808      * @return Returns the same Intent object, for chaining multiple calls
7809      * into a single statement.
7810      *
7811      * @see #getType
7812      * @see #setData
7813      * @see #normalizeMimeType
7814      */
setTypeAndNormalize(@ullable String type)7815     public @NonNull Intent setTypeAndNormalize(@Nullable String type) {
7816         return setType(normalizeMimeType(type));
7817     }
7818 
7819     /**
7820      * (Usually optional) Set the data for the intent along with an explicit
7821      * MIME data type.  This method should very rarely be used -- it allows you
7822      * to override the MIME type that would ordinarily be inferred from the
7823      * data with your own type given here.
7824      *
7825      * <p><em>Note: MIME type and Uri scheme matching in the
7826      * Android framework is case-sensitive, unlike the formal RFC definitions.
7827      * As a result, you should always write these elements with lower case letters,
7828      * or use {@link #normalizeMimeType} or {@link android.net.Uri#normalizeScheme} or
7829      * {@link #setDataAndTypeAndNormalize}
7830      * to ensure that they are converted to lower case.</em>
7831      *
7832      * @param data The Uri of the data this intent is now targeting.
7833      * @param type The MIME type of the data being handled by this intent.
7834      *
7835      * @return Returns the same Intent object, for chaining multiple calls
7836      * into a single statement.
7837      *
7838      * @see #setType
7839      * @see #setData
7840      * @see #normalizeMimeType
7841      * @see android.net.Uri#normalizeScheme
7842      * @see #setDataAndTypeAndNormalize
7843      */
setDataAndType(@ullable Uri data, @Nullable String type)7844     public @NonNull Intent setDataAndType(@Nullable Uri data, @Nullable String type) {
7845         mData = data;
7846         mType = type;
7847         return this;
7848     }
7849 
7850     /**
7851      * (Usually optional) Normalize and set both the data Uri and an explicit
7852      * MIME data type.  This method should very rarely be used -- it allows you
7853      * to override the MIME type that would ordinarily be inferred from the
7854      * data with your own type given here.
7855      *
7856      * <p>The data Uri and the MIME type are normalize using
7857      * {@link android.net.Uri#normalizeScheme} and {@link #normalizeMimeType}
7858      * before they are set, so really this is just a convenience method for
7859      * <pre>
7860      * setDataAndType(data.normalize(), Intent.normalizeMimeType(type))
7861      * </pre>
7862      *
7863      * @param data The Uri of the data this intent is now targeting.
7864      * @param type The MIME type of the data being handled by this intent.
7865      *
7866      * @return Returns the same Intent object, for chaining multiple calls
7867      * into a single statement.
7868      *
7869      * @see #setType
7870      * @see #setData
7871      * @see #setDataAndType
7872      * @see #normalizeMimeType
7873      * @see android.net.Uri#normalizeScheme
7874      */
setDataAndTypeAndNormalize(@onNull Uri data, @Nullable String type)7875     public @NonNull Intent setDataAndTypeAndNormalize(@NonNull Uri data, @Nullable String type) {
7876         return setDataAndType(data.normalizeScheme(), normalizeMimeType(type));
7877     }
7878 
7879     /**
7880      * Add a new category to the intent.  Categories provide additional detail
7881      * about the action the intent performs.  When resolving an intent, only
7882      * activities that provide <em>all</em> of the requested categories will be
7883      * used.
7884      *
7885      * @param category The desired category.  This can be either one of the
7886      *               predefined Intent categories, or a custom category in your own
7887      *               namespace.
7888      *
7889      * @return Returns the same Intent object, for chaining multiple calls
7890      * into a single statement.
7891      *
7892      * @see #hasCategory
7893      * @see #removeCategory
7894      */
addCategory(String category)7895     public @NonNull Intent addCategory(String category) {
7896         if (mCategories == null) {
7897             mCategories = new ArraySet<String>();
7898         }
7899         mCategories.add(category.intern());
7900         return this;
7901     }
7902 
7903     /**
7904      * Remove a category from an intent.
7905      *
7906      * @param category The category to remove.
7907      *
7908      * @see #addCategory
7909      */
removeCategory(String category)7910     public void removeCategory(String category) {
7911         if (mCategories != null) {
7912             mCategories.remove(category);
7913             if (mCategories.size() == 0) {
7914                 mCategories = null;
7915             }
7916         }
7917     }
7918 
7919     /**
7920      * Set a selector for this Intent.  This is a modification to the kinds of
7921      * things the Intent will match.  If the selector is set, it will be used
7922      * when trying to find entities that can handle the Intent, instead of the
7923      * main contents of the Intent.  This allows you build an Intent containing
7924      * a generic protocol while targeting it more specifically.
7925      *
7926      * <p>An example of where this may be used is with things like
7927      * {@link #CATEGORY_APP_BROWSER}.  This category allows you to build an
7928      * Intent that will launch the Browser application.  However, the correct
7929      * main entry point of an application is actually {@link #ACTION_MAIN}
7930      * {@link #CATEGORY_LAUNCHER} with {@link #setComponent(ComponentName)}
7931      * used to specify the actual Activity to launch.  If you launch the browser
7932      * with something different, undesired behavior may happen if the user has
7933      * previously or later launches it the normal way, since they do not match.
7934      * Instead, you can build an Intent with the MAIN action (but no ComponentName
7935      * yet specified) and set a selector with {@link #ACTION_MAIN} and
7936      * {@link #CATEGORY_APP_BROWSER} to point it specifically to the browser activity.
7937      *
7938      * <p>Setting a selector does not impact the behavior of
7939      * {@link #filterEquals(Intent)} and {@link #filterHashCode()}.  This is part of the
7940      * desired behavior of a selector -- it does not impact the base meaning
7941      * of the Intent, just what kinds of things will be matched against it
7942      * when determining who can handle it.</p>
7943      *
7944      * <p>You can not use both a selector and {@link #setPackage(String)} on
7945      * the same base Intent.</p>
7946      *
7947      * @param selector The desired selector Intent; set to null to not use
7948      * a special selector.
7949      */
setSelector(@ullable Intent selector)7950     public void setSelector(@Nullable Intent selector) {
7951         if (selector == this) {
7952             throw new IllegalArgumentException(
7953                     "Intent being set as a selector of itself");
7954         }
7955         if (selector != null && mPackage != null) {
7956             throw new IllegalArgumentException(
7957                     "Can't set selector when package name is already set");
7958         }
7959         mSelector = selector;
7960     }
7961 
7962     /**
7963      * Set a {@link ClipData} associated with this Intent.  This replaces any
7964      * previously set ClipData.
7965      *
7966      * <p>The ClipData in an intent is not used for Intent matching or other
7967      * such operations.  Semantically it is like extras, used to transmit
7968      * additional data with the Intent.  The main feature of using this over
7969      * the extras for data is that {@link #FLAG_GRANT_READ_URI_PERMISSION}
7970      * and {@link #FLAG_GRANT_WRITE_URI_PERMISSION} will operate on any URI
7971      * items included in the clip data.  This is useful, in particular, if
7972      * you want to transmit an Intent containing multiple <code>content:</code>
7973      * URIs for which the recipient may not have global permission to access the
7974      * content provider.
7975      *
7976      * <p>If the ClipData contains items that are themselves Intents, any
7977      * grant flags in those Intents will be ignored.  Only the top-level flags
7978      * of the main Intent are respected, and will be applied to all Uri or
7979      * Intent items in the clip (or sub-items of the clip).
7980      *
7981      * <p>The MIME type, label, and icon in the ClipData object are not
7982      * directly used by Intent.  Applications should generally rely on the
7983      * MIME type of the Intent itself, not what it may find in the ClipData.
7984      * A common practice is to construct a ClipData for use with an Intent
7985      * with a MIME type of "*&#47;*".
7986      *
7987      * @param clip The new clip to set.  May be null to clear the current clip.
7988      */
setClipData(@ullable ClipData clip)7989     public void setClipData(@Nullable ClipData clip) {
7990         mClipData = clip;
7991     }
7992 
7993     /**
7994      * This is NOT a secure mechanism to identify the user who sent the intent.
7995      * When the intent is sent to a different user, it is used to fix uris by adding the userId
7996      * who sent the intent.
7997      * @hide
7998      */
prepareToLeaveUser(int userId)7999     public void prepareToLeaveUser(int userId) {
8000         // If mContentUserHint is not UserHandle.USER_CURRENT, the intent has already left a user.
8001         // We want mContentUserHint to refer to the original user, so don't do anything.
8002         if (mContentUserHint == UserHandle.USER_CURRENT) {
8003             mContentUserHint = userId;
8004         }
8005     }
8006 
8007     /**
8008      * Add extended data to the intent.  The name must include a package
8009      * prefix, for example the app com.android.contacts would use names
8010      * like "com.android.contacts.ShowAll".
8011      *
8012      * @param name The name of the extra data, with package prefix.
8013      * @param value The boolean data value.
8014      *
8015      * @return Returns the same Intent object, for chaining multiple calls
8016      * into a single statement.
8017      *
8018      * @see #putExtras
8019      * @see #removeExtra
8020      * @see #getBooleanExtra(String, boolean)
8021      */
putExtra(String name, boolean value)8022     public @NonNull Intent putExtra(String name, boolean value) {
8023         if (mExtras == null) {
8024             mExtras = new Bundle();
8025         }
8026         mExtras.putBoolean(name, value);
8027         return this;
8028     }
8029 
8030     /**
8031      * Add extended data to the intent.  The name must include a package
8032      * prefix, for example the app com.android.contacts would use names
8033      * like "com.android.contacts.ShowAll".
8034      *
8035      * @param name The name of the extra data, with package prefix.
8036      * @param value The byte data value.
8037      *
8038      * @return Returns the same Intent object, for chaining multiple calls
8039      * into a single statement.
8040      *
8041      * @see #putExtras
8042      * @see #removeExtra
8043      * @see #getByteExtra(String, byte)
8044      */
putExtra(String name, byte value)8045     public @NonNull Intent putExtra(String name, byte value) {
8046         if (mExtras == null) {
8047             mExtras = new Bundle();
8048         }
8049         mExtras.putByte(name, value);
8050         return this;
8051     }
8052 
8053     /**
8054      * Add extended data to the intent.  The name must include a package
8055      * prefix, for example the app com.android.contacts would use names
8056      * like "com.android.contacts.ShowAll".
8057      *
8058      * @param name The name of the extra data, with package prefix.
8059      * @param value The char data value.
8060      *
8061      * @return Returns the same Intent object, for chaining multiple calls
8062      * into a single statement.
8063      *
8064      * @see #putExtras
8065      * @see #removeExtra
8066      * @see #getCharExtra(String, char)
8067      */
putExtra(String name, char value)8068     public @NonNull Intent putExtra(String name, char value) {
8069         if (mExtras == null) {
8070             mExtras = new Bundle();
8071         }
8072         mExtras.putChar(name, value);
8073         return this;
8074     }
8075 
8076     /**
8077      * Add extended data to the intent.  The name must include a package
8078      * prefix, for example the app com.android.contacts would use names
8079      * like "com.android.contacts.ShowAll".
8080      *
8081      * @param name The name of the extra data, with package prefix.
8082      * @param value The short data value.
8083      *
8084      * @return Returns the same Intent object, for chaining multiple calls
8085      * into a single statement.
8086      *
8087      * @see #putExtras
8088      * @see #removeExtra
8089      * @see #getShortExtra(String, short)
8090      */
putExtra(String name, short value)8091     public @NonNull Intent putExtra(String name, short value) {
8092         if (mExtras == null) {
8093             mExtras = new Bundle();
8094         }
8095         mExtras.putShort(name, value);
8096         return this;
8097     }
8098 
8099     /**
8100      * Add extended data to the intent.  The name must include a package
8101      * prefix, for example the app com.android.contacts would use names
8102      * like "com.android.contacts.ShowAll".
8103      *
8104      * @param name The name of the extra data, with package prefix.
8105      * @param value The integer data value.
8106      *
8107      * @return Returns the same Intent object, for chaining multiple calls
8108      * into a single statement.
8109      *
8110      * @see #putExtras
8111      * @see #removeExtra
8112      * @see #getIntExtra(String, int)
8113      */
putExtra(String name, int value)8114     public @NonNull Intent putExtra(String name, int value) {
8115         if (mExtras == null) {
8116             mExtras = new Bundle();
8117         }
8118         mExtras.putInt(name, value);
8119         return this;
8120     }
8121 
8122     /**
8123      * Add extended data to the intent.  The name must include a package
8124      * prefix, for example the app com.android.contacts would use names
8125      * like "com.android.contacts.ShowAll".
8126      *
8127      * @param name The name of the extra data, with package prefix.
8128      * @param value The long data value.
8129      *
8130      * @return Returns the same Intent object, for chaining multiple calls
8131      * into a single statement.
8132      *
8133      * @see #putExtras
8134      * @see #removeExtra
8135      * @see #getLongExtra(String, long)
8136      */
putExtra(String name, long value)8137     public @NonNull Intent putExtra(String name, long value) {
8138         if (mExtras == null) {
8139             mExtras = new Bundle();
8140         }
8141         mExtras.putLong(name, value);
8142         return this;
8143     }
8144 
8145     /**
8146      * Add extended data to the intent.  The name must include a package
8147      * prefix, for example the app com.android.contacts would use names
8148      * like "com.android.contacts.ShowAll".
8149      *
8150      * @param name The name of the extra data, with package prefix.
8151      * @param value The float data value.
8152      *
8153      * @return Returns the same Intent object, for chaining multiple calls
8154      * into a single statement.
8155      *
8156      * @see #putExtras
8157      * @see #removeExtra
8158      * @see #getFloatExtra(String, float)
8159      */
putExtra(String name, float value)8160     public @NonNull Intent putExtra(String name, float value) {
8161         if (mExtras == null) {
8162             mExtras = new Bundle();
8163         }
8164         mExtras.putFloat(name, value);
8165         return this;
8166     }
8167 
8168     /**
8169      * Add extended data to the intent.  The name must include a package
8170      * prefix, for example the app com.android.contacts would use names
8171      * like "com.android.contacts.ShowAll".
8172      *
8173      * @param name The name of the extra data, with package prefix.
8174      * @param value The double data value.
8175      *
8176      * @return Returns the same Intent object, for chaining multiple calls
8177      * into a single statement.
8178      *
8179      * @see #putExtras
8180      * @see #removeExtra
8181      * @see #getDoubleExtra(String, double)
8182      */
putExtra(String name, double value)8183     public @NonNull Intent putExtra(String name, double value) {
8184         if (mExtras == null) {
8185             mExtras = new Bundle();
8186         }
8187         mExtras.putDouble(name, value);
8188         return this;
8189     }
8190 
8191     /**
8192      * Add extended data to the intent.  The name must include a package
8193      * prefix, for example the app com.android.contacts would use names
8194      * like "com.android.contacts.ShowAll".
8195      *
8196      * @param name The name of the extra data, with package prefix.
8197      * @param value The String data value.
8198      *
8199      * @return Returns the same Intent object, for chaining multiple calls
8200      * into a single statement.
8201      *
8202      * @see #putExtras
8203      * @see #removeExtra
8204      * @see #getStringExtra(String)
8205      */
putExtra(String name, String value)8206     public @NonNull Intent putExtra(String name, String value) {
8207         if (mExtras == null) {
8208             mExtras = new Bundle();
8209         }
8210         mExtras.putString(name, value);
8211         return this;
8212     }
8213 
8214     /**
8215      * Add extended data to the intent.  The name must include a package
8216      * prefix, for example the app com.android.contacts would use names
8217      * like "com.android.contacts.ShowAll".
8218      *
8219      * @param name The name of the extra data, with package prefix.
8220      * @param value The CharSequence data value.
8221      *
8222      * @return Returns the same Intent object, for chaining multiple calls
8223      * into a single statement.
8224      *
8225      * @see #putExtras
8226      * @see #removeExtra
8227      * @see #getCharSequenceExtra(String)
8228      */
putExtra(String name, CharSequence value)8229     public @NonNull Intent putExtra(String name, CharSequence value) {
8230         if (mExtras == null) {
8231             mExtras = new Bundle();
8232         }
8233         mExtras.putCharSequence(name, value);
8234         return this;
8235     }
8236 
8237     /**
8238      * Add extended data to the intent.  The name must include a package
8239      * prefix, for example the app com.android.contacts would use names
8240      * like "com.android.contacts.ShowAll".
8241      *
8242      * @param name The name of the extra data, with package prefix.
8243      * @param value The Parcelable data value.
8244      *
8245      * @return Returns the same Intent object, for chaining multiple calls
8246      * into a single statement.
8247      *
8248      * @see #putExtras
8249      * @see #removeExtra
8250      * @see #getParcelableExtra(String)
8251      */
putExtra(String name, Parcelable value)8252     public @NonNull Intent putExtra(String name, Parcelable value) {
8253         if (mExtras == null) {
8254             mExtras = new Bundle();
8255         }
8256         mExtras.putParcelable(name, value);
8257         return this;
8258     }
8259 
8260     /**
8261      * Add extended data to the intent.  The name must include a package
8262      * prefix, for example the app com.android.contacts would use names
8263      * like "com.android.contacts.ShowAll".
8264      *
8265      * @param name The name of the extra data, with package prefix.
8266      * @param value The Parcelable[] data value.
8267      *
8268      * @return Returns the same Intent object, for chaining multiple calls
8269      * into a single statement.
8270      *
8271      * @see #putExtras
8272      * @see #removeExtra
8273      * @see #getParcelableArrayExtra(String)
8274      */
putExtra(String name, Parcelable[] value)8275     public @NonNull Intent putExtra(String name, Parcelable[] value) {
8276         if (mExtras == null) {
8277             mExtras = new Bundle();
8278         }
8279         mExtras.putParcelableArray(name, value);
8280         return this;
8281     }
8282 
8283     /**
8284      * Add extended data to the intent.  The name must include a package
8285      * prefix, for example the app com.android.contacts would use names
8286      * like "com.android.contacts.ShowAll".
8287      *
8288      * @param name The name of the extra data, with package prefix.
8289      * @param value The ArrayList<Parcelable> data value.
8290      *
8291      * @return Returns the same Intent object, for chaining multiple calls
8292      * into a single statement.
8293      *
8294      * @see #putExtras
8295      * @see #removeExtra
8296      * @see #getParcelableArrayListExtra(String)
8297      */
putParcelableArrayListExtra(String name, ArrayList<? extends Parcelable> value)8298     public @NonNull Intent putParcelableArrayListExtra(String name,
8299             ArrayList<? extends Parcelable> value) {
8300         if (mExtras == null) {
8301             mExtras = new Bundle();
8302         }
8303         mExtras.putParcelableArrayList(name, value);
8304         return this;
8305     }
8306 
8307     /**
8308      * Add extended data to the intent.  The name must include a package
8309      * prefix, for example the app com.android.contacts would use names
8310      * like "com.android.contacts.ShowAll".
8311      *
8312      * @param name The name of the extra data, with package prefix.
8313      * @param value The ArrayList<Integer> data value.
8314      *
8315      * @return Returns the same Intent object, for chaining multiple calls
8316      * into a single statement.
8317      *
8318      * @see #putExtras
8319      * @see #removeExtra
8320      * @see #getIntegerArrayListExtra(String)
8321      */
putIntegerArrayListExtra(String name, ArrayList<Integer> value)8322     public @NonNull Intent putIntegerArrayListExtra(String name, ArrayList<Integer> value) {
8323         if (mExtras == null) {
8324             mExtras = new Bundle();
8325         }
8326         mExtras.putIntegerArrayList(name, value);
8327         return this;
8328     }
8329 
8330     /**
8331      * Add extended data to the intent.  The name must include a package
8332      * prefix, for example the app com.android.contacts would use names
8333      * like "com.android.contacts.ShowAll".
8334      *
8335      * @param name The name of the extra data, with package prefix.
8336      * @param value The ArrayList<String> data value.
8337      *
8338      * @return Returns the same Intent object, for chaining multiple calls
8339      * into a single statement.
8340      *
8341      * @see #putExtras
8342      * @see #removeExtra
8343      * @see #getStringArrayListExtra(String)
8344      */
putStringArrayListExtra(String name, ArrayList<String> value)8345     public @NonNull Intent putStringArrayListExtra(String name, ArrayList<String> value) {
8346         if (mExtras == null) {
8347             mExtras = new Bundle();
8348         }
8349         mExtras.putStringArrayList(name, value);
8350         return this;
8351     }
8352 
8353     /**
8354      * Add extended data to the intent.  The name must include a package
8355      * prefix, for example the app com.android.contacts would use names
8356      * like "com.android.contacts.ShowAll".
8357      *
8358      * @param name The name of the extra data, with package prefix.
8359      * @param value The ArrayList<CharSequence> data value.
8360      *
8361      * @return Returns the same Intent object, for chaining multiple calls
8362      * into a single statement.
8363      *
8364      * @see #putExtras
8365      * @see #removeExtra
8366      * @see #getCharSequenceArrayListExtra(String)
8367      */
putCharSequenceArrayListExtra(String name, ArrayList<CharSequence> value)8368     public @NonNull Intent putCharSequenceArrayListExtra(String name,
8369             ArrayList<CharSequence> value) {
8370         if (mExtras == null) {
8371             mExtras = new Bundle();
8372         }
8373         mExtras.putCharSequenceArrayList(name, value);
8374         return this;
8375     }
8376 
8377     /**
8378      * Add extended data to the intent.  The name must include a package
8379      * prefix, for example the app com.android.contacts would use names
8380      * like "com.android.contacts.ShowAll".
8381      *
8382      * @param name The name of the extra data, with package prefix.
8383      * @param value The Serializable data value.
8384      *
8385      * @return Returns the same Intent object, for chaining multiple calls
8386      * into a single statement.
8387      *
8388      * @see #putExtras
8389      * @see #removeExtra
8390      * @see #getSerializableExtra(String)
8391      */
putExtra(String name, Serializable value)8392     public @NonNull Intent putExtra(String name, Serializable value) {
8393         if (mExtras == null) {
8394             mExtras = new Bundle();
8395         }
8396         mExtras.putSerializable(name, value);
8397         return this;
8398     }
8399 
8400     /**
8401      * Add extended data to the intent.  The name must include a package
8402      * prefix, for example the app com.android.contacts would use names
8403      * like "com.android.contacts.ShowAll".
8404      *
8405      * @param name The name of the extra data, with package prefix.
8406      * @param value The boolean array data value.
8407      *
8408      * @return Returns the same Intent object, for chaining multiple calls
8409      * into a single statement.
8410      *
8411      * @see #putExtras
8412      * @see #removeExtra
8413      * @see #getBooleanArrayExtra(String)
8414      */
putExtra(String name, boolean[] value)8415     public @NonNull Intent putExtra(String name, boolean[] value) {
8416         if (mExtras == null) {
8417             mExtras = new Bundle();
8418         }
8419         mExtras.putBooleanArray(name, value);
8420         return this;
8421     }
8422 
8423     /**
8424      * Add extended data to the intent.  The name must include a package
8425      * prefix, for example the app com.android.contacts would use names
8426      * like "com.android.contacts.ShowAll".
8427      *
8428      * @param name The name of the extra data, with package prefix.
8429      * @param value The byte array data value.
8430      *
8431      * @return Returns the same Intent object, for chaining multiple calls
8432      * into a single statement.
8433      *
8434      * @see #putExtras
8435      * @see #removeExtra
8436      * @see #getByteArrayExtra(String)
8437      */
putExtra(String name, byte[] value)8438     public @NonNull Intent putExtra(String name, byte[] value) {
8439         if (mExtras == null) {
8440             mExtras = new Bundle();
8441         }
8442         mExtras.putByteArray(name, value);
8443         return this;
8444     }
8445 
8446     /**
8447      * Add extended data to the intent.  The name must include a package
8448      * prefix, for example the app com.android.contacts would use names
8449      * like "com.android.contacts.ShowAll".
8450      *
8451      * @param name The name of the extra data, with package prefix.
8452      * @param value The short array data value.
8453      *
8454      * @return Returns the same Intent object, for chaining multiple calls
8455      * into a single statement.
8456      *
8457      * @see #putExtras
8458      * @see #removeExtra
8459      * @see #getShortArrayExtra(String)
8460      */
putExtra(String name, short[] value)8461     public @NonNull Intent putExtra(String name, short[] value) {
8462         if (mExtras == null) {
8463             mExtras = new Bundle();
8464         }
8465         mExtras.putShortArray(name, value);
8466         return this;
8467     }
8468 
8469     /**
8470      * Add extended data to the intent.  The name must include a package
8471      * prefix, for example the app com.android.contacts would use names
8472      * like "com.android.contacts.ShowAll".
8473      *
8474      * @param name The name of the extra data, with package prefix.
8475      * @param value The char array data value.
8476      *
8477      * @return Returns the same Intent object, for chaining multiple calls
8478      * into a single statement.
8479      *
8480      * @see #putExtras
8481      * @see #removeExtra
8482      * @see #getCharArrayExtra(String)
8483      */
putExtra(String name, char[] value)8484     public @NonNull Intent putExtra(String name, char[] value) {
8485         if (mExtras == null) {
8486             mExtras = new Bundle();
8487         }
8488         mExtras.putCharArray(name, value);
8489         return this;
8490     }
8491 
8492     /**
8493      * Add extended data to the intent.  The name must include a package
8494      * prefix, for example the app com.android.contacts would use names
8495      * like "com.android.contacts.ShowAll".
8496      *
8497      * @param name The name of the extra data, with package prefix.
8498      * @param value The int array data value.
8499      *
8500      * @return Returns the same Intent object, for chaining multiple calls
8501      * into a single statement.
8502      *
8503      * @see #putExtras
8504      * @see #removeExtra
8505      * @see #getIntArrayExtra(String)
8506      */
putExtra(String name, int[] value)8507     public @NonNull Intent putExtra(String name, int[] value) {
8508         if (mExtras == null) {
8509             mExtras = new Bundle();
8510         }
8511         mExtras.putIntArray(name, value);
8512         return this;
8513     }
8514 
8515     /**
8516      * Add extended data to the intent.  The name must include a package
8517      * prefix, for example the app com.android.contacts would use names
8518      * like "com.android.contacts.ShowAll".
8519      *
8520      * @param name The name of the extra data, with package prefix.
8521      * @param value The byte array data value.
8522      *
8523      * @return Returns the same Intent object, for chaining multiple calls
8524      * into a single statement.
8525      *
8526      * @see #putExtras
8527      * @see #removeExtra
8528      * @see #getLongArrayExtra(String)
8529      */
putExtra(String name, long[] value)8530     public @NonNull Intent putExtra(String name, long[] value) {
8531         if (mExtras == null) {
8532             mExtras = new Bundle();
8533         }
8534         mExtras.putLongArray(name, value);
8535         return this;
8536     }
8537 
8538     /**
8539      * Add extended data to the intent.  The name must include a package
8540      * prefix, for example the app com.android.contacts would use names
8541      * like "com.android.contacts.ShowAll".
8542      *
8543      * @param name The name of the extra data, with package prefix.
8544      * @param value The float array data value.
8545      *
8546      * @return Returns the same Intent object, for chaining multiple calls
8547      * into a single statement.
8548      *
8549      * @see #putExtras
8550      * @see #removeExtra
8551      * @see #getFloatArrayExtra(String)
8552      */
putExtra(String name, float[] value)8553     public @NonNull Intent putExtra(String name, float[] value) {
8554         if (mExtras == null) {
8555             mExtras = new Bundle();
8556         }
8557         mExtras.putFloatArray(name, value);
8558         return this;
8559     }
8560 
8561     /**
8562      * Add extended data to the intent.  The name must include a package
8563      * prefix, for example the app com.android.contacts would use names
8564      * like "com.android.contacts.ShowAll".
8565      *
8566      * @param name The name of the extra data, with package prefix.
8567      * @param value The double array data value.
8568      *
8569      * @return Returns the same Intent object, for chaining multiple calls
8570      * into a single statement.
8571      *
8572      * @see #putExtras
8573      * @see #removeExtra
8574      * @see #getDoubleArrayExtra(String)
8575      */
putExtra(String name, double[] value)8576     public @NonNull Intent putExtra(String name, double[] value) {
8577         if (mExtras == null) {
8578             mExtras = new Bundle();
8579         }
8580         mExtras.putDoubleArray(name, value);
8581         return this;
8582     }
8583 
8584     /**
8585      * Add extended data to the intent.  The name must include a package
8586      * prefix, for example the app com.android.contacts would use names
8587      * like "com.android.contacts.ShowAll".
8588      *
8589      * @param name The name of the extra data, with package prefix.
8590      * @param value The String array data value.
8591      *
8592      * @return Returns the same Intent object, for chaining multiple calls
8593      * into a single statement.
8594      *
8595      * @see #putExtras
8596      * @see #removeExtra
8597      * @see #getStringArrayExtra(String)
8598      */
putExtra(String name, String[] value)8599     public @NonNull Intent putExtra(String name, String[] value) {
8600         if (mExtras == null) {
8601             mExtras = new Bundle();
8602         }
8603         mExtras.putStringArray(name, value);
8604         return this;
8605     }
8606 
8607     /**
8608      * Add extended data to the intent.  The name must include a package
8609      * prefix, for example the app com.android.contacts would use names
8610      * like "com.android.contacts.ShowAll".
8611      *
8612      * @param name The name of the extra data, with package prefix.
8613      * @param value The CharSequence array data value.
8614      *
8615      * @return Returns the same Intent object, for chaining multiple calls
8616      * into a single statement.
8617      *
8618      * @see #putExtras
8619      * @see #removeExtra
8620      * @see #getCharSequenceArrayExtra(String)
8621      */
putExtra(String name, CharSequence[] value)8622     public @NonNull Intent putExtra(String name, CharSequence[] value) {
8623         if (mExtras == null) {
8624             mExtras = new Bundle();
8625         }
8626         mExtras.putCharSequenceArray(name, value);
8627         return this;
8628     }
8629 
8630     /**
8631      * Add extended data to the intent.  The name must include a package
8632      * prefix, for example the app com.android.contacts would use names
8633      * like "com.android.contacts.ShowAll".
8634      *
8635      * @param name The name of the extra data, with package prefix.
8636      * @param value The Bundle data value.
8637      *
8638      * @return Returns the same Intent object, for chaining multiple calls
8639      * into a single statement.
8640      *
8641      * @see #putExtras
8642      * @see #removeExtra
8643      * @see #getBundleExtra(String)
8644      */
putExtra(String name, Bundle value)8645     public @NonNull Intent putExtra(String name, Bundle value) {
8646         if (mExtras == null) {
8647             mExtras = new Bundle();
8648         }
8649         mExtras.putBundle(name, value);
8650         return this;
8651     }
8652 
8653     /**
8654      * Add extended data to the intent.  The name must include a package
8655      * prefix, for example the app com.android.contacts would use names
8656      * like "com.android.contacts.ShowAll".
8657      *
8658      * @param name The name of the extra data, with package prefix.
8659      * @param value The IBinder data value.
8660      *
8661      * @return Returns the same Intent object, for chaining multiple calls
8662      * into a single statement.
8663      *
8664      * @see #putExtras
8665      * @see #removeExtra
8666      * @see #getIBinderExtra(String)
8667      *
8668      * @deprecated
8669      * @hide
8670      */
8671     @Deprecated
putExtra(String name, IBinder value)8672     public @NonNull Intent putExtra(String name, IBinder value) {
8673         if (mExtras == null) {
8674             mExtras = new Bundle();
8675         }
8676         mExtras.putIBinder(name, value);
8677         return this;
8678     }
8679 
8680     /**
8681      * Copy all extras in 'src' in to this intent.
8682      *
8683      * @param src Contains the extras to copy.
8684      *
8685      * @see #putExtra
8686      */
putExtras(@onNull Intent src)8687     public @NonNull Intent putExtras(@NonNull Intent src) {
8688         if (src.mExtras != null) {
8689             if (mExtras == null) {
8690                 mExtras = new Bundle(src.mExtras);
8691             } else {
8692                 mExtras.putAll(src.mExtras);
8693             }
8694         }
8695         return this;
8696     }
8697 
8698     /**
8699      * Add a set of extended data to the intent.  The keys must include a package
8700      * prefix, for example the app com.android.contacts would use names
8701      * like "com.android.contacts.ShowAll".
8702      *
8703      * @param extras The Bundle of extras to add to this intent.
8704      *
8705      * @see #putExtra
8706      * @see #removeExtra
8707      */
putExtras(@onNull Bundle extras)8708     public @NonNull Intent putExtras(@NonNull Bundle extras) {
8709         if (mExtras == null) {
8710             mExtras = new Bundle();
8711         }
8712         mExtras.putAll(extras);
8713         return this;
8714     }
8715 
8716     /**
8717      * Completely replace the extras in the Intent with the extras in the
8718      * given Intent.
8719      *
8720      * @param src The exact extras contained in this Intent are copied
8721      * into the target intent, replacing any that were previously there.
8722      */
replaceExtras(@onNull Intent src)8723     public @NonNull Intent replaceExtras(@NonNull Intent src) {
8724         mExtras = src.mExtras != null ? new Bundle(src.mExtras) : null;
8725         return this;
8726     }
8727 
8728     /**
8729      * Completely replace the extras in the Intent with the given Bundle of
8730      * extras.
8731      *
8732      * @param extras The new set of extras in the Intent, or null to erase
8733      * all extras.
8734      */
replaceExtras(@onNull Bundle extras)8735     public @NonNull Intent replaceExtras(@NonNull Bundle extras) {
8736         mExtras = extras != null ? new Bundle(extras) : null;
8737         return this;
8738     }
8739 
8740     /**
8741      * Remove extended data from the intent.
8742      *
8743      * @see #putExtra
8744      */
removeExtra(String name)8745     public void removeExtra(String name) {
8746         if (mExtras != null) {
8747             mExtras.remove(name);
8748             if (mExtras.size() == 0) {
8749                 mExtras = null;
8750             }
8751         }
8752     }
8753 
8754     /**
8755      * Set special flags controlling how this intent is handled.  Most values
8756      * here depend on the type of component being executed by the Intent,
8757      * specifically the FLAG_ACTIVITY_* flags are all for use with
8758      * {@link Context#startActivity Context.startActivity()} and the
8759      * FLAG_RECEIVER_* flags are all for use with
8760      * {@link Context#sendBroadcast(Intent) Context.sendBroadcast()}.
8761      *
8762      * <p>See the
8763      * <a href="{@docRoot}guide/topics/fundamentals/tasks-and-back-stack.html">Tasks and Back
8764      * Stack</a> documentation for important information on how some of these options impact
8765      * the behavior of your application.
8766      *
8767      * @param flags The desired flags.
8768      * @return Returns the same Intent object, for chaining multiple calls
8769      * into a single statement.
8770      * @see #getFlags
8771      * @see #addFlags
8772      * @see #removeFlags
8773      */
setFlags(@lags int flags)8774     public @NonNull Intent setFlags(@Flags int flags) {
8775         mFlags = flags;
8776         return this;
8777     }
8778 
8779     /**
8780      * Add additional flags to the intent (or with existing flags value).
8781      *
8782      * @param flags The new flags to set.
8783      * @return Returns the same Intent object, for chaining multiple calls into
8784      *         a single statement.
8785      * @see #setFlags
8786      * @see #getFlags
8787      * @see #removeFlags
8788      */
addFlags(@lags int flags)8789     public @NonNull Intent addFlags(@Flags int flags) {
8790         mFlags |= flags;
8791         return this;
8792     }
8793 
8794     /**
8795      * Remove these flags from the intent.
8796      *
8797      * @param flags The flags to remove.
8798      * @see #setFlags
8799      * @see #getFlags
8800      * @see #addFlags
8801      */
removeFlags(@lags int flags)8802     public void removeFlags(@Flags int flags) {
8803         mFlags &= ~flags;
8804     }
8805 
8806     /**
8807      * (Usually optional) Set an explicit application package name that limits
8808      * the components this Intent will resolve to.  If left to the default
8809      * value of null, all components in all applications will considered.
8810      * If non-null, the Intent can only match the components in the given
8811      * application package.
8812      *
8813      * @param packageName The name of the application package to handle the
8814      * intent, or null to allow any application package.
8815      *
8816      * @return Returns the same Intent object, for chaining multiple calls
8817      * into a single statement.
8818      *
8819      * @see #getPackage
8820      * @see #resolveActivity
8821      */
setPackage(@ullable String packageName)8822     public @NonNull Intent setPackage(@Nullable String packageName) {
8823         if (packageName != null && mSelector != null) {
8824             throw new IllegalArgumentException(
8825                     "Can't set package name when selector is already set");
8826         }
8827         mPackage = packageName;
8828         return this;
8829     }
8830 
8831     /**
8832      * (Usually optional) Explicitly set the component to handle the intent.
8833      * If left with the default value of null, the system will determine the
8834      * appropriate class to use based on the other fields (action, data,
8835      * type, categories) in the Intent.  If this class is defined, the
8836      * specified class will always be used regardless of the other fields.  You
8837      * should only set this value when you know you absolutely want a specific
8838      * class to be used; otherwise it is better to let the system find the
8839      * appropriate class so that you will respect the installed applications
8840      * and user preferences.
8841      *
8842      * @param component The name of the application component to handle the
8843      * intent, or null to let the system find one for you.
8844      *
8845      * @return Returns the same Intent object, for chaining multiple calls
8846      * into a single statement.
8847      *
8848      * @see #setClass
8849      * @see #setClassName(Context, String)
8850      * @see #setClassName(String, String)
8851      * @see #getComponent
8852      * @see #resolveActivity
8853      */
setComponent(@ullable ComponentName component)8854     public @NonNull Intent setComponent(@Nullable ComponentName component) {
8855         mComponent = component;
8856         return this;
8857     }
8858 
8859     /**
8860      * Convenience for calling {@link #setComponent} with an
8861      * explicit class name.
8862      *
8863      * @param packageContext A Context of the application package implementing
8864      * this class.
8865      * @param className The name of a class inside of the application package
8866      * that will be used as the component for this Intent.
8867      *
8868      * @return Returns the same Intent object, for chaining multiple calls
8869      * into a single statement.
8870      *
8871      * @see #setComponent
8872      * @see #setClass
8873      */
setClassName(@onNull Context packageContext, @NonNull String className)8874     public @NonNull Intent setClassName(@NonNull Context packageContext,
8875             @NonNull String className) {
8876         mComponent = new ComponentName(packageContext, className);
8877         return this;
8878     }
8879 
8880     /**
8881      * Convenience for calling {@link #setComponent} with an
8882      * explicit application package name and class name.
8883      *
8884      * @param packageName The name of the package implementing the desired
8885      * component.
8886      * @param className The name of a class inside of the application package
8887      * that will be used as the component for this Intent.
8888      *
8889      * @return Returns the same Intent object, for chaining multiple calls
8890      * into a single statement.
8891      *
8892      * @see #setComponent
8893      * @see #setClass
8894      */
setClassName(@onNull String packageName, @NonNull String className)8895     public @NonNull Intent setClassName(@NonNull String packageName, @NonNull String className) {
8896         mComponent = new ComponentName(packageName, className);
8897         return this;
8898     }
8899 
8900     /**
8901      * Convenience for calling {@link #setComponent(ComponentName)} with the
8902      * name returned by a {@link Class} object.
8903      *
8904      * @param packageContext A Context of the application package implementing
8905      * this class.
8906      * @param cls The class name to set, equivalent to
8907      *            <code>setClassName(context, cls.getName())</code>.
8908      *
8909      * @return Returns the same Intent object, for chaining multiple calls
8910      * into a single statement.
8911      *
8912      * @see #setComponent
8913      */
setClass(@onNull Context packageContext, @NonNull Class<?> cls)8914     public @NonNull Intent setClass(@NonNull Context packageContext, @NonNull Class<?> cls) {
8915         mComponent = new ComponentName(packageContext, cls);
8916         return this;
8917     }
8918 
8919     /**
8920      * Set the bounds of the sender of this intent, in screen coordinates.  This can be
8921      * used as a hint to the receiver for animations and the like.  Null means that there
8922      * is no source bounds.
8923      */
setSourceBounds(@ullable Rect r)8924     public void setSourceBounds(@Nullable Rect r) {
8925         if (r != null) {
8926             mSourceBounds = new Rect(r);
8927         } else {
8928             mSourceBounds = null;
8929         }
8930     }
8931 
8932     /** @hide */
8933     @IntDef(flag = true,
8934             value = {
8935                     FILL_IN_ACTION,
8936                     FILL_IN_DATA,
8937                     FILL_IN_CATEGORIES,
8938                     FILL_IN_COMPONENT,
8939                     FILL_IN_PACKAGE,
8940                     FILL_IN_SOURCE_BOUNDS,
8941                     FILL_IN_SELECTOR,
8942                     FILL_IN_CLIP_DATA
8943             })
8944     @Retention(RetentionPolicy.SOURCE)
8945     public @interface FillInFlags {}
8946 
8947     /**
8948      * Use with {@link #fillIn} to allow the current action value to be
8949      * overwritten, even if it is already set.
8950      */
8951     public static final int FILL_IN_ACTION = 1<<0;
8952 
8953     /**
8954      * Use with {@link #fillIn} to allow the current data or type value
8955      * overwritten, even if it is already set.
8956      */
8957     public static final int FILL_IN_DATA = 1<<1;
8958 
8959     /**
8960      * Use with {@link #fillIn} to allow the current categories to be
8961      * overwritten, even if they are already set.
8962      */
8963     public static final int FILL_IN_CATEGORIES = 1<<2;
8964 
8965     /**
8966      * Use with {@link #fillIn} to allow the current component value to be
8967      * overwritten, even if it is already set.
8968      */
8969     public static final int FILL_IN_COMPONENT = 1<<3;
8970 
8971     /**
8972      * Use with {@link #fillIn} to allow the current package value to be
8973      * overwritten, even if it is already set.
8974      */
8975     public static final int FILL_IN_PACKAGE = 1<<4;
8976 
8977     /**
8978      * Use with {@link #fillIn} to allow the current bounds rectangle to be
8979      * overwritten, even if it is already set.
8980      */
8981     public static final int FILL_IN_SOURCE_BOUNDS = 1<<5;
8982 
8983     /**
8984      * Use with {@link #fillIn} to allow the current selector to be
8985      * overwritten, even if it is already set.
8986      */
8987     public static final int FILL_IN_SELECTOR = 1<<6;
8988 
8989     /**
8990      * Use with {@link #fillIn} to allow the current ClipData to be
8991      * overwritten, even if it is already set.
8992      */
8993     public static final int FILL_IN_CLIP_DATA = 1<<7;
8994 
8995     /**
8996      * Copy the contents of <var>other</var> in to this object, but only
8997      * where fields are not defined by this object.  For purposes of a field
8998      * being defined, the following pieces of data in the Intent are
8999      * considered to be separate fields:
9000      *
9001      * <ul>
9002      * <li> action, as set by {@link #setAction}.
9003      * <li> data Uri and MIME type, as set by {@link #setData(Uri)},
9004      * {@link #setType(String)}, or {@link #setDataAndType(Uri, String)}.
9005      * <li> categories, as set by {@link #addCategory}.
9006      * <li> package, as set by {@link #setPackage}.
9007      * <li> component, as set by {@link #setComponent(ComponentName)} or
9008      * related methods.
9009      * <li> source bounds, as set by {@link #setSourceBounds}.
9010      * <li> selector, as set by {@link #setSelector(Intent)}.
9011      * <li> clip data, as set by {@link #setClipData(ClipData)}.
9012      * <li> each top-level name in the associated extras.
9013      * </ul>
9014      *
9015      * <p>In addition, you can use the {@link #FILL_IN_ACTION},
9016      * {@link #FILL_IN_DATA}, {@link #FILL_IN_CATEGORIES}, {@link #FILL_IN_PACKAGE},
9017      * {@link #FILL_IN_COMPONENT}, {@link #FILL_IN_SOURCE_BOUNDS},
9018      * {@link #FILL_IN_SELECTOR}, and {@link #FILL_IN_CLIP_DATA} to override
9019      * the restriction where the corresponding field will not be replaced if
9020      * it is already set.
9021      *
9022      * <p>Note: The component field will only be copied if {@link #FILL_IN_COMPONENT}
9023      * is explicitly specified.  The selector will only be copied if
9024      * {@link #FILL_IN_SELECTOR} is explicitly specified.
9025      *
9026      * <p>For example, consider Intent A with {data="foo", categories="bar"}
9027      * and Intent B with {action="gotit", data-type="some/thing",
9028      * categories="one","two"}.
9029      *
9030      * <p>Calling A.fillIn(B, Intent.FILL_IN_DATA) will result in A now
9031      * containing: {action="gotit", data-type="some/thing",
9032      * categories="bar"}.
9033      *
9034      * @param other Another Intent whose values are to be used to fill in
9035      * the current one.
9036      * @param flags Options to control which fields can be filled in.
9037      *
9038      * @return Returns a bit mask of {@link #FILL_IN_ACTION},
9039      * {@link #FILL_IN_DATA}, {@link #FILL_IN_CATEGORIES}, {@link #FILL_IN_PACKAGE},
9040      * {@link #FILL_IN_COMPONENT}, {@link #FILL_IN_SOURCE_BOUNDS},
9041      * {@link #FILL_IN_SELECTOR} and {@link #FILL_IN_CLIP_DATA} indicating which fields were
9042      * changed.
9043      */
9044     @FillInFlags
fillIn(@onNull Intent other, @FillInFlags int flags)9045     public int fillIn(@NonNull Intent other, @FillInFlags int flags) {
9046         int changes = 0;
9047         boolean mayHaveCopiedUris = false;
9048         if (other.mAction != null
9049                 && (mAction == null || (flags&FILL_IN_ACTION) != 0)) {
9050             mAction = other.mAction;
9051             changes |= FILL_IN_ACTION;
9052         }
9053         if ((other.mData != null || other.mType != null)
9054                 && ((mData == null && mType == null)
9055                         || (flags&FILL_IN_DATA) != 0)) {
9056             mData = other.mData;
9057             mType = other.mType;
9058             changes |= FILL_IN_DATA;
9059             mayHaveCopiedUris = true;
9060         }
9061         if (other.mCategories != null
9062                 && (mCategories == null || (flags&FILL_IN_CATEGORIES) != 0)) {
9063             if (other.mCategories != null) {
9064                 mCategories = new ArraySet<String>(other.mCategories);
9065             }
9066             changes |= FILL_IN_CATEGORIES;
9067         }
9068         if (other.mPackage != null
9069                 && (mPackage == null || (flags&FILL_IN_PACKAGE) != 0)) {
9070             // Only do this if mSelector is not set.
9071             if (mSelector == null) {
9072                 mPackage = other.mPackage;
9073                 changes |= FILL_IN_PACKAGE;
9074             }
9075         }
9076         // Selector is special: it can only be set if explicitly allowed,
9077         // for the same reason as the component name.
9078         if (other.mSelector != null && (flags&FILL_IN_SELECTOR) != 0) {
9079             if (mPackage == null) {
9080                 mSelector = new Intent(other.mSelector);
9081                 mPackage = null;
9082                 changes |= FILL_IN_SELECTOR;
9083             }
9084         }
9085         if (other.mClipData != null
9086                 && (mClipData == null || (flags&FILL_IN_CLIP_DATA) != 0)) {
9087             mClipData = other.mClipData;
9088             changes |= FILL_IN_CLIP_DATA;
9089             mayHaveCopiedUris = true;
9090         }
9091         // Component is special: it can -only- be set if explicitly allowed,
9092         // since otherwise the sender could force the intent somewhere the
9093         // originator didn't intend.
9094         if (other.mComponent != null && (flags&FILL_IN_COMPONENT) != 0) {
9095             mComponent = other.mComponent;
9096             changes |= FILL_IN_COMPONENT;
9097         }
9098         mFlags |= other.mFlags;
9099         if (other.mSourceBounds != null
9100                 && (mSourceBounds == null || (flags&FILL_IN_SOURCE_BOUNDS) != 0)) {
9101             mSourceBounds = new Rect(other.mSourceBounds);
9102             changes |= FILL_IN_SOURCE_BOUNDS;
9103         }
9104         if (mExtras == null) {
9105             if (other.mExtras != null) {
9106                 mExtras = new Bundle(other.mExtras);
9107                 mayHaveCopiedUris = true;
9108             }
9109         } else if (other.mExtras != null) {
9110             try {
9111                 Bundle newb = new Bundle(other.mExtras);
9112                 newb.putAll(mExtras);
9113                 mExtras = newb;
9114                 mayHaveCopiedUris = true;
9115             } catch (RuntimeException e) {
9116                 // Modifying the extras can cause us to unparcel the contents
9117                 // of the bundle, and if we do this in the system process that
9118                 // may fail.  We really should handle this (i.e., the Bundle
9119                 // impl shouldn't be on top of a plain map), but for now just
9120                 // ignore it and keep the original contents. :(
9121                 Log.w("Intent", "Failure filling in extras", e);
9122             }
9123         }
9124         if (mayHaveCopiedUris && mContentUserHint == UserHandle.USER_CURRENT
9125                 && other.mContentUserHint != UserHandle.USER_CURRENT) {
9126             mContentUserHint = other.mContentUserHint;
9127         }
9128         return changes;
9129     }
9130 
9131     /**
9132      * Wrapper class holding an Intent and implementing comparisons on it for
9133      * the purpose of filtering.  The class implements its
9134      * {@link #equals equals()} and {@link #hashCode hashCode()} methods as
9135      * simple calls to {@link Intent#filterEquals(Intent)}  filterEquals()} and
9136      * {@link android.content.Intent#filterHashCode()}  filterHashCode()}
9137      * on the wrapped Intent.
9138      */
9139     public static final class FilterComparison {
9140         private final Intent mIntent;
9141         private final int mHashCode;
9142 
FilterComparison(Intent intent)9143         public FilterComparison(Intent intent) {
9144             mIntent = intent;
9145             mHashCode = intent.filterHashCode();
9146         }
9147 
9148         /**
9149          * Return the Intent that this FilterComparison represents.
9150          * @return Returns the Intent held by the FilterComparison.  Do
9151          * not modify!
9152          */
getIntent()9153         public Intent getIntent() {
9154             return mIntent;
9155         }
9156 
9157         @Override
equals(Object obj)9158         public boolean equals(Object obj) {
9159             if (obj instanceof FilterComparison) {
9160                 Intent other = ((FilterComparison)obj).mIntent;
9161                 return mIntent.filterEquals(other);
9162             }
9163             return false;
9164         }
9165 
9166         @Override
hashCode()9167         public int hashCode() {
9168             return mHashCode;
9169         }
9170     }
9171 
9172     /**
9173      * Determine if two intents are the same for the purposes of intent
9174      * resolution (filtering). That is, if their action, data, type,
9175      * class, and categories are the same.  This does <em>not</em> compare
9176      * any extra data included in the intents.
9177      *
9178      * @param other The other Intent to compare against.
9179      *
9180      * @return Returns true if action, data, type, class, and categories
9181      *         are the same.
9182      */
filterEquals(Intent other)9183     public boolean filterEquals(Intent other) {
9184         if (other == null) {
9185             return false;
9186         }
9187         if (!Objects.equals(this.mAction, other.mAction)) return false;
9188         if (!Objects.equals(this.mData, other.mData)) return false;
9189         if (!Objects.equals(this.mType, other.mType)) return false;
9190         if (!Objects.equals(this.mPackage, other.mPackage)) return false;
9191         if (!Objects.equals(this.mComponent, other.mComponent)) return false;
9192         if (!Objects.equals(this.mCategories, other.mCategories)) return false;
9193 
9194         return true;
9195     }
9196 
9197     /**
9198      * Generate hash code that matches semantics of filterEquals().
9199      *
9200      * @return Returns the hash value of the action, data, type, class, and
9201      *         categories.
9202      *
9203      * @see #filterEquals
9204      */
filterHashCode()9205     public int filterHashCode() {
9206         int code = 0;
9207         if (mAction != null) {
9208             code += mAction.hashCode();
9209         }
9210         if (mData != null) {
9211             code += mData.hashCode();
9212         }
9213         if (mType != null) {
9214             code += mType.hashCode();
9215         }
9216         if (mPackage != null) {
9217             code += mPackage.hashCode();
9218         }
9219         if (mComponent != null) {
9220             code += mComponent.hashCode();
9221         }
9222         if (mCategories != null) {
9223             code += mCategories.hashCode();
9224         }
9225         return code;
9226     }
9227 
9228     @Override
toString()9229     public String toString() {
9230         StringBuilder b = new StringBuilder(128);
9231 
9232         b.append("Intent { ");
9233         toShortString(b, true, true, true, false);
9234         b.append(" }");
9235 
9236         return b.toString();
9237     }
9238 
9239     /** @hide */
toInsecureString()9240     public String toInsecureString() {
9241         StringBuilder b = new StringBuilder(128);
9242 
9243         b.append("Intent { ");
9244         toShortString(b, false, true, true, false);
9245         b.append(" }");
9246 
9247         return b.toString();
9248     }
9249 
9250     /** @hide */
toInsecureStringWithClip()9251     public String toInsecureStringWithClip() {
9252         StringBuilder b = new StringBuilder(128);
9253 
9254         b.append("Intent { ");
9255         toShortString(b, false, true, true, true);
9256         b.append(" }");
9257 
9258         return b.toString();
9259     }
9260 
9261     /** @hide */
toShortString(boolean secure, boolean comp, boolean extras, boolean clip)9262     public String toShortString(boolean secure, boolean comp, boolean extras, boolean clip) {
9263         StringBuilder b = new StringBuilder(128);
9264         toShortString(b, secure, comp, extras, clip);
9265         return b.toString();
9266     }
9267 
9268     /** @hide */
toShortString(StringBuilder b, boolean secure, boolean comp, boolean extras, boolean clip)9269     public void toShortString(StringBuilder b, boolean secure, boolean comp, boolean extras,
9270             boolean clip) {
9271         boolean first = true;
9272         if (mAction != null) {
9273             b.append("act=").append(mAction);
9274             first = false;
9275         }
9276         if (mCategories != null) {
9277             if (!first) {
9278                 b.append(' ');
9279             }
9280             first = false;
9281             b.append("cat=[");
9282             for (int i=0; i<mCategories.size(); i++) {
9283                 if (i > 0) b.append(',');
9284                 b.append(mCategories.valueAt(i));
9285             }
9286             b.append("]");
9287         }
9288         if (mData != null) {
9289             if (!first) {
9290                 b.append(' ');
9291             }
9292             first = false;
9293             b.append("dat=");
9294             if (secure) {
9295                 b.append(mData.toSafeString());
9296             } else {
9297                 b.append(mData);
9298             }
9299         }
9300         if (mType != null) {
9301             if (!first) {
9302                 b.append(' ');
9303             }
9304             first = false;
9305             b.append("typ=").append(mType);
9306         }
9307         if (mFlags != 0) {
9308             if (!first) {
9309                 b.append(' ');
9310             }
9311             first = false;
9312             b.append("flg=0x").append(Integer.toHexString(mFlags));
9313         }
9314         if (mPackage != null) {
9315             if (!first) {
9316                 b.append(' ');
9317             }
9318             first = false;
9319             b.append("pkg=").append(mPackage);
9320         }
9321         if (comp && mComponent != null) {
9322             if (!first) {
9323                 b.append(' ');
9324             }
9325             first = false;
9326             b.append("cmp=").append(mComponent.flattenToShortString());
9327         }
9328         if (mSourceBounds != null) {
9329             if (!first) {
9330                 b.append(' ');
9331             }
9332             first = false;
9333             b.append("bnds=").append(mSourceBounds.toShortString());
9334         }
9335         if (mClipData != null) {
9336             if (!first) {
9337                 b.append(' ');
9338             }
9339             b.append("clip={");
9340             if (clip) {
9341                 mClipData.toShortString(b);
9342             } else {
9343                 if (mClipData.getDescription() != null) {
9344                     first = !mClipData.getDescription().toShortStringTypesOnly(b);
9345                 } else {
9346                     first = true;
9347                 }
9348                 mClipData.toShortStringShortItems(b, first);
9349             }
9350             first = false;
9351             b.append('}');
9352         }
9353         if (extras && mExtras != null) {
9354             if (!first) {
9355                 b.append(' ');
9356             }
9357             first = false;
9358             b.append("(has extras)");
9359         }
9360         if (mContentUserHint != UserHandle.USER_CURRENT) {
9361             if (!first) {
9362                 b.append(' ');
9363             }
9364             first = false;
9365             b.append("u=").append(mContentUserHint);
9366         }
9367         if (mSelector != null) {
9368             b.append(" sel=");
9369             mSelector.toShortString(b, secure, comp, extras, clip);
9370             b.append("}");
9371         }
9372     }
9373 
9374     /**
9375      * Call {@link #toUri} with 0 flags.
9376      * @deprecated Use {@link #toUri} instead.
9377      */
9378     @Deprecated
toURI()9379     public String toURI() {
9380         return toUri(0);
9381     }
9382 
9383     /**
9384      * Convert this Intent into a String holding a URI representation of it.
9385      * The returned URI string has been properly URI encoded, so it can be
9386      * used with {@link Uri#parse Uri.parse(String)}.  The URI contains the
9387      * Intent's data as the base URI, with an additional fragment describing
9388      * the action, categories, type, flags, package, component, and extras.
9389      *
9390      * <p>You can convert the returned string back to an Intent with
9391      * {@link #getIntent}.
9392      *
9393      * @param flags Additional operating flags.
9394      *
9395      * @return Returns a URI encoding URI string describing the entire contents
9396      * of the Intent.
9397      */
toUri(@riFlags int flags)9398     public String toUri(@UriFlags int flags) {
9399         StringBuilder uri = new StringBuilder(128);
9400         if ((flags&URI_ANDROID_APP_SCHEME) != 0) {
9401             if (mPackage == null) {
9402                 throw new IllegalArgumentException(
9403                         "Intent must include an explicit package name to build an android-app: "
9404                         + this);
9405             }
9406             uri.append("android-app://");
9407             uri.append(mPackage);
9408             String scheme = null;
9409             if (mData != null) {
9410                 scheme = mData.getScheme();
9411                 if (scheme != null) {
9412                     uri.append('/');
9413                     uri.append(scheme);
9414                     String authority = mData.getEncodedAuthority();
9415                     if (authority != null) {
9416                         uri.append('/');
9417                         uri.append(authority);
9418                         String path = mData.getEncodedPath();
9419                         if (path != null) {
9420                             uri.append(path);
9421                         }
9422                         String queryParams = mData.getEncodedQuery();
9423                         if (queryParams != null) {
9424                             uri.append('?');
9425                             uri.append(queryParams);
9426                         }
9427                         String fragment = mData.getEncodedFragment();
9428                         if (fragment != null) {
9429                             uri.append('#');
9430                             uri.append(fragment);
9431                         }
9432                     }
9433                 }
9434             }
9435             toUriFragment(uri, null, scheme == null ? Intent.ACTION_MAIN : Intent.ACTION_VIEW,
9436                     mPackage, flags);
9437             return uri.toString();
9438         }
9439         String scheme = null;
9440         if (mData != null) {
9441             String data = mData.toString();
9442             if ((flags&URI_INTENT_SCHEME) != 0) {
9443                 final int N = data.length();
9444                 for (int i=0; i<N; i++) {
9445                     char c = data.charAt(i);
9446                     if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')
9447                             || c == '.' || c == '-') {
9448                         continue;
9449                     }
9450                     if (c == ':' && i > 0) {
9451                         // Valid scheme.
9452                         scheme = data.substring(0, i);
9453                         uri.append("intent:");
9454                         data = data.substring(i+1);
9455                         break;
9456                     }
9457 
9458                     // No scheme.
9459                     break;
9460                 }
9461             }
9462             uri.append(data);
9463 
9464         } else if ((flags&URI_INTENT_SCHEME) != 0) {
9465             uri.append("intent:");
9466         }
9467 
9468         toUriFragment(uri, scheme, Intent.ACTION_VIEW, null, flags);
9469 
9470         return uri.toString();
9471     }
9472 
toUriFragment(StringBuilder uri, String scheme, String defAction, String defPackage, int flags)9473     private void toUriFragment(StringBuilder uri, String scheme, String defAction,
9474             String defPackage, int flags) {
9475         StringBuilder frag = new StringBuilder(128);
9476 
9477         toUriInner(frag, scheme, defAction, defPackage, flags);
9478         if (mSelector != null) {
9479             frag.append("SEL;");
9480             // Note that for now we are not going to try to handle the
9481             // data part; not clear how to represent this as a URI, and
9482             // not much utility in it.
9483             mSelector.toUriInner(frag, mSelector.mData != null ? mSelector.mData.getScheme() : null,
9484                     null, null, flags);
9485         }
9486 
9487         if (frag.length() > 0) {
9488             uri.append("#Intent;");
9489             uri.append(frag);
9490             uri.append("end");
9491         }
9492     }
9493 
toUriInner(StringBuilder uri, String scheme, String defAction, String defPackage, int flags)9494     private void toUriInner(StringBuilder uri, String scheme, String defAction,
9495             String defPackage, int flags) {
9496         if (scheme != null) {
9497             uri.append("scheme=").append(scheme).append(';');
9498         }
9499         if (mAction != null && !mAction.equals(defAction)) {
9500             uri.append("action=").append(Uri.encode(mAction)).append(';');
9501         }
9502         if (mCategories != null) {
9503             for (int i=0; i<mCategories.size(); i++) {
9504                 uri.append("category=").append(Uri.encode(mCategories.valueAt(i))).append(';');
9505             }
9506         }
9507         if (mType != null) {
9508             uri.append("type=").append(Uri.encode(mType, "/")).append(';');
9509         }
9510         if (mFlags != 0) {
9511             uri.append("launchFlags=0x").append(Integer.toHexString(mFlags)).append(';');
9512         }
9513         if (mPackage != null && !mPackage.equals(defPackage)) {
9514             uri.append("package=").append(Uri.encode(mPackage)).append(';');
9515         }
9516         if (mComponent != null) {
9517             uri.append("component=").append(Uri.encode(
9518                     mComponent.flattenToShortString(), "/")).append(';');
9519         }
9520         if (mSourceBounds != null) {
9521             uri.append("sourceBounds=")
9522                     .append(Uri.encode(mSourceBounds.flattenToString()))
9523                     .append(';');
9524         }
9525         if (mExtras != null) {
9526             for (String key : mExtras.keySet()) {
9527                 final Object value = mExtras.get(key);
9528                 char entryType =
9529                         value instanceof String    ? 'S' :
9530                         value instanceof Boolean   ? 'B' :
9531                         value instanceof Byte      ? 'b' :
9532                         value instanceof Character ? 'c' :
9533                         value instanceof Double    ? 'd' :
9534                         value instanceof Float     ? 'f' :
9535                         value instanceof Integer   ? 'i' :
9536                         value instanceof Long      ? 'l' :
9537                         value instanceof Short     ? 's' :
9538                         '\0';
9539 
9540                 if (entryType != '\0') {
9541                     uri.append(entryType);
9542                     uri.append('.');
9543                     uri.append(Uri.encode(key));
9544                     uri.append('=');
9545                     uri.append(Uri.encode(value.toString()));
9546                     uri.append(';');
9547                 }
9548             }
9549         }
9550     }
9551 
describeContents()9552     public int describeContents() {
9553         return (mExtras != null) ? mExtras.describeContents() : 0;
9554     }
9555 
writeToParcel(Parcel out, int flags)9556     public void writeToParcel(Parcel out, int flags) {
9557         out.writeString(mAction);
9558         Uri.writeToParcel(out, mData);
9559         out.writeString(mType);
9560         out.writeInt(mFlags);
9561         out.writeString(mPackage);
9562         ComponentName.writeToParcel(mComponent, out);
9563 
9564         if (mSourceBounds != null) {
9565             out.writeInt(1);
9566             mSourceBounds.writeToParcel(out, flags);
9567         } else {
9568             out.writeInt(0);
9569         }
9570 
9571         if (mCategories != null) {
9572             final int N = mCategories.size();
9573             out.writeInt(N);
9574             for (int i=0; i<N; i++) {
9575                 out.writeString(mCategories.valueAt(i));
9576             }
9577         } else {
9578             out.writeInt(0);
9579         }
9580 
9581         if (mSelector != null) {
9582             out.writeInt(1);
9583             mSelector.writeToParcel(out, flags);
9584         } else {
9585             out.writeInt(0);
9586         }
9587 
9588         if (mClipData != null) {
9589             out.writeInt(1);
9590             mClipData.writeToParcel(out, flags);
9591         } else {
9592             out.writeInt(0);
9593         }
9594         out.writeInt(mContentUserHint);
9595         out.writeBundle(mExtras);
9596     }
9597 
9598     public static final Parcelable.Creator<Intent> CREATOR
9599             = new Parcelable.Creator<Intent>() {
9600         public Intent createFromParcel(Parcel in) {
9601             return new Intent(in);
9602         }
9603         public Intent[] newArray(int size) {
9604             return new Intent[size];
9605         }
9606     };
9607 
9608     /** @hide */
Intent(Parcel in)9609     protected Intent(Parcel in) {
9610         readFromParcel(in);
9611     }
9612 
readFromParcel(Parcel in)9613     public void readFromParcel(Parcel in) {
9614         setAction(in.readString());
9615         mData = Uri.CREATOR.createFromParcel(in);
9616         mType = in.readString();
9617         mFlags = in.readInt();
9618         mPackage = in.readString();
9619         mComponent = ComponentName.readFromParcel(in);
9620 
9621         if (in.readInt() != 0) {
9622             mSourceBounds = Rect.CREATOR.createFromParcel(in);
9623         }
9624 
9625         int N = in.readInt();
9626         if (N > 0) {
9627             mCategories = new ArraySet<String>();
9628             int i;
9629             for (i=0; i<N; i++) {
9630                 mCategories.add(in.readString().intern());
9631             }
9632         } else {
9633             mCategories = null;
9634         }
9635 
9636         if (in.readInt() != 0) {
9637             mSelector = new Intent(in);
9638         }
9639 
9640         if (in.readInt() != 0) {
9641             mClipData = new ClipData(in);
9642         }
9643         mContentUserHint = in.readInt();
9644         mExtras = in.readBundle();
9645     }
9646 
9647     /**
9648      * Parses the "intent" element (and its children) from XML and instantiates
9649      * an Intent object.  The given XML parser should be located at the tag
9650      * where parsing should start (often named "intent"), from which the
9651      * basic action, data, type, and package and class name will be
9652      * retrieved.  The function will then parse in to any child elements,
9653      * looking for <category android:name="xxx"> tags to add categories and
9654      * <extra android:name="xxx" android:value="yyy"> to attach extra data
9655      * to the intent.
9656      *
9657      * @param resources The Resources to use when inflating resources.
9658      * @param parser The XML parser pointing at an "intent" tag.
9659      * @param attrs The AttributeSet interface for retrieving extended
9660      * attribute data at the current <var>parser</var> location.
9661      * @return An Intent object matching the XML data.
9662      * @throws XmlPullParserException If there was an XML parsing error.
9663      * @throws IOException If there was an I/O error.
9664      */
parseIntent(@onNull Resources resources, @NonNull XmlPullParser parser, AttributeSet attrs)9665     public static @NonNull Intent parseIntent(@NonNull Resources resources,
9666             @NonNull XmlPullParser parser, AttributeSet attrs)
9667             throws XmlPullParserException, IOException {
9668         Intent intent = new Intent();
9669 
9670         TypedArray sa = resources.obtainAttributes(attrs,
9671                 com.android.internal.R.styleable.Intent);
9672 
9673         intent.setAction(sa.getString(com.android.internal.R.styleable.Intent_action));
9674 
9675         String data = sa.getString(com.android.internal.R.styleable.Intent_data);
9676         String mimeType = sa.getString(com.android.internal.R.styleable.Intent_mimeType);
9677         intent.setDataAndType(data != null ? Uri.parse(data) : null, mimeType);
9678 
9679         String packageName = sa.getString(com.android.internal.R.styleable.Intent_targetPackage);
9680         String className = sa.getString(com.android.internal.R.styleable.Intent_targetClass);
9681         if (packageName != null && className != null) {
9682             intent.setComponent(new ComponentName(packageName, className));
9683         }
9684 
9685         sa.recycle();
9686 
9687         int outerDepth = parser.getDepth();
9688         int type;
9689         while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
9690                && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
9691             if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
9692                 continue;
9693             }
9694 
9695             String nodeName = parser.getName();
9696             if (nodeName.equals(TAG_CATEGORIES)) {
9697                 sa = resources.obtainAttributes(attrs,
9698                         com.android.internal.R.styleable.IntentCategory);
9699                 String cat = sa.getString(com.android.internal.R.styleable.IntentCategory_name);
9700                 sa.recycle();
9701 
9702                 if (cat != null) {
9703                     intent.addCategory(cat);
9704                 }
9705                 XmlUtils.skipCurrentTag(parser);
9706 
9707             } else if (nodeName.equals(TAG_EXTRA)) {
9708                 if (intent.mExtras == null) {
9709                     intent.mExtras = new Bundle();
9710                 }
9711                 resources.parseBundleExtra(TAG_EXTRA, attrs, intent.mExtras);
9712                 XmlUtils.skipCurrentTag(parser);
9713 
9714             } else {
9715                 XmlUtils.skipCurrentTag(parser);
9716             }
9717         }
9718 
9719         return intent;
9720     }
9721 
9722     /** @hide */
saveToXml(XmlSerializer out)9723     public void saveToXml(XmlSerializer out) throws IOException {
9724         if (mAction != null) {
9725             out.attribute(null, ATTR_ACTION, mAction);
9726         }
9727         if (mData != null) {
9728             out.attribute(null, ATTR_DATA, mData.toString());
9729         }
9730         if (mType != null) {
9731             out.attribute(null, ATTR_TYPE, mType);
9732         }
9733         if (mComponent != null) {
9734             out.attribute(null, ATTR_COMPONENT, mComponent.flattenToShortString());
9735         }
9736         out.attribute(null, ATTR_FLAGS, Integer.toHexString(getFlags()));
9737 
9738         if (mCategories != null) {
9739             out.startTag(null, TAG_CATEGORIES);
9740             for (int categoryNdx = mCategories.size() - 1; categoryNdx >= 0; --categoryNdx) {
9741                 out.attribute(null, ATTR_CATEGORY, mCategories.valueAt(categoryNdx));
9742             }
9743             out.endTag(null, TAG_CATEGORIES);
9744         }
9745     }
9746 
9747     /** @hide */
restoreFromXml(XmlPullParser in)9748     public static Intent restoreFromXml(XmlPullParser in) throws IOException,
9749             XmlPullParserException {
9750         Intent intent = new Intent();
9751         final int outerDepth = in.getDepth();
9752 
9753         int attrCount = in.getAttributeCount();
9754         for (int attrNdx = attrCount - 1; attrNdx >= 0; --attrNdx) {
9755             final String attrName = in.getAttributeName(attrNdx);
9756             final String attrValue = in.getAttributeValue(attrNdx);
9757             if (ATTR_ACTION.equals(attrName)) {
9758                 intent.setAction(attrValue);
9759             } else if (ATTR_DATA.equals(attrName)) {
9760                 intent.setData(Uri.parse(attrValue));
9761             } else if (ATTR_TYPE.equals(attrName)) {
9762                 intent.setType(attrValue);
9763             } else if (ATTR_COMPONENT.equals(attrName)) {
9764                 intent.setComponent(ComponentName.unflattenFromString(attrValue));
9765             } else if (ATTR_FLAGS.equals(attrName)) {
9766                 intent.setFlags(Integer.parseInt(attrValue, 16));
9767             } else {
9768                 Log.e("Intent", "restoreFromXml: unknown attribute=" + attrName);
9769             }
9770         }
9771 
9772         int event;
9773         String name;
9774         while (((event = in.next()) != XmlPullParser.END_DOCUMENT) &&
9775                 (event != XmlPullParser.END_TAG || in.getDepth() < outerDepth)) {
9776             if (event == XmlPullParser.START_TAG) {
9777                 name = in.getName();
9778                 if (TAG_CATEGORIES.equals(name)) {
9779                     attrCount = in.getAttributeCount();
9780                     for (int attrNdx = attrCount - 1; attrNdx >= 0; --attrNdx) {
9781                         intent.addCategory(in.getAttributeValue(attrNdx));
9782                     }
9783                 } else {
9784                     Log.w("Intent", "restoreFromXml: unknown name=" + name);
9785                     XmlUtils.skipCurrentTag(in);
9786                 }
9787             }
9788         }
9789 
9790         return intent;
9791     }
9792 
9793     /**
9794      * Normalize a MIME data type.
9795      *
9796      * <p>A normalized MIME type has white-space trimmed,
9797      * content-type parameters removed, and is lower-case.
9798      * This aligns the type with Android best practices for
9799      * intent filtering.
9800      *
9801      * <p>For example, "text/plain; charset=utf-8" becomes "text/plain".
9802      * "text/x-vCard" becomes "text/x-vcard".
9803      *
9804      * <p>All MIME types received from outside Android (such as user input,
9805      * or external sources like Bluetooth, NFC, or the Internet) should
9806      * be normalized before they are used to create an Intent.
9807      *
9808      * @param type MIME data type to normalize
9809      * @return normalized MIME data type, or null if the input was null
9810      * @see #setType
9811      * @see #setTypeAndNormalize
9812      */
normalizeMimeType(@ullable String type)9813     public static @Nullable String normalizeMimeType(@Nullable String type) {
9814         if (type == null) {
9815             return null;
9816         }
9817 
9818         type = type.trim().toLowerCase(Locale.ROOT);
9819 
9820         final int semicolonIndex = type.indexOf(';');
9821         if (semicolonIndex != -1) {
9822             type = type.substring(0, semicolonIndex);
9823         }
9824         return type;
9825     }
9826 
9827     /**
9828      * Prepare this {@link Intent} to leave an app process.
9829      *
9830      * @hide
9831      */
prepareToLeaveProcess(Context context)9832     public void prepareToLeaveProcess(Context context) {
9833         final boolean leavingPackage = (mComponent == null)
9834                 || !Objects.equals(mComponent.getPackageName(), context.getPackageName());
9835         prepareToLeaveProcess(leavingPackage);
9836     }
9837 
9838     /**
9839      * Prepare this {@link Intent} to leave an app process.
9840      *
9841      * @hide
9842      */
prepareToLeaveProcess(boolean leavingPackage)9843     public void prepareToLeaveProcess(boolean leavingPackage) {
9844         setAllowFds(false);
9845 
9846         if (mSelector != null) {
9847             mSelector.prepareToLeaveProcess(leavingPackage);
9848         }
9849         if (mClipData != null) {
9850             mClipData.prepareToLeaveProcess(leavingPackage, getFlags());
9851         }
9852 
9853         if (mExtras != null && !mExtras.isParcelled()) {
9854             final Object intent = mExtras.get(Intent.EXTRA_INTENT);
9855             if (intent instanceof Intent) {
9856                 ((Intent) intent).prepareToLeaveProcess(leavingPackage);
9857             }
9858         }
9859 
9860         if (mAction != null && mData != null && StrictMode.vmFileUriExposureEnabled()
9861                 && leavingPackage) {
9862             switch (mAction) {
9863                 case ACTION_MEDIA_REMOVED:
9864                 case ACTION_MEDIA_UNMOUNTED:
9865                 case ACTION_MEDIA_CHECKING:
9866                 case ACTION_MEDIA_NOFS:
9867                 case ACTION_MEDIA_MOUNTED:
9868                 case ACTION_MEDIA_SHARED:
9869                 case ACTION_MEDIA_UNSHARED:
9870                 case ACTION_MEDIA_BAD_REMOVAL:
9871                 case ACTION_MEDIA_UNMOUNTABLE:
9872                 case ACTION_MEDIA_EJECT:
9873                 case ACTION_MEDIA_SCANNER_STARTED:
9874                 case ACTION_MEDIA_SCANNER_FINISHED:
9875                 case ACTION_MEDIA_SCANNER_SCAN_FILE:
9876                 case ACTION_PACKAGE_NEEDS_VERIFICATION:
9877                 case ACTION_PACKAGE_VERIFIED:
9878                     // Ignore legacy actions
9879                     break;
9880                 default:
9881                     mData.checkFileUriExposed("Intent.getData()");
9882             }
9883         }
9884 
9885         if (mAction != null && mData != null && StrictMode.vmContentUriWithoutPermissionEnabled()
9886                 && leavingPackage) {
9887             switch (mAction) {
9888                 case ACTION_PROVIDER_CHANGED:
9889                 case QuickContact.ACTION_QUICK_CONTACT:
9890                     // Ignore actions that don't need to grant
9891                     break;
9892                 default:
9893                     mData.checkContentUriWithoutPermission("Intent.getData()", getFlags());
9894             }
9895         }
9896     }
9897 
9898     /**
9899      * @hide
9900      */
prepareToEnterProcess()9901     public void prepareToEnterProcess() {
9902         // We just entered destination process, so we should be able to read all
9903         // parcelables inside.
9904         setDefusable(true);
9905 
9906         if (mSelector != null) {
9907             mSelector.prepareToEnterProcess();
9908         }
9909         if (mClipData != null) {
9910             mClipData.prepareToEnterProcess();
9911         }
9912 
9913         if (mContentUserHint != UserHandle.USER_CURRENT) {
9914             if (UserHandle.getAppId(Process.myUid()) != Process.SYSTEM_UID) {
9915                 fixUris(mContentUserHint);
9916                 mContentUserHint = UserHandle.USER_CURRENT;
9917             }
9918         }
9919     }
9920 
9921     /**
9922      * @hide
9923      */
fixUris(int contentUserHint)9924      public void fixUris(int contentUserHint) {
9925         Uri data = getData();
9926         if (data != null) {
9927             mData = maybeAddUserId(data, contentUserHint);
9928         }
9929         if (mClipData != null) {
9930             mClipData.fixUris(contentUserHint);
9931         }
9932         String action = getAction();
9933         if (ACTION_SEND.equals(action)) {
9934             final Uri stream = getParcelableExtra(EXTRA_STREAM);
9935             if (stream != null) {
9936                 putExtra(EXTRA_STREAM, maybeAddUserId(stream, contentUserHint));
9937             }
9938         } else if (ACTION_SEND_MULTIPLE.equals(action)) {
9939             final ArrayList<Uri> streams = getParcelableArrayListExtra(EXTRA_STREAM);
9940             if (streams != null) {
9941                 ArrayList<Uri> newStreams = new ArrayList<Uri>();
9942                 for (int i = 0; i < streams.size(); i++) {
9943                     newStreams.add(maybeAddUserId(streams.get(i), contentUserHint));
9944                 }
9945                 putParcelableArrayListExtra(EXTRA_STREAM, newStreams);
9946             }
9947         } else if (MediaStore.ACTION_IMAGE_CAPTURE.equals(action)
9948                 || MediaStore.ACTION_IMAGE_CAPTURE_SECURE.equals(action)
9949                 || MediaStore.ACTION_VIDEO_CAPTURE.equals(action)) {
9950             final Uri output = getParcelableExtra(MediaStore.EXTRA_OUTPUT);
9951             if (output != null) {
9952                 putExtra(MediaStore.EXTRA_OUTPUT, maybeAddUserId(output, contentUserHint));
9953             }
9954         }
9955      }
9956 
9957     /**
9958      * Migrate any {@link #EXTRA_STREAM} in {@link #ACTION_SEND} and
9959      * {@link #ACTION_SEND_MULTIPLE} to {@link ClipData}. Also inspects nested
9960      * intents in {@link #ACTION_CHOOSER}.
9961      *
9962      * @return Whether any contents were migrated.
9963      * @hide
9964      */
migrateExtraStreamToClipData()9965     public boolean migrateExtraStreamToClipData() {
9966         // Refuse to touch if extras already parcelled
9967         if (mExtras != null && mExtras.isParcelled()) return false;
9968 
9969         // Bail when someone already gave us ClipData
9970         if (getClipData() != null) return false;
9971 
9972         final String action = getAction();
9973         if (ACTION_CHOOSER.equals(action)) {
9974             // Inspect contained intents to see if we need to migrate extras. We
9975             // don't promote ClipData to the parent, since ChooserActivity will
9976             // already start the picked item as the caller, and we can't combine
9977             // the flags in a safe way.
9978 
9979             boolean migrated = false;
9980             try {
9981                 final Intent intent = getParcelableExtra(EXTRA_INTENT);
9982                 if (intent != null) {
9983                     migrated |= intent.migrateExtraStreamToClipData();
9984                 }
9985             } catch (ClassCastException e) {
9986             }
9987             try {
9988                 final Parcelable[] intents = getParcelableArrayExtra(EXTRA_INITIAL_INTENTS);
9989                 if (intents != null) {
9990                     for (int i = 0; i < intents.length; i++) {
9991                         final Intent intent = (Intent) intents[i];
9992                         if (intent != null) {
9993                             migrated |= intent.migrateExtraStreamToClipData();
9994                         }
9995                     }
9996                 }
9997             } catch (ClassCastException e) {
9998             }
9999             return migrated;
10000 
10001         } else if (ACTION_SEND.equals(action)) {
10002             try {
10003                 final Uri stream = getParcelableExtra(EXTRA_STREAM);
10004                 final CharSequence text = getCharSequenceExtra(EXTRA_TEXT);
10005                 final String htmlText = getStringExtra(EXTRA_HTML_TEXT);
10006                 if (stream != null || text != null || htmlText != null) {
10007                     final ClipData clipData = new ClipData(
10008                             null, new String[] { getType() },
10009                             new ClipData.Item(text, htmlText, null, stream));
10010                     setClipData(clipData);
10011                     addFlags(FLAG_GRANT_READ_URI_PERMISSION);
10012                     return true;
10013                 }
10014             } catch (ClassCastException e) {
10015             }
10016 
10017         } else if (ACTION_SEND_MULTIPLE.equals(action)) {
10018             try {
10019                 final ArrayList<Uri> streams = getParcelableArrayListExtra(EXTRA_STREAM);
10020                 final ArrayList<CharSequence> texts = getCharSequenceArrayListExtra(EXTRA_TEXT);
10021                 final ArrayList<String> htmlTexts = getStringArrayListExtra(EXTRA_HTML_TEXT);
10022                 int num = -1;
10023                 if (streams != null) {
10024                     num = streams.size();
10025                 }
10026                 if (texts != null) {
10027                     if (num >= 0 && num != texts.size()) {
10028                         // Wha...!  F- you.
10029                         return false;
10030                     }
10031                     num = texts.size();
10032                 }
10033                 if (htmlTexts != null) {
10034                     if (num >= 0 && num != htmlTexts.size()) {
10035                         // Wha...!  F- you.
10036                         return false;
10037                     }
10038                     num = htmlTexts.size();
10039                 }
10040                 if (num > 0) {
10041                     final ClipData clipData = new ClipData(
10042                             null, new String[] { getType() },
10043                             makeClipItem(streams, texts, htmlTexts, 0));
10044 
10045                     for (int i = 1; i < num; i++) {
10046                         clipData.addItem(makeClipItem(streams, texts, htmlTexts, i));
10047                     }
10048 
10049                     setClipData(clipData);
10050                     addFlags(FLAG_GRANT_READ_URI_PERMISSION);
10051                     return true;
10052                 }
10053             } catch (ClassCastException e) {
10054             }
10055         } else if (MediaStore.ACTION_IMAGE_CAPTURE.equals(action)
10056                 || MediaStore.ACTION_IMAGE_CAPTURE_SECURE.equals(action)
10057                 || MediaStore.ACTION_VIDEO_CAPTURE.equals(action)) {
10058             final Uri output;
10059             try {
10060                 output = getParcelableExtra(MediaStore.EXTRA_OUTPUT);
10061             } catch (ClassCastException e) {
10062                 return false;
10063             }
10064             if (output != null) {
10065                 setClipData(ClipData.newRawUri("", output));
10066                 addFlags(FLAG_GRANT_WRITE_URI_PERMISSION|FLAG_GRANT_READ_URI_PERMISSION);
10067                 return true;
10068             }
10069         }
10070 
10071         return false;
10072     }
10073 
makeClipItem(ArrayList<Uri> streams, ArrayList<CharSequence> texts, ArrayList<String> htmlTexts, int which)10074     private static ClipData.Item makeClipItem(ArrayList<Uri> streams, ArrayList<CharSequence> texts,
10075             ArrayList<String> htmlTexts, int which) {
10076         Uri uri = streams != null ? streams.get(which) : null;
10077         CharSequence text = texts != null ? texts.get(which) : null;
10078         String htmlText = htmlTexts != null ? htmlTexts.get(which) : null;
10079         return new ClipData.Item(text, htmlText, null, uri);
10080     }
10081 
10082     /** @hide */
isDocument()10083     public boolean isDocument() {
10084         return (mFlags & FLAG_ACTIVITY_NEW_DOCUMENT) == FLAG_ACTIVITY_NEW_DOCUMENT;
10085     }
10086 }
10087