convert alpha sort into "sort by search terms", keep "last updated"
refs #1600 closes #1522 closes #1185
This commit is contained in:
		
							parent
							
								
									646f2c8e9f
								
							
						
					
					
						commit
						c3c31ed033
					
				@ -74,7 +74,7 @@ public class AppListActivity extends AppCompatActivity implements LoaderManager.
 | 
			
		||||
    private Utils.KeyboardStateMonitor keyboardStateMonitor;
 | 
			
		||||
 | 
			
		||||
    private interface SortClause {
 | 
			
		||||
        String NAME = Cols.NAME;
 | 
			
		||||
        String WORDS = Cols.NAME;
 | 
			
		||||
        String LAST_UPDATED = Cols.LAST_UPDATED;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -115,14 +115,14 @@ public class AppListActivity extends AppCompatActivity implements LoaderManager.
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onClick(View view) {
 | 
			
		||||
                switch (sortClauseSelected) {
 | 
			
		||||
                    case SortClause.NAME:
 | 
			
		||||
                    case SortClause.WORDS:
 | 
			
		||||
                        sortClauseSelected = SortClause.LAST_UPDATED;
 | 
			
		||||
                        sortImage.setImageDrawable(lastUpdated);
 | 
			
		||||
                        break;
 | 
			
		||||
                    case SortClause.LAST_UPDATED:
 | 
			
		||||
                        sortClauseSelected = SortClause.NAME;
 | 
			
		||||
                        sortClauseSelected = SortClause.WORDS;
 | 
			
		||||
                        final Drawable alphabetical = DrawableCompat.wrap(
 | 
			
		||||
                                ContextCompat.getDrawable(AppListActivity.this, R.drawable.ic_sort_by_alpha))
 | 
			
		||||
                                ContextCompat.getDrawable(AppListActivity.this, R.drawable.ic_sort))
 | 
			
		||||
                                .mutate();
 | 
			
		||||
                        DrawableCompat.setTint(alphabetical, FDroidApp.isAppThemeLight() ? Color.BLACK : Color.WHITE);
 | 
			
		||||
                        sortImage.setImageDrawable(alphabetical);
 | 
			
		||||
@ -253,25 +253,36 @@ public class AppListActivity extends AppCompatActivity implements LoaderManager.
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private String getSortOrder() {
 | 
			
		||||
        final String nameCol = AppMetadataTable.NAME + "." + AppMetadataTable.Cols.NAME;
 | 
			
		||||
        final String summaryCol = AppMetadataTable.NAME + "." + AppMetadataTable.Cols.SUMMARY;
 | 
			
		||||
        final String nameSort = AppMetadataTable.NAME + "." + Cols.NAME + " COLLATE LOCALIZED ";
 | 
			
		||||
        final String lastUpdatedSort = AppMetadataTable.NAME + "." + Cols.LAST_UPDATED + " DESC";
 | 
			
		||||
        String sortOrder;
 | 
			
		||||
        switch (sortClauseSelected) {
 | 
			
		||||
            case SortClause.NAME:
 | 
			
		||||
                sortOrder = nameSort;
 | 
			
		||||
                break;
 | 
			
		||||
            case SortClause.LAST_UPDATED:
 | 
			
		||||
                sortOrder = lastUpdatedSort;
 | 
			
		||||
                break;
 | 
			
		||||
            default:
 | 
			
		||||
                sortOrder = nameSort;
 | 
			
		||||
        final String table = AppMetadataTable.NAME;
 | 
			
		||||
        final String nameCol = table + "." + AppMetadataTable.Cols.NAME;
 | 
			
		||||
        final String summaryCol = table + "." + AppMetadataTable.Cols.SUMMARY;
 | 
			
		||||
        final String packageCol = Cols.Package.PACKAGE_NAME;
 | 
			
		||||
 | 
			
		||||
        if (sortClauseSelected.equals(SortClause.LAST_UPDATED)) {
 | 
			
		||||
            return table + "." + Cols.LAST_UPDATED + " DESC"
 | 
			
		||||
                    + ", " + table + "." + Cols.IS_LOCALIZED + " DESC"
 | 
			
		||||
                    + ", " + table + "." + Cols.ADDED + " ASC"
 | 
			
		||||
                    + ", " + table + "." + Cols.NAME + " IS NULL ASC"
 | 
			
		||||
                    + ", " + table + "." + Cols.ICON + " IS NULL ASC"
 | 
			
		||||
                    + ", " + table + "." + Cols.SUMMARY + " IS NULL ASC"
 | 
			
		||||
                    + ", " + table + "." + Cols.DESCRIPTION + " IS NULL ASC"
 | 
			
		||||
                    + ", " + table + "." + Cols.WHATSNEW + " 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";
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        final String[] terms = searchTerms.trim().split("\\s+");
 | 
			
		||||
        // prevent SQL injection https://en.wikipedia.org/wiki/SQL_injection#Escaping
 | 
			
		||||
        final String[] terms = searchTerms.trim().replaceAll("[\\x1a\0\n\r\"';\\\\]+", " ").split("\\s+");
 | 
			
		||||
        if (terms.length == 0 || terms[0].equals("")) {
 | 
			
		||||
            return sortOrder;
 | 
			
		||||
            return table + "." + Cols.NAME + " COLLATE LOCALIZED ";
 | 
			
		||||
        }
 | 
			
		||||
        }
 | 
			
		||||
        StringBuilder titleCase = new StringBuilder(String.format("%s like '%%%s%%'", nameCol, terms[0]));
 | 
			
		||||
        StringBuilder summaryCase = new StringBuilder(String.format("%s like '%%%s%%'", summaryCol, terms[0]));
 | 
			
		||||
@ -281,6 +292,24 @@ public class AppListActivity extends AppCompatActivity implements LoaderManager.
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return String.format("case when %s then 1 when %s then 2 else 3 end, %s",
 | 
			
		||||
                titleCase.toString(), summaryCase.toString(), sortOrder);
 | 
			
		||||
                titleCase.toString(), summaryCase.toString(), ""
 | 
			
		||||
                + ", " + table + "." + Cols.IS_LOCALIZED + " DESC"
 | 
			
		||||
                + ", " + table + "." + Cols.ADDED + " ASC"
 | 
			
		||||
                + ", " + table + "." + Cols.NAME + " IS NULL ASC"
 | 
			
		||||
                + ", " + table + "." + Cols.ICON + " IS NULL ASC"
 | 
			
		||||
                + ", " + table + "." + Cols.SUMMARY + " IS NULL ASC"
 | 
			
		||||
                + ", " + table + "." + Cols.DESCRIPTION + " IS NULL ASC"
 | 
			
		||||
                + ", " + table + "." + Cols.WHATSNEW + " 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"
 | 
			
		||||
                + ", " + table + "." + Cols.LAST_UPDATED + " DESC"
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										10
									
								
								app/src/main/res/drawable/ic_sort.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								app/src/main/res/drawable/ic_sort.xml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,10 @@
 | 
			
		||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
        android:autoMirrored="true"
 | 
			
		||||
        android:height="24dp"
 | 
			
		||||
        android:viewportHeight="24"
 | 
			
		||||
        android:viewportWidth="24"
 | 
			
		||||
        android:width="24dp">
 | 
			
		||||
    <path
 | 
			
		||||
            android:fillColor="#FFFFFF"
 | 
			
		||||
            android:pathData="M3,18h6v-2L3,16v2zM3,6v2h18L21,6L3,6zM3,13h12v-2L3,11v2z" />
 | 
			
		||||
</vector>
 | 
			
		||||
@ -1,10 +0,0 @@
 | 
			
		||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    android:width="24dp"
 | 
			
		||||
    android:height="24dp"
 | 
			
		||||
    android:tint="?attr/colorControlNormal"
 | 
			
		||||
    android:viewportWidth="24"
 | 
			
		||||
    android:viewportHeight="24">
 | 
			
		||||
    <path
 | 
			
		||||
        android:fillColor="#FFFFFF"
 | 
			
		||||
        android:pathData="M14.94,4.66h-4.72l2.36,-2.36zM10.25,19.37h4.66l-2.33,2.33zM6.1,6.27L1.6,17.73h1.84l0.92,-2.45h5.11l0.92,2.45h1.84L7.74,6.27L6.1,6.27zM4.97,13.64l1.94,-5.18 1.94,5.18L4.97,13.64zM15.73,16.14h6.12v1.59h-8.53v-1.29l5.92,-8.56h-5.88v-1.6h8.3v1.26l-5.93,8.6z" />
 | 
			
		||||
</vector>
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user