Bug 1234328 - Add readercache icon to TwoLinePageRow r?sebastian draft
authorAndrzej Hunt <ahunt@mozilla.com>
Fri, 04 Mar 2016 15:51:59 -0800
changeset 341812 a8a150a4d0f9a6cb67b885bed2c3ea8599100e5c
parent 341753 d7a41637e723101ad664d444de95b5c02a3468c1
child 341813 878bfb63debd0be91f2ffd802798378e26e099a0
push id13300
push userahunt@mozilla.com
push dateThu, 17 Mar 2016 21:46:59 +0000
reviewerssebastian
bugs1234328
milestone48.0a1
Bug 1234328 - Add readercache icon to TwoLinePageRow r?sebastian This means we can see the readercache availability not only inside bookmarks, but also in most other parts of the awesomescreen, since we use TwoLinePageRow for most items (history, bookmarks, topsites, search results etc). MozReview-Commit-ID: 8SxE8VabIK9
mobile/android/base/java/org/mozilla/gecko/home/TwoLinePageRow.java
mobile/android/base/resources/drawable-hdpi/ic_downloaded.png
mobile/android/base/resources/drawable-xhdpi/ic_downloaded.png
mobile/android/base/resources/drawable-xxhdpi/ic_downloaded.png
mobile/android/base/resources/layout/two_line_page_row.xml
--- a/mobile/android/base/java/org/mozilla/gecko/home/TwoLinePageRow.java
+++ b/mobile/android/base/java/org/mozilla/gecko/home/TwoLinePageRow.java
@@ -3,17 +3,19 @@
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 package org.mozilla.gecko.home;
 
 import java.lang.ref.WeakReference;
 
 import org.mozilla.gecko.AboutPages;
+import org.mozilla.gecko.GeckoProfile;
 import org.mozilla.gecko.R;
+import org.mozilla.gecko.reader.ReaderCacheHelper;
 import org.mozilla.gecko.reader.ReaderModeUtils;
 import org.mozilla.gecko.Tab;
 import org.mozilla.gecko.Tabs;
 import org.mozilla.gecko.db.BrowserContract.Combined;
 import org.mozilla.gecko.db.BrowserContract.URLColumns;
 import org.mozilla.gecko.favicons.Favicons;
 import org.mozilla.gecko.favicons.OnFaviconLoadedListener;
 import org.mozilla.gecko.widget.FaviconView;
@@ -21,31 +23,33 @@ import org.mozilla.gecko.widget.FaviconV
 import android.content.Context;
 import android.database.Cursor;
 import android.graphics.Bitmap;
 import android.text.TextUtils;
 import android.util.AttributeSet;
 import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.widget.ImageView;
