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
This commit is contained in:
parent
3d9a68c1e3
commit
19215db243
@ -852,11 +852,36 @@ public class AppProvider extends FDroidProvider {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case LATEST_TAB:
|
case LATEST_TAB:
|
||||||
String table = getTableName();
|
/* Sort by localized first so users see entries in their language,
|
||||||
String isNew = table + "." + Cols.LAST_UPDATED + " <= " + table + "." + Cols.ADDED + " DESC";
|
* then sort by highlighted fields, then sort by whether the app is new,
|
||||||
String hasFeatureGraphic = table + "." + Cols.FEATURE_GRAPHIC + " IS NULL ASC ";
|
* then if it has WhatsNew/Changelog entries, then by when it was last
|
||||||
String lastUpdated = table + "." + Cols.LAST_UPDATED + " DESC";
|
* updated. Last, it sorts by the date the app was added, putting older
|
||||||
sortOrder = lastUpdated + ", " + isNew + ", " + hasFeatureGraphic;
|
* 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
|
// 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.
|
// if it loads quickly, as it is the default view shown every time F-Droid is opened.
|
||||||
|
@ -3,20 +3,20 @@ package org.fdroid.fdroid.views.main;
|
|||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
import android.os.Bundle;
|
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.view.View;
|
||||||
import android.widget.FrameLayout;
|
import android.widget.FrameLayout;
|
||||||
import android.widget.LinearLayout;
|
import android.widget.LinearLayout;
|
||||||
import android.widget.ProgressBar;
|
import android.widget.ProgressBar;
|
||||||
import android.widget.TextView;
|
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.Preferences;
|
||||||
import org.fdroid.fdroid.R;
|
import org.fdroid.fdroid.R;
|
||||||
import org.fdroid.fdroid.UpdateService;
|
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.AppProvider;
|
||||||
import org.fdroid.fdroid.data.RepoProvider;
|
import org.fdroid.fdroid.data.RepoProvider;
|
||||||
import org.fdroid.fdroid.data.Schema.AppMetadataTable;
|
import org.fdroid.fdroid.data.Schema.AppMetadataTable;
|
||||||
import org.fdroid.fdroid.views.apps.AppListActivity;
|
|
||||||
import org.fdroid.fdroid.panic.HidingManager;
|
import org.fdroid.fdroid.panic.HidingManager;
|
||||||
|
import org.fdroid.fdroid.views.apps.AppListActivity;
|
||||||
import org.fdroid.fdroid.views.whatsnew.WhatsNewAdapter;
|
import org.fdroid.fdroid.views.whatsnew.WhatsNewAdapter;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.Locale;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Loads a list of newly added or recently updated apps and displays them to the user.
|
* 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<Cursor> {
|
|||||||
if (id != LOADER_ID) {
|
if (id != LOADER_ID) {
|
||||||
return null;
|
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(
|
return new CursorLoader(
|
||||||
activity,
|
activity,
|
||||||
AppProvider.getLatestTabUri(),
|
AppProvider.getLatestTabUri(),
|
||||||
AppMetadataTable.Cols.ALL,
|
AppMetadataTable.Cols.ALL,
|
||||||
selection,
|
null,
|
||||||
null,
|
null,
|
||||||
null
|
null
|
||||||
);
|
);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user