Bug 1397888: Display pin icon in top-left of top sites card if pinned. r=liuche draft
authorMichael Comella <michael.l.comella@gmail.com>
Wed, 13 Sep 2017 17:16:40 -0700
changeset 664988 b527cff1faf5a565d1cf309ce3063b8d23553150
parent 664987 66d7af40cd1270ebfbe3c3442b067ce1f1ff1fce
child 664989 e399ac698285c57c804d8ca3c20c8476f5fecd84
push id79891
push usermichael.l.comella@gmail.com
push dateThu, 14 Sep 2017 19:41:01 +0000
reviewersliuche
bugs1397888
milestone57.0a1
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
mobile/android/app/src/main/res/layout/activity_stream_topsites_card.xml
mobile/android/base/java/org/mozilla/gecko/activitystream/homepanel/topsites/TopSitesCard.java
--- 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());