Bug 895866 - Implement empty screen state for 'history'. r=sriram
☠☠ backed out by bcda9a677aec ☠ ☠
authorChenxia Liu <liuche@mozilla.com>
Tue, 06 Aug 2013 17:03:04 -0700
changeset 143501 e979b2ee0d42b888050a4793d5501ac31493cef2
parent 143500 847f396b0dded3e3f807f050985fbe74ff8897b9
child 143502 bcda9a677aec73fb6c733acbda717caf345a5c83
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
bugs895866
milestone25.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 895866 - Implement empty screen state for 'history'. r=sriram
mobile/android/base/Makefile.in
mobile/android/base/home/MostRecentPage.java
mobile/android/base/home/MostVisitedPage.java
mobile/android/base/locales/en-US/android_strings.dtd
mobile/android/base/resources/drawable-hdpi/icon_most_recent_empty.png
mobile/android/base/resources/drawable-mdpi/icon_most_recent_empty.png
mobile/android/base/resources/drawable-xhdpi/icon_most_recent_empty.png
mobile/android/base/resources/layout/home_list_with_title.xml
mobile/android/base/resources/values-v16/styles.xml
mobile/android/base/resources/values/styles.xml
mobile/android/base/strings.xml.in
--- a/mobile/android/base/Makefile.in
+++ b/mobile/android/base/Makefile.in
@@ -632,16 +632,17 @@ RES_DRAWABLE_MDPI = \
   res/drawable-mdpi/ic_menu_new_tab.png \
   res/drawable-mdpi/ic_menu_reload.png \
   res/drawable-mdpi/ic_status_logo.png \
   res/drawable-mdpi/ic_url_bar_go.png \
   res/drawable-mdpi/ic_url_bar_reader.png \
   res/drawable-mdpi/ic_url_bar_search.png \
   res/drawable-mdpi/ic_url_bar_star.png \
   res/drawable-mdpi/ic_url_bar_tab.png \
+  res/drawable-mdpi/icon_most_recent_empty.png \
   res/drawable-mdpi/icon_last_tabs.png \
   res/drawable-mdpi/icon_most_recent.png \
   res/drawable-mdpi/icon_most_visited.png \
   res/drawable-mdpi/icon_pageaction.png \
   res/drawable-mdpi/progress_spinner_1.png \
   res/drawable-mdpi/progress_spinner_2.png \
   res/drawable-mdpi/progress_spinner_3.png \
   res/drawable-mdpi/progress_spinner_4.png \
@@ -748,16 +749,17 @@ RES_DRAWABLE_HDPI = \
   res/drawable-hdpi/ic_menu_new_tab.png \
   res/drawable-hdpi/ic_menu_reload.png \
   res/drawable-hdpi/ic_status_logo.png \
   res/drawable-hdpi/ic_url_bar_go.png \
   res/drawable-hdpi/ic_url_bar_reader.png \
   res/drawable-hdpi/ic_url_bar_search.png \
   res/drawable-hdpi/ic_url_bar_star.png \
   res/drawable-hdpi/ic_url_bar_tab.png \
+  res/drawable-hdpi/icon_most_recent_empty.png \
   res/drawable-hdpi/icon_last_tabs.png \
   res/drawable-hdpi/icon_most_recent.png \
   res/drawable-hdpi/icon_most_visited.png \
   res/drawable-hdpi/icon_pageaction.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 \
@@ -840,16 +842,17 @@ RES_DRAWABLE_XHDPI = \
   res/drawable-xhdpi/ic_menu_new_tab.png \
   res/drawable-xhdpi/ic_menu_reload.png \
   res/drawable-xhdpi/ic_status_logo.png \
   res/drawable-xhdpi/ic_url_bar_go.png \
   res/drawable-xhdpi/ic_url_bar_reader.png \
   res/drawable-xhdpi/ic_url_bar_search.png \
   res/drawable-xhdpi/ic_url_bar_star.png \
   res/drawable-xhdpi/ic_url_bar_tab.png \
+  res/drawable-xhdpi/icon_most_recent_empty.png \
   res/drawable-xhdpi/icon_last_tabs.png \
   res/drawable-xhdpi/icon_most_recent.png \
   res/drawable-xhdpi/icon_most_visited.png \
   res/drawable-xhdpi/icon_pageaction.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 \
--- a/mobile/android/base/home/MostRecentPage.java
+++ b/mobile/android/base/home/MostRecentPage.java
@@ -19,16 +19,17 @@ import android.os.Bundle;
 import android.support.v4.app.LoaderManager;
 import android.support.v4.content.Loader;
 import android.support.v4.widget.SimpleCursorAdapter;
 import android.util.SparseArray;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.LayoutInflater;
 import android.widget.AdapterView;
+import android.widget.ImageView;
 import android.widget.ListView;
 import android.widget.TextView;
 
 import java.util.Date;
 
 /**
  * Fragment that displays recent history in a ListView.
  */
