Bug 1315937 - Add share item to menu if necessary
3rd-party app could ask to add default share item to menu, and share
the data url to other activities if user click the share-menu-item.
MozReview-Commit-ID: HkDyENJtFn9
--- a/mobile/android/base/java/org/mozilla/gecko/customtabs/CustomTabsActivity.java
+++ b/mobile/android/base/java/org/mozilla/gecko/customtabs/CustomTabsActivity.java
@@ -253,16 +253,19 @@ public class CustomTabsActivity extends
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
return true;
case R.id.action_button:
onActionButtonClicked();
return true;
+ case R.id.share:
+ onShareClicked();
+ return true;
case R.id.custom_tabs_menu_forward:
onForwardClicked();
return true;
case R.id.custom_tabs_menu_reload:
onReloadClicked();
return true;
case R.id.custom_tabs_menu_open_in:
onOpenInClicked();
@@ -363,16 +366,21 @@ public class CustomTabsActivity extends
final List<PendingIntent> intents = IntentUtil.getMenuItemsPendingIntent(intent);
menuItemsIntent.clear();
for (int i = 0; i < titles.size(); i++) {
final int menuId = Menu.FIRST + i;
geckoMenu.add(Menu.NONE, menuId, Menu.NONE, titles.get(i));
menuItemsIntent.put(menuId, intents.get(i));
}
+ // to add share menu item, if necessary
+ if (IntentUtil.hasShareItem(intent) && !TextUtils.isEmpty(intent.getDataString())) {
+ geckoMenu.add(Menu.NONE, R.id.share, Menu.NONE, getString(R.string.share));
+ }
+
final MenuInflater inflater = new GeckoMenuInflater(this);
inflater.inflate(R.menu.customtabs_menu, geckoMenu);
// insert default browser name to title of menu-item-Open-In
final MenuItem openItem = geckoMenu.findItem(R.id.custom_tabs_menu_open_in);
if (openItem != null) {
final Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://"));
final ResolveInfo info = getPackageManager()
@@ -432,9 +440,26 @@ public class CustomTabsActivity extends
startActivity(intent);
}
}
private void onActionButtonClicked() {
PendingIntent pendingIntent = IntentUtil.getActionButtonPendingIntent(getIntent());
performPendingIntent(pendingIntent);
}
+
+ /**
+ * Callback for Share menu item.
+ */
+ private void onShareClicked() {
+ final String url = Tabs.getInstance().getSelectedTab().getURL();
+
+ if (!TextUtils.isEmpty(url)) {
+ Intent shareIntent = new Intent(Intent.ACTION_SEND);
+ shareIntent.setType("text/plain");
+ shareIntent.putExtra(Intent.EXTRA_TEXT, url);
+
+ Intent chooserIntent = Intent.createChooser(shareIntent, getString(R.string.share_title));
+ chooserIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ startActivity(chooserIntent);
+ }
+ }
}
--- a/mobile/android/base/java/org/mozilla/gecko/customtabs/IntentUtil.java
+++ b/mobile/android/base/java/org/mozilla/gecko/customtabs/IntentUtil.java
@@ -41,16 +41,26 @@ class IntentUtil {
static boolean hasActionButton(@NonNull Intent intent) {
return (getActionButtonBundle(intent) != null)
&& (getActionButtonIcon(intent) != null)
&& (getActionButtonDescription(intent) != null)
&& (getActionButtonPendingIntent(intent) != null);
}
/**
+ * To determine whether the intent requires to add share action to menu item.
+ *
+ * @param intent which to launch a Custom-Tabs-Activity
+ * @return true, if intent requires to add share action to menu item.
+ */
+ static boolean hasShareItem(@NonNull Intent intent) {
+ return intent.getBooleanExtra(CustomTabsIntent.EXTRA_DEFAULT_SHARE_MENU_ITEM, false);
+ }
+
+ /**
* To extract bitmap icon from intent for Action-Button.
*
* @param intent which to launch a Custom-Tabs-Activity
* @return bitmap icon, if any. Otherwise, null.
*/
static Bitmap getActionButtonIcon(@NonNull Intent intent) {
final Bundle bundle = getActionButtonBundle(intent);
return (bundle == null) ? null : (Bitmap) bundle.getParcelable(CustomTabsIntent.KEY_ICON);
--- a/mobile/android/tests/background/junit4/src/org/mozilla/gecko/customtabs/TestIntentUtil.java
+++ b/mobile/android/tests/background/junit4/src/org/mozilla/gecko/customtabs/TestIntentUtil.java
@@ -122,16 +122,26 @@ public class TestIntentUtil {
Assert.assertEquals("Label 0", titles.get(0));
Assert.assertEquals("Label 1", titles.get(1));
Assert.assertEquals("Label 2", titles.get(2));
Assert.assertTrue(Objects.equals(intent0, intents.get(0)));
Assert.assertTrue(Objects.equals(intent1, intents.get(1)));
Assert.assertTrue(Objects.equals(intent2, intents.get(2)));
}
+ @Test
+ public void testMenuShareItem() {
+ final CustomTabsIntent.Builder builderNoShareItem = new CustomTabsIntent.Builder();
+ Assert.assertFalse(IntentUtil.hasShareItem(builderNoShareItem.build().intent));
+
+ final CustomTabsIntent.Builder builderHasShareItem = new CustomTabsIntent.Builder();
+ builderHasShareItem.addDefaultShareMenuItem();
+ Assert.assertTrue(IntentUtil.hasShareItem(builderHasShareItem.build().intent));
+ }
+
private PendingIntent createPendingIntent(int reqCode, @Nullable String uri) {
final Intent actionIntent = new Intent(Intent.ACTION_VIEW);
if (!TextUtils.isEmpty(uri)) {
actionIntent.setData(Uri.parse(uri));
}
return PendingIntent.getActivity(spyContext, reqCode, actionIntent,
PendingIntent.FLAG_CANCEL_CURRENT);
}