+import android.view.View;
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
 public class TwoLinePageRow extends LinearLayout
                             implements Tabs.OnTabsChangedListener {
 
     protected static final int NO_ICON = 0;
 
     private final TextView mTitle;
     private final TextView mUrl;
     private final ImageView mStatusIcon;
 
     private int mSwitchToTabIconId;
 
     private final FaviconView mFavicon;
+    private final View mCached;
 
     private boolean mShowIcons;
     private int mLoadFaviconJobId = Favicons.NOT_LOADING;
 
     // Only holds a reference to the FaviconView itself, so if the row gets
     // discarded while a task is outstanding, we'll leak less memory.
     private static class UpdateViewFaviconLoadedListener implements OnFaviconLoadedListener {
         private final WeakReference<FaviconView> view;
@@ -98,16 +102,18 @@ public class TwoLinePageRow extends Line
         mUrl = (TextView) findViewById(R.id.url);
         mStatusIcon = (ImageView) findViewById(R.id.status_icon_bookmark);
 
         mSwitchToTabIconId = NO_ICON;
         mShowIcons = true;
 
         mFavicon = (FaviconView) findViewById(R.id.icon);
         mFaviconListener = new UpdateViewFaviconLoadedListener(mFavicon);
+
+        mCached = findViewById(R.id.iscached);
     }
 
     @Override
     protected void onAttachedToWindow() {
         super.onAttachedToWindow();
 
         Tabs.registerOnTabsChangedListener(this);
     }
@@ -219,20 +225,20 @@ public class TwoLinePageRow extends Line
      * Update the data displayed by this row.
      * <p>
      * This method must be invoked on the UI thread.
      *
      * @param title to display.
      * @param url to display.
      */
     public void update(String title, String url) {
-        update(title, url, 0);
+        update(title, url, 0, false);
     }
 
-    protected void update(String title, String url, long bookmarkId) {
+    protected void update(String title, String url, long bookmarkId, boolean hasCacheItem) {
         if (mShowIcons) {
             // The bookmark id will be 0 (null in database) when the url
             // is not a bookmark.
             final boolean isBookmark = bookmarkId != 0;
             showBookmarkIcon(isBookmark);
         } else {
             showBookmarkIcon(false);
         }
@@ -252,16 +258,18 @@ public class TwoLinePageRow extends Line
 
         // Displayed RecentTabsPanel URLs may refer to pages opened in reader mode, so we
         // remove the about:reader prefix to ensure the Favicon loads properly.
         final String pageURL = AboutPages.isAboutReader(url) ?
             ReaderModeUtils.getUrlFromAboutReader(url) : url;
         mLoadFaviconJobId = Favicons.getSizedFaviconForPageFromLocal(getContext(), pageURL, mFaviconListener);
 
         updateDisplayedUrl(url);
+
+        mCached.setVisibility(hasCacheItem ? View.VISIBLE : View.INVISIBLE);
     }
 
     /**
      * Update the data displayed by this row.
      * <p>
      * This method must be invoked on the UI thread.
      *
      * @param cursor to extract data from.
@@ -280,11 +288,14 @@ public class TwoLinePageRow extends Line
         final long bookmarkId;
         final int bookmarkIdIndex = cursor.getColumnIndex(Combined.BOOKMARK_ID);
         if (bookmarkIdIndex != -1) {
             bookmarkId = cursor.getLong(bookmarkIdIndex);
         } else {
             bookmarkId = 0;
         }
 
-        update(title, url, bookmarkId);
+        ReaderCacheHelper rch = GeckoProfile.get(getContext()).getReaderCacheHelper();
+        final boolean hasCacheItem = rch.isUrlCached(url);
+
+        update(title, url, bookmarkId, hasCacheItem);
     }
 }
new file mode 100644
index 0000000000000000000000000000000000000000..34139ebc62a18f32470608a160feb219efa5dd7d
GIT binary patch
literal 598
zc$@)N0;&CpP)<h;3K|Lk000e1NJLTq000yK000^Y1^@s6w}X6r00001b5ch_0Itp)
z=>Px%5J^NqR7ef&R6S@EK^T4C+$HLI*hoM@35ix(YAZspv$2sF1wk|#ECdBBu~AU0
z?BYh!BuyZlbs(ZxY9k0i%*h#%AP5>Shhf(nzc=gtxOaPd*a?2HJKy)d_ulNz?2e!;
z=GS+k*_v>)nzw-Sdp3JXs=b=7*V??M<GtVckdF6VUT`x7cnVuXlPI!zjOE61!<?Y3
z{Fe-8K6z!YQ`paFqgQ@Zzm4{f4NTV;@zj>@eC$jvHPq5W!(h5`1lHcss{+{5SgFrz
zUcR>Etkmb6hFW^~jY9@I+N*%PjVFc01pN1YQWquUSe#AU>M`K08C)3oitXD@sA(f<
zT004U^<h%y6ZXhSLbdd`IP_f-Y<BG+g5bFl_a>OgU7e@~+rI8FF*=EDD#xu?#FKRl
z4jjX!{qI<(hO8bp4kP^eOhvm{x)6NSSKHT-N5B_UE5~tp_)SF48xrLvAzapMS4=7x
zH-PFGt`5J-_B(fzgbGeVq?IN9k+Vlm&WxN+L!ws>ywJrsrP&tCTx_`>IbEW=A&FC?
zOE6|!voNCz9mZZk6dO`7HS$EC=8P^i57j12W!zx}X8ps9pKIXtKf0|z`lt9Gj=}~v
zV5R@#i;iLgROJCCM_;o{#qHph*81&P;{6Bdq0^kBDD&Bf{z`ux-(qF@gyP+Vv|j2-
kl43Ed=O_WZ!G)Oe3+%C`L%nNmj{pDw07*qoM6N<$g3>b__5c6?
new file mode 100644
index 0000000000000000000000000000000000000000..7a690ef0bd085eb5e2f233f823831a8a5ab10bfb
GIT binary patch
literal 688
zc$@*S0#E&kP)<h;3K|Lk000e1NJLTq000;O001Be1^@s62wu2200001b5ch_0Itp)
z=>Px%YDq*vR7ef&RxxN4K@@$ncZQ^h2&S;HxD6Ke7FLQxG>t_9+IR|rVD1i4P>4-B
zL4yifBzs9?h!G)`U?YNv+FDu&F}qe`p(3U*NN&gXH<{br+uNHZXk|VuGxO&C_vine
znO%jV=J^juZEVqJP;;*oadnE2wm1!FU5cJKkk!3-01-Eq>>DhnEgm38zy|LGuvG~E
zyhP<_3A26!3RNim2ouAz)@Ah~G*|1;>KrtdP<Lm_@K$edZ{H#SK8NA?13X0cdTHd&
zdHywo`mPAks1=kPMw?7IXcD~OQVJ_F5FhbPnhq~JEX#Bf+w5x(O~0DObC8HjpNy$_
z2eskbP%2##trfFeK=adh#-|eyj&Q{%X`)$o?`-a(ntPouc`i90-8s7T1kGSHg(n9x
zC!Ef!L$pMb7Dv_Eq1YnHXOkMF{NiRF<;#1W!X0%KA)fPv4y16U9%G_%o>d72j|0f)
zl`i9hzs!`!WY{)^HDZJ9v2?m&z*8J_Pve-{Fx+$iL6>zOz6Q^@vJ-|>tW_^CR5^t+
z>UWZ#J;_2S^^Y;dw@G5pzHr5-LtK2a85pIdZ@aPf<0VUT$Ut3Ng?AX-GlJ^gpWWuO
z85ov0?CLwoCA>FKrj<G2<cJGDKLexoFxZFn@C`FLV4$c~SV6yY1Q#k_Qh3K8KLbM)
z0SCu9{AeI9YbC-g;=;FQU{vQm523X_$*Uz~S*CGu|93OB)Bfibh<B0a-()T1^BMoa
zZLc^R+?!L;cZUA)IncQJ7sO>rWqyX+KgMx@?XA}86$enb&l|L5^{^9IA}zoAk^KQ^
Wq_->WzPNb+0000<MNUMnLSTZABsPx#
new file mode 100644
index 0000000000000000000000000000000000000000..4821f1743679281fe48f9c50c4c8c3cf2e5028d0
GIT binary patch
literal 994
zc$@*^10DQ{P)<h;3K|Lk000e1NJLTq001Na001xu1^@s6c}Lh400001b5ch_0Itp)
z=>Px&oJmAMR9Fe^Sv_bJQ4s##=EnmI8yhuZve$@R3M~W$@rM)<0)i1WsKJE07>HI9
z6e1{yHvSa3JCk6D2#OJjg@RfLcG@XeD0dr85Vf(8V2rta&g|y0yT`u0+gx&KcHpw_
z&3yCCck_1N?p_2cvBBIfN*@KJZqtYy9Z#Z1e`C+X|JA~$crr#EG3>X5k#Ff%p`b!%
z+yeZ3?s)LHLP5dgONmB;N_8#jP}HGP9Viu#&Y@Brs$B%6a$Pj;fW#Nn)%T;TVR|vP
z5`&@X2F(Ax28ad-j3J?qa2b2aQpNzJyh9(lS<2%Ce2tN>8&^Vy#hIDhVAYT~N;P-G
zl*346FL6vm+USEctqD6UlZa#P-%Dh^tuMHi?Z}*F{uQl6+`}m`09qxD#9Z_Q3KNNK
zFlS#NlU-MEReWSF=45U^ljtQu_}~|_d{Q<ek7pSBzE+7TH^3as#hfY=GOHmLJ3;X&
z6^8sfF*7rPyGASk6CC1P=3p+B2~1;6tWQJdrYY27AB6a!!crIaVpcvvM%F1YssQJ3
zE_0|%;3sM*PFn1%tULaRL>-_@@RurwTHT7gagUDWZ>Eg3b6S<WT(ef}2Wud6$h-9S
zv>&w4=eIgpw$qg`OrnGuvk+lSdUA-ik#;4PYjI7ky<m<Yb|m$;sL>8mr~VWGKF3o?
z8Ml1=UKeAe+39t<XH<i0aZQ)`f77(lLSz%P?)5Hg(NMbznEgf0g=tWXAOdrcHErl=
zd|sUIFNjg8>><j0NXt`GoK(?Vh`hCo$@pVG9`BO55u6~<NmrkAyDJ(q7jr7aFt=I|
zM-%!OeVa2pTox0u*XC5S1q<T5WIP3-omW$o8DWk@e6SR{v>;|kHeIKsyIhJ)8P~)W
zi$e);0_v06!8oII_6AIxbsS}kG~A@loGSxqLBa{LHaml#n@*QiK!{-^n!3YW7~ur5
z3cekrbN6YFIua;K-~pY$$4HDBh${+~cMiFexWHDug9<%$yFFu$*_cpbm?OL(&e|j9
zv8CxS?I}-q>M<e4tr%mLVBwd{UBp^G;{q*T54ouu;x>|vd_^wbX6mjNjiU}k9f&$m
zg${T(#?)jpJxh<%4NI>=ZGN`?2vOgL#OBY1dPTPmlint(B!(66JHDKwpJW_!1ljLe
z+nrF=MmyY<96@gHDvljN_6_mfDroV%C^~{HC0ZYyY5Xsy>X>~}dtM;^1I<nkw0<F#
QEC2ui07*qoM6N<$g7`JS_W%F@
--- a/mobile/android/base/resources/layout/two_line_page_row.xml
+++ b/mobile/android/base/resources/layout/two_line_page_row.xml
@@ -43,9 +43,16 @@
 
     <ImageView android:id="@+id/status_icon_bookmark"
                android:layout_width="20dp"
                android:layout_height="20dp"
                android:layout_gravity="center"
                android:visibility="gone"
                android:src="@drawable/star_blue"/>
 
+    <ImageView android:id="@+id/iscached"
+               android:layout_width="wrap_content"
+               android:layout_height="wrap_content"
+               android:layout_gravity="center_vertical"
+               android:src="@drawable/ic_downloaded"
+               android:padding="16dp"/>
+
 </merge>