@@ -40,16 +41,18 @@ public class MostRecentPage extends Home
     private static final int LOADER_ID_HISTORY = 0;
 
     // Adapter for the list of search results
     private MostRecentAdapter mAdapter;
 
     // The view shown by the fragment.
     private ListView mList;
 
+    private View emptyView;
+
     // Callbacks used for the search and favicon cursor loaders
     private CursorLoaderCallbacks mCursorLoaderCallbacks;
 
     // On URL open listener
     private OnUrlOpenListener mUrlOpenListener;
 
     public static MostRecentPage newInstance() {
         return new MostRecentPage();
@@ -98,16 +101,24 @@ public class MostRecentPage extends Home
                     return;
                 }
 
                 final String url = c.getString(c.getColumnIndexOrThrow(URLColumns.URL));
                 mUrlOpenListener.onUrlOpen(url);
             }
         });
 
+        // Set empty page view.
+        if (emptyView == null) {
+            emptyView = view.findViewById(R.id.home_empty_view);
+            ((ImageView) emptyView.findViewById(R.id.home_empty_image)).setImageResource(R.drawable.icon_most_recent_empty);
+            ((TextView) emptyView.findViewById(R.id.home_empty_text)).setText(R.string.home_most_recent_empty);
+            mList.setEmptyView(emptyView);
+        }
+
         registerForContextMenu(mList);
     }
 
     @Override
     public void onDestroyView() {
         super.onDestroyView();
         mList = null;
     }
--- a/mobile/android/base/home/MostVisitedPage.java
+++ b/mobile/android/base/home/MostVisitedPage.java
@@ -36,19 +36,16 @@ public class MostVisitedPage extends Hom
     private static final int LOADER_ID_FRECENCY = 0;
 
     // Adapter for the list of search results
     private VisitedAdapter mAdapter;
 
     // The view shown by the fragment.
     private ListView mList;
 
-    // Empty message view
-    private View mEmptyMessage;
-
     // Callbacks used for the search and favicon cursor loaders
     private CursorLoaderCallbacks mCursorLoaderCallbacks;
 
     // On URL open listener
     private OnUrlOpenListener mUrlOpenListener;
 
     public static MostVisitedPage newInstance() {
         return new MostVisitedPage();
@@ -82,17 +79,16 @@ public class MostVisitedPage extends Hom
         return inflater.inflate(R.layout.home_most_visited_page, container, false);
     }
 
     @Override
     public void onViewCreated(View view, Bundle savedInstanceState) {
         final TextView title = (TextView) view.findViewById(R.id.title);
         title.setText(R.string.home_most_visited_title);
 
-        mEmptyMessage = view.findViewById(R.id.empty_message);
         mList = (HomeListView) 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;
@@ -105,17 +101,16 @@ public class MostVisitedPage extends Hom
 
         registerForContextMenu(mList);
     }
 
     @Override
     public void onDestroyView() {
         super.onDestroyView();
         mList = null;
-        mEmptyMessage = null;
     }
 
     @Override
     public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
 
         final Activity activity = getActivity();
 
@@ -177,20 +172,16 @@ public class MostVisitedPage extends Hom
             } else {
                 return super.onCreateLoader(id, args);
             }
         }
 
         @Override
         public void onLoadFinished(Loader<Cursor> loader, Cursor c) {
             if (loader.getId() == LOADER_ID_FRECENCY) {
-                // Only set empty view once cursor is loaded to avoid
-                // flashing the empty message before loading.
-                mList.setEmptyView(mEmptyMessage);
-
                 mAdapter.swapCursor(c);
                 loadFavicons(c);
             } else {
                 super.onLoadFinished(loader, c);
             }
         }
 
         @Override
