overhaul search to include summary, better searching, and localized sort
include @gcbrown76's `getSortOrder()` from !889 as getLastUpdatedSortOrder
This commit is contained in:
		
							parent
							
								
									9c3176852e
								
							
						
					
					
						commit
						646f2c8e9f
					
				@ -32,7 +32,6 @@ import android.view.inputmethod.InputMethodManager;
 | 
			
		||||
import android.widget.EditText;
 | 
			
		||||
import android.widget.ImageView;
 | 
			
		||||
import android.widget.TextView;
 | 
			
		||||
 | 
			
		||||
import androidx.annotation.NonNull;
 | 
			
		||||
import androidx.annotation.Nullable;
 | 
			
		||||
import androidx.appcompat.app.AppCompatActivity;
 | 
			
		||||
@ -43,14 +42,13 @@ import androidx.loader.content.CursorLoader;
 | 
			
		||||
import androidx.loader.content.Loader;
 | 
			
		||||
import androidx.recyclerview.widget.LinearLayoutManager;
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView;
 | 
			
		||||
 | 
			
		||||
import com.nostra13.universalimageloader.core.ImageLoader;
 | 
			
		||||
 | 
			
		||||
import org.fdroid.fdroid.FDroidApp;
 | 
			
		||||
import org.fdroid.fdroid.R;
 | 
			
		||||
import org.fdroid.fdroid.Utils;
 | 
			
		||||
import org.fdroid.fdroid.data.AppProvider;
 | 
			
		||||
import org.fdroid.fdroid.data.Schema;
 | 
			
		||||
import org.fdroid.fdroid.data.Schema.AppMetadataTable;
 | 
			
		||||
import org.fdroid.fdroid.data.Schema.AppMetadataTable.Cols;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Provides scrollable listing of apps for search and category views.
 | 
			
		||||
@ -58,6 +56,8 @@ import org.fdroid.fdroid.data.Schema;
 | 
			
		||||
public class AppListActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor>,
 | 
			
		||||
        CategoryTextWatcher.SearchTermsChangedListener {
 | 
			
		||||
 | 
			
		||||
    public static final String TAG = "AppListActivity";
 | 
			
		||||
 | 
			
		||||
    public static final String EXTRA_CATEGORY
 | 
			
		||||
            = "org.fdroid.fdroid.views.apps.AppListActivity.EXTRA_CATEGORY";
 | 
			
		||||
    public static final String EXTRA_SEARCH_TERMS
 | 
			
		||||
@ -74,9 +74,8 @@ public class AppListActivity extends AppCompatActivity implements LoaderManager.
 | 
			
		||||
    private Utils.KeyboardStateMonitor keyboardStateMonitor;
 | 
			
		||||
 | 
			
		||||
    private interface SortClause {
 | 
			
		||||
        String NAME = Schema.AppMetadataTable.NAME + "." + Schema.AppMetadataTable.Cols.NAME + " asc";
 | 
			
		||||
        String LAST_UPDATED = Schema.AppMetadataTable.NAME + "."
 | 
			
		||||
                + Schema.AppMetadataTable.Cols.LAST_UPDATED + " desc";
 | 
			
		||||
        String NAME = Cols.NAME;
 | 
			
		||||
        String LAST_UPDATED = Cols.LAST_UPDATED;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@ -115,15 +114,19 @@ public class AppListActivity extends AppCompatActivity implements LoaderManager.
 | 
			
		||||
        sortImage.setOnClickListener(new View.OnClickListener() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onClick(View view) {
 | 
			
		||||
                if (sortClauseSelected.equalsIgnoreCase(SortClause.LAST_UPDATED)) {
 | 
			
		||||
                    sortClauseSelected = SortClause.NAME;
 | 
			
		||||
                    final Drawable alphabetical = DrawableCompat.wrap(
 | 
			
		||||
                            ContextCompat.getDrawable(AppListActivity.this, R.drawable.ic_sort_by_alpha)).mutate();
 | 
			
		||||
                    DrawableCompat.setTint(alphabetical, FDroidApp.isAppThemeLight() ? Color.BLACK : Color.WHITE);
 | 
			
		||||
                    sortImage.setImageDrawable(alphabetical);
 | 
			
		||||
                } else {
 | 
			
		||||
                    sortClauseSelected = SortClause.LAST_UPDATED;
 | 
			
		||||
                    sortImage.setImageDrawable(lastUpdated);
 | 
			
		||||
                switch (sortClauseSelected) {
 | 
			
		||||
                    case SortClause.NAME:
 | 
			
		||||
                        sortClauseSelected = SortClause.LAST_UPDATED;
 | 
			
		||||
                        sortImage.setImageDrawable(lastUpdated);
 | 
			
		||||
                        break;
 | 
			
		||||
                    case SortClause.LAST_UPDATED:
 | 
			
		||||
                        sortClauseSelected = SortClause.NAME;
 | 
			
		||||
                        final Drawable alphabetical = DrawableCompat.wrap(
 | 
			
		||||
                                ContextCompat.getDrawable(AppListActivity.this, R.drawable.ic_sort_by_alpha))
 | 
			
		||||
                                .mutate();
 | 
			
		||||
                        DrawableCompat.setTint(alphabetical, FDroidApp.isAppThemeLight() ? Color.BLACK : Color.WHITE);
 | 
			
		||||
                        sortImage.setImageDrawable(alphabetical);
 | 
			
		||||
                        break;
 | 
			
		||||
                }
 | 
			
		||||
                getSupportLoaderManager().restartLoader(0, null, AppListActivity.this);
 | 
			
		||||
                appView.scrollToPosition(0);
 | 
			
		||||
@ -218,10 +221,10 @@ public class AppListActivity extends AppCompatActivity implements LoaderManager.
 | 
			
		||||
        return new CursorLoader(
 | 
			
		||||
                this,
 | 
			
		||||
                AppProvider.getSearchUri(searchTerms, category),
 | 
			
		||||
                Schema.AppMetadataTable.Cols.ALL,
 | 
			
		||||
                AppMetadataTable.Cols.ALL,
 | 
			
		||||
                null,
 | 
			
		||||
                null,
 | 
			
		||||
                sortClauseSelected
 | 
			
		||||
                getSortOrder()
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -248,4 +251,36 @@ public class AppListActivity extends AppCompatActivity implements LoaderManager.
 | 
			
		||||
        this.searchTerms = searchTerms;
 | 
			
		||||
        getSupportLoaderManager().restartLoader(0, null, this);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    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[] terms = searchTerms.trim().split("\\s+");
 | 
			
		||||
        if (terms.length == 0 || terms[0].equals("")) {
 | 
			
		||||
            return sortOrder;
 | 
			
		||||
        }
 | 
			
		||||
        StringBuilder titleCase = new StringBuilder(String.format("%s like '%%%s%%'", nameCol, terms[0]));
 | 
			
		||||
        StringBuilder summaryCase = new StringBuilder(String.format("%s like '%%%s%%'", summaryCol, terms[0]));
 | 
			
		||||
        for (int i = 1; i < terms.length; i++) {
 | 
			
		||||
            titleCase.append(String.format(" and %s like '%%%s%%'", nameCol, terms[i]));
 | 
			
		||||
            summaryCase.append(String.format(" and %s like '%%%s%%'", summaryCol, terms[i]));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return String.format("case when %s then 1 when %s then 2 else 3 end, %s",
 | 
			
		||||
                titleCase.toString(), summaryCase.toString(), sortOrder);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user