Bug 1397888: Display pin icon in top-left of top sites card if pinned. r=liuche
I don't scale the pin size/margins based on the dynamic tile size. This could
mean we get into situations where the pin crowds out the top site tile but I
don't know if this would happen in practice.
MozReview-Commit-ID: Ct8EP3dPr6N
--- a/mobile/android/app/src/main/res/layout/activity_stream_topsites_card.xml
+++ b/mobile/android/app/src/main/res/layout/activity_stream_topsites_card.xml
@@ -8,16 +8,27 @@
<org.mozilla.gecko.widget.FaviconView
android:id="@+id/favicon"
style="@style/ActivityStreamFaviconView"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:background="@drawable/favicon_globe"/>
+ <!-- Visibility is dynamically set based on pinned state. -->
+ <ImageView
+ android:id="@+id/pin_icon"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="top|start"
+ android:layout_margin="3dp"
+ android:src="@drawable/topsite_pin"
+ android:visibility="gone"
+ android:importantForAccessibility="no"/>
+
<!-- scrollHorizontally=false allows drags on the TextView to scroll the ViewPager.
See https://stackoverflow.com/a/18171834/2219998 -->
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#66000000"
android:padding="5dp"
--- a/mobile/android/base/java/org/mozilla/gecko/activitystream/homepanel/topsites/TopSitesCard.java
+++ b/mobile/android/base/java/org/mozilla/gecko/activitystream/homepanel/topsites/TopSitesCard.java
@@ -8,16 +8,17 @@ import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.support.annotation.UiThread;
import android.support.v4.widget.TextViewCompat;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.view.View;
import android.widget.FrameLayout;
+import android.widget.ImageView;
import android.widget.TextView;
import org.mozilla.gecko.R;
import org.mozilla.gecko.Telemetry;
import org.mozilla.gecko.TelemetryContract;
import org.mozilla.gecko.activitystream.ActivityStreamTelemetry;
import org.mozilla.gecko.activitystream.homepanel.menu.ActivityStreamContextMenu;
import org.mozilla.gecko.activitystream.homepanel.model.TopSite;
import org.mozilla.gecko.db.BrowserDB;
@@ -37,30 +38,31 @@ import java.net.URISyntaxException;
import java.util.UUID;
import java.util.concurrent.Future;
/* package-local */ class TopSitesCard extends RecyclerView.ViewHolder
implements IconCallback {
private final FaviconView faviconView;
private final TextView title;
+ private final ImageView pinIconView;
private Future<IconResponse> ongoingIconLoad;
private TopSite topSite;
private int absolutePosition;
private final HomePager.OnUrlOpenListener onUrlOpenListener;
private final HomePager.OnUrlOpenInBackgroundListener onUrlOpenInBackgroundListener;
/* package-local */ TopSitesCard(final FrameLayout card, final HomePager.OnUrlOpenListener onUrlOpenListener, final HomePager.OnUrlOpenInBackgroundListener onUrlOpenInBackgroundListener) {
super(card);
faviconView = (FaviconView) card.findViewById(R.id.favicon);
-
title = (TextView) card.findViewById(R.id.title);
+ pinIconView = (ImageView) card.findViewById(R.id.pin_icon);
this.onUrlOpenListener = onUrlOpenListener;
this.onUrlOpenInBackgroundListener = onUrlOpenInBackgroundListener;
card.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
ActivityStreamTelemetry.Extras.Builder extras = ActivityStreamTelemetry.Extras.builder()
@@ -106,16 +108,18 @@ import java.util.concurrent.Future;
ongoingIconLoad = Icons.with(itemView.getContext())
.pageUrl(topSite.getUrl())
.skipNetwork()
.forActivityStream()
.build()
.execute(this);
}
+ pinIconView.setVisibility(topSite.isPinned() ? View.VISIBLE : View.GONE);
+
setTopSiteTitle(topSite);
}
private void setTopSiteTitle(final TopSite topSite) {
URI topSiteURI = null; // not final so we can use in the Exception case.
boolean isInvalidURI = false;
try {
topSiteURI = new URI(topSite.getUrl());