Bug 1315937 - Add share item to menu if necessary draft
authorJulian_Chu <walkingice0204@gmail.com>
Thu, 02 Mar 2017 17:05:28 +0800
changeset 497291 dcb1a685d25f002573ccfd322b04ef52e991171d
parent 497290 f309c59a70ae4f2498eb24c5e2b9402d6ef18d85
child 548851 51f4d1ba1f600c8da373e654eba225e84d3b2268
push id48857
push userbmo:walkingice0204@gmail.com
push dateMon, 13 Mar 2017 04:50:52 +0000
bugs1315937
milestone54.0a1
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
mobile/android/base/java/org/mozilla/gecko/customtabs/CustomTabsActivity.java
mobile/android/base/java/org/mozilla/gecko/customtabs/IntentUtil.java
mobile/android/tests/background/junit4/src/org/mozilla/gecko/customtabs/TestIntentUtil.java
--- 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);
     }