diff --git a/app/build.gradle b/app/build.gradle index 9539e8cda..edc039c17 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -169,7 +169,8 @@ dependencies { testImplementation 'org.robolectric:robolectric:3.8' testImplementation "com.android.support.test:monitor:1.0.2" testImplementation 'org.bouncycastle:bcprov-jdk15on:1.60' - testImplementation 'junit:junit:4.12' + testImplementation 'junit:junit:4.13' + testImplementation 'org.hamcrest:hamcrest:2.2' testImplementation 'org.mockito:mockito-core:2.7.22' androidTestImplementation 'com.android.support:support-annotations:27.1.1' diff --git a/app/src/full/java/org/fdroid/fdroid/nearby/LocalRepoManager.java b/app/src/full/java/org/fdroid/fdroid/nearby/LocalRepoManager.java index e5f8d7f13..336e2db0b 100644 --- a/app/src/full/java/org/fdroid/fdroid/nearby/LocalRepoManager.java +++ b/app/src/full/java/org/fdroid/fdroid/nearby/LocalRepoManager.java @@ -414,7 +414,7 @@ public final class LocalRepoManager { tag("lastupdated", app.lastUpdated); tag("name", app.name); tag("summary", app.summary); - tag("icon", app.icon); + tag("icon", app.iconFromApk); tag("desc", app.description); tag("license", "Unknown"); tag("categories", "LocalRepo," + Preferences.get().getLocalRepoName()); diff --git a/app/src/full/java/org/fdroid/fdroid/nearby/SwapSuccessView.java b/app/src/full/java/org/fdroid/fdroid/nearby/SwapSuccessView.java index c6ef14113..14a343f26 100644 --- a/app/src/full/java/org/fdroid/fdroid/nearby/SwapSuccessView.java +++ b/app/src/full/java/org/fdroid/fdroid/nearby/SwapSuccessView.java @@ -309,7 +309,7 @@ public class SwapSuccessView extends SwapView implements LoaderManager.LoaderCal nameView.setText(app.name); } - ImageLoader.getInstance().displayImage(app.iconUrl, iconView, Utils.getRepoAppDisplayImageOptions()); + ImageLoader.getInstance().displayImage(app.getIconUrl(iconView.getContext()), iconView, Utils.getRepoAppDisplayImageOptions()); if (app.hasUpdates()) { btnInstall.setText(R.string.menu_upgrade); diff --git a/app/src/main/java/org/fdroid/fdroid/NotificationHelper.java b/app/src/main/java/org/fdroid/fdroid/NotificationHelper.java index 27c7525e9..ac5149a69 100644 --- a/app/src/main/java/org/fdroid/fdroid/NotificationHelper.java +++ b/app/src/main/java/org/fdroid/fdroid/NotificationHelper.java @@ -493,7 +493,7 @@ class NotificationHelper { private Bitmap getLargeIconForEntry(AppUpdateStatusManager.AppUpdateStatus entry) { final Point largeIconSize = getLargeIconSize(); Bitmap iconLarge = null; - if (TextUtils.isEmpty(entry.app.iconUrl)) { + if (TextUtils.isEmpty(entry.app.getIconUrl(context))) { return null; } else if (entry.status == AppUpdateStatusManager.Status.Downloading || entry.status == AppUpdateStatusManager.Status.Installing) { @@ -505,12 +505,12 @@ class NotificationHelper { downloadIcon.draw(canvas); } return bitmap; - } else if (DiskCacheUtils.findInCache(entry.app.iconUrl, ImageLoader.getInstance().getDiskCache()) != null) { + } else if (DiskCacheUtils.findInCache(entry.app.getIconUrl(context), ImageLoader.getInstance().getDiskCache()) != null) { iconLarge = ImageLoader.getInstance().loadImageSync( - entry.app.iconUrl, new ImageSize(largeIconSize.x, largeIconSize.y)); + entry.app.getIconUrl(context), new ImageSize(largeIconSize.x, largeIconSize.y)); } else { // Load it for later! - ImageLoader.getInstance().loadImage(entry.app.iconUrl, new ImageSize(largeIconSize.x, largeIconSize.y), new ImageLoadingListener() { + ImageLoader.getInstance().loadImage(entry.app.getIconUrl(context), new ImageSize(largeIconSize.x, largeIconSize.y), new ImageLoadingListener() { AppUpdateStatusManager.AppUpdateStatus entry; @@ -536,8 +536,8 @@ class NotificationHelper { AppUpdateStatusManager.AppUpdateStatus oldEntry = appUpdateStatusManager.get(entry.getCanonicalUrl()); if (oldEntry != null && oldEntry.app != null - && oldEntry.app.iconUrl != null - && DiskCacheUtils.findInCache(oldEntry.app.iconUrl, ImageLoader.getInstance().getDiskCache()) != null) { + && oldEntry.app.getIconUrl(context) != null + && DiskCacheUtils.findInCache(oldEntry.app.getIconUrl(context), ImageLoader.getInstance().getDiskCache()) != null) { createNotification(oldEntry); // Update with new image! } } diff --git a/app/src/main/java/org/fdroid/fdroid/Utils.java b/app/src/main/java/org/fdroid/fdroid/Utils.java index 12653ff42..431ae7a13 100644 --- a/app/src/main/java/org/fdroid/fdroid/Utils.java +++ b/app/src/main/java/org/fdroid/fdroid/Utils.java @@ -49,12 +49,15 @@ import android.util.Log; import android.util.TypedValue; import android.view.View; import android.view.ViewTreeObserver; +import android.widget.ImageView; import android.widget.Toast; import com.nostra13.universalimageloader.core.DisplayImageOptions; +import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.assist.ImageScaleType; import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer; import com.nostra13.universalimageloader.utils.StorageUtils; import org.fdroid.fdroid.compat.FileCompat; +import org.fdroid.fdroid.data.App; import org.fdroid.fdroid.data.Repo; import org.fdroid.fdroid.data.SanitizedFile; import org.xml.sax.XMLReader; @@ -486,6 +489,26 @@ public final class Utils { return repoAppDisplayImageOptions; } + /** + * If app has an iconUrl we feed that to UIL, otherwise we ask the PackageManager which will + * return the app's icon directly when the app is installed. + * We fall back to the placeholder icon otherwise. + */ + public static void setIconFromRepoOrPM(@NonNull App app, ImageView iv, Context context) { + if (app.getIconUrl(iv.getContext()) == null) { + try { + iv.setImageDrawable(context.getPackageManager().getApplicationIcon(app.packageName)); + } catch (PackageManager.NameNotFoundException e) { + DisplayImageOptions options = Utils.getRepoAppDisplayImageOptions(); + iv.setImageDrawable(options.shouldShowImageForEmptyUri() + ? options.getImageForEmptyUri(FDroidApp.getInstance().getResources()) + : null); + } + } else { + ImageLoader.getInstance().displayImage(app.getIconUrl(iv.getContext()), iv, Utils.getRepoAppDisplayImageOptions()); + } + } + // this is all new stuff being added public static String hashBytes(byte[] input, String algo) { try { diff --git a/app/src/main/java/org/fdroid/fdroid/data/App.java b/app/src/main/java/org/fdroid/fdroid/data/App.java index f86bb71ba..77bf4560b 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/App.java +++ b/app/src/main/java/org/fdroid/fdroid/data/App.java @@ -19,9 +19,11 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.text.TextUtils; import android.util.Log; + import com.fasterxml.jackson.annotation.JacksonInject; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; + import org.apache.commons.io.filefilter.RegexFileFilter; import org.fdroid.fdroid.FDroidApp; import org.fdroid.fdroid.Preferences; @@ -116,7 +118,8 @@ public class App extends ValueObject implements Comparable, Parcelable { public String name = "Unknown"; public String summary = "Unknown application"; - public String icon; + @JsonProperty("icon") + public String iconFromApk; public String description; @@ -215,9 +218,10 @@ public class App extends ValueObject implements Comparable, Parcelable { public String[] requirements; /** - * URL to download the app's icon. + * URL to download the app's icon. (Set only from localized block, see also + * {@link #iconFromApk} and {@link #getIconUrl(Context)} */ - public String iconUrl; + private String iconUrl; public static String getIconName(String packageName, int versionCode) { return packageName + "_" + versionCode + ".png"; @@ -258,7 +262,7 @@ public class App extends ValueObject implements Comparable, Parcelable { summary = cursor.getString(i); break; case Cols.ICON: - icon = cursor.getString(i); + iconFromApk = cursor.getString(i); break; case Cols.DESCRIPTION: description = cursor.getString(i); @@ -567,6 +571,10 @@ public class App extends ValueObject implements Comparable, Parcelable { if (!TextUtils.isEmpty(value)) { description = formatDescription(value); } + value = getLocalizedGraphicsEntry(localized, localesToUse, "icon"); + if (!TextUtils.isEmpty(value)) { + iconUrl = value; + } featureGraphic = getLocalizedGraphicsEntry(localized, localesToUse, "featureGraphic"); promoGraphic = getLocalizedGraphicsEntry(localized, localesToUse, "promoGraphic"); @@ -656,6 +664,28 @@ public class App extends ValueObject implements Comparable, Parcelable { return description.replace("\n", "
"); } + public String getIconUrl(Context context) { + Repo repo = RepoProvider.Helper.findById(context, repoId); + if (TextUtils.isEmpty(iconUrl)) { + if (TextUtils.isEmpty(iconFromApk)){ + return null; + } + if (iconFromApk.endsWith(".xml")){ + // We cannot use xml ressources as icons. F-Droid server should not include them + // https://gitlab.com/fdroid/fdroidserver/issues/344 + return null; + } + String iconsDir; + if (repo.version >= Repo.VERSION_DENSITY_SPECIFIC_ICONS) { + iconsDir = Utils.getIconsDir(context, 1.0); + } else { + iconsDir = Utils.FALLBACK_ICONS_DIR; + } + return repo.address + iconsDir + iconFromApk; + } + return repo.address + "/" + packageName + "/" + iconUrl; + } + public String getFeatureGraphicUrl(Context context) { if (TextUtils.isEmpty(featureGraphic)) { return null; @@ -756,7 +786,7 @@ public class App extends ValueObject implements Comparable, Parcelable { + ", last updated on " + this.lastUpdated + ")

"; this.name = (String) appInfo.loadLabel(pm); - this.icon = getIconName(packageName, packageInfo.versionCode); + this.iconFromApk = getIconName(packageName, packageInfo.versionCode); this.installedVersionName = packageInfo.versionName; this.installedVersionCode = packageInfo.versionCode; this.compatible = true; @@ -943,7 +973,7 @@ public class App extends ValueObject implements Comparable, Parcelable { values.put(Cols.NAME, name); values.put(Cols.REPO_ID, repoId); values.put(Cols.SUMMARY, summary); - values.put(Cols.ICON, icon); + values.put(Cols.ICON, iconFromApk); values.put(Cols.ICON_URL, iconUrl); values.put(Cols.DESCRIPTION, description); values.put(Cols.WHATSNEW, whatsNew); @@ -1173,7 +1203,7 @@ public class App extends ValueObject implements Comparable, Parcelable { dest.writeString(this.name); dest.writeLong(this.repoId); dest.writeString(this.summary); - dest.writeString(this.icon); + dest.writeString(this.iconFromApk); dest.writeString(this.description); dest.writeString(this.whatsNew); dest.writeString(this.license); @@ -1224,7 +1254,7 @@ public class App extends ValueObject implements Comparable, Parcelable { this.name = in.readString(); this.repoId = in.readLong(); this.summary = in.readString(); - this.icon = in.readString(); + this.iconFromApk = in.readString(); this.description = in.readString(); this.whatsNew = in.readString(); this.license = in.readString(); diff --git a/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java b/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java index 7cd30f4f9..1b1939674 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java +++ b/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java @@ -1007,8 +1007,6 @@ public class AppProvider extends FDroidProvider { updatePreferredMetadata(); updateCompatibleFlags(); updateSuggestedFromUpstream(null); - updateSuggestedFromLatest(null); - updateIconUrls(); } /** @@ -1182,51 +1180,4 @@ public class AppProvider extends FDroidProvider { LoggingQuery.execSQL(db(), updateSql, args); } - - private void updateIconUrls() { - final String appTable = getTableName(); - final String iconsDir = Utils.getIconsDir(getContext(), 1.0); - String repoVersion = Integer.toString(Repo.VERSION_DENSITY_SPECIFIC_ICONS); - Utils.debugLog(TAG, "Updating icon paths for apps belonging to repos with version >= " + repoVersion); - Utils.debugLog(TAG, "Using icons dir '" + iconsDir + "'"); - String query = getIconUpdateQuery(appTable); - final String[] params = { - repoVersion, iconsDir, Utils.FALLBACK_ICONS_DIR, - }; - db().execSQL(query, params); - } - - /** - * Returns a query which requires two parameters to be bound. These are (in order): - * 1) The repo version that introduced density specific icons - * 2) The dir to density specific icons for the current device. - */ - private static String getIconUpdateQuery(String app) { - - final String repo = RepoTable.NAME; - - final String iconUrlQuery = - "SELECT " + - - // Concatenate (using the "||" operator) the address, the - // icons directory (bound to the ? as the second parameter - // when executing the query) and the icon path. - "( " + - repo + "." + RepoTable.Cols.ADDRESS + - " || " + - - // If the repo has the relevant version, then use a more - // intelligent icons dir, otherwise revert to the default - // one - " CASE WHEN " + repo + "." + RepoTable.Cols.VERSION + " >= ? THEN ? ELSE ? END " + - - " || " + - app + "." + Cols.ICON + - ") " + - " FROM " + - repo + " WHERE " + repo + "." + RepoTable.Cols._ID + " = " + app + "." + Cols.REPO_ID; - return "UPDATE " + app + " SET " - + Cols.ICON_URL + " = ( " + iconUrlQuery + " )"; - } - } diff --git a/app/src/main/java/org/fdroid/fdroid/data/DBHelper.java b/app/src/main/java/org/fdroid/fdroid/data/DBHelper.java index 11deee710..ec3cf3563 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/DBHelper.java +++ b/app/src/main/java/org/fdroid/fdroid/data/DBHelper.java @@ -227,7 +227,7 @@ public class DBHelper extends SQLiteOpenHelper { + "primary key(" + ApkAntiFeatureJoinTable.Cols.APK_ID + ", " + ApkAntiFeatureJoinTable.Cols.ANTI_FEATURE_ID + ") " + " );"; - protected static final int DB_VERSION = 83; + protected static final int DB_VERSION = 84; private final Context context; @@ -456,6 +456,15 @@ public class DBHelper extends SQLiteOpenHelper { addIsLocalized(db, oldVersion); addTranslation(db, oldVersion); switchRepoArchivePriorities(db, oldVersion); + deleteOldIconUrls(db, oldVersion); + } + + private void deleteOldIconUrls(SQLiteDatabase db, int oldVersion) { + if (oldVersion >= 84) { + return; + } + Utils.debugLog(TAG, "Clearing iconUrl field to enable localized icons on next update"); + db.execSQL("UPDATE " + AppMetadataTable.NAME + " SET " + AppMetadataTable.Cols.ICON_URL + "= NULL"); } private void switchRepoArchivePriorities(SQLiteDatabase db, int oldVersion) { diff --git a/app/src/main/java/org/fdroid/fdroid/data/RepoXMLHandler.java b/app/src/main/java/org/fdroid/fdroid/data/RepoXMLHandler.java index 6e5e55160..1110a2412 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/RepoXMLHandler.java +++ b/app/src/main/java/org/fdroid/fdroid/data/RepoXMLHandler.java @@ -214,7 +214,7 @@ public class RepoXMLHandler extends DefaultHandler { curapp.name = str; break; case "icon": - curapp.icon = str; + curapp.iconFromApk = str; break; case "description": // This is the old-style description. We'll read it diff --git a/app/src/main/java/org/fdroid/fdroid/privileged/views/InstallConfirmActivity.java b/app/src/main/java/org/fdroid/fdroid/privileged/views/InstallConfirmActivity.java index fb450594f..051884d78 100644 --- a/app/src/main/java/org/fdroid/fdroid/privileged/views/InstallConfirmActivity.java +++ b/app/src/main/java/org/fdroid/fdroid/privileged/views/InstallConfirmActivity.java @@ -76,7 +76,7 @@ public class InstallConfirmActivity extends FragmentActivity implements OnCancel TabHost tabHost = (TabHost) findViewById(android.R.id.tabhost); appName.setText(app.name); - ImageLoader.getInstance().displayImage(app.iconUrl, appIcon, + ImageLoader.getInstance().displayImage(app.getIconUrl(this), appIcon, Utils.getRepoAppDisplayImageOptions()); tabHost.setup(); diff --git a/app/src/main/java/org/fdroid/fdroid/views/AppDetailsActivity.java b/app/src/main/java/org/fdroid/fdroid/views/AppDetailsActivity.java index 4af3ea8f5..94008a507 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/AppDetailsActivity.java +++ b/app/src/main/java/org/fdroid/fdroid/views/AppDetailsActivity.java @@ -149,7 +149,7 @@ public class AppDetailsActivity extends AppCompatActivity DisplayImageOptions displayImageOptions = Utils.getRepoAppDisplayImageOptions(); String featureGraphicUrl = app.getFeatureGraphicUrl(this); featureImage.loadImageAndDisplay(ImageLoader.getInstance(), displayImageOptions, - featureGraphicUrl, app.iconUrl); + featureGraphicUrl, app.getIconUrl(this)); } private String getPackageNameFromIntent(Intent intent) { diff --git a/app/src/main/java/org/fdroid/fdroid/views/AppDetailsRecyclerViewAdapter.java b/app/src/main/java/org/fdroid/fdroid/views/AppDetailsRecyclerViewAdapter.java index 6c8b24cb8..e6287e50f 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/AppDetailsRecyclerViewAdapter.java +++ b/app/src/main/java/org/fdroid/fdroid/views/AppDetailsRecyclerViewAdapter.java @@ -480,7 +480,7 @@ public class AppDetailsRecyclerViewAdapter } public void bindModel() { - ImageLoader.getInstance().displayImage(app.iconUrl, iconView, Utils.getRepoAppDisplayImageOptions()); + Utils.setIconFromRepoOrPM(app, iconView, iconView.getContext()); titleView.setText(app.name); if (!TextUtils.isEmpty(app.authorName)) { authorView.setText(context.getString(R.string.by_author_format, app.authorName)); diff --git a/app/src/main/java/org/fdroid/fdroid/views/apps/AppListItemController.java b/app/src/main/java/org/fdroid/fdroid/views/apps/AppListItemController.java index ab30d3a6f..ac7b62a25 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/apps/AppListItemController.java +++ b/app/src/main/java/org/fdroid/fdroid/views/apps/AppListItemController.java @@ -191,18 +191,7 @@ public abstract class AppListItemController extends RecyclerView.ViewHolder { if (actionButton != null) actionButton.setEnabled(true); - if (app.iconUrl == null) { - try { - icon.setImageDrawable(activity.getPackageManager().getApplicationIcon(app.packageName)); - } catch (PackageManager.NameNotFoundException e) { - DisplayImageOptions options = Utils.getRepoAppDisplayImageOptions(); - icon.setImageDrawable(options.shouldShowImageForEmptyUri() - ? options.getImageForEmptyUri(FDroidApp.getInstance().getResources()) - : null); - } - } else { - ImageLoader.getInstance().displayImage(app.iconUrl, icon, Utils.getRepoAppDisplayImageOptions()); - } + Utils.setIconFromRepoOrPM(app, icon, activity); // Figures out the current install/update/download/etc status for the app we are viewing. // Then, asks the view to update itself to reflect this status. diff --git a/app/src/main/java/org/fdroid/fdroid/views/categories/AppCardController.java b/app/src/main/java/org/fdroid/fdroid/views/categories/AppCardController.java index ee1c87553..00639e6fd 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/categories/AppCardController.java +++ b/app/src/main/java/org/fdroid/fdroid/views/categories/AppCardController.java @@ -95,8 +95,7 @@ public class AppCardController extends RecyclerView.ViewHolder newTag.setVisibility(View.GONE); } } - - ImageLoader.getInstance().displayImage(app.iconUrl, icon, Utils.getRepoAppDisplayImageOptions()); + Utils.setIconFromRepoOrPM(app, icon, icon.getContext()); } private boolean isConsideredNew(@NonNull App app) { diff --git a/app/src/main/java/org/fdroid/fdroid/views/categories/CategoryController.java b/app/src/main/java/org/fdroid/fdroid/views/categories/CategoryController.java index f06e25669..d2eab3b16 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/categories/CategoryController.java +++ b/app/src/main/java/org/fdroid/fdroid/views/categories/CategoryController.java @@ -154,6 +154,8 @@ public class CategoryController extends RecyclerView.ViewHolder implements Loade Schema.AppMetadataTable.Cols.Package.PACKAGE_NAME, Schema.AppMetadataTable.Cols.SUMMARY, Schema.AppMetadataTable.Cols.ICON_URL, + Schema.AppMetadataTable.Cols.ICON, + Schema.AppMetadataTable.Cols.REPO_ID, }, null, null, @@ -167,7 +169,7 @@ public class CategoryController extends RecyclerView.ViewHolder implements Loade int topAppsId = currentCategory.hashCode(); int countAllAppsId = topAppsId + 1; - // Anything other than these IDs indicates that the loader which just finished finished + // Anything other than these IDs indicates that the loader which just finished // is no longer the one this view holder is interested in, due to the user having // scrolled away already during the asynchronous query being run. if (loader.getId() == topAppsId) { diff --git a/app/src/test/java/org/fdroid/fdroid/updater/AppIconsTest.java b/app/src/test/java/org/fdroid/fdroid/updater/AppIconsTest.java index 195a1c262..ccf850ecf 100644 --- a/app/src/test/java/org/fdroid/fdroid/updater/AppIconsTest.java +++ b/app/src/test/java/org/fdroid/fdroid/updater/AppIconsTest.java @@ -1,6 +1,7 @@ package org.fdroid.fdroid.updater; import android.content.ContentValues; + import org.fdroid.fdroid.BuildConfig; import org.fdroid.fdroid.IndexUpdater; import org.fdroid.fdroid.data.App; @@ -8,13 +9,14 @@ import org.fdroid.fdroid.data.AppProvider; import org.fdroid.fdroid.data.Repo; import org.fdroid.fdroid.data.RepoProvider; import org.fdroid.fdroid.data.Schema; +import org.hamcrest.text.MatchesPattern; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; -import static org.junit.Assert.assertEquals; +import static org.hamcrest.MatcherAssert.assertThat; /** * Check whether app icons are loaded from the correct repository. The repository with the @@ -42,7 +44,7 @@ public class AppIconsTest extends MultiIndexUpdaterTest { updateMain(); updateArchive(); - assertIconUrl("https://f-droid.org/repo/icons/org.adaway.54.png"); + assertIconUrl("^https://f-droid\\.org/repo/icons-[0-9]{3}/org\\.adaway\\.54\\.png$"); } @Test @@ -53,7 +55,7 @@ public class AppIconsTest extends MultiIndexUpdaterTest { updateMain(); updateArchive(); - assertIconUrl("https://f-droid.org/archive/icons/org.adaway.54.png"); + assertIconUrl("^https://f-droid\\.org/archive/icons-[0-9]{3}/org\\.adaway\\.54.png$"); } private void setRepoPriority(String repoUri, int priority) { @@ -66,9 +68,10 @@ public class AppIconsTest extends MultiIndexUpdaterTest { private void assertIconUrl(String expectedUrl) { App app = AppProvider.Helper.findHighestPriorityMetadata(context.getContentResolver(), - "org.adaway", new String[]{Schema.AppMetadataTable.Cols.ICON_URL}); - - assertEquals(app.iconUrl, expectedUrl); + "org.adaway", new String[]{ + Schema.AppMetadataTable.Cols.ICON_URL, + Schema.AppMetadataTable.Cols.ICON, + Schema.AppMetadataTable.Cols.REPO_ID}); + assertThat(app.getIconUrl(context), MatchesPattern.matchesPattern(expectedUrl)); } - } diff --git a/app/src/test/java/org/fdroid/fdroid/updater/IndexV1UpdaterTest.java b/app/src/test/java/org/fdroid/fdroid/updater/IndexV1UpdaterTest.java index c1205cc1e..b8b95133e 100644 --- a/app/src/test/java/org/fdroid/fdroid/updater/IndexV1UpdaterTest.java +++ b/app/src/test/java/org/fdroid/fdroid/updater/IndexV1UpdaterTest.java @@ -27,6 +27,7 @@ import org.fdroid.fdroid.data.Repo; import org.fdroid.fdroid.data.RepoProvider; import org.fdroid.fdroid.data.RepoPushRequest; import org.fdroid.fdroid.data.RepoXMLHandlerTest; +import org.fdroid.fdroid.data.Schema; import org.fdroid.fdroid.mock.RepoDetails; import org.junit.Before; import org.junit.Test; @@ -143,6 +144,14 @@ public class IndexV1UpdaterTest extends FDroidProviderTest { assertTrue(requestedPermissions.contains(android.Manifest.permission.READ_EXTERNAL_STORAGE)); assertTrue(requestedPermissions.contains(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)); assertFalse(requestedPermissions.contains(android.Manifest.permission.READ_CALENDAR)); + App app = AppProvider.Helper.findHighestPriorityMetadata(context.getContentResolver(), + "com.autonavi.minimap", new String[]{ + Schema.AppMetadataTable.Cols.ICON_URL, + Schema.AppMetadataTable.Cols.ICON, + Schema.AppMetadataTable.Cols.REPO_ID, + Schema.AppMetadataTable.Cols.Package.PACKAGE_NAME}); + assertEquals("localized icon takes precedence", TESTY_CANONICAL_URL + "/" + + app.packageName + "/en-US/icon.png", app.getIconUrl(context)); } @Test(expected = IndexUpdater.SigningException.class) @@ -312,7 +321,7 @@ public class IndexV1UpdaterTest extends FDroidProviderTest { "donate", "featureGraphic", "flattrID", - "icon", + "iconFromApk", "iconUrl", "issueTracker", "lastUpdated",