Merge branch 'acra-crashes' into 'master'

Fix some more ACRA crashes

Closes acra-crash-reports#218, acra-crash-reports#217, acra-crash-reports#197, and acra-crash-reports#185

See merge request fdroid/fdroidclient!1203
This commit is contained in:
Hans-Christoph Steiner 2023-03-14 13:29:30 +00:00
commit b34ebfe9f5
4 changed files with 54 additions and 7 deletions

View File

@ -244,7 +244,8 @@ public class AppDetailsActivity extends AppCompatActivity
public boolean onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
final AppPrefs prefs = appPrefs;
if (prefs == null) return true;
// don't show menu before appPrefs haven't been loaded
if (prefs == null || app == null) return false;
MenuItem itemIgnoreAll = menu.findItem(R.id.action_ignore_all);
itemIgnoreAll.setChecked(prefs.getIgnoreAllUpdates());

View File

@ -232,10 +232,18 @@ public class ManageReposActivity extends AppCompatActivity implements RepoAdapte
try {
new URL(text);
Uri uri = Uri.parse(text);
fingerprint = uri.getQueryParameter("fingerprint");
try {
fingerprint = uri.getQueryParameter("fingerprint");
} catch (UnsupportedOperationException e) {
Log.e(TAG, "Error getting fingerprint ", e);
}
// uri might contain a QR-style, all uppercase URL:
if (TextUtils.isEmpty(fingerprint)) {
fingerprint = uri.getQueryParameter("FINGERPRINT");
try {
fingerprint = uri.getQueryParameter("FINGERPRINT");
} catch (UnsupportedOperationException e) {
Log.e(TAG, "Error getting fingerprint ", e);
}
}
String userInfo = uri.getUserInfo();

View File

@ -62,6 +62,12 @@ internal class AppListItemsTest : AppTest() {
assertEquals(app1, apps[0])
}
// get first app by partial search, sort by name
appDao.getAppListItems(pm, "On", NAME).getOrFail().let { apps ->
assertEquals(1, apps.size)
assertEquals(app1, apps[0])
}
// get second app by search, sort order doesn't matter
appDao.getAppListItems(pm, "Two", NAME).getOrFail().let { apps ->
assertEquals(1, apps.size)
@ -155,6 +161,27 @@ internal class AppListItemsTest : AppTest() {
}
}
@Test
fun testMalformedSearchQuery() {
every { pm.getInstalledPackages(0) } returns emptyList()
// without category
appDao.getAppListItems(pm, "\"", LAST_UPDATED).getOrFail().let { apps ->
assertTrue(apps.isEmpty())
}
appDao.getAppListItems(pm, "*simple\"*", NAME).getOrFail().let { apps ->
assertTrue(apps.isEmpty())
}
// with category
appDao.getAppListItems(pm, "Category", "\"", LAST_UPDATED).getOrFail().let { apps ->
assertTrue(apps.isEmpty())
}
appDao.getAppListItems(pm, "Category", "*simple\"*", NAME).getOrFail().let { apps ->
assertTrue(apps.isEmpty())
}
}
@Test
fun testSortOrderByLastUpdated() {
// insert three apps in a random order

View File

@ -379,7 +379,7 @@ internal interface AppDaoInt : AppDao {
return if (searchQuery.isNullOrEmpty()) when (sortOrder) {
LAST_UPDATED -> getAppListItemsByLastUpdated().map(packageManager)
NAME -> getAppListItemsByName().map(packageManager)
} else getAppListItems(searchQuery).map(packageManager)
} else getAppListItems(escapeQuery(searchQuery)).map(packageManager)
}
override fun getAppListItems(
@ -391,7 +391,12 @@ internal interface AppDaoInt : AppDao {
return if (searchQuery.isNullOrEmpty()) when (sortOrder) {
LAST_UPDATED -> getAppListItemsByLastUpdated(category).map(packageManager)
NAME -> getAppListItemsByName(category).map(packageManager)
} else getAppListItems(category, searchQuery).map(packageManager)
} else getAppListItems(category, escapeQuery(searchQuery)).map(packageManager)
}
private fun escapeQuery(searchQuery: String): String {
val sanitized = searchQuery.replace(Regex.fromLiteral("\""), "\"\"")
return "\"*$sanitized*\""
}
private fun LiveData<List<AppListItem>>.map(
@ -408,6 +413,9 @@ internal interface AppDaoInt : AppDao {
}
}
/**
* Warning: Run [escapeQuery] on the given [searchQuery] before.
*/
@Transaction
@Query("""
SELECT repoId, packageName, app.localizedName, app.localizedSummary, app.lastUpdated,
@ -416,10 +424,13 @@ internal interface AppDaoInt : AppDao {
JOIN ${AppMetadataFts.TABLE} USING (repoId, packageName)
LEFT JOIN ${HighestVersion.TABLE} AS version USING (repoId, packageName)
JOIN ${RepositoryPreferences.TABLE} AS pref USING (repoId)
WHERE pref.enabled = 1 AND ${AppMetadataFts.TABLE} MATCH '"*' || :searchQuery || '*"'
WHERE pref.enabled = 1 AND ${AppMetadataFts.TABLE} MATCH :searchQuery
GROUP BY packageName HAVING MAX(pref.weight)""")
fun getAppListItems(searchQuery: String): LiveData<List<AppListItem>>
/**
* Warning: Run [escapeQuery] on the given [searchQuery] before.
*/
@Transaction
@Query("""
SELECT repoId, packageName, app.localizedName, app.localizedSummary, app.lastUpdated,
@ -429,7 +440,7 @@ internal interface AppDaoInt : AppDao {
LEFT JOIN ${HighestVersion.TABLE} AS version USING (repoId, packageName)
JOIN ${RepositoryPreferences.TABLE} AS pref USING (repoId)
WHERE pref.enabled = 1 AND categories LIKE '%,' || :category || ',%' AND
${AppMetadataFts.TABLE} MATCH '"*' || :searchQuery || '*"'
${AppMetadataFts.TABLE} MATCH :searchQuery
GROUP BY packageName HAVING MAX(pref.weight)""")
fun getAppListItems(category: String, searchQuery: String): LiveData<List<AppListItem>>