From 19215db243ce5b7c75dcd8ed9de9820769b695f2 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Sat, 6 Feb 2021 00:29:05 +0100 Subject: [PATCH] convert Latest Tab's selection into a sort This removes the convoluted logic of both a selection and a sort, and just does all the ordering in the sort. closes #939 closes #2024 --- .../org/fdroid/fdroid/data/AppProvider.java | 35 ++++++++++++--- .../fdroid/views/main/WhatsNewViewBinder.java | 44 +++++-------------- 2 files changed, 41 insertions(+), 38 deletions(-) diff --git a/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java b/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java index e52cc35c1..ef6ef3b90 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java +++ b/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java @@ -852,11 +852,36 @@ public class AppProvider extends FDroidProvider { break; case LATEST_TAB: - String table = getTableName(); - String isNew = table + "." + Cols.LAST_UPDATED + " <= " + table + "." + Cols.ADDED + " DESC"; - String hasFeatureGraphic = table + "." + Cols.FEATURE_GRAPHIC + " IS NULL ASC "; - String lastUpdated = table + "." + Cols.LAST_UPDATED + " DESC"; - sortOrder = lastUpdated + ", " + isNew + ", " + hasFeatureGraphic; + /* Sort by localized first so users see entries in their language, + * then sort by highlighted fields, then sort by whether the app is new, + * then if it has WhatsNew/Changelog entries, then by when it was last + * updated. Last, it sorts by the date the app was added, putting older + * ones first, to give preference to apps that have been maintained in + * F-Droid longer. + */ + final String table = getTableName(); + final String added = table + "." + Cols.ADDED; + final String lastUpdated = table + "." + Cols.LAST_UPDATED; + sortOrder = table + "." + Cols.IS_LOCALIZED + " DESC" + + ", " + table + "." + Cols.NAME + " IS NULL ASC" + + ", " + table + "." + Cols.ICON + " IS NULL ASC" + + ", " + table + "." + Cols.SUMMARY + " IS NULL ASC" + + ", " + table + "." + Cols.DESCRIPTION + " IS NULL ASC" + + ", CASE WHEN " + table + "." + Cols.PHONE_SCREENSHOTS + " IS NULL" + + " AND " + table + "." + Cols.SEVEN_INCH_SCREENSHOTS + " IS NULL" + + " AND " + table + "." + Cols.TEN_INCH_SCREENSHOTS + " IS NULL" + + " AND " + table + "." + Cols.TV_SCREENSHOTS + " IS NULL" + + " AND " + table + "." + Cols.WEAR_SCREENSHOTS + " IS NULL" + + " AND " + table + "." + Cols.FEATURE_GRAPHIC + " IS NULL" + + " AND " + table + "." + Cols.PROMO_GRAPHIC + " IS NULL" + + " AND " + table + "." + Cols.TV_BANNER + " IS NULL" + + " THEN 1 ELSE 0 END" + + ", CASE WHEN date(" + added + ") >= date(" + lastUpdated + ")" + + " AND date('now','-7 days') < date(" + lastUpdated + ")" + + " THEN 0 ELSE 1 END" + + ", " + table + "." + Cols.WHATSNEW + " IS NULL ASC" + + ", " + lastUpdated + " DESC" + + ", " + added + " ASC"; // There seems no reason to limit the number of apps on the front page, but it helps // if it loads quickly, as it is the default view shown every time F-Droid is opened. 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 bc3f0029c..1b29ffdb8 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 @@ -3,20 +3,20 @@ package org.fdroid.fdroid.views.main; import android.content.Intent; import android.database.Cursor; import android.os.Bundle; -import androidx.annotation.NonNull; -import com.google.android.material.floatingactionbutton.FloatingActionButton; -import androidx.loader.app.LoaderManager; -import androidx.loader.content.CursorLoader; -import androidx.loader.content.Loader; -import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; -import androidx.appcompat.app.AppCompatActivity; -import androidx.recyclerview.widget.GridLayoutManager; -import androidx.recyclerview.widget.RecyclerView; import android.view.View; import android.widget.FrameLayout; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.loader.app.LoaderManager; +import androidx.loader.content.CursorLoader; +import androidx.loader.content.Loader; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; +import com.google.android.material.floatingactionbutton.FloatingActionButton; import org.fdroid.fdroid.Preferences; import org.fdroid.fdroid.R; import org.fdroid.fdroid.UpdateService; @@ -24,12 +24,11 @@ import org.fdroid.fdroid.Utils; import org.fdroid.fdroid.data.AppProvider; import org.fdroid.fdroid.data.RepoProvider; import org.fdroid.fdroid.data.Schema.AppMetadataTable; -import org.fdroid.fdroid.views.apps.AppListActivity; import org.fdroid.fdroid.panic.HidingManager; +import org.fdroid.fdroid.views.apps.AppListActivity; import org.fdroid.fdroid.views.whatsnew.WhatsNewAdapter; import java.util.Date; -import java.util.Locale; /** * Loads a list of newly added or recently updated apps and displays them to the user. @@ -104,32 +103,11 @@ class WhatsNewViewBinder implements LoaderManager.LoaderCallbacks { if (id != LOADER_ID) { return null; } - - // select that have all required items: - String selection = "(" + AppMetadataTable.NAME + "." + AppMetadataTable.Cols.NAME + " != ''" - + " AND " + AppMetadataTable.NAME + "." + AppMetadataTable.Cols.SUMMARY + " != ''" - + " AND " + AppMetadataTable.NAME + "." + AppMetadataTable.Cols.DESCRIPTION + " != ''" - + " AND " + AppMetadataTable.NAME + "." + AppMetadataTable.Cols.LICENSE + " != ''" - + " AND " + AppMetadataTable.NAME + "." + AppMetadataTable.Cols.WHATSNEW + " != ''"; - if (!"en".equals(Locale.getDefault().getLanguage())) { - // only require localization if using a non-English locale - selection += " AND " + AppMetadataTable.NAME + "." + AppMetadataTable.Cols.IS_LOCALIZED + " = 1"; - } - // and at least one optional item: - selection += ") AND (" - + AppMetadataTable.NAME + "." + AppMetadataTable.Cols.SEVEN_INCH_SCREENSHOTS + " IS NOT NULL " - + " OR " + AppMetadataTable.NAME + "." + AppMetadataTable.Cols.PHONE_SCREENSHOTS + " IS NOT NULL " - + " OR " + AppMetadataTable.NAME + "." + AppMetadataTable.Cols.TEN_INCH_SCREENSHOTS + " IS NOT NULL " - + " OR " + AppMetadataTable.NAME + "." + AppMetadataTable.Cols.TV_SCREENSHOTS + " IS NOT NULL " - + " OR " + AppMetadataTable.NAME + "." + AppMetadataTable.Cols.WEAR_SCREENSHOTS + " IS NOT NULL " - + " OR " + AppMetadataTable.NAME + "." + AppMetadataTable.Cols.FEATURE_GRAPHIC + " IS NOT NULL " - + ")"; - return new CursorLoader( activity, AppProvider.getLatestTabUri(), AppMetadataTable.Cols.ALL, - selection, + null, null, null );