Bug 1336373 - CustomTabsActivity supports tint in Action Button draft
authorJulian_Chu <walkingice0204@gmail.com>
Mon, 20 Mar 2017 13:59:43 +0800
changeset 502596 3671f961d791eaead5213115b1248349110f91d5
parent 502245 bd4f3810b402147f8656390555b29502ce5e2644
child 550205 9d567c2d4e118742f1f61ee5136cb536377bfcb8
push id50333
push userbmo:walkingice0204@gmail.com
push dateWed, 22 Mar 2017 03:15:55 +0000
bugs1336373
milestone55.0a1
Bug 1336373 - CustomTabsActivity supports tint in Action Button If 3-rd party app specify to use tint for Action Button, use primary text color as the tint color for Action Button. MozReview-Commit-ID: 3sX0MH8P0dM
mobile/android/base/java/org/mozilla/gecko/customtabs/ActionBarPresenter.java
mobile/android/base/java/org/mozilla/gecko/customtabs/CustomTabsActivity.java
mobile/android/tests/background/junit4/src/org/mozilla/gecko/customtabs/TestCustomTabsActivity.java
--- a/mobile/android/base/java/org/mozilla/gecko/customtabs/ActionBarPresenter.java
+++ b/mobile/android/base/java/org/mozilla/gecko/customtabs/ActionBarPresenter.java
@@ -120,16 +120,26 @@ public class ActionBarPresenter {
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                 window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                 window.setStatusBarColor(ColorUtil.darken(color, 0.25));
             }
         }
     }
 
     /**
+     * To get primary color of Title of ActionBar
+     *
+     * @return color code of primary color
+     */
+    @ColorInt
+    public int getTextPrimaryColor() {
+        return mTextPrimaryColor;
+    }
+
+    /**
      * To update appearance of CustomView of ActionBar, includes its icon, title and url text.
      *
      * @param identity SiteIdentity for current website. Could be null if don't want to show icon.
      * @param title    Title for current website. Could be null if don't want to show title.
      * @param url      URL for current website. At least Custom will show this url.
      */
     @UiThread
     private void updateCustomView(@Nullable SiteIdentity identity,
--- a/mobile/android/base/java/org/mozilla/gecko/customtabs/CustomTabsActivity.java
+++ b/mobile/android/base/java/org/mozilla/gecko/customtabs/CustomTabsActivity.java
@@ -7,22 +7,24 @@ package org.mozilla.gecko.customtabs;
 
 import android.app.PendingIntent;
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.graphics.Bitmap;
 import android.graphics.Color;
 import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.os.Bundle;
 import android.support.annotation.ColorInt;
 import android.support.annotation.NonNull;
 import android.support.annotation.StyleRes;
 import android.support.annotation.VisibleForTesting;
+import android.support.v4.graphics.drawable.DrawableCompat;
 import android.support.v4.util.SparseArrayCompat;
 import android.support.v4.view.MenuItemCompat;
 import android.support.v7.app.ActionBar;
 import android.support.v7.widget.Toolbar;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.Menu;
 import android.view.MenuInflater;
@@ -193,17 +195,17 @@ public class CustomTabsActivity extends 
     }
 
     // Usually should use onCreateOptionsMenu() to initialize menu items. But GeckoApp overwrite
     // it to support custom menu(Bug 739412). Then the parameter *menu* in this.onCreateOptionsMenu()
     // and this.onPrepareOptionsMenu() are different instances - GeckoApp.onCreatePanelMenu() changed it.
     // CustomTabsActivity only use standard menu in ActionBar, so initialize menu here.
     @Override
     public boolean onCreatePanelMenu(final int id, final Menu menu) {
-        insertActionButton(menu, getIntent());
+        insertActionButton(menu, getIntent(), actionBarPresenter.getTextPrimaryColor());
 
         popupMenu = createCustomPopupMenu();
 
         // Create a ImageButton manually, and use it as an anchor for PopupMenu.
         final ImageButton btn = new ImageButton(getContext(),
                 null, 0, R.style.Widget_MenuButtonCustomTabs);
         btn.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
         btn.setOnClickListener(new View.OnClickListener() {
@@ -255,31 +257,37 @@ public class CustomTabsActivity extends 
         return super.onOptionsItemSelected(item);
     }
 
     /**
      * To insert a MenuItem (as an ActionButton) into Menu.
      *
      * @param menu   The options menu in which to place items.
      * @param intent which to launch this activity
+     * @param tintColor color to tint action-button
      * @return the MenuItem which be created and inserted into menu. Otherwise, null.
      */
     @VisibleForTesting
-    MenuItem insertActionButton(Menu menu, Intent intent) {
+    MenuItem insertActionButton(final Menu menu,
+                                final Intent intent,
+                                @ColorInt final int tintColor) {
         if (!IntentUtil.hasActionButton(intent)) {
             return null;
         }
 
-        // TODO: Bug 1336373 - Action button icon should support tint
         MenuItem item = menu.add(Menu.NONE,
                 R.id.action_button,
                 Menu.NONE,
                 IntentUtil.getActionButtonDescription(intent));
         Bitmap bitmap = IntentUtil.getActionButtonIcon(intent);
-        item.setIcon(new BitmapDrawable(getResources(), bitmap));
+        final Drawable icon = new BitmapDrawable(getResources(), bitmap);
+        if (IntentUtil.isActionButtonTinted(intent)) {
+            DrawableCompat.setTint(icon, tintColor);
+        }
+        item.setIcon(icon);
         MenuItemCompat.setShowAsAction(item, MenuItemCompat.SHOW_AS_ACTION_ALWAYS);
 
         return item;
     }
 
     private void bindNavigationCallback(@NonNull final Toolbar toolbar) {
         toolbar.setNavigationOnClickListener(new View.OnClickListener() {
             @Override
--- a/mobile/android/tests/background/junit4/src/org/mozilla/gecko/customtabs/TestCustomTabsActivity.java
+++ b/mobile/android/tests/background/junit4/src/org/mozilla/gecko/customtabs/TestCustomTabsActivity.java
@@ -116,15 +116,15 @@ public class TestCustomTabsActivity {
                 R.drawable.ic_action_settings); // arbitrary icon resource
 
         // To create a CustomTabsIntent which is asking for ActionButton.
         final CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
         builder.setActionButton(bitmap, description, pendingIntent, true);
 
         // CustomTabsActivity should return a MenuItem with corresponding attributes.
         Menu menu = new RoboMenu(spyContext);
-        MenuItem item = spyActivity.insertActionButton(menu, builder.build().intent);
+        MenuItem item = spyActivity.insertActionButton(menu, builder.build().intent, 0xFF0000);
         Assert.assertNotNull(item);
         Assert.assertEquals(item.getTitle(), description);
         Assert.assertEquals(0, item.getOrder()); // should be the first one
         Assert.assertTrue(item.isVisible());
     }
 }
\ No newline at end of file