--- a/mobile/android/base/locales/en-US/android_strings.dtd
+++ b/mobile/android/base/locales/en-US/android_strings.dtd
@@ -260,18 +260,18 @@ size. -->
 <!ENTITY button_clear_data "Clear data">
 <!ENTITY button_set "Set">
 <!ENTITY button_clear "Clear">
 
 <!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_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_visited_empty "Websites you visited go 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">
 
 <!-- Site identity popup -->
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..3259ebcb9e913af3c3f1816bc018dcc804076b68
GIT binary patch
literal 2335
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
FV1iQGHz5E3
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..918a0546298bc8532630426c6188d7f65d0d8ae0
GIT binary patch
literal 1599
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
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..cc0361c13c1bed9577be2f0a7f25659b9fac51e3
GIT binary patch
literal 3234
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
URZ0DwGXMYp07*qoM6N<$g2)r)G5`Po
--- a/mobile/android/base/resources/layout/home_list_with_title.xml
+++ b/mobile/android/base/resources/layout/home_list_with_title.xml
@@ -1,21 +1,37 @@
 <?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/. -->
 
 <merge xmlns:android="http://schemas.android.com/apk/res/android">
 
-    <TextView android:id="@+id/empty_message"
-              style="@style/Widget.Home.EmptyMessage"
-              android:layout_width="fill_parent"
-              android:layout_height="fill_parent"
-              android:text="@string/home_visited_empty"
-              android:visibility="gone"/>
+    <LinearLayout android:id="@+id/home_empty_view"
+                  android:layout_width="fill_parent"
+                  android:layout_height="fill_parent"
+                  android:orientation="vertical"
+                  android:gravity="center"
+                  android:paddingLeft="50dp"
+                  android:paddingRight="50dp"
+                  android:visibility="gone">
+
+        <ImageView android:id="@+id/home_empty_image"
+                   android:layout_width="wrap_content"
+                   android:layout_height="wrap_content"
+                   android:paddingBottom="15dp"
+                   android:scaleType="fitXY"/>
+
+        <TextView android:id="@+id/home_empty_text"
+                  android:layout_width="fill_parent"
+                  android:layout_height="wrap_content"
+                  android:gravity="center"
+                  android:textAppearance="@style/TextAppearance.EmptyMessage"/>
+
+    </LinearLayout>
 
     <TextView android:id="@+id/title"
               style="@style/Widget.Home.PageTitle"/>
 
     <org.mozilla.gecko.home.HomeListView
             android:id="@+id/list"
             android:layout_width="fill_parent"
             android:layout_height="0dp"
--- a/mobile/android/base/resources/values-v16/styles.xml
+++ b/mobile/android/base/resources/values-v16/styles.xml
@@ -1,15 +1,19 @@
 <?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/. -->
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android">
 
+    <style name="TextAppearance.EmptyMessage" parent="TextAppearance.Large">
+        <item name="android:fontFamily">sans-serif-light</item>
+    </style>
+
     <style name="TextAppearance.Widget.TwoLinePageRow.Title" parent="TextAppearance.Medium">
         <item name="android:fontFamily">sans-serif-light</item>
     </style>
 
     <style name="TextAppearance.Widget.Home.PageTitle" parent="TextAppearance.Medium">
         <item name="android:fontFamily">sans-serif-light</item>
     </style>
 
--- a/mobile/android/base/resources/values/styles.xml
+++ b/mobile/android/base/resources/values/styles.xml
@@ -161,24 +161,16 @@
         <item name="android:textAppearance">@style/TextAppearance.Widget.Home.Header</item>
         <item name="android:background">#fff5f7f9</item>
         <item name="android:focusable">false</item>
         <item name="android:gravity">center|left</item>
         <item name="android:paddingLeft">10dip</item>
         <item name="android:paddingRight">10dip</item>
     </style>
 
-    <style name="Widget.Home.EmptyMessage">
-        <item name="android:textAppearance">@style/TextAppearance.Widget.Home.PageTitle</item>
-        <item name="android:gravity">center</item>
-        <item name="android:focusable">false</item>
-        <item name="android:paddingLeft">10dip</item>
-        <item name="android:paddingRight">10dip</item>
-    </style>
-
     <style name="Widget.Home.PageButton">
         <item name="android:layout_width">fill_parent</item>
         <item name="android:layout_height">40dip</item>
         <item name="android:textAppearance">@style/TextAppearance.Widget.Home.PageTitle</item>
         <item name="android:background">@drawable/action_bar_button</item>
         <item name="android:focusable">true</item>
         <item name="android:gravity">center|left</item>
         <item name="android:paddingLeft">10dip</item>
@@ -253,16 +245,18 @@
 
     <style name="TextAppearance.Small.Inverse">
         <item name="android:textColor">?android:attr/textColorSecondaryInverse</item>
         <item name="android:textColorHint">?android:attr/textColorHintInverse</item>
         <item name="android:textColorHighlight">@color/text_color_highlight_inverse</item>
         <item name="android:textColorLink">?android:attr/textColorLink</item>
     </style>
 
+    <style name="TextAppearance.EmptyMessage" parent="TextAppearance.Large"/>
+
     <style name="TextAppearance.Micro">
         <item name="android:textSize">12sp</item>
         <item name="android:textColor">?android:attr/textColorTertiary</item>
     </style>
 
     <style name="TextAppearance.Micro.Inverse">
         <item name="android:textColor">?android:attr/textColorTertiaryInverse</item>
         <item name="android:textColorHint">?android:attr/textColorHintInverse</item>
--- a/mobile/android/base/strings.xml.in
+++ b/mobile/android/base/strings.xml.in
@@ -242,18 +242,18 @@
   <string name="button_clear">&button_clear;</string>
   <string name="button_yes">&button_yes;</string>
   <string name="button_no">&button_no;</string>
 
   <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_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_visited_empty">&home_visited_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