Merge branch 'latest-apps-criteria' into 'master'

Latest apps criteria

See merge request fdroid/fdroidclient!805
This commit is contained in:
Hans-Christoph Steiner 2019-03-26 15:17:09 +00:00
commit 99591c050c
9 changed files with 118 additions and 14 deletions

View File

@ -204,7 +204,8 @@ public class MainActivityEspressoTest {
allOf(withText(R.string.main_menu__swap_nearby), isDisplayed())); allOf(withText(R.string.main_menu__swap_nearby), isDisplayed()));
nearbyBottonNavButton.perform(click()); nearbyBottonNavButton.perform(click());
ViewInteraction findPeopleButton = onView( ViewInteraction findPeopleButton = onView(
allOf(withId(R.id.find_people_button), withText(R.string.nearby_splash__find_people_button), isDisplayed())); allOf(withId(R.id.find_people_button), withText(R.string.nearby_splash__find_people_button),
isDisplayed()));
findPeopleButton.perform(click()); findPeopleButton.perform(click());
onView(withText(R.string.swap_send_fdroid)).check(matches(isDisplayed())); onView(withText(R.string.swap_send_fdroid)).check(matches(isDisplayed()));
} }

View File

@ -98,6 +98,8 @@ public class App extends ValueObject implements Comparable<App>, Parcelable {
public String preferredSigner; public String preferredSigner;
@JsonIgnore @JsonIgnore
public boolean isApk; public boolean isApk;
@JsonIgnore
private boolean isLocalized = false;
/** /**
* This is primarily for the purpose of saving app metadata when parsing an index.xml file. * This is primarily for the purpose of saving app metadata when parsing an index.xml file.
@ -144,6 +146,8 @@ public class App extends ValueObject implements Comparable<App>, Parcelable {
public String sourceCode; public String sourceCode;
public String translation;
public String video; public String video;
public String changelog; public String changelog;
@ -271,6 +275,9 @@ public class App extends ValueObject implements Comparable<App>, Parcelable {
case Cols.SOURCE_CODE: case Cols.SOURCE_CODE:
sourceCode = cursor.getString(i); sourceCode = cursor.getString(i);
break; break;
case Cols.TRANSLATION:
translation = cursor.getString(i);
break;
case Cols.VIDEO: case Cols.VIDEO:
video = cursor.getString(i); video = cursor.getString(i);
break; break;
@ -349,6 +356,9 @@ public class App extends ValueObject implements Comparable<App>, Parcelable {
case Cols.IS_APK: case Cols.IS_APK:
isApk = cursor.getInt(i) == 1; isApk = cursor.getInt(i) == 1;
break; break;
case Cols.IS_LOCALIZED:
isLocalized = cursor.getInt(i) == 1;
break;
case Cols.InstalledApp.VERSION_CODE: case Cols.InstalledApp.VERSION_CODE:
installedVersionCode = cursor.getInt(i); installedVersionCode = cursor.getInt(i);
break; break;
@ -468,6 +478,10 @@ public class App extends ValueObject implements Comparable<App>, Parcelable {
*/ */
@JsonProperty("localized") @JsonProperty("localized")
private void setLocalized(Map<String, Map<String, Object>> localized) { // NOPMD private void setLocalized(Map<String, Map<String, Object>> localized) { // NOPMD
if (localized.size() > 1) {
isLocalized = true;
}
Locale defaultLocale = Locale.getDefault(); Locale defaultLocale = Locale.getDefault();
String languageTag = defaultLocale.getLanguage(); String languageTag = defaultLocale.getLanguage();
String countryTag = defaultLocale.getCountry(); String countryTag = defaultLocale.getCountry();
@ -927,6 +941,7 @@ public class App extends ValueObject implements Comparable<App>, Parcelable {
values.put(Cols.WEBSITE, webSite); values.put(Cols.WEBSITE, webSite);
values.put(Cols.ISSUE_TRACKER, issueTracker); values.put(Cols.ISSUE_TRACKER, issueTracker);
values.put(Cols.SOURCE_CODE, sourceCode); values.put(Cols.SOURCE_CODE, sourceCode);
values.put(Cols.TRANSLATION, translation);
values.put(Cols.VIDEO, video); values.put(Cols.VIDEO, video);
values.put(Cols.CHANGELOG, changelog); values.put(Cols.CHANGELOG, changelog);
values.put(Cols.DONATE, donate); values.put(Cols.DONATE, donate);
@ -953,6 +968,7 @@ public class App extends ValueObject implements Comparable<App>, Parcelable {
values.put(Cols.WEAR_SCREENSHOTS, Utils.serializeCommaSeparatedString(wearScreenshots)); values.put(Cols.WEAR_SCREENSHOTS, Utils.serializeCommaSeparatedString(wearScreenshots));
values.put(Cols.IS_COMPATIBLE, compatible ? 1 : 0); values.put(Cols.IS_COMPATIBLE, compatible ? 1 : 0);
values.put(Cols.IS_APK, isApk ? 1 : 0); values.put(Cols.IS_APK, isApk ? 1 : 0);
values.put(Cols.IS_LOCALIZED, isLocalized ? 1 : 0);
return values; return values;
} }
@ -1151,6 +1167,7 @@ public class App extends ValueObject implements Comparable<App>, Parcelable {
dest.writeString(this.webSite); dest.writeString(this.webSite);
dest.writeString(this.issueTracker); dest.writeString(this.issueTracker);
dest.writeString(this.sourceCode); dest.writeString(this.sourceCode);
dest.writeString(this.translation);
dest.writeString(this.video); dest.writeString(this.video);
dest.writeString(this.changelog); dest.writeString(this.changelog);
dest.writeString(this.donate); dest.writeString(this.donate);
@ -1178,6 +1195,7 @@ public class App extends ValueObject implements Comparable<App>, Parcelable {
dest.writeStringArray(this.tvScreenshots); dest.writeStringArray(this.tvScreenshots);
dest.writeStringArray(this.wearScreenshots); dest.writeStringArray(this.wearScreenshots);
dest.writeByte(this.isApk ? (byte) 1 : (byte) 0); dest.writeByte(this.isApk ? (byte) 1 : (byte) 0);
dest.writeByte(this.isLocalized ? (byte) 1 : (byte) 0);
dest.writeString(this.installedVersionName); dest.writeString(this.installedVersionName);
dest.writeInt(this.installedVersionCode); dest.writeInt(this.installedVersionCode);
dest.writeParcelable(this.installedApk, flags); dest.writeParcelable(this.installedApk, flags);
@ -1200,6 +1218,7 @@ public class App extends ValueObject implements Comparable<App>, Parcelable {
this.webSite = in.readString(); this.webSite = in.readString();
this.issueTracker = in.readString(); this.issueTracker = in.readString();
this.sourceCode = in.readString(); this.sourceCode = in.readString();
this.translation = in.readString();
this.video = in.readString(); this.video = in.readString();
this.changelog = in.readString(); this.changelog = in.readString();
this.donate = in.readString(); this.donate = in.readString();
@ -1229,6 +1248,7 @@ public class App extends ValueObject implements Comparable<App>, Parcelable {
this.tvScreenshots = in.createStringArray(); this.tvScreenshots = in.createStringArray();
this.wearScreenshots = in.createStringArray(); this.wearScreenshots = in.createStringArray();
this.isApk = in.readByte() != 0; this.isApk = in.readByte() != 0;
this.isLocalized = in.readByte() != 0;
this.installedVersionName = in.readString(); this.installedVersionName = in.readString();
this.installedVersionCode = in.readInt(); this.installedVersionCode = in.readInt();
this.installedApk = in.readParcelable(Apk.class.getClassLoader()); this.installedApk = in.readParcelable(Apk.class.getClassLoader());

View File

@ -143,6 +143,7 @@ public class DBHelper extends SQLiteOpenHelper {
+ AppMetadataTable.Cols.WEBSITE + " text, " + AppMetadataTable.Cols.WEBSITE + " text, "
+ AppMetadataTable.Cols.ISSUE_TRACKER + " text, " + AppMetadataTable.Cols.ISSUE_TRACKER + " text, "
+ AppMetadataTable.Cols.SOURCE_CODE + " text, " + AppMetadataTable.Cols.SOURCE_CODE + " text, "
+ AppMetadataTable.Cols.TRANSLATION + " text, "
+ AppMetadataTable.Cols.VIDEO + " string, " + AppMetadataTable.Cols.VIDEO + " string, "
+ AppMetadataTable.Cols.CHANGELOG + " text, " + AppMetadataTable.Cols.CHANGELOG + " text, "
+ AppMetadataTable.Cols.PREFERRED_SIGNER + " text," + AppMetadataTable.Cols.PREFERRED_SIGNER + " text,"
@ -169,6 +170,7 @@ public class DBHelper extends SQLiteOpenHelper {
+ AppMetadataTable.Cols.TV_SCREENSHOTS + " string," + AppMetadataTable.Cols.TV_SCREENSHOTS + " string,"
+ AppMetadataTable.Cols.WEAR_SCREENSHOTS + " string," + AppMetadataTable.Cols.WEAR_SCREENSHOTS + " string,"
+ AppMetadataTable.Cols.IS_APK + " boolean," + AppMetadataTable.Cols.IS_APK + " boolean,"
+ AppMetadataTable.Cols.IS_LOCALIZED + " boolean,"
+ "primary key(" + AppMetadataTable.Cols.PACKAGE_ID + ", " + AppMetadataTable.Cols.REPO_ID + "));"; + "primary key(" + AppMetadataTable.Cols.PACKAGE_ID + ", " + AppMetadataTable.Cols.REPO_ID + "));";
private static final String CREATE_TABLE_APP_PREFS = "CREATE TABLE " + AppPrefsTable.NAME private static final String CREATE_TABLE_APP_PREFS = "CREATE TABLE " + AppPrefsTable.NAME
@ -224,7 +226,7 @@ public class DBHelper extends SQLiteOpenHelper {
+ "primary key(" + ApkAntiFeatureJoinTable.Cols.APK_ID + ", " + ApkAntiFeatureJoinTable.Cols.ANTI_FEATURE_ID + ") " + "primary key(" + ApkAntiFeatureJoinTable.Cols.APK_ID + ", " + ApkAntiFeatureJoinTable.Cols.ANTI_FEATURE_ID + ") "
+ " );"; + " );";
protected static final int DB_VERSION = 80; protected static final int DB_VERSION = 82;
private final Context context; private final Context context;
@ -450,6 +452,32 @@ public class DBHelper extends SQLiteOpenHelper {
addUserMirrorsFields(db, oldVersion); addUserMirrorsFields(db, oldVersion);
removeNotNullFromVersionName(db, oldVersion); removeNotNullFromVersionName(db, oldVersion);
addDisabledMirrorsFields(db, oldVersion); addDisabledMirrorsFields(db, oldVersion);
addIsLocalized(db, oldVersion);
addTranslation(db, oldVersion);
}
private void addTranslation(SQLiteDatabase db, int oldVersion) {
if (oldVersion >= 82) {
return;
}
if (!columnExists(db, AppMetadataTable.NAME, AppMetadataTable.Cols.TRANSLATION)) {
Utils.debugLog(TAG, "Adding " + AppMetadataTable.Cols.TRANSLATION + " field to "
+ AppMetadataTable.NAME + " table in db.");
db.execSQL("alter table " + AppMetadataTable.NAME + " add column "
+ AppMetadataTable.Cols.TRANSLATION + " string;");
}
}
private void addIsLocalized(SQLiteDatabase db, int oldVersion) {
if (oldVersion >= 81) {
return;
}
if (!columnExists(db, AppMetadataTable.NAME, AppMetadataTable.Cols.IS_LOCALIZED)) {
Utils.debugLog(TAG, "Adding " + AppMetadataTable.Cols.IS_LOCALIZED + " field to "
+ AppMetadataTable.NAME + " table in db.");
db.execSQL("alter table " + AppMetadataTable.NAME + " add column "
+ AppMetadataTable.Cols.IS_LOCALIZED + " boolean;");
}
} }
private void addDisabledMirrorsFields(SQLiteDatabase db, int oldVersion) { private void addDisabledMirrorsFields(SQLiteDatabase db, int oldVersion) {

View File

@ -12,11 +12,13 @@ public interface Schema {
/** /**
* A package is essentially the app that a developer builds and wants you to install on your * A package is essentially the app that a developer builds and wants you to install on your
* device. It differs from entries in: * device. It differs from entries in:
* * {@link ApkTable} because they are specific builds of a particular package. Many different * <ul>
* builds of the same package can exist. * <li>{@link ApkTable} because they are specific builds of a particular package. Many different
* * {@link AppMetadataTable} because this is metdata about a package which is specified by a * builds of the same package can exist.</li>
* <li>{@link AppMetadataTable} because this is metdata about a package which is specified by a
* given repo. Different repos can provide the same package with different descriptions, * given repo. Different repos can provide the same package with different descriptions,
* categories, etc. * categories, etc.</li>
* </ul>
*/ */
interface PackageTable { interface PackageTable {
@ -78,6 +80,7 @@ public interface Schema {
* An entry in this table signifies that an app is in a particular category. Each repo can * An entry in this table signifies that an app is in a particular category. Each repo can
* classify its apps in separate categories, and so the same record in {@link PackageTable} * classify its apps in separate categories, and so the same record in {@link PackageTable}
* can be in the same category multiple times, if multiple repos think that is the case. * can be in the same category multiple times, if multiple repos think that is the case.
*
* @see CategoryTable * @see CategoryTable
* @see AppMetadataTable * @see AppMetadataTable
*/ */
@ -90,12 +93,14 @@ public interface Schema {
/** /**
* Foreign key to {@link AppMetadataTable}. * Foreign key to {@link AppMetadataTable}.
*
* @see AppMetadataTable * @see AppMetadataTable
*/ */
String APP_METADATA_ID = "appMetadataId"; String APP_METADATA_ID = "appMetadataId";
/** /**
* Foreign key to {@link CategoryTable}. * Foreign key to {@link CategoryTable}.
*
* @see CategoryTable * @see CategoryTable
*/ */
String CATEGORY_ID = "categoryId"; String CATEGORY_ID = "categoryId";
@ -121,6 +126,7 @@ public interface Schema {
/** /**
* An entry in this table signifies that an apk has a particular anti feature. * An entry in this table signifies that an apk has a particular anti feature.
*
* @see AntiFeatureTable * @see AntiFeatureTable
* @see ApkTable * @see ApkTable
*/ */
@ -131,12 +137,14 @@ public interface Schema {
interface Cols { interface Cols {
/** /**
* Foreign key to {@link ApkTable}. * Foreign key to {@link ApkTable}.
*
* @see ApkTable * @see ApkTable
*/ */
String APK_ID = "apkId"; String APK_ID = "apkId";
/** /**
* Foreign key to {@link AntiFeatureTable}. * Foreign key to {@link AntiFeatureTable}.
*
* @see AntiFeatureTable * @see AntiFeatureTable
*/ */
String ANTI_FEATURE_ID = "antiFeatureId"; String ANTI_FEATURE_ID = "antiFeatureId";
@ -174,6 +182,7 @@ public interface Schema {
String WEBSITE = "webURL"; String WEBSITE = "webURL";
String ISSUE_TRACKER = "trackerURL"; String ISSUE_TRACKER = "trackerURL";
String SOURCE_CODE = "sourceURL"; String SOURCE_CODE = "sourceURL";
String TRANSLATION = "translation";
String VIDEO = "video"; String VIDEO = "video";
String CHANGELOG = "changelogURL"; String CHANGELOG = "changelogURL";
String DONATE = "donateURL"; String DONATE = "donateURL";
@ -199,6 +208,7 @@ public interface Schema {
String TV_SCREENSHOTS = "tvScreenshots"; String TV_SCREENSHOTS = "tvScreenshots";
String WEAR_SCREENSHOTS = "wearScreenshots"; String WEAR_SCREENSHOTS = "wearScreenshots";
String IS_APK = "isApk"; String IS_APK = "isApk";
String IS_LOCALIZED = "isLocalized";
interface SuggestedApk { interface SuggestedApk {
String VERSION_NAME = "suggestedApkVersion"; String VERSION_NAME = "suggestedApkVersion";
@ -233,28 +243,29 @@ public interface Schema {
String[] ALL_COLS = { String[] ALL_COLS = {
ROW_ID, PACKAGE_ID, REPO_ID, IS_COMPATIBLE, NAME, SUMMARY, ICON, DESCRIPTION, ROW_ID, PACKAGE_ID, REPO_ID, IS_COMPATIBLE, NAME, SUMMARY, ICON, DESCRIPTION,
WHATSNEW, LICENSE, AUTHOR_NAME, AUTHOR_EMAIL, WEBSITE, ISSUE_TRACKER, SOURCE_CODE, WHATSNEW, LICENSE, AUTHOR_NAME, AUTHOR_EMAIL, WEBSITE, ISSUE_TRACKER, SOURCE_CODE,
VIDEO, CHANGELOG, DONATE, BITCOIN, LITECOIN, FLATTR_ID, LIBERAPAY_ID, TRANSLATION, VIDEO, CHANGELOG, DONATE, BITCOIN, LITECOIN, FLATTR_ID, LIBERAPAY_ID,
UPSTREAM_VERSION_NAME, UPSTREAM_VERSION_CODE, ADDED, LAST_UPDATED, UPSTREAM_VERSION_NAME, UPSTREAM_VERSION_CODE, ADDED, LAST_UPDATED,
ANTI_FEATURES, REQUIREMENTS, ICON_URL, ANTI_FEATURES, REQUIREMENTS, ICON_URL,
FEATURE_GRAPHIC, PROMO_GRAPHIC, TV_BANNER, PHONE_SCREENSHOTS, FEATURE_GRAPHIC, PROMO_GRAPHIC, TV_BANNER, PHONE_SCREENSHOTS,
SEVEN_INCH_SCREENSHOTS, TEN_INCH_SCREENSHOTS, TV_SCREENSHOTS, WEAR_SCREENSHOTS, SEVEN_INCH_SCREENSHOTS, TEN_INCH_SCREENSHOTS, TV_SCREENSHOTS, WEAR_SCREENSHOTS,
PREFERRED_SIGNER, SUGGESTED_VERSION_CODE, IS_APK, PREFERRED_SIGNER, SUGGESTED_VERSION_CODE, IS_APK, IS_LOCALIZED,
}; };
/** /**
* Superset of {@link Cols#ALL_COLS} including fields from other tables and also an alias * Superset of {@link Cols#ALL_COLS} including fields from other tables and also an alias
* to satisfy the Android requirement for an "_ID" field. * to satisfy the Android requirement for an "_ID" field.
*
* @see Cols#ALL_COLS * @see Cols#ALL_COLS
*/ */
String[] ALL = { String[] ALL = {
_ID, ROW_ID, REPO_ID, IS_COMPATIBLE, NAME, SUMMARY, ICON, DESCRIPTION, _ID, ROW_ID, REPO_ID, IS_COMPATIBLE, NAME, SUMMARY, ICON, DESCRIPTION,
WHATSNEW, LICENSE, AUTHOR_NAME, AUTHOR_EMAIL, WEBSITE, ISSUE_TRACKER, SOURCE_CODE, WHATSNEW, LICENSE, AUTHOR_NAME, AUTHOR_EMAIL, WEBSITE, ISSUE_TRACKER, SOURCE_CODE,
VIDEO, CHANGELOG, DONATE, BITCOIN, LITECOIN, FLATTR_ID, LIBERAPAY_ID, TRANSLATION, VIDEO, CHANGELOG, DONATE, BITCOIN, LITECOIN, FLATTR_ID, LIBERAPAY_ID,
UPSTREAM_VERSION_NAME, UPSTREAM_VERSION_CODE, ADDED, LAST_UPDATED, UPSTREAM_VERSION_NAME, UPSTREAM_VERSION_CODE, ADDED, LAST_UPDATED,
ANTI_FEATURES, REQUIREMENTS, ICON_URL, ANTI_FEATURES, REQUIREMENTS, ICON_URL,
FEATURE_GRAPHIC, PROMO_GRAPHIC, TV_BANNER, PHONE_SCREENSHOTS, FEATURE_GRAPHIC, PROMO_GRAPHIC, TV_BANNER, PHONE_SCREENSHOTS,
SEVEN_INCH_SCREENSHOTS, TEN_INCH_SCREENSHOTS, TV_SCREENSHOTS, WEAR_SCREENSHOTS, SEVEN_INCH_SCREENSHOTS, TEN_INCH_SCREENSHOTS, TV_SCREENSHOTS, WEAR_SCREENSHOTS,
PREFERRED_SIGNER, SUGGESTED_VERSION_CODE, IS_APK, SuggestedApk.VERSION_NAME, PREFERRED_SIGNER, SUGGESTED_VERSION_CODE, IS_APK, IS_LOCALIZED, SuggestedApk.VERSION_NAME,
InstalledApp.VERSION_CODE, InstalledApp.VERSION_NAME, InstalledApp.VERSION_CODE, InstalledApp.VERSION_NAME,
InstalledApp.SIGNATURE, Package.PACKAGE_NAME, InstalledApp.SIGNATURE, Package.PACKAGE_NAME,
}; };

View File

@ -981,6 +981,11 @@ public class AppDetailsRecyclerViewAdapter
addLinkItemView(contentView, R.string.menu_issues, R.drawable.ic_issues, app.issueTracker); addLinkItemView(contentView, R.string.menu_issues, R.drawable.ic_issues, app.issueTracker);
} }
// Translation button
if (uriIsSetAndCanBeOpened(app.translation)) {
addLinkItemView(contentView, R.string.menu_translation, R.drawable.ic_translation, app.translation);
}
// Changelog button // Changelog button
if (uriIsSetAndCanBeOpened(app.changelog)) { if (uriIsSetAndCanBeOpened(app.changelog)) {
addLinkItemView(contentView, R.string.menu_changelog, R.drawable.ic_changelog, app.changelog); addLinkItemView(contentView, R.string.menu_changelog, R.drawable.ic_changelog, app.changelog);

View File

@ -23,12 +23,13 @@ import org.fdroid.fdroid.UpdateService;
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.RepoProvider; import org.fdroid.fdroid.data.RepoProvider;
import org.fdroid.fdroid.data.Schema; import org.fdroid.fdroid.data.Schema.AppMetadataTable;
import org.fdroid.fdroid.views.apps.AppListActivity; import org.fdroid.fdroid.views.apps.AppListActivity;
import org.fdroid.fdroid.views.hiding.HidingManager; import org.fdroid.fdroid.views.hiding.HidingManager;
import org.fdroid.fdroid.views.whatsnew.WhatsNewAdapter; import org.fdroid.fdroid.views.whatsnew.WhatsNewAdapter;
import java.util.Date; import java.util.Date;
import java.util.Locale;
/** /**
* Loads a list of newly added or recently updated apps and displays them to the user. * Loads a list of newly added or recently updated apps and displays them to the user.
@ -100,11 +101,31 @@ class WhatsNewViewBinder implements LoaderManager.LoaderCallbacks<Cursor> {
return null; return null;
} }
// select that have all required items:
String selection = "(" + AppMetadataTable.NAME + "." + AppMetadataTable.Cols.NAME + " != ''"
+ " AND " + AppMetadataTable.NAME + "." + AppMetadataTable.Cols.SUMMARY + " != ''"
+ " AND " + AppMetadataTable.NAME + "." + AppMetadataTable.Cols.DESCRIPTION + " != ''"
+ " AND " + AppMetadataTable.NAME + "." + AppMetadataTable.Cols.LICENSE + " != ''"
+ " AND " + AppMetadataTable.NAME + "." + AppMetadataTable.Cols.WHATSNEW + " != ''";
if (!"en".equals(Locale.getDefault().getLanguage())) {
// only require localization if using a non-English locale
selection += " AND " + AppMetadataTable.NAME + "." + AppMetadataTable.Cols.IS_LOCALIZED + " = 1";
}
// and at least one optional item:
selection += ") AND ("
+ AppMetadataTable.NAME + "." + AppMetadataTable.Cols.SEVEN_INCH_SCREENSHOTS + " IS NOT NULL "
+ " OR " + AppMetadataTable.NAME + "." + AppMetadataTable.Cols.PHONE_SCREENSHOTS + " IS NOT NULL "
+ " OR " + AppMetadataTable.NAME + "." + AppMetadataTable.Cols.TEN_INCH_SCREENSHOTS + " IS NOT NULL "
+ " OR " + AppMetadataTable.NAME + "." + AppMetadataTable.Cols.TV_SCREENSHOTS + " IS NOT NULL "
+ " OR " + AppMetadataTable.NAME + "." + AppMetadataTable.Cols.WEAR_SCREENSHOTS + " IS NOT NULL "
+ " OR " + AppMetadataTable.NAME + "." + AppMetadataTable.Cols.FEATURE_GRAPHIC + " IS NOT NULL "
+ ")";
return new CursorLoader( return new CursorLoader(
activity, activity,
AppProvider.getRecentlyUpdatedUri(), AppProvider.getRecentlyUpdatedUri(),
Schema.AppMetadataTable.Cols.ALL, AppMetadataTable.Cols.ALL,
null, selection,
null, null,
null null
); );

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#666666"
android:pathData="M12.87,15.07l-2.54,-2.51 0.03,-0.03c1.74,-1.94 2.98,-4.17 3.71,-6.53L17,6L17,4h-7L10,2L8,2v2L1,4v1.99h11.17C11.5,7.92 10.44,9.75 9,11.35 8.07,10.32 7.3,9.19 6.69,8h-2c0.73,1.63 1.73,3.17 2.98,4.56l-5.09,5.02L4,19l5,-5 3.11,3.11 0.76,-2.04zM18.5,10h-2L12,22h2l1.12,-3h4.75L21,22h2l-4.5,-12zM15.88,17l1.62,-4.33L19.12,17h-3.24z"/>
</vector>

View File

@ -210,11 +210,18 @@ This often occurs with apps installed via Google Play or other sources, if they
<string name="menu_ignore_this">Ignore This Update</string> <string name="menu_ignore_this">Ignore This Update</string>
<string name="menu_website">Website</string> <string name="menu_website">Website</string>
<string name="menu_email">E-Mail Author</string> <string name="menu_email">E-Mail Author</string>
<!-- The title for the link that points to the issue tracker for this app -->
<string name="menu_issues">Issues</string> <string name="menu_issues">Issues</string>
<!-- The title for the link that points to the Changelog document for this app -->
<string name="menu_changelog">Changelog</string> <string name="menu_changelog">Changelog</string>
<!-- The title for the link that points to a demo video for this app -->
<string name="menu_video">Video</string> <string name="menu_video">Video</string>
<!-- The title for the link that points to the license for this app -->
<string name="menu_license">License: %s</string> <string name="menu_license">License: %s</string>
<!-- The title for the link that points to the source code for this app -->
<string name="menu_source">Source Code</string> <string name="menu_source">Source Code</string>
<!-- The title for the link that points to the translation service for this app -->
<string name="menu_translation">Translation</string>
<string name="menu_upgrade">Update</string> <string name="menu_upgrade">Update</string>
<string name="menu_downgrade">Downgrade</string> <string name="menu_downgrade">Downgrade</string>
<string name="menu_donate">Donate</string> <string name="menu_donate">Donate</string>

View File

@ -329,6 +329,7 @@ public class IndexV1UpdaterTest extends FDroidProviderTest {
"suggestedVersionName", "suggestedVersionName",
"summary", "summary",
"tenInchScreenshots", "tenInchScreenshots",
"translation",
"tvBanner", "tvBanner",
"tvScreenshots", "tvScreenshots",
"upstreamVersionCode", "upstreamVersionCode",
@ -347,6 +348,7 @@ public class IndexV1UpdaterTest extends FDroidProviderTest {
"installedVersionCode", "installedVersionCode",
"installedVersionName", "installedVersionName",
"isApk", "isApk",
"isLocalized",
"preferredSigner", "preferredSigner",
"prefs", "prefs",
"TAG", "TAG",