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
--- 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