Bug 891953 - Part 1: Implement empty screen text and icon for reading list. r=sriram
authorChenxia Liu <liuche@mozilla.com>
Fri, 16 Aug 2013 01:33:04 -0700
changeset 143544 1b57558f86194acb700792ecfde7ab8035302139
parent 143543 5b87508c0148f4757207521d5ab9a41392618af8
child 143545 7b96d62ba83a19bcc871cff18d722667f4d17402
push id25130
push userlrocha@mozilla.com
push dateWed, 21 Aug 2013 09:41:27 +0000
treeherdermozilla-central@b2486721572e [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewerssriram
bugs891953
milestone26.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 891953 - Part 1: Implement empty screen text and icon for reading list. r=sriram
mobile/android/base/Makefile.in
mobile/android/base/home/ReadingListPage.java
mobile/android/base/locales/en-US/android_strings.dtd
mobile/android/base/resources/drawable-hdpi/icon_reading_list_empty.png
mobile/android/base/resources/drawable-mdpi/icon_reading_list_empty.png
mobile/android/base/resources/drawable-xhdpi/icon_reading_list_empty.png
mobile/android/base/resources/layout/home_reading_list_page.xml
mobile/android/base/strings.xml.in
--- a/mobile/android/base/Makefile.in
+++ b/mobile/android/base/Makefile.in
@@ -663,16 +663,17 @@ RES_DRAWABLE_MDPI = \
   res/drawable-mdpi/ic_url_bar_tab.png \
   res/drawable-mdpi/icon_last_tabs.png \
   res/drawable-mdpi/icon_last_tabs_empty.png \
   res/drawable-mdpi/icon_most_recent.png \
   res/drawable-mdpi/icon_most_recent_empty.png \
   res/drawable-mdpi/icon_most_visited.png \
   res/drawable-mdpi/icon_most_visited_empty.png \
   res/drawable-mdpi/icon_pageaction.png \
+  res/drawable-mdpi/icon_reading_list_empty.png \
   res/drawable-mdpi/progress_spinner.png \
   res/drawable-mdpi/tab_indicator_divider.9.png \
   res/drawable-mdpi/tab_indicator_selected.9.png \
   res/drawable-mdpi/tab_indicator_selected_focused.9.png \
   res/drawable-mdpi/spinner_default.9.png \
   res/drawable-mdpi/spinner_focused.9.png \
   res/drawable-mdpi/spinner_pressed.9.png \
   res/drawable-mdpi/tab_new.png \
@@ -773,16 +774,17 @@ RES_DRAWABLE_HDPI = \
   res/drawable-hdpi/ic_url_bar_tab.png \
   res/drawable-hdpi/icon_last_tabs.png \
   res/drawable-hdpi/icon_last_tabs_empty.png \
   res/drawable-hdpi/icon_most_recent.png \
   res/drawable-hdpi/icon_most_recent_empty.png \
   res/drawable-hdpi/icon_most_visited.png \
   res/drawable-hdpi/icon_most_visited_empty.png \
   res/drawable-hdpi/icon_pageaction.png \
+  res/drawable-hdpi/icon_reading_list_empty.png \
   res/drawable-hdpi/tab_indicator_divider.9.png \
   res/drawable-hdpi/tab_indicator_selected.9.png \
   res/drawable-hdpi/tab_indicator_selected_focused.9.png \
   res/drawable-hdpi/spinner_default.9.png \
   res/drawable-hdpi/spinner_focused.9.png \
   res/drawable-hdpi/spinner_pressed.9.png \
   res/drawable-hdpi/tab_new.png \
   res/drawable-hdpi/tab_new_pb.png \
@@ -870,16 +872,17 @@ RES_DRAWABLE_XHDPI = \
   res/drawable-xhdpi/ic_url_bar_tab.png \
   res/drawable-xhdpi/icon_last_tabs.png \
   res/drawable-xhdpi/icon_last_tabs_empty.png \
   res/drawable-xhdpi/icon_most_recent.png \
   res/drawable-xhdpi/icon_most_recent_empty.png \
   res/drawable-xhdpi/icon_most_visited.png \
   res/drawable-xhdpi/icon_most_visited_empty.png \
   res/drawable-xhdpi/icon_pageaction.png \
+  res/drawable-xhdpi/icon_reading_list_empty.png \
   res/drawable-xhdpi/spinner_default.9.png \
   res/drawable-xhdpi/spinner_focused.9.png \
   res/drawable-xhdpi/spinner_pressed.9.png \
   res/drawable-xhdpi/tab_new.png \
   res/drawable-xhdpi/tab_new_pb.png \
   res/drawable-xhdpi/tab_close.png \
   res/drawable-xhdpi/tab_thumbnail_default.png \
   res/drawable-xhdpi/tab_thumbnail_shadow.png \
--- a/mobile/android/base/home/ReadingListPage.java
+++ b/mobile/android/base/home/ReadingListPage.java
@@ -19,34 +19,43 @@ import android.content.res.Configuration
 import android.database.Cursor;
 import android.os.Bundle;
 import android.support.v4.app.LoaderManager.LoaderCallbacks;
 import android.support.v4.content.Loader;
 import android.support.v4.widget.CursorAdapter;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
+import android.view.ViewStub;
 import android.widget.AdapterView;
+import android.widget.ImageView;
 import android.widget.ListView;
+import android.widget.TextView;
 
 import java.util.EnumSet;
 
 /**
  * Fragment that displays reading list contents in a ListView.
  */
 public class ReadingListPage extends HomeFragment {
     // Cursor loader ID for reading list
     private static final int LOADER_ID_READING_LIST = 0;
 
     // Adapter for the list of reading list items
     private ReadingListAdapter mAdapter;
 
     // The view shown by the fragment
     private ListView mList;
 
+    // Reference to the View to display when there are no results.
+    private View mEmptyView;
+
+    // Reference to top view.
+    private View mTopView;
+
     // Callbacks used for the reading list and favicon cursor loaders
     private CursorLoaderCallbacks mCursorLoaderCallbacks;
 
     // On URL open listener
     private OnUrlOpenListener mUrlOpenListener;
 
     @Override
     public void onAttach(Activity activity) {
@@ -64,24 +73,26 @@ public class ReadingListPage extends Hom
     public void onDetach() {
         super.onDetach();
 
         mUrlOpenListener = null;
     }
 
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
-        mList = (HomeListView) inflater.inflate(R.layout.home_reading_list_page, container, false);
-        return mList;
+        return inflater.inflate(R.layout.home_reading_list_page, container, false);
     }
 
     @Override
     public void onViewCreated(View view, Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
 
+        mTopView = view;
+
+        mList = (ListView) view.findViewById(R.id.list);
         mList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
             @Override
             public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                 final Cursor c = mAdapter.getCursor();
                 if (c == null || !c.moveToPosition(position)) {
                     return;
                 }
 
@@ -95,16 +106,18 @@ public class ReadingListPage extends Hom
 
         registerForContextMenu(mList);
     }
 
     @Override
     public void onDestroyView() {
         super.onDestroyView();
         mList = null;
+        mTopView = null;
+        mEmptyView = null;
     }
 
     @Override
     public void onConfigurationChanged(Configuration newConfig) {
         super.onConfigurationChanged(newConfig);
 
         // Detach and reattach the fragment as the layout changes.
         if (isVisible()) {
@@ -127,16 +140,33 @@ public class ReadingListPage extends Hom
         loadIfVisible();
     }
 
     @Override
     protected void load() {
         getLoaderManager().initLoader(LOADER_ID_READING_LIST, null, mCursorLoaderCallbacks);
     }
 
+    private void updateUiFromCursor(Cursor c) {
+        // We delay setting the empty view until the cursor is actually empty.
+        // This avoids image flashing.
+        if ((c == null || c.getCount() == 0) && mEmptyView == null) {
+            final ViewStub emptyViewStub = (ViewStub) mTopView.findViewById(R.id.home_empty_view_stub);
+            mEmptyView = emptyViewStub.inflate();
+
+            final ImageView emptyIcon = (ImageView) mEmptyView.findViewById(R.id.home_empty_image);
+            emptyIcon.setImageResource(R.drawable.icon_reading_list_empty);
+
+            final TextView emptyText = (TextView) mEmptyView.findViewById(R.id.home_empty_text);
+            emptyText.setText(R.string.home_reading_list_empty);
+
+            mList.setEmptyView(mEmptyView);
+        }
+    }
+
     /**
      * Cursor loader for the list of reading list items.
      */
     private static class ReadingListLoader extends SimpleCursorLoader {
         public ReadingListLoader(Context context) {
             super(context);
         }
 
@@ -182,16 +212,18 @@ public class ReadingListPage extends Hom
         @Override
         public void onLoadFinished(Loader<Cursor> loader, Cursor c) {
             final int loaderId = loader.getId();
             switch(loaderId) {
                 case LOADER_ID_READING_LIST:
                     mAdapter.swapCursor(c);
                     break;
            }
+
+           updateUiFromCursor(c);
         }
 
         @Override
         public void onLoaderReset(Loader<Cursor> loader) {
             final int loaderId = loader.getId();
             switch(loaderId) {
                 case LOADER_ID_READING_LIST:
                     mAdapter.swapCursor(null);
--- a/mobile/android/base/locales/en-US/android_strings.dtd
+++ b/mobile/android/base/locales/en-US/android_strings.dtd
@@ -271,16 +271,17 @@ size. -->
 
 <!ENTITY home_history_title "History">
 <!ENTITY home_last_tabs_title "Tabs from last time">
 <!ENTITY home_last_tabs_open "Open all tabs from last time">
 <!ENTITY home_last_tabs_empty "Your recent tabs show up here.">
 <!ENTITY home_most_recent_title "Most recent">
 <!ENTITY home_most_recent_empty "Websites you visited most recently show up here.">
 <!ENTITY home_most_visited_title "Most visited">
+<!ENTITY home_reading_list_empty "Articles you save for later show up here.">
 <!ENTITY home_most_visited_empty "Websites you visit most frequently show up here.">
 <!ENTITY pin_bookmark_dialog_hint "Enter a search keyword">
 
 <!ENTITY filepicker_title "Choose File">
 <!ENTITY filepicker_audio_title "Choose or record a sound">
 <!ENTITY filepicker_image_title "Choose or take a picture">
 <!ENTITY filepicker_video_title "Choose or record a video">
 
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..b272b4bae2314e6fc7e6810304437ff3a353ba38
GIT binary patch
literal 1456
zc$`&Kc{G~|5Kj>zBxvIP;=ZrNqH)!dXxtm6D7wvowjPyF>(+IZ5QJWYbw`WWDlN6y
z)+(_PtNPGxyNb4wY#ps?lx?j>yR`51?fx+{znOXS<~Q%nObIcFfPibkArJ_{*9U)a
z$I^ENCcC5E7X5Y-&@^AXXK4D&%G_)J`V@e_*0>LaOT0CH-l)cVVWDU~8v5X=@?5+P
zIkiVMkA<5XHKo`)hO~FT=mXf@2P_>u`(2;k6}Y`w`>2_P0<h6bg4;|&SL5QATY5d8
z-k3D;W>uK%>gsB6$4>$&7Ao`f88|fE3>gfxVDaGRz*n$FTh3{W>7~H0b{lk;$6Aqq
zMxoW%JTk)Fh6L$JFIH_OHAM1^f}kQ!KH6$em|d9(M=Bogp++V|z};)GL9tvP7TScU
z^s`dpW;2Yx&?}<Ct4Oanit53bD`fANQPqd3qZd>zatkL*93xbsz!To*64Ayq=MCdn
ztuO$_X)r9iYReM(TuF2ohMp!xfuq@^%nmM<B~-={!hmgCp1vlE*3PXJRwn$E4nMNv
zd%k9c0#l)jM7lclL2g_>{l~edi#2%NDpE$|(7q*a*IFc5F`kH-%wmBY!&bHM^|{1=
zg^X|PN=}&-tPdLV&P6%zAGEh>^&qJPuvKhuAYgrnqndpCNq(XD*t^H!AaG{!Mr4z9
zl4G3^5`C_npY)-hZk`tc@YLjJ!27omr&EWA%$byO>GmNhtJYE)!%!ZC+|r+L*b<-#
zWKsKfDT-qPuXvtGg3`BUhk(LTkxU#VJ2PGyr(&@DJGc;xXv4x$d^@+?jCr+am@%j4
zo>VU)2-K@?KRSjocNi=b!~3Kss$6)%(^wOd&T^r`35}w_Kg^k2{td|bD1uYjz*ie6
z3IPf$s5%SfOS6+;T__-j;s>$_&+<x}_5^`I0MMlmT_3c!5VR11sb63Nxx560MFE<g
zW7?WTmZ92dc%kZqlTR7{TMY&dG(+;5v6K=vbX$WtbS&Ky+|=X~bfO131!Y39CG$YS
zkee9xf-&5Pl_l$Bgn*kU{`a;O*&Wyo#pNH0&~y)Qoa^?sL?||8?q?AqcLM+)J}&JM
zZ~5xEGr_WoWOutFk|$V{KVdvGrCIRMY)ZakHS8;aFU$Ich>Aa;x(O(CYZNqsJ4Dn8
z@+XJgCa+>83=x85>Lk9l+a;Jqu(3eq2sujYqv4<H0xfI9di5UVhejPvjJ=QnOT{Qe
zlnr4p`OBNp|GkAtlI8BOXu8nsIFOj}a;`0H3Ug51Wr|Tvluax4qe*qKrIQvnuh(Z_
z)yZ>m>r6v^Cs1AbxNB}i!|(@<A@>Asb~Co+AB8`O($#J7(`2N1gcA?k=oBXZmX>}|
za8P{Nfx%9{-(-Q;NMRKWp$W;7{I*kP*DO93nKNT*XQ?+LD{@G_461RbUjB6`7h6Q{
zmhpAoKj3d!)b#h@tei)Y@i_JUr?3FKl{g6UlKgfG=Kjhf-OH-D$-RCk$;2s>^`0lp
z&`3`iN0E~i`Q+-#3TMSTd|%%KxWVitnILnvnbL?rY%gn@iVqZINf?Of{pIR3MlIiJ
z#2s@-8|#m@VY9kA?$P$@Qd}lVyS*cHe&p-9h!yLS?Dxn(MLrCz4ZNhFYuIass}VVW
z)13Kf=1vw$CSNa?+e6D^!6+@N8gPn5o%M8qb#xp`%M4~Porl;uFYQc}_^-Z$J`WS0
zuQ@XPuHCe9{ce?ayX^tJGWK@nv;=#(-WIomvlfm98L4i;L`!}0Ox<U{8l46IA{P&9
zldq}3M5Fg$>iv@H$Jn=yXKtdN7--UK!#Bbel}DOe);PxsZIO@EIAnSZka@A2zn2We
wTLi~w%kB8~NKJYfZbV;H365f8fU$=d269GQsif0!=MzJGy@T-Ay-4~00?Xos+yDRo
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..941aa2b814473e16c76e045f88370075e041be60
GIT binary patch
literal 972
zc$@*u12g=IP)<h;3K|Lk000e1NJLTq003G5003GD1^@s6IH*Aa000A%Nkl<Zc-rmV
z-)mE69LMpmrCk!*ZFWwf#acJ&whNIl5b3P0Zn#BR8Kbo;s5reCilcLN5}1gQIz<fg
z*ANl9qMNpAHLlO!uzRolXS(-AB(ZRolk`04ImzeZ^*}Dqo5T4<&iB~T(vmbl%Lh<s
zg%*WYXleNX3a!vm5BvAU%U3ekjDc0wi??7Nq_7T~FyPr{WGX|q;d?xTi;+3xu^$;&
z9eOZ|JpO`fuxB`iHe(rwi@A9m!W*y<w&Efd;bLIiSZ3i8;uiW~0n#`P7c;ZQ;u7Wo
z`eDm-<9E0?N?vH-4$`oaPTYo5=;$4SmHY&!(0)8Z8huz)XupQ=16(tNzKfHdOd(g{
z3Le3QbOLv4Is4-RawVrD+Kyrrp?`rjP#d;lGQ>?(A;e+h9wyKOi%R9~HNWTmhW2kg
z&cFqD3>RPl-=YHsQ|RgjF%K8gAJ_zgDRgc6FauXb9x0eY*Kb3WM+Rrn4pZordmjq{
zC&ms~vxfc<d0dOoWqb+?um`TfL%a)X*3jLUhx6bcd;|+{0j^{pteHc91Lx5sEI==w
z<2u$fd+4K{L+4@tBZpyFvxgq>9Qwx)C&u<x2>rI_WAq0w4-ys{*n(d%9ij8s0aNG(
zP-szTg;r>VR%nHOO&@;7bcAx)rqE?w9{)U8M884<SvZf5D|CY%Dk(HD>N)h3LIXW0
zdJMf?q02tQ4CW$qAK&S!Lljz}6<VPcTA^h%LZ`6@V-Xrbw?db-;|81u_tCA;z%DqC
z4l6Wp#B=EL3ay7q4GsOC=Xd;u6}oKH!w8B+Ok#~fzpeva5lZPgS`=EL6<VPcx&=f3
zhL1}IF|-1^kgZ}bc3>dFtB(w}U^|BJ6|xn+tZRG9U7jR;UdMA3@HO77alYM7oWiUI
zqts>r2hm>TdVU-aHGyX3t_JMg8*o#jexg-awr8)yY}`lv+)HTe30TQAT#OaVqs)@$
zF*5iBF6OQo%SIFv8vAqP;9_prSPa7njXjCK;bLkLN0-l!?!{hYSIGztVhS^GA>6Lv
zb?56ijtT5X*0V3rUpYTIu6l8#${xE=CGZXGLnkakbxlN%yEG2tDO^Z@Vkhhsg${2c
z?u3YZ1}T_A*RK<o-~t?g!4!JsQYgSJGX_)WXsyKqxRP@)h4y1N9Om$jLi<&~7)+u4
u8blYY!So3yeJg88p+%t;S`=ELTiSnx+m)>@;GQ7>0000<MNUMnLSTZtJhp`Z
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..92f86751139f951915ba63028cb87bdeea25566f
GIT binary patch
literal 2109
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
--- a/mobile/android/base/resources/layout/home_reading_list_page.xml
+++ b/mobile/android/base/resources/layout/home_reading_list_page.xml
@@ -1,9 +1,20 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!-- This Source Code Form is subject to the terms of the Mozilla Public
    - 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/. -->
 
-<org.mozilla.gecko.home.HomeListView xmlns:android="http://schemas.android.com/apk/res/android"
-                                     style="@style/Widget.ReadingListView"
-                                     android:layout_width="fill_parent"
-                                     android:layout_height="fill_parent"/>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:layout_width="fill_parent"
+              android:layout_height="fill_parent"
+              android:orientation="vertical">
+
+    <ViewStub android:id="@+id/home_empty_view_stub"
+              android:layout="@layout/home_empty_page"
+              android:layout_width="fill_parent"
+              android:layout_height="fill_parent"/>
+
+    <org.mozilla.gecko.home.HomeListView android:id="@+id/list"
+                                         style="@style/Widget.ReadingListView"
+                                         android:layout_width="fill_parent"
+                                         android:layout_height="wrap_content"/>
+</LinearLayout>
--- a/mobile/android/base/strings.xml.in
+++ b/mobile/android/base/strings.xml.in
@@ -254,16 +254,17 @@
   <string name="home_history_title">&home_history_title;</string>
   <string name="home_last_tabs_title">&home_last_tabs_title;</string>
   <string name="home_last_tabs_open">&home_last_tabs_open;</string>
   <string name="home_last_tabs_empty">&home_last_tabs_empty;</string>
   <string name="home_most_recent_title">&home_most_recent_title;</string>
   <string name="home_most_recent_empty">&home_most_recent_empty;</string>
   <string name="home_most_visited_title">&home_most_visited_title;</string>
   <string name="home_most_visited_empty">&home_most_visited_empty;</string>
+  <string name="home_reading_list_empty">&home_reading_list_empty;</string>
   <string name="pin_bookmark_dialog_hint">&pin_bookmark_dialog_hint;</string>
 
   <string name="filepicker_title">&filepicker_title;</string>
   <string name="filepicker_audio_title">&filepicker_audio_title;</string>
   <string name="filepicker_image_title">&filepicker_image_title;</string>
   <string name="filepicker_video_title">&filepicker_video_title;</string>
 
   <!-- Default bookmarks. Use bookmarks titles shared with XUL from mobile's