diff --git a/mobile/android/base/resources/drawable-large-hdpi-v11/favicon_none.png b/mobile/android/base/resources/drawable-large-hdpi-v11/favicon_none.png new file mode 100644 index 000000000000..9a0ab144207f Binary files /dev/null and b/mobile/android/base/resources/drawable-large-hdpi-v11/favicon_none.png differ diff --git a/mobile/android/base/resources/drawable-large-mdpi-v11/favicon_none.png b/mobile/android/base/resources/drawable-large-mdpi-v11/favicon_none.png new file mode 100644 index 000000000000..1d5e8b2eaef5 Binary files /dev/null and b/mobile/android/base/resources/drawable-large-mdpi-v11/favicon_none.png differ diff --git a/mobile/android/base/resources/drawable-large-xhdpi-v11/favicon_none.png b/mobile/android/base/resources/drawable-large-xhdpi-v11/favicon_none.png new file mode 100644 index 000000000000..32723effcb89 Binary files /dev/null and b/mobile/android/base/resources/drawable-large-xhdpi-v11/favicon_none.png differ diff --git a/mobile/android/base/resources/drawable-large-xxhdpi-v11/favicon_none.png b/mobile/android/base/resources/drawable-large-xxhdpi-v11/favicon_none.png new file mode 100644 index 000000000000..567b5b62a40e Binary files /dev/null and b/mobile/android/base/resources/drawable-large-xxhdpi-v11/favicon_none.png differ diff --git a/mobile/android/base/resources/layout/tab_strip.xml b/mobile/android/base/resources/layout/tab_strip.xml index de237bce210e..e4c4ec627ce6 100644 --- a/mobile/android/base/resources/layout/tab_strip.xml +++ b/mobile/android/base/resources/layout/tab_strip.xml @@ -10,7 +10,8 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" - android:paddingTop="8dp"/> + android:paddingTop="8dp" + android:paddingLeft="2dp"/> - \ No newline at end of file + diff --git a/mobile/android/base/resources/layout/tab_strip_item.xml b/mobile/android/base/resources/layout/tab_strip_item.xml index 71087dda28aa..58fa0a675a5f 100644 --- a/mobile/android/base/resources/layout/tab_strip_item.xml +++ b/mobile/android/base/resources/layout/tab_strip_item.xml @@ -10,5 +10,5 @@ android:layout_width="@dimen/new_tablet_tab_strip_item_width" android:layout_height="match_parent" android:background="@drawable/new_tablet_tab_strip_item_bg" - android:paddingLeft="28dp" + android:paddingLeft="25dp" android:paddingRight="15dp"/> diff --git a/mobile/android/base/resources/layout/tab_strip_item_view.xml b/mobile/android/base/resources/layout/tab_strip_item_view.xml index 58e0149c2362..fedb4f9b17f4 100644 --- a/mobile/android/base/resources/layout/tab_strip_item_view.xml +++ b/mobile/android/base/resources/layout/tab_strip_item_view.xml @@ -5,6 +5,14 @@ + + 26sp 200dp + 16dp + diff --git a/mobile/android/base/tabs/TabStrip.java b/mobile/android/base/tabs/TabStrip.java index cc693b21fea3..4c835ac615bb 100644 --- a/mobile/android/base/tabs/TabStrip.java +++ b/mobile/android/base/tabs/TabStrip.java @@ -98,6 +98,7 @@ public class TabStrip extends ThemedLinearLayout { case UNSELECTED: // We just need to update the style for the unselected tab... case TITLE: + case FAVICON: case RECORDING_CHANGE: tabStripView.updateTab(tab); break; diff --git a/mobile/android/base/tabs/TabStripItemView.java b/mobile/android/base/tabs/TabStripItemView.java index 59d4e3880679..fabf4945df4a 100644 --- a/mobile/android/base/tabs/TabStripItemView.java +++ b/mobile/android/base/tabs/TabStripItemView.java @@ -5,7 +5,15 @@ package org.mozilla.gecko.tabs; +import org.mozilla.gecko.R; +import org.mozilla.gecko.Tab; +import org.mozilla.gecko.Tabs; +import org.mozilla.gecko.widget.ThemedImageButton; +import org.mozilla.gecko.widget.ThemedLinearLayout; +import org.mozilla.gecko.widget.ThemedTextView; + import android.content.Context; +import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Path; @@ -17,16 +25,11 @@ import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.widget.Checkable; - -import org.mozilla.gecko.R; -import org.mozilla.gecko.Tab; -import org.mozilla.gecko.Tabs; -import org.mozilla.gecko.widget.ThemedImageButton; -import org.mozilla.gecko.widget.ThemedLinearLayout; -import org.mozilla.gecko.widget.ThemedTextView; +import android.widget.ImageView; public class TabStripItemView extends ThemedLinearLayout implements Checkable { + @SuppressWarnings("unused") private static final String LOGTAG = "GeckoTabStripItem"; private static final int[] STATE_CHECKED = { @@ -36,6 +39,7 @@ public class TabStripItemView extends ThemedLinearLayout private int id = -1; private boolean checked; + private final ImageView faviconView; private final ThemedTextView titleView; private final ThemedImageButton closeView; @@ -44,6 +48,9 @@ public class TabStripItemView extends ThemedLinearLayout private final Region tabRegion; private final Region tabClipRegion; + private final int faviconSize; + private Bitmap lastFavicon; + public TabStripItemView(Context context) { this(context, null); } @@ -62,6 +69,8 @@ public class TabStripItemView extends ThemedLinearLayout tabPaint.setStrokeWidth(0.0f); tabPaint.setXfermode(new PorterDuffXfermode(Mode.DST_IN)); + faviconSize = getResources().getDimensionPixelSize(R.dimen.tab_strip_favicon_size); + LayoutInflater.from(context).inflate(R.layout.tab_strip_item_view, this); setOnClickListener(new View.OnClickListener() { @Override @@ -74,6 +83,7 @@ public class TabStripItemView extends ThemedLinearLayout } }); + faviconView = (ImageView) findViewById(R.id.favicon); titleView = (ThemedTextView) findViewById(R.id.title); closeView = (ThemedImageButton) findViewById(R.id.close); @@ -187,7 +197,25 @@ public class TabStripItemView extends ThemedLinearLayout } id = tab.getId(); + updateFavicon(tab.getFavicon()); titleView.setText(tab.getDisplayTitle()); setPrivateMode(tab.isPrivate()); } + + private void updateFavicon(final Bitmap favicon) { + if (favicon == null) { + lastFavicon = null; + faviconView.setImageResource(R.drawable.favicon_none); + return; + } else if (favicon == lastFavicon) { + return; + } + + // Cache the original so we can debounce without scaling. + lastFavicon = favicon; + + final Bitmap scaledFavicon = + Bitmap.createScaledBitmap(favicon, faviconSize, faviconSize, false); + faviconView.setImageBitmap(scaledFavicon); + } }