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);
+ }
}