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.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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user