overhaul search to include summary, better searching, and localized sort

include @gcbrown76's `getSortOrder()` from !889 as getLastUpdatedSortOrder
This commit is contained in:
Hans-Christoph Steiner 2021-02-08 16:17:19 +01:00
parent 9c3176852e
commit 646f2c8e9f

View File

@ -32,7 +32,6 @@ import android.view.inputmethod.InputMethodManager;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
@ -43,14 +42,13 @@ import androidx.loader.content.CursorLoader;
import androidx.loader.content.Loader; import androidx.loader.content.Loader;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.ImageLoader;
import org.fdroid.fdroid.FDroidApp; import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.R; import org.fdroid.fdroid.R;
import org.fdroid.fdroid.Utils; import org.fdroid.fdroid.Utils;
import org.fdroid.fdroid.data.AppProvider; 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. * 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>, public class AppListActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor>,
CategoryTextWatcher.SearchTermsChangedListener { CategoryTextWatcher.SearchTermsChangedListener {
public static final String TAG = "AppListActivity";
public static final String EXTRA_CATEGORY public static final String EXTRA_CATEGORY
= "org.fdroid.fdroid.views.apps.AppListActivity.EXTRA_CATEGORY"; = "org.fdroid.fdroid.views.apps.AppListActivity.EXTRA_CATEGORY";
public static final String EXTRA_SEARCH_TERMS public static final String EXTRA_SEARCH_TERMS
@ -74,9 +74,8 @@ public class AppListActivity extends AppCompatActivity implements LoaderManager.
private Utils.KeyboardStateMonitor keyboardStateMonitor; private Utils.KeyboardStateMonitor keyboardStateMonitor;
private interface SortClause { private interface SortClause {
String NAME = Schema.AppMetadataTable.NAME + "." + Schema.AppMetadataTable.Cols.NAME + " asc"; String NAME = Cols.NAME;
String LAST_UPDATED = Schema.AppMetadataTable.NAME + "." String LAST_UPDATED = Cols.LAST_UPDATED;
+ Schema.AppMetadataTable.Cols.LAST_UPDATED + " desc";
} }
@Override @Override
@ -115,15 +114,19 @@ public class AppListActivity extends AppCompatActivity implements LoaderManager.
sortImage.setOnClickListener(new View.OnClickListener() { sortImage.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View view) { public void onClick(View view) {
if (sortClauseSelected.equalsIgnoreCase(SortClause.LAST_UPDATED)) { switch (sortClauseSelected) {
sortClauseSelected = SortClause.NAME; case SortClause.NAME:
final Drawable alphabetical = DrawableCompat.wrap( sortClauseSelected = SortClause.LAST_UPDATED;
ContextCompat.getDrawable(AppListActivity.this, R.drawable.ic_sort_by_alpha)).mutate(); sortImage.setImageDrawable(lastUpdated);
DrawableCompat.setTint(alphabetical, FDroidApp.isAppThemeLight() ? Color.BLACK : Color.WHITE); break;
sortImage.setImageDrawable(alphabetical); case SortClause.LAST_UPDATED:
} else { sortClauseSelected = SortClause.NAME;
sortClauseSelected = SortClause.LAST_UPDATED; final Drawable alphabetical = DrawableCompat.wrap(
sortImage.setImageDrawable(lastUpdated); 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); getSupportLoaderManager().restartLoader(0, null, AppListActivity.this);
appView.scrollToPosition(0); appView.scrollToPosition(0);
@ -218,10 +221,10 @@ public class AppListActivity extends AppCompatActivity implements LoaderManager.
return new CursorLoader( return new CursorLoader(
this, this,
AppProvider.getSearchUri(searchTerms, category), AppProvider.getSearchUri(searchTerms, category),
Schema.AppMetadataTable.Cols.ALL, AppMetadataTable.Cols.ALL,
null, null,
null, null,
sortClauseSelected getSortOrder()
); );
} }
@ -248,4 +251,36 @@ public class AppListActivity extends AppCompatActivity implements LoaderManager.
this.searchTerms = searchTerms; this.searchTerms = searchTerms;
getSupportLoaderManager().restartLoader(0, null, this); 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);
}
} }