diff --git a/mobile/android/base/BrowserApp.java b/mobile/android/base/BrowserApp.java index e3d9fa710615..95049a690dbe 100644 --- a/mobile/android/base/BrowserApp.java +++ b/mobile/android/base/BrowserApp.java @@ -1431,6 +1431,13 @@ abstract public class BrowserApp extends GeckoApp return; } + // Hide any visible homepager subpages + final FragmentManager fm = getSupportFragmentManager(); + final Fragment subPage = fm.findFragmentByTag(HomePager.SUBPAGE_TAG); + if (subPage != null) { + fm.beginTransaction().remove(subPage).commitAllowingStateLoss(); + } + // FIXME: do animation if animate is true mHomePager.hide(); diff --git a/mobile/android/base/Makefile.in b/mobile/android/base/Makefile.in index 974f8e85c1c8..59700c563088 100644 --- a/mobile/android/base/Makefile.in +++ b/mobile/android/base/Makefile.in @@ -471,6 +471,7 @@ RES_LAYOUT = \ res/layout/home_header_row.xml \ res/layout/home_list_with_title.xml \ res/layout/home_search_item_row.xml \ + res/layout/home_visited_page.xml \ res/layout/web_app.xml \ res/layout/launch_app_list.xml \ res/layout/launch_app_listitem.xml \ diff --git a/mobile/android/base/home/HomeFragment.java b/mobile/android/base/home/HomeFragment.java index 29e6cc1df227..4cc2718a5f44 100644 --- a/mobile/android/base/home/HomeFragment.java +++ b/mobile/android/base/home/HomeFragment.java @@ -46,6 +46,12 @@ class HomeFragment extends Fragment { // URL to Title replacement regex. private static final String REGEX_URL_TO_TITLE = "^([a-z]+://)?(www\\.)?"; + protected void showSubPage(Fragment subPage) { + getActivity().getSupportFragmentManager().beginTransaction() + .addToBackStack(null).replace(R.id.home_pager_container, subPage, HomePager.SUBPAGE_TAG) + .commitAllowingStateLoss(); + } + @Override public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo) { if (!(menuInfo instanceof HomeContextMenuInfo)) { diff --git a/mobile/android/base/home/HomePager.java b/mobile/android/base/home/HomePager.java index a4e4be886b87..de9947af12e7 100644 --- a/mobile/android/base/home/HomePager.java +++ b/mobile/android/base/home/HomePager.java @@ -22,6 +22,9 @@ import java.util.EnumMap; import java.util.EnumSet; public class HomePager extends ViewPager { + // Subpage fragment tag + public static final String SUBPAGE_TAG = "home_pager_subpage"; + private final Context mContext; private volatile boolean mLoaded; diff --git a/mobile/android/base/home/VisitedPage.java b/mobile/android/base/home/VisitedPage.java index c1fb48044ef4..69deb27f1f19 100644 --- a/mobile/android/base/home/VisitedPage.java +++ b/mobile/android/base/home/VisitedPage.java @@ -43,6 +43,12 @@ public class VisitedPage extends HomeFragment { // The view shown by the fragment. private ListView mList; + // Empty message view + private View mEmptyMessage; + + // Buttons container + private View mButtonsContainer; + // Callbacks used for the search and favicon cursor loaders private CursorLoaderCallbacks mCursorLoaderCallbacks; @@ -74,16 +80,15 @@ public class VisitedPage extends HomeFragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - // All list views are styled to look the same with a global activity theme. - // If the style of the list changes, inflate it from an XML. - mList = new HomeListView(container.getContext()); - return mList; + return inflater.inflate(R.layout.home_visited_page, container, false); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + mList = (HomeListView) view.findViewById(R.id.visited_list); + mList.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { @@ -98,12 +103,33 @@ public class VisitedPage extends HomeFragment { }); registerForContextMenu(mList); + + mEmptyMessage = view.findViewById(R.id.empty_message); + mButtonsContainer = view.findViewById(R.id.buttons_container); + + final View historyButton = view.findViewById(R.id.history_button); + historyButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + showHistoryPage(); + } + }); + + final View tabsButton = view.findViewById(R.id.tabs_button); + tabsButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + showTabsPage(); + } + }); } @Override public void onDestroyView() { super.onDestroyView(); mList = null; + mButtonsContainer = null; + mEmptyMessage = null; } @Override @@ -121,6 +147,16 @@ public class VisitedPage extends HomeFragment { getLoaderManager().initLoader(FRECENCY_LOADER_ID, null, mCursorLoaderCallbacks); } + private void showHistoryPage() { + final HistoryPage historyPage = HistoryPage.newInstance(); + showSubPage(historyPage); + } + + private void showTabsPage() { + final LastTabsPage lastTabsPage = LastTabsPage.newInstance(); + showSubPage(lastTabsPage); + } + private static class FrecencyCursorLoader extends SimpleCursorLoader { // Max number of search results private static final int SEARCH_LIMIT = 50; @@ -172,6 +208,13 @@ public class VisitedPage extends HomeFragment { final int loaderId = loader.getId(); switch(loaderId) { case FRECENCY_LOADER_ID: + // Only set empty view once cursor is loaded to avoid + // flashing the empty message before loading. + mList.setEmptyView(mEmptyMessage); + + final int buttonsVisibility = (c.getCount() == 0 ? View.GONE : View.VISIBLE); + mButtonsContainer.setVisibility(buttonsVisibility); + mAdapter.swapCursor(c); FaviconsLoader.restartFromCursor(getLoaderManager(), FAVICONS_LOADER_ID, diff --git a/mobile/android/base/locales/en-US/android_strings.dtd b/mobile/android/base/locales/en-US/android_strings.dtd index 3ad868ec5bee..24f4b4227262 100644 --- a/mobile/android/base/locales/en-US/android_strings.dtd +++ b/mobile/android/base/locales/en-US/android_strings.dtd @@ -274,6 +274,7 @@ size. --> + + + + + + + + + + +