diff --git a/app/src/main/java/org/fdroid/fdroid/views/main/CategoriesViewBinder.java b/app/src/main/java/org/fdroid/fdroid/views/main/CategoriesViewBinder.java index 9528f7ffc..462cf096b 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/main/CategoriesViewBinder.java +++ b/app/src/main/java/org/fdroid/fdroid/views/main/CategoriesViewBinder.java @@ -12,6 +12,7 @@ import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.View; import android.widget.FrameLayout; +import android.widget.TextView; import org.fdroid.fdroid.R; import org.fdroid.fdroid.data.CategoryProvider; @@ -30,6 +31,8 @@ class CategoriesViewBinder implements LoaderManager.LoaderCallbacks { private final CategoryAdapter categoryAdapter; private final AppCompatActivity activity; + private final TextView emptyState; + private final RecyclerView categoriesList; CategoriesViewBinder(final AppCompatActivity activity, FrameLayout parent) { this.activity = activity; @@ -38,7 +41,9 @@ class CategoriesViewBinder implements LoaderManager.LoaderCallbacks { categoryAdapter = new CategoryAdapter(activity, activity.getSupportLoaderManager()); - RecyclerView categoriesList = (RecyclerView) categoriesView.findViewById(R.id.category_list); + emptyState = (TextView) categoriesView.findViewById(R.id.empty_state); + + categoriesList = (RecyclerView) categoriesView.findViewById(R.id.category_list); categoriesList.setHasFixedSize(true); categoriesList.setLayoutManager(new LinearLayoutManager(activity)); categoriesList.setAdapter(categoryAdapter); @@ -77,6 +82,14 @@ class CategoriesViewBinder implements LoaderManager.LoaderCallbacks { } categoryAdapter.setCategoriesCursor(cursor); + + if (categoryAdapter.getItemCount() == 0) { + emptyState.setVisibility(View.VISIBLE); + categoriesList.setVisibility(View.GONE); + } else { + emptyState.setVisibility(View.GONE); + categoriesList.setVisibility(View.VISIBLE); + } } @Override diff --git a/app/src/main/java/org/fdroid/fdroid/views/main/WhatsNewViewBinder.java b/app/src/main/java/org/fdroid/fdroid/views/main/WhatsNewViewBinder.java index 62cbe6906..4aaf66606 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/main/WhatsNewViewBinder.java +++ b/app/src/main/java/org/fdroid/fdroid/views/main/WhatsNewViewBinder.java @@ -13,14 +13,20 @@ import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.View; import android.widget.FrameLayout; +import android.widget.TextView; import org.fdroid.fdroid.R; import org.fdroid.fdroid.UpdateService; import org.fdroid.fdroid.data.AppProvider; +import org.fdroid.fdroid.data.RepoProvider; import org.fdroid.fdroid.data.Schema; import org.fdroid.fdroid.views.apps.AppListActivity; import org.fdroid.fdroid.views.whatsnew.WhatsNewAdapter; +import java.util.Calendar; +import java.util.Date; +import java.util.concurrent.TimeUnit; + /** * Loads a list of newly added or recently updated apps and displays them to the user. */ @@ -30,6 +36,8 @@ class WhatsNewViewBinder implements LoaderManager.LoaderCallbacks { private final WhatsNewAdapter whatsNewAdapter; private final AppCompatActivity activity; + private final TextView emptyState; + private final RecyclerView appList; WhatsNewViewBinder(final AppCompatActivity activity, FrameLayout parent) { this.activity = activity; @@ -41,7 +49,9 @@ class WhatsNewViewBinder implements LoaderManager.LoaderCallbacks { GridLayoutManager layoutManager = new GridLayoutManager(activity, 2); layoutManager.setSpanSizeLookup(new WhatsNewAdapter.SpanSizeLookup()); - RecyclerView appList = (RecyclerView) whatsNewView.findViewById(R.id.app_list); + emptyState = (TextView) whatsNewView.findViewById(R.id.empty_state); + + appList = (RecyclerView) whatsNewView.findViewById(R.id.app_list); appList.setHasFixedSize(true); appList.setLayoutManager(layoutManager); appList.setAdapter(whatsNewAdapter); @@ -89,6 +99,37 @@ class WhatsNewViewBinder implements LoaderManager.LoaderCallbacks { } whatsNewAdapter.setAppsCursor(cursor); + + if (whatsNewAdapter.getItemCount() == 0) { + emptyState.setVisibility(View.VISIBLE); + appList.setVisibility(View.GONE); + explainEmptyStateToUser(); + } else { + emptyState.setVisibility(View.GONE); + appList.setVisibility(View.VISIBLE); + } + } + + private void explainEmptyStateToUser() { + StringBuilder emptyStateText = new StringBuilder(); + emptyStateText.append(activity.getString(R.string.latest__empty_state__no_recent_apps)); + emptyStateText.append("\n\n"); + + int repoCount = RepoProvider.Helper.countEnabledRepos(activity); + if (repoCount == 0) { + emptyStateText.append(activity.getString(R.string.latest__empty_state__no_enabled_repos)); + } else { + Date lastUpdate = RepoProvider.Helper.lastUpdate(activity); + if (lastUpdate == null) { + emptyStateText.append(activity.getString(R.string.latest__empty_state__never_updated)); + } else { + long msDiff = Calendar.getInstance().getTimeInMillis() - lastUpdate.getTime(); + int daysDiff = (int) TimeUnit.MILLISECONDS.toDays(msDiff); + emptyStateText.append(activity.getResources().getQuantityString(R.plurals.details_last_update_days, daysDiff, daysDiff)); + } + } + + emptyState.setText(emptyStateText.toString()); } @Override diff --git a/app/src/main/res/layout/main_tab_categories.xml b/app/src/main/res/layout/main_tab_categories.xml index 22257c8b3..27ca6f052 100644 --- a/app/src/main/res/layout/main_tab_categories.xml +++ b/app/src/main/res/layout/main_tab_categories.xml @@ -16,6 +16,18 @@ app:layout_constraintEnd_toEndOf="parent" tools:layout_editor_absoluteX="8dp" /> + + + + Categories Nearby + No recent apps found + Once your list of apps has been updated, the latest apps should show here + Once you enable a repository and let it update, the latest apps should show here + + No categories to display + My Apps Manage Installed Apps diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index e46554b20..dcb4eaee0 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -93,6 +93,13 @@ +