1ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell/*
2ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell * Copyright (C) 2011 The Android Open Source Project
3ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell *
4ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell * Licensed under the Apache License, Version 2.0 (the "License");
5ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell * you may not use this file except in compliance with the License.
6ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell * You may obtain a copy of the License at
7ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell *
8ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell *      http://www.apache.org/licenses/LICENSE-2.0
9ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell *
10ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell * Unless required by applicable law or agreed to in writing, software
11ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell * distributed under the License is distributed on an "AS IS" BASIS,
12ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell * See the License for the specific language governing permissions and
14ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell * limitations under the License.
15ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell */
16ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
17ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powellpackage android.support.v4.app;
18ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
19ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powellimport android.app.Activity;
20ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powellimport android.content.ComponentName;
21ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powellimport android.content.Intent;
22ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powellimport android.content.pm.PackageManager;
23ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powellimport android.content.pm.PackageManager.NameNotFoundException;
24ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powellimport android.graphics.drawable.Drawable;
25ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powellimport android.net.Uri;
26ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powellimport android.os.Build;
27a3ff3273e976adf19770651dcf473fa67b38eb22Tor Norbyeimport android.support.annotation.StringRes;
2837c1509886a7897163f70f4645c08ddf0b41632dAdam Powellimport android.support.v4.content.IntentCompat;
29ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powellimport android.support.v4.view.MenuItemCompat;
3037c1509886a7897163f70f4645c08ddf0b41632dAdam Powellimport android.text.Html;
3137c1509886a7897163f70f4645c08ddf0b41632dAdam Powellimport android.text.Spanned;
32ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powellimport android.util.Log;
33ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powellimport android.view.Menu;
34ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powellimport android.view.MenuItem;
35ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
36ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powellimport java.util.ArrayList;
37ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
38ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell/**
39ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell * Extra helper functionality for sharing data between activities.
40ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell *
41ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell * ShareCompat provides functionality to extend the {@link Intent#ACTION_SEND}/
42ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell * {@link Intent#ACTION_SEND_MULTIPLE} protocol and support retrieving more info
43ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell * about the activity that invoked a social sharing action.
44ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell *
45ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell * {@link IntentBuilder} provides helper functions for constructing a sharing
46ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell * intent that always includes data about the calling activity and app.
47ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell * This lets the called activity provide attribution for the app that shared
48ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell * content. Constructing an intent this way can be done in a method-chaining style.
49ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell * To obtain an IntentBuilder with info about your calling activity, use the static
50ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell * method {@link IntentBuilder#from(Activity)}.
51ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell *
52ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell * {@link IntentReader} provides helper functions for parsing the defined extras
53ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell * within an {@link Intent#ACTION_SEND} or {@link Intent#ACTION_SEND_MULTIPLE} intent
54ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell * used to launch an activity. You can also obtain a Drawable for the caller's
55ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell * application icon and the application's localized label (the app's human-readable name).
56ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell * Social apps that enable sharing content are encouraged to use this information
57ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell * to call out the app that the content was shared from.
58ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell */
59ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powellpublic class ShareCompat {
60ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell    /**
61ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * Intent extra that stores the name of the calling package for an ACTION_SEND intent.
62ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * When an activity is started using startActivityForResult this is redundant info.
63ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * (It is also provided by {@link Activity#getCallingPackage()}.)
64ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     *
65ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * Instead of using this constant directly, consider using {@link #getCallingPackage(Activity)}
66ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * or {@link IntentReader#getCallingPackage()}.
67ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     */
68ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell    public static final String EXTRA_CALLING_PACKAGE =
69ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            "android.support.v4.app.EXTRA_CALLING_PACKAGE";
70ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
71ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell    /**
72ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * Intent extra that stores the {@link ComponentName} of the calling activity for
73ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * an ACTION_SEND intent.
74ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     */
75ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell    public static final String EXTRA_CALLING_ACTIVITY =
76ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            "android.support.v4.app.EXTRA_CALLING_ACTIVITY";
77ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
78ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell    /**
79ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * Compatibility shims for sharing operations
80ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     */
81ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell    interface ShareCompatImpl {
82ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        void configureMenuItem(MenuItem item, IntentBuilder shareIntent);
8337c1509886a7897163f70f4645c08ddf0b41632dAdam Powell        String escapeHtml(CharSequence text);
84ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell    }
85ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
86ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell    static class ShareCompatImplBase implements ShareCompatImpl {
87ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        public void configureMenuItem(MenuItem item, IntentBuilder shareIntent) {
88ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            item.setIntent(shareIntent.createChooserIntent());
89ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
9037c1509886a7897163f70f4645c08ddf0b41632dAdam Powell
9137c1509886a7897163f70f4645c08ddf0b41632dAdam Powell        public String escapeHtml(CharSequence text) {
9237c1509886a7897163f70f4645c08ddf0b41632dAdam Powell            StringBuilder out = new StringBuilder();
9337c1509886a7897163f70f4645c08ddf0b41632dAdam Powell            withinStyle(out, text, 0, text.length());
9437c1509886a7897163f70f4645c08ddf0b41632dAdam Powell            return out.toString();
9537c1509886a7897163f70f4645c08ddf0b41632dAdam Powell        }
9637c1509886a7897163f70f4645c08ddf0b41632dAdam Powell
9737c1509886a7897163f70f4645c08ddf0b41632dAdam Powell        private static void withinStyle(StringBuilder out, CharSequence text,
9837c1509886a7897163f70f4645c08ddf0b41632dAdam Powell                int start, int end) {
9937c1509886a7897163f70f4645c08ddf0b41632dAdam Powell            for (int i = start; i < end; i++) {
10037c1509886a7897163f70f4645c08ddf0b41632dAdam Powell                char c = text.charAt(i);
10137c1509886a7897163f70f4645c08ddf0b41632dAdam Powell
10237c1509886a7897163f70f4645c08ddf0b41632dAdam Powell                if (c == '<') {
10337c1509886a7897163f70f4645c08ddf0b41632dAdam Powell                    out.append("&lt;");
10437c1509886a7897163f70f4645c08ddf0b41632dAdam Powell                } else if (c == '>') {
10537c1509886a7897163f70f4645c08ddf0b41632dAdam Powell                    out.append("&gt;");
10637c1509886a7897163f70f4645c08ddf0b41632dAdam Powell                } else if (c == '&') {
10737c1509886a7897163f70f4645c08ddf0b41632dAdam Powell                    out.append("&amp;");
10837c1509886a7897163f70f4645c08ddf0b41632dAdam Powell                } else if (c > 0x7E || c < ' ') {
10937c1509886a7897163f70f4645c08ddf0b41632dAdam Powell                    out.append("&#" + ((int) c) + ";");
11037c1509886a7897163f70f4645c08ddf0b41632dAdam Powell                } else if (c == ' ') {
11137c1509886a7897163f70f4645c08ddf0b41632dAdam Powell                    while (i + 1 < end && text.charAt(i + 1) == ' ') {
11237c1509886a7897163f70f4645c08ddf0b41632dAdam Powell                        out.append("&nbsp;");
11337c1509886a7897163f70f4645c08ddf0b41632dAdam Powell                        i++;
11437c1509886a7897163f70f4645c08ddf0b41632dAdam Powell                    }
11537c1509886a7897163f70f4645c08ddf0b41632dAdam Powell
11637c1509886a7897163f70f4645c08ddf0b41632dAdam Powell                    out.append(' ');
11737c1509886a7897163f70f4645c08ddf0b41632dAdam Powell                } else {
11837c1509886a7897163f70f4645c08ddf0b41632dAdam Powell                    out.append(c);
11937c1509886a7897163f70f4645c08ddf0b41632dAdam Powell                }
12037c1509886a7897163f70f4645c08ddf0b41632dAdam Powell            }
12137c1509886a7897163f70f4645c08ddf0b41632dAdam Powell        }
122ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell    }
123ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
12437c1509886a7897163f70f4645c08ddf0b41632dAdam Powell    static class ShareCompatImplICS extends ShareCompatImplBase {
125ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        public void configureMenuItem(MenuItem item, IntentBuilder shareIntent) {
126ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            ShareCompatICS.configureMenuItem(item, shareIntent.getActivity(),
127ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                    shareIntent.getIntent());
12866957a1e997dde850701ee96a3aa7b7c1444d67fAdam Powell            if (shouldAddChooserIntent(item)) {
12966957a1e997dde850701ee96a3aa7b7c1444d67fAdam Powell                item.setIntent(shareIntent.createChooserIntent());
13066957a1e997dde850701ee96a3aa7b7c1444d67fAdam Powell            }
13166957a1e997dde850701ee96a3aa7b7c1444d67fAdam Powell        }
13266957a1e997dde850701ee96a3aa7b7c1444d67fAdam Powell
13366957a1e997dde850701ee96a3aa7b7c1444d67fAdam Powell        boolean shouldAddChooserIntent(MenuItem item) {
13466957a1e997dde850701ee96a3aa7b7c1444d67fAdam Powell            return !item.hasSubMenu();
135ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
136ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell    }
137ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
13837c1509886a7897163f70f4645c08ddf0b41632dAdam Powell    static class ShareCompatImplJB extends ShareCompatImplICS {
13937c1509886a7897163f70f4645c08ddf0b41632dAdam Powell        public String escapeHtml(CharSequence html) {
14037c1509886a7897163f70f4645c08ddf0b41632dAdam Powell            return ShareCompatJB.escapeHtml(html);
14137c1509886a7897163f70f4645c08ddf0b41632dAdam Powell        }
14266957a1e997dde850701ee96a3aa7b7c1444d67fAdam Powell
14366957a1e997dde850701ee96a3aa7b7c1444d67fAdam Powell        @Override
14466957a1e997dde850701ee96a3aa7b7c1444d67fAdam Powell        boolean shouldAddChooserIntent(MenuItem item) {
14566957a1e997dde850701ee96a3aa7b7c1444d67fAdam Powell            return false;
14666957a1e997dde850701ee96a3aa7b7c1444d67fAdam Powell        }
14737c1509886a7897163f70f4645c08ddf0b41632dAdam Powell    }
14837c1509886a7897163f70f4645c08ddf0b41632dAdam Powell
149ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell    private static ShareCompatImpl IMPL;
150ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
151ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell    static {
15237c1509886a7897163f70f4645c08ddf0b41632dAdam Powell        if (Build.VERSION.SDK_INT >= 16) {
15337c1509886a7897163f70f4645c08ddf0b41632dAdam Powell            IMPL = new ShareCompatImplJB();
15437c1509886a7897163f70f4645c08ddf0b41632dAdam Powell        } else if (Build.VERSION.SDK_INT >= 14) {
155ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            IMPL = new ShareCompatImplICS();
156ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        } else {
157ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            IMPL = new ShareCompatImplBase();
158ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
159ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell    }
160ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
161ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell    /**
162ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * Retrieve the name of the package that launched calledActivity from a share intent.
163ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * Apps that provide social sharing functionality can use this to provide attribution
164ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * for the app that shared the content.
165ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     *
166ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * <p><em>Note:</em> This data may have been provided voluntarily by the calling
167ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * application. As such it should not be trusted for accuracy in the context of
168ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * security or verification.</p>
169ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     *
170ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * @param calledActivity Current activity that was launched to share content
171ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * @return Name of the calling package
172ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     */
173ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell    public static String getCallingPackage(Activity calledActivity) {
174ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        String result = calledActivity.getCallingPackage();
175ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        if (result == null) {
176ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            result = calledActivity.getIntent().getStringExtra(EXTRA_CALLING_PACKAGE);
177ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
178ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        return result;
179ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell    }
180ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
181ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell    /**
182ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * Retrieve the ComponentName of the activity that launched calledActivity from a share intent.
183ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * Apps that provide social sharing functionality can use this to provide attribution
184ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * for the app that shared the content.
185ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     *
186ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * <p><em>Note:</em> This data may have been provided voluntarily by the calling
187ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * application. As such it should not be trusted for accuracy in the context of
188ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * security or verification.</p>
189ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     *
190ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * @param calledActivity Current activity that was launched to share content
191ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * @return ComponentName of the calling activity
192ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     */
193ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell    public static ComponentName getCallingActivity(Activity calledActivity) {
194ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        ComponentName result = calledActivity.getCallingActivity();
195ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        if (result == null) {
196ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            result = calledActivity.getIntent().getParcelableExtra(EXTRA_CALLING_ACTIVITY);
197ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
198ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        return result;
199ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell    }
200ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
201ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell    /**
202ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * Configure a {@link MenuItem} to act as a sharing action.
203ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     *
204ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * <p>If the app is running on API level 14 or higher (Android 4.0/Ice Cream Sandwich)
205ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * this method will configure a ShareActionProvider to provide a more robust UI
206ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * for selecting the target of the share. History will be tracked for each calling
207ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * activity in a file named with the prefix ".sharecompat_" in the application's
208ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * private data directory. If the application wishes to set this MenuItem to show
209ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * as an action in the Action Bar it should use
210ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * {@link MenuItemCompat#setShowAsAction(MenuItem, int)} to request that behavior
211ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * in addition to calling this method.</p>
212ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     *
213ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * <p>If the app is running on an older platform version this method will configure
214ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * a standard activity chooser dialog for the menu item.</p>
215ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     *
216ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * <p>During the calling activity's lifecycle, if data within the share intent must
217ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * change the app should change that state in one of several ways:</p>
218ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * <ul>
219ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * <li>Call {@link ActivityCompat#invalidateOptionsMenu(Activity)}. If the app is running
220ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * on API level 11 or above and uses the Action Bar its menu will be recreated and rebuilt.
221ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * If not, the activity will receive a call to {@link Activity#onPrepareOptionsMenu(Menu)}
222ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * the next time the user presses the menu key to open the options menu panel. The activity
223ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * can then call configureMenuItem again with a new or altered IntentBuilder to reconfigure
224ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * the share menu item.</li>
225ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * <li>Keep a reference to the MenuItem object for the share item once it has been created
226ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * and call configureMenuItem to update the associated sharing intent as needed.</li>
227ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * </ul>
228ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     *
229ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * @param item MenuItem to configure for sharing
230ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * @param shareIntent IntentBuilder with data about the content to share
231ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     */
232ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell    public static void configureMenuItem(MenuItem item, IntentBuilder shareIntent) {
233ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        IMPL.configureMenuItem(item, shareIntent);
234ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell    }
235ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
236ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell    /**
237ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * Configure a menu item to act as a sharing action.
238ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     *
239ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * @param menu Menu containing the item to use for sharing
240ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * @param menuItemId ID of the share item within menu
241ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * @param shareIntent IntentBuilder with data about the content to share
242ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * @see #configureMenuItem(MenuItem, IntentBuilder)
243ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     */
244ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell    public static void configureMenuItem(Menu menu, int menuItemId, IntentBuilder shareIntent) {
245ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        MenuItem item = menu.findItem(menuItemId);
246ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        if (item == null) {
247ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            throw new IllegalArgumentException("Could not find menu item with id " + menuItemId +
248ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                    " in the supplied menu");
249ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
250ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        configureMenuItem(item, shareIntent);
251ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell    }
252ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
253ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell    /**
254ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * IntentBuilder is a helper for constructing {@link Intent#ACTION_SEND} and
255ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * {@link Intent#ACTION_SEND_MULTIPLE} sharing intents and starting activities
256ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * to share content. The ComponentName and package name of the calling activity
257ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * will be included.
258ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     */
259ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell    public static class IntentBuilder {
260ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        private Activity mActivity;
261ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        private Intent mIntent;
262ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        private CharSequence mChooserTitle;
263ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        private ArrayList<String> mToAddresses;
264ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        private ArrayList<String> mCcAddresses;
265ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        private ArrayList<String> mBccAddresses;
266ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
267ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        private ArrayList<Uri> mStreams;
268ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
269ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        /**
270ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * Create a new IntentBuilder for launching a sharing action from launchingActivity.
271ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         *
272ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @param launchingActivity Activity that the share will be launched from
273ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @return a new IntentBuilder instance
274ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         */
275ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        public static IntentBuilder from(Activity launchingActivity) {
276ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            return new IntentBuilder(launchingActivity);
277ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
278ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
279ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        private IntentBuilder(Activity launchingActivity) {
280ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            mActivity = launchingActivity;
281ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            mIntent = new Intent().setAction(Intent.ACTION_SEND);
282ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            mIntent.putExtra(EXTRA_CALLING_PACKAGE, launchingActivity.getPackageName());
283ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            mIntent.putExtra(EXTRA_CALLING_ACTIVITY, launchingActivity.getComponentName());
284ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            mIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
285ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
286ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
287ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        /**
288ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * Retrieve the Intent as configured so far by the IntentBuilder. This Intent
289ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * is suitable for use in a ShareActionProvider or chooser dialog.
290ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         *
291ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * <p>To create an intent that will launch the activity chooser so that the user
292ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * may select a target for the share, see {@link #createChooserIntent()}.
293ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         *
294ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @return The current Intent being configured by this builder
295ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         */
296ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        public Intent getIntent() {
297ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            if (mToAddresses != null) {
298ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                combineArrayExtra(Intent.EXTRA_EMAIL, mToAddresses);
299ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                mToAddresses = null;
300ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            }
301ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            if (mCcAddresses != null) {
302ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                combineArrayExtra(Intent.EXTRA_CC, mCcAddresses);
303ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                mCcAddresses = null;
304ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            }
305ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            if (mBccAddresses != null) {
306ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                combineArrayExtra(Intent.EXTRA_BCC, mBccAddresses);
307ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                mBccAddresses = null;
308ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            }
309ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
310ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            // Check if we need to change the action.
311ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            boolean needsSendMultiple = mStreams != null && mStreams.size() > 1;
312ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            boolean isSendMultiple = mIntent.getAction().equals(Intent.ACTION_SEND_MULTIPLE);
313ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
314ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            if (!needsSendMultiple && isSendMultiple) {
315ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                // Change back to a single send action; place the first stream into the
316ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                // intent for single sharing.
317ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                mIntent.setAction(Intent.ACTION_SEND);
318ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                if (mStreams != null && !mStreams.isEmpty()) {
319ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                    mIntent.putExtra(Intent.EXTRA_STREAM, mStreams.get(0));
320ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                } else {
321ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                    mIntent.removeExtra(Intent.EXTRA_STREAM);
322ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                }
323ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                mStreams = null;
324ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            }
325ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
326ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            if (needsSendMultiple && !isSendMultiple) {
327ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                // Change to a multiple send action; place the relevant ArrayList into the
328ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                // intent for multiple sharing.
329ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                mIntent.setAction(Intent.ACTION_SEND_MULTIPLE);
330ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                if (mStreams != null && !mStreams.isEmpty()) {
331ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                    mIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, mStreams);
332ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                } else {
333ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                    mIntent.removeExtra(Intent.EXTRA_STREAM);
334ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                }
335ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            }
336ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
337ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            return mIntent;
338ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
339ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
340ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        Activity getActivity() {
341ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            return mActivity;
342ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
343ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
344ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        private void combineArrayExtra(String extra, ArrayList<String> add) {
345ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            String[] currentAddresses = mIntent.getStringArrayExtra(extra);
346ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            int currentLength = currentAddresses != null ? currentAddresses.length : 0;
347ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            String[] finalAddresses = new String[currentLength + add.size()];
348ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            add.toArray(finalAddresses);
349ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            if (currentAddresses != null) {
350ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                System.arraycopy(currentAddresses, 0, finalAddresses, add.size(), currentLength);
351ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            }
352ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            mIntent.putExtra(extra, finalAddresses);
353ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
354ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
355ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        private void combineArrayExtra(String extra, String[] add) {
356ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            // Add any items still pending
357ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            Intent intent = getIntent();
358ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            String[] old = intent.getStringArrayExtra(extra);
359ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            int oldLength = old != null ? old.length : 0;
360ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            String[] result = new String[oldLength + add.length];
361ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            if (old != null) System.arraycopy(old, 0, result, 0, oldLength);
362ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            System.arraycopy(add, 0, result, oldLength, add.length);
363ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            intent.putExtra(extra, result);
364ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
365ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
366ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        /**
367ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * Create an Intent that will launch the standard Android activity chooser,
368ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * allowing the user to pick what activity/app on the system should handle
369ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * the share.
370ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         *
371ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @return A chooser Intent for the currently configured sharing action
372ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         */
373ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        public Intent createChooserIntent() {
374ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            return Intent.createChooser(getIntent(), mChooserTitle);
375ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
376ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
377ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        /**
3787ac4b376371e890eb19838249e6749f64d707ad2Adam Powell         * Start a chooser activity for the current share intent.
3797ac4b376371e890eb19838249e6749f64d707ad2Adam Powell         *
3807ac4b376371e890eb19838249e6749f64d707ad2Adam Powell         * <p>Note that under most circumstances you should use
3817ac4b376371e890eb19838249e6749f64d707ad2Adam Powell         * {@link ShareCompat#configureMenuItem(MenuItem, IntentBuilder)
3827ac4b376371e890eb19838249e6749f64d707ad2Adam Powell         *  ShareCompat.configureMenuItem()} to add a Share item to the menu while
3837ac4b376371e890eb19838249e6749f64d707ad2Adam Powell         * presenting a detail view of the content to be shared instead
3847ac4b376371e890eb19838249e6749f64d707ad2Adam Powell         * of invoking this directly.</p>
385ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         */
3867ac4b376371e890eb19838249e6749f64d707ad2Adam Powell        public void startChooser() {
3877ac4b376371e890eb19838249e6749f64d707ad2Adam Powell            mActivity.startActivity(createChooserIntent());
388ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
389ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
390ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        /**
391ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * Set the title that will be used for the activity chooser for this share.
392ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         *
393ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @param title Title string
394ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @return This IntentBuilder for method chaining
395ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         */
396ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        public IntentBuilder setChooserTitle(CharSequence title) {
397ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            mChooserTitle = title;
398ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            return this;
399ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
400ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
401ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        /**
402ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * Set the title that will be used for the activity chooser for this share.
403ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         *
404ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @param resId Resource ID of the title string to use
405ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @return This IntentBuilder for method chaining
406ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         */
407a3ff3273e976adf19770651dcf473fa67b38eb22Tor Norbye        public IntentBuilder setChooserTitle(@StringRes int resId) {
408ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            return setChooserTitle(mActivity.getText(resId));
409ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
410ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
411ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        /**
412ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * Set the type of data being shared
413ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         *
414ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @param mimeType mimetype of the shared data
415ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @return This IntentBuilder for method chaining
416ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @see Intent#setType(String)
417ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         */
418ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        public IntentBuilder setType(String mimeType) {
419ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            mIntent.setType(mimeType);
420ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            return this;
421ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
422ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
423ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        /**
424ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * Set the literal text data to be sent as part of the share.
42537c1509886a7897163f70f4645c08ddf0b41632dAdam Powell         * This may be a styled CharSequence.
426ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         *
427ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @param text Text to share
428ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @return This IntentBuilder for method chaining
429ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @see Intent#EXTRA_TEXT
430ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         */
431ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        public IntentBuilder setText(CharSequence text) {
432ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            mIntent.putExtra(Intent.EXTRA_TEXT, text);
433ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            return this;
434ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
435ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
436ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        /**
43737c1509886a7897163f70f4645c08ddf0b41632dAdam Powell         * Set an HTML string to be sent as part of the share.
43837c1509886a7897163f70f4645c08ddf0b41632dAdam Powell         * If {@link Intent#EXTRA_TEXT EXTRA_TEXT} has not already been supplied,
43937c1509886a7897163f70f4645c08ddf0b41632dAdam Powell         * a styled version of the supplied HTML text will be added as EXTRA_TEXT as
44037c1509886a7897163f70f4645c08ddf0b41632dAdam Powell         * parsed by {@link android.text.Html#fromHtml(String) Html.fromHtml}.
44137c1509886a7897163f70f4645c08ddf0b41632dAdam Powell         *
44237c1509886a7897163f70f4645c08ddf0b41632dAdam Powell         * @param htmlText A string containing HTML markup as a richer version of the text
44337c1509886a7897163f70f4645c08ddf0b41632dAdam Powell         *                 provided by EXTRA_TEXT.
44437c1509886a7897163f70f4645c08ddf0b41632dAdam Powell         * @return This IntentBuilder for method chaining
44537c1509886a7897163f70f4645c08ddf0b41632dAdam Powell         * @see #setText(CharSequence)
44637c1509886a7897163f70f4645c08ddf0b41632dAdam Powell         */
44737c1509886a7897163f70f4645c08ddf0b41632dAdam Powell        public IntentBuilder setHtmlText(String htmlText) {
44837c1509886a7897163f70f4645c08ddf0b41632dAdam Powell            mIntent.putExtra(IntentCompat.EXTRA_HTML_TEXT, htmlText);
44937c1509886a7897163f70f4645c08ddf0b41632dAdam Powell            if (!mIntent.hasExtra(Intent.EXTRA_TEXT)) {
45037c1509886a7897163f70f4645c08ddf0b41632dAdam Powell                // Supply a default if EXTRA_TEXT isn't set
45137c1509886a7897163f70f4645c08ddf0b41632dAdam Powell                setText(Html.fromHtml(htmlText));
45237c1509886a7897163f70f4645c08ddf0b41632dAdam Powell            }
45337c1509886a7897163f70f4645c08ddf0b41632dAdam Powell            return this;
45437c1509886a7897163f70f4645c08ddf0b41632dAdam Powell        }
45537c1509886a7897163f70f4645c08ddf0b41632dAdam Powell
45637c1509886a7897163f70f4645c08ddf0b41632dAdam Powell        /**
457ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * Set a stream URI to the data that should be shared.
458ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         *
459ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * <p>This replaces all currently set stream URIs and will produce a single-stream
460ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * ACTION_SEND intent.</p>
461ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         *
462ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @param streamUri URI of the stream to share
463ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @return This IntentBuilder for method chaining
464ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @see Intent#EXTRA_STREAM
465ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         */
466ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        public IntentBuilder setStream(Uri streamUri) {
467ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            if (!mIntent.getAction().equals(Intent.ACTION_SEND)) {
468ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                mIntent.setAction(Intent.ACTION_SEND);
469ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            }
470ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            mStreams = null;
471ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            mIntent.putExtra(Intent.EXTRA_STREAM, streamUri);
472ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            return this;
473ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
474ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
475ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        /**
476ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * Add a stream URI to the data that should be shared. If this is not the first
477ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * stream URI added the final intent constructed will become an ACTION_SEND_MULTIPLE
478ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * intent. Not all apps will handle both ACTION_SEND and ACTION_SEND_MULTIPLE.
479ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         *
480ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @param streamUri URI of the stream to share
481ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @return This IntentBuilder for method chaining
482ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @see Intent#EXTRA_STREAM
483ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @see Intent#ACTION_SEND
484ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @see Intent#ACTION_SEND_MULTIPLE
485ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         */
486ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        public IntentBuilder addStream(Uri streamUri) {
487ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            Uri currentStream = mIntent.getParcelableExtra(Intent.EXTRA_STREAM);
488ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            if (currentStream == null) {
489ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                return setStream(streamUri);
490ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            }
491ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            if (mStreams == null) {
492ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                mStreams = new ArrayList<Uri>();
493ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            }
494ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            if (currentStream != null) {
495ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                mIntent.removeExtra(Intent.EXTRA_STREAM);
496ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                mStreams.add(currentStream);
497ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            }
498ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            mStreams.add(streamUri);
499ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            return this;
500ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
501ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
502ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        /**
503ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * Set an array of email addresses as recipients of this share.
504ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * This replaces all current "to" recipients that have been set so far.
505ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         *
506ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @param addresses Email addresses to send to
507ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @return This IntentBuilder for method chaining
508ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @see Intent#EXTRA_EMAIL
509ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         */
510ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        public IntentBuilder setEmailTo(String[] addresses) {
511ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            if (mToAddresses != null) {
512ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                mToAddresses = null;
513ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            }
514ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            mIntent.putExtra(Intent.EXTRA_EMAIL, addresses);
515ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            return this;
516ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
517ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
518ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        /**
519ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * Add an email address to be used in the "to" field of the final Intent.
520ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         *
521ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @param address Email address to send to
522ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @return This IntentBuilder for method chaining
523ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @see Intent#EXTRA_EMAIL
524ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         */
525ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        public IntentBuilder addEmailTo(String address) {
526ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            if (mToAddresses == null) {
527ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                mToAddresses = new ArrayList<String>();
528ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            }
529ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            mToAddresses.add(address);
530ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            return this;
531ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
532ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
533ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        /**
534ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * Add an array of email addresses to be used in the "to" field of the final Intent.
535ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         *
536ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @param addresses Email addresses to send to
537ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @return This IntentBuilder for method chaining
538ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @see Intent#EXTRA_EMAIL
539ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         */
540ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        public IntentBuilder addEmailTo(String[] addresses) {
541ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            combineArrayExtra(Intent.EXTRA_EMAIL, addresses);
542ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            return this;
543ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
544ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
545ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        /**
546ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * Set an array of email addresses to CC on this share.
547ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * This replaces all current "CC" recipients that have been set so far.
548ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         *
549ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @param addresses Email addresses to CC on the share
550ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @return This IntentBuilder for method chaining
551ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @see Intent#EXTRA_CC
552ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         */
553ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        public IntentBuilder setEmailCc(String[] addresses) {
554ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            mIntent.putExtra(Intent.EXTRA_CC, addresses);
555ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            return this;
556ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
557ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
558ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        /**
559ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * Add an email address to be used in the "cc" field of the final Intent.
560ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         *
561ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @param address Email address to CC
562ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @return This IntentBuilder for method chaining
563ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @see Intent#EXTRA_CC
564ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         */
565ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        public IntentBuilder addEmailCc(String address) {
566ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            if (mCcAddresses == null) {
567ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                mCcAddresses = new ArrayList<String>();
568ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            }
569ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            mCcAddresses.add(address);
570ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            return this;
571ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
572ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
573ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        /**
574ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * Add an array of email addresses to be used in the "cc" field of the final Intent.
575ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         *
576ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @param addresses Email addresses to CC
577ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @return This IntentBuilder for method chaining
578ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @see Intent#EXTRA_CC
579ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         */
580ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        public IntentBuilder addEmailCc(String[] addresses) {
581ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            combineArrayExtra(Intent.EXTRA_CC, addresses);
582ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            return this;
583ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
584ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
585ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        /**
586ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * Set an array of email addresses to BCC on this share.
587ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * This replaces all current "BCC" recipients that have been set so far.
588ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         *
589ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @param addresses Email addresses to BCC on the share
590ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @return This IntentBuilder for method chaining
591ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @see Intent#EXTRA_BCC
592ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         */
593ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        public IntentBuilder setEmailBcc(String[] addresses) {
594ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            mIntent.putExtra(Intent.EXTRA_BCC, addresses);
595ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            return this;
596ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
597ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
598ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        /**
599ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * Add an email address to be used in the "bcc" field of the final Intent.
600ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         *
601ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @param address Email address to BCC
602ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @return This IntentBuilder for method chaining
603ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @see Intent#EXTRA_BCC
604ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         */
605ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        public IntentBuilder addEmailBcc(String address) {
606ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            if (mBccAddresses == null) {
607ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                mBccAddresses = new ArrayList<String>();
608ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            }
609ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            mBccAddresses.add(address);
610ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            return this;
611ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
612ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
613ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        /**
614ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * Add an array of email addresses to be used in the "bcc" field of the final Intent.
615ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         *
616ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @param addresses Email addresses to BCC
617ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @return This IntentBuilder for method chaining
618ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @see Intent#EXTRA_BCC
619ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         */
620ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        public IntentBuilder addEmailBcc(String[] addresses) {
621ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            combineArrayExtra(Intent.EXTRA_BCC, addresses);
622ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            return this;
623ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
624ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
625ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        /**
626ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * Set a subject heading for this share; useful for sharing via email.
627ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         *
628ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @param subject Subject heading for this share
629ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @return This IntentBuilder for method chaining
630ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @see Intent#EXTRA_SUBJECT
631ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         */
632ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        public IntentBuilder setSubject(String subject) {
633ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            mIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
634ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            return this;
635ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
636ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell    }
637ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
638ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell    /**
639ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * IntentReader is a helper for reading the data contained within a sharing (ACTION_SEND)
640ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * Intent. It provides methods to parse standard elements included with a share
641ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * in addition to extra metadata about the app that shared the content.
642ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     *
643ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * <p>Social sharing apps are encouraged to provide attribution for the app that shared
644ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * the content. IntentReader offers access to the application label, calling activity info,
645ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * and application icon of the app that shared the content. This data may have been provided
646ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * voluntarily by the calling app and should always be displayed to the user before submission
647ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * for manual verification. The user should be offered the option to omit this information
648ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * from shared posts if desired.</p>
649ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     *
650ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * <p>Activities that intend to receive sharing intents should configure an intent-filter
651ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * to accept {@link Intent#ACTION_SEND} intents ("android.intent.action.SEND") and optionally
652ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * accept {@link Intent#ACTION_SEND_MULTIPLE} ("android.intent.action.SEND_MULTIPLE") if
653ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     * the activity is equipped to handle multiple data streams.</p>
654ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell     */
655ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell    public static class IntentReader {
656ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        private static final String TAG = "IntentReader";
657ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
658ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        private Activity mActivity;
659ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        private Intent mIntent;
660ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        private String mCallingPackage;
661ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        private ComponentName mCallingActivity;
662ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
663ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        private ArrayList<Uri> mStreams;
664ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
665ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        /**
666ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * Get an IntentReader for parsing and interpreting the sharing intent
667ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * used to start the given activity.
668ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         *
669ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @param activity Activity that was started to share content
670ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @return IntentReader for parsing sharing data
671ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         */
672ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        public static IntentReader from(Activity activity) {
673ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            return new IntentReader(activity);
674ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
675ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
676ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        private IntentReader(Activity activity) {
677ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            mActivity = activity;
678ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            mIntent = activity.getIntent();
679ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            mCallingPackage = ShareCompat.getCallingPackage(activity);
680ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            mCallingActivity = ShareCompat.getCallingActivity(activity);
681ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
682ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
683ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        /**
684ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * Returns true if the activity this reader was obtained for was
685ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * started with an {@link Intent#ACTION_SEND} or {@link Intent#ACTION_SEND_MULTIPLE}
686ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * sharing Intent.
687ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         *
688ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @return true if the activity was started with an ACTION_SEND
689ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         *         or ACTION_SEND_MULTIPLE Intent
690ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         */
691ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        public boolean isShareIntent() {
692ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            final String action = mIntent.getAction();
6930e2575ae97ccb986e9d32a57c9e4c44b3c1aa20eAdam Koch            return Intent.ACTION_SEND.equals(action) || Intent.ACTION_SEND_MULTIPLE.equals(action);
694ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
695ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
696ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        /**
697ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * Returns true if the activity this reader was obtained for was started with an
698ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * {@link Intent#ACTION_SEND} intent and contains a single shared item.
699ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * The shared content should be obtained using either the {@link #getText()}
700ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * or {@link #getStream()} methods depending on the type of content shared.
701ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         *
702ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @return true if the activity was started with an ACTION_SEND intent
703ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         */
704ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        public boolean isSingleShare() {
7050e2575ae97ccb986e9d32a57c9e4c44b3c1aa20eAdam Koch            return Intent.ACTION_SEND.equals(mIntent.getAction());
706ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
707ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
708ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        /**
709ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * Returns true if the activity this reader was obtained for was started with an
710ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * {@link Intent#ACTION_SEND_MULTIPLE} intent. The Intent may contain more than
711ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * one stream item.
712ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         *
713ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @return true if the activity was started with an ACTION_SEND_MULTIPLE intent
714ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         */
715ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        public boolean isMultipleShare() {
7160e2575ae97ccb986e9d32a57c9e4c44b3c1aa20eAdam Koch            return Intent.ACTION_SEND_MULTIPLE.equals(mIntent.getAction());
717ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
718ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
719ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        /**
720ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * Get the mimetype of the data shared to this activity.
721ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         *
722ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @return mimetype of the shared data
723ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @see Intent#getType()
724ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         */
725ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        public String getType() {
726ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            return mIntent.getType();
727ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
728ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
729ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        /**
730ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * Get the literal text shared with the target activity.
731ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         *
732ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @return Literal shared text or null if none was supplied
733ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @see Intent#EXTRA_TEXT
734ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         */
735ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        public CharSequence getText() {
736ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            return mIntent.getCharSequenceExtra(Intent.EXTRA_TEXT);
737ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
738ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
739ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        /**
74037c1509886a7897163f70f4645c08ddf0b41632dAdam Powell         * Get the styled HTML text shared with the target activity.
74137c1509886a7897163f70f4645c08ddf0b41632dAdam Powell         * If no HTML text was supplied but {@link Intent#EXTRA_TEXT} contained
74237c1509886a7897163f70f4645c08ddf0b41632dAdam Powell         * styled text, it will be converted to HTML if possible and returned.
74337c1509886a7897163f70f4645c08ddf0b41632dAdam Powell         * If the text provided by {@link Intent#EXTRA_TEXT} was not styled text,
74437c1509886a7897163f70f4645c08ddf0b41632dAdam Powell         * it will be escaped by {@link android.text.Html#escapeHtml(CharSequence)}
74537c1509886a7897163f70f4645c08ddf0b41632dAdam Powell         * and returned. If no text was provided at all, this method will return null.
74637c1509886a7897163f70f4645c08ddf0b41632dAdam Powell         *
74737c1509886a7897163f70f4645c08ddf0b41632dAdam Powell         * @return Styled text provided by the sender as HTML.
74837c1509886a7897163f70f4645c08ddf0b41632dAdam Powell         */
74937c1509886a7897163f70f4645c08ddf0b41632dAdam Powell        public String getHtmlText() {
75037c1509886a7897163f70f4645c08ddf0b41632dAdam Powell            String result = mIntent.getStringExtra(IntentCompat.EXTRA_HTML_TEXT);
7510eefa9b2aa1c43a6c05def134bba74328b207a02Adam Powell            if (result == null) {
75237c1509886a7897163f70f4645c08ddf0b41632dAdam Powell                CharSequence text = getText();
75337c1509886a7897163f70f4645c08ddf0b41632dAdam Powell                if (text instanceof Spanned) {
75437c1509886a7897163f70f4645c08ddf0b41632dAdam Powell                    result = Html.toHtml((Spanned) text);
75537c1509886a7897163f70f4645c08ddf0b41632dAdam Powell                } else if (text != null) {
75637c1509886a7897163f70f4645c08ddf0b41632dAdam Powell                    result = IMPL.escapeHtml(text);
75737c1509886a7897163f70f4645c08ddf0b41632dAdam Powell                }
75837c1509886a7897163f70f4645c08ddf0b41632dAdam Powell            }
75937c1509886a7897163f70f4645c08ddf0b41632dAdam Powell            return result;
76037c1509886a7897163f70f4645c08ddf0b41632dAdam Powell        }
76137c1509886a7897163f70f4645c08ddf0b41632dAdam Powell
76237c1509886a7897163f70f4645c08ddf0b41632dAdam Powell        /**
763ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * Get a URI referring to a data stream shared with the target activity.
764ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         *
765ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * <p>This call will fail if the share intent contains multiple stream items.
766ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * If {@link #isMultipleShare()} returns true the application should use
767ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * {@link #getStream(int)} and {@link #getStreamCount()} to retrieve the
768ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * included stream items.</p>
769ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         *
770ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @return A URI referring to a data stream to be shared or null if one was not supplied
771ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @see Intent#EXTRA_STREAM
772ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         */
773ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        public Uri getStream() {
774ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            return mIntent.getParcelableExtra(Intent.EXTRA_STREAM);
775ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
776ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
777ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        /**
778ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * Get the URI of a stream item shared with the target activity.
779ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * Index should be in the range [0-getStreamCount()).
780ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         *
781ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @param index Index of text item to retrieve
782ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @return Requested stream item URI
783ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @see Intent#EXTRA_STREAM
784ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @see Intent#ACTION_SEND_MULTIPLE
785ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         */
786ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        public Uri getStream(int index) {
787ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            if (mStreams == null && isMultipleShare()) {
788ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                mStreams = mIntent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
789ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            }
790ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            if (mStreams != null) {
791ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                return mStreams.get(index);
792ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            }
793ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            if (index == 0) {
794ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                return mIntent.getParcelableExtra(Intent.EXTRA_STREAM);
795ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            }
796ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            throw new IndexOutOfBoundsException("Stream items available: " + getStreamCount() +
797ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                    " index requested: " + index);
798ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
799ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
800ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        /**
801ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * Return the number of stream items shared. The return value will be 0 or 1 if
802ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * this was an {@link Intent#ACTION_SEND} intent, or 0 or more if it was an
803ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * {@link Intent#ACTION_SEND_MULTIPLE} intent.
804ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         *
805ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @return Count of text items contained within the Intent
806ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         */
807ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        public int getStreamCount() {
808ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            if (mStreams == null && isMultipleShare()) {
809ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                mStreams = mIntent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
810ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            }
811ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            if (mStreams != null) {
812ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                return mStreams.size();
813ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            }
814ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            return mIntent.hasExtra(Intent.EXTRA_STREAM) ? 1 : 0;
815ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
816ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
817ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        /**
818ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * Get an array of Strings, each an email address to share to.
819ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         *
820ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @return An array of email addresses or null if none were supplied.
821ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @see Intent#EXTRA_EMAIL
822ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         */
823ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        public String[] getEmailTo() {
824ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            return mIntent.getStringArrayExtra(Intent.EXTRA_EMAIL);
825ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
826ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
827ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        /**
828ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * Get an array of Strings, each an email address to CC on this share.
829ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         *
830ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @return An array of email addresses or null if none were supplied.
831ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @see Intent#EXTRA_CC
832ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         */
833ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        public String[] getEmailCc() {
834ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            return mIntent.getStringArrayExtra(Intent.EXTRA_CC);
835ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
836ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
837ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        /**
838ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * Get an array of Strings, each an email address to BCC on this share.
839ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         *
840ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @return An array of email addresses or null if none were supplied.
841ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @see Intent#EXTRA_BCC
842ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         */
843ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        public String[] getEmailBcc() {
844ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            return mIntent.getStringArrayExtra(Intent.EXTRA_BCC);
845ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
846ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
847ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        /**
848ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * Get a subject heading for this share; useful when sharing via email.
849ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         *
850ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @return The subject heading for this share or null if one was not supplied.
851ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @see Intent#EXTRA_SUBJECT
852ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         */
853ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        public String getSubject() {
854ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            return mIntent.getStringExtra(Intent.EXTRA_SUBJECT);
855ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
856ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
857ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        /**
858ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * Get the name of the package that invoked this sharing intent. If the activity
859ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * was not started for a result, IntentBuilder will read this from extra metadata placed
860ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * in the Intent by ShareBuilder.
861ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         *
862ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * <p><em>Note:</em> This data may have been provided voluntarily by the calling
863ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * application. As such it should not be trusted for accuracy in the context of
864ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * security or verification.</p>
865ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         *
866ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @return Name of the package that started this activity or null if unknown
867ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @see Activity#getCallingPackage()
868ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @see ShareCompat#EXTRA_CALLING_PACKAGE
869ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         */
870ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        public String getCallingPackage() {
871ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            return mCallingPackage;
872ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
873ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
874ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        /**
875ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * Get the {@link ComponentName} of the Activity that invoked this sharing intent.
876ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * If the target sharing activity was not started for a result, IntentBuilder will read
877ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * this from extra metadata placed in the intent by ShareBuilder.
878ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         *
879ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * <p><em>Note:</em> This data may have been provided voluntarily by the calling
880ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * application. As such it should not be trusted for accuracy in the context of
881ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * security or verification.</p>
882ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         *
883ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @return ComponentName of the calling Activity or null if unknown
884ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @see Activity#getCallingActivity()
885ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @see ShareCompat#EXTRA_CALLING_ACTIVITY
886ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         */
887ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        public ComponentName getCallingActivity() {
888ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            return mCallingActivity;
889ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
890ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
891ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        /**
892ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * Get the icon of the calling activity as a Drawable if data about
893ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * the calling activity is available.
894ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         *
895ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * <p><em>Note:</em> This data may have been provided voluntarily by the calling
896ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * application. As such it should not be trusted for accuracy in the context of
897ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * security or verification.</p>
898ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         *
899ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @return The calling Activity's icon or null if unknown
900ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         */
901ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        public Drawable getCallingActivityIcon() {
902ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            if (mCallingActivity == null) return null;
903ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
904ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            PackageManager pm = mActivity.getPackageManager();
905ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            try {
906ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                return pm.getActivityIcon(mCallingActivity);
907ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            } catch (NameNotFoundException e) {
908ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                Log.e(TAG, "Could not retrieve icon for calling activity", e);
909ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            }
910ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            return null;
911ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
912ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
913ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        /**
914ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * Get the icon of the calling application as a Drawable if data
915ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * about the calling package is available.
916ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         *
917ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * <p><em>Note:</em> This data may have been provided voluntarily by the calling
918ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * application. As such it should not be trusted for accuracy in the context of
919ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * security or verification.</p>
920ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         *
921ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @return The calling application's icon or null if unknown
922ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         */
923ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        public Drawable getCallingApplicationIcon() {
924ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            if (mCallingPackage == null) return null;
925ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
926ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            PackageManager pm = mActivity.getPackageManager();
927ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            try {
928ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                return pm.getApplicationIcon(mCallingPackage);
929ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            } catch (NameNotFoundException e) {
930ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                Log.e(TAG, "Could not retrieve icon for calling application", e);
931ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            }
932ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            return null;
933ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
934ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
935ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        /**
936ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * Get the human-readable label (title) of the calling application if
937ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * data about the calling package is available.
938ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         *
939ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * <p><em>Note:</em> This data may have been provided voluntarily by the calling
940ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * application. As such it should not be trusted for accuracy in the context of
941ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * security or verification.</p>
942ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         *
943ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         * @return The calling application's label or null if unknown
944ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell         */
945ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        public CharSequence getCallingApplicationLabel() {
946ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            if (mCallingPackage == null) return null;
947ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell
948ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            PackageManager pm = mActivity.getPackageManager();
949ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            try {
950ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                return pm.getApplicationLabel(pm.getApplicationInfo(mCallingPackage, 0));
951ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            } catch (NameNotFoundException e) {
952ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell                Log.e(TAG, "Could not retrieve label for calling application", e);
953ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            }
954ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell            return null;
955ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell        }
956ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell    }
957ac4078687ff889e804b198bf5748e611bbb0fa30Adam Powell}
958