From e92497be7499dc080e3be04b2bf6fa2c3e73bc8b Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Tue, 6 Jun 2023 14:31:31 -0300 Subject: [PATCH] [app] Hard-code category for nightly builds --- .../views/categories/CategoryAdapter.java | 18 +++++++++++- .../views/categories/CategoryController.java | 28 +++++++++++-------- .../views/main/CategoriesViewBinder.java | 10 ++++++- app/src/main/res/values/strings.xml | 1 + 4 files changed, 44 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/org/fdroid/fdroid/views/categories/CategoryAdapter.java b/app/src/main/java/org/fdroid/fdroid/views/categories/CategoryAdapter.java index 29a06b51f..1daf2e5d5 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/categories/CategoryAdapter.java +++ b/app/src/main/java/org/fdroid/fdroid/views/categories/CategoryAdapter.java @@ -1,5 +1,6 @@ package org.fdroid.fdroid.views.categories; +import android.util.Log; import android.view.ViewGroup; import org.fdroid.database.AppOverviewItem; @@ -7,7 +8,9 @@ import org.fdroid.database.Category; import org.fdroid.database.FDroidDatabase; import org.fdroid.fdroid.R; +import java.util.ArrayList; import java.util.HashMap; +import java.util.Iterator; import java.util.List; import androidx.annotation.NonNull; @@ -49,7 +52,7 @@ public class CategoryAdapter extends ListAdapter { @Override public void onBindViewHolder(@NonNull CategoryController holder, int position) { Category category = getItem(position); - holder.bindModel(category, liveData.get(category)); + holder.bindModel(category, liveData.get(category), this::onNoApps); } public void setCategories(@NonNull List categories) { @@ -62,4 +65,17 @@ public class CategoryAdapter extends ListAdapter { } } + private void onNoApps(Category category) { + ArrayList categories = new ArrayList<>(getCurrentList()); + Iterator itr = categories.iterator(); + while (itr.hasNext()) { + Category c = itr.next(); + if (c.getId().equals(category.getId())) { + Log.d("CategoryAdapter", "Removing " + category.getId() + " without apps."); + itr.remove(); + break; + } + } + submitList(categories); + } } diff --git a/app/src/main/java/org/fdroid/fdroid/views/categories/CategoryController.java b/app/src/main/java/org/fdroid/fdroid/views/categories/CategoryController.java index 25fd76a48..f1cf8229c 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/categories/CategoryController.java +++ b/app/src/main/java/org/fdroid/fdroid/views/categories/CategoryController.java @@ -17,6 +17,7 @@ import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import androidx.core.content.ContextCompat; import androidx.core.os.LocaleListCompat; +import androidx.core.util.Consumer; import androidx.core.view.ViewCompat; import androidx.lifecycle.LiveData; import androidx.lifecycle.Observer; @@ -88,7 +89,8 @@ public class CategoryController extends RecyclerView.ViewHolder { return categoryNameId == 0 ? categoryName : context.getString(categoryNameId); } - void bindModel(@NonNull Category category, LiveData> liveData) { + void bindModel(@NonNull Category category, LiveData> liveData, + Consumer onNoApps) { loadAppItems(liveData); currentCategory = category; @@ -98,7 +100,7 @@ public class CategoryController extends RecyclerView.ViewHolder { heading.setContentDescription(activity.getString(R.string.tts_category_name, categoryName)); viewAll.setVisibility(View.INVISIBLE); - loadNumAppsInCategory(); + loadNumAppsInCategory(onNoApps); @ColorInt int backgroundColour = getBackgroundColour(activity, category.getId()); background.setBackgroundColor(backgroundColour); @@ -139,12 +141,12 @@ public class CategoryController extends RecyclerView.ViewHolder { }); } - private void loadNumAppsInCategory() { + private void loadNumAppsInCategory(Consumer onNoApps) { if (disposable != null) disposable.dispose(); disposable = Single.fromCallable(() -> db.getAppDao().getNumberOfAppsInCategory(currentCategory.getId())) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(this::setNumAppsInCategory); + .subscribe((numApps) -> setNumAppsInCategory(numApps, onNoApps)); } /** @@ -179,13 +181,17 @@ public class CategoryController extends RecyclerView.ViewHolder { return Color.HSVToColor(hsv); } - private void setNumAppsInCategory(int numAppsInCategory) { - viewAll.setVisibility(View.VISIBLE); - Resources r = activity.getResources(); - viewAll.setText(r.getQuantityString(R.plurals.button_view_all_apps_in_category, numAppsInCategory, - numAppsInCategory)); - viewAll.setContentDescription(r.getQuantityString(R.plurals.tts_view_all_in_category, numAppsInCategory, - numAppsInCategory, currentCategory)); + private void setNumAppsInCategory(int numAppsInCategory, Consumer onNoApps) { + if (numAppsInCategory == 0) { + onNoApps.accept(currentCategory); + } else { + viewAll.setVisibility(View.VISIBLE); + Resources r = activity.getResources(); + viewAll.setText(r.getQuantityString(R.plurals.button_view_all_apps_in_category, numAppsInCategory, + numAppsInCategory)); + viewAll.setContentDescription(r.getQuantityString(R.plurals.tts_view_all_in_category, numAppsInCategory, + numAppsInCategory, currentCategory)); + } } @SuppressWarnings("FieldCanBeLocal") 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 f0a432239..cd4c295a0 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 @@ -18,8 +18,10 @@ import org.fdroid.fdroid.panic.HidingManager; import org.fdroid.fdroid.views.apps.AppListActivity; import org.fdroid.fdroid.views.categories.CategoryAdapter; +import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Map; import androidx.appcompat.app.AppCompatActivity; import androidx.core.os.LocaleListCompat; @@ -38,10 +40,12 @@ class CategoriesViewBinder implements Observer> { public static final String TAG = "CategoriesViewBinder"; 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; FDroidDatabase db = DBHelper.getDb(activity); Transformations.distinctUntilChanged(db.getRepositoryDao().getLiveCategories()).observe(activity, this); @@ -100,7 +104,11 @@ class CategoriesViewBinder implements Observer> { if (name2 == null) name2 = o2.getId(); return name1.compareToIgnoreCase(name2); }); - categoryAdapter.setCategories(categories); + // TODO force-adding nightly category here can be removed once fdroidserver LTS supports defining categories + ArrayList c = new ArrayList<>(categories); + Map name = Collections.singletonMap("en-US", activity.getString(R.string.category_Nightly)); + c.add(new Category(42L, "nightly", Collections.emptyMap(), name, Collections.emptyMap())); + categoryAdapter.setCategories(c); if (categoryAdapter.getItemCount() == 0) { emptyState.setVisibility(View.VISIBLE); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7e3e5322b..4a2b52d42 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -479,6 +479,7 @@ This often occurs with apps installed via Google Play or other sources, if they Theming Time Writing + Nightly Builds View %d