From e0cb3f8afcbbbfc700aad25ef9dab98fe5b08222 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 14 Jul 2020 19:28:46 +0200 Subject: [PATCH] App.isLocalized() marks whether relevant translations are available !886 --- CHANGELOG.md | 2 + .../main/java/org/fdroid/fdroid/data/App.java | 18 ++++-- .../fdroid/fdroid/data/AppProviderTest.java | 64 +++++++++++++++++++ 3 files changed, 77 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b304389a1..5a97854fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ ### 1.10-alpha0 (2020-07-20) +* Latest Tab will show better results on non-English devices + * updates to core libraries (Jackson, androidx, gradle, etc) * use Gradle's new dependency verification 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 bebbfe534..386623b67 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/App.java +++ b/app/src/main/java/org/fdroid/fdroid/data/App.java @@ -15,15 +15,13 @@ import android.os.Environment; import android.os.LocaleList; import android.os.Parcel; import android.os.Parcelable; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import android.text.TextUtils; import android.util.Log; - +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; 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; @@ -101,7 +99,7 @@ public class App extends ValueObject implements Comparable, Parcelable { @JsonIgnore public boolean isApk; @JsonIgnore - private boolean isLocalized = false; + boolean isLocalized = false; /** * This is primarily for the purpose of saving app metadata when parsing an index.xml file. @@ -517,7 +515,7 @@ public class App extends ValueObject implements Comparable, Parcelable { * on other country-specific locales, rather than English. */ @JsonProperty("localized") - private void setLocalized(Map> localized) { // NOPMD + void setLocalized(Map> localized) { // NOPMD Locale defaultLocale = Locale.getDefault(); String languageTag = defaultLocale.getLanguage(); String countryTag = defaultLocale.getCountry(); @@ -571,7 +569,13 @@ public class App extends ValueObject implements Comparable, Parcelable { } } - if (localesToUse.size() >= 1) { + for (String l : localesToUse) { + if (l.startsWith(languageTag)) { + isLocalized = true; + break; + } + } + if (localesToUse.size() > 1) { isLocalized = true; } diff --git a/app/src/test/java/org/fdroid/fdroid/data/AppProviderTest.java b/app/src/test/java/org/fdroid/fdroid/data/AppProviderTest.java index 47dd43a28..c35ccd1cf 100644 --- a/app/src/test/java/org/fdroid/fdroid/data/AppProviderTest.java +++ b/app/src/test/java/org/fdroid/fdroid/data/AppProviderTest.java @@ -9,6 +9,7 @@ import android.net.Uri; import org.fdroid.fdroid.Preferences; import org.fdroid.fdroid.TestUtils; import org.fdroid.fdroid.data.Schema.AppMetadataTable.Cols; +import org.junit.After; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; @@ -17,7 +18,10 @@ import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Locale; +import java.util.Map; import java.util.TimeZone; import static org.fdroid.fdroid.Assert.assertContainsOnly; @@ -36,6 +40,8 @@ public class AppProviderTest extends FDroidProviderTest { private static final String[] PROJ = Cols.ALL; + private static Locale defaultLocale; + @BeforeClass public static void setRandomTimeZone() { TimeZone.setDefault(TimeZone.getTimeZone(String.format("GMT-%d:%02d", @@ -45,10 +51,16 @@ public class AppProviderTest extends FDroidProviderTest { @Before public void setup() { + defaultLocale = Locale.getDefault(); TestUtils.registerContentProvider(AppProvider.getAuthority(), AppProvider.class); Preferences.setupForTests(context); } + @After + public void teardown() { + Locale.setDefault(defaultLocale); + } + /** * Although this doesn't directly relate to the {@link AppProvider}, it is here because * the {@link AppProvider} used to stumble across this bug when asking for installed apps, @@ -268,6 +280,58 @@ public class AppProviderTest extends FDroidProviderTest { assertEquals("F-Droid", otherApp.name); } + @Test + public void testAppSetLocalized() { + final String enSummary = "utility for getting information about the APKs that are installed on your device"; + HashMap en = new HashMap<>(); + en.put("summary", enSummary); + + final String esSummary = "utilidad para obtener información sobre los APKs instalados en su dispositivo"; + HashMap es = new HashMap<>(); + es.put("summary", esSummary); + + final String frSummary = "utilitaire pour obtenir des informations sur les APKs qui sont installés sur vot"; + HashMap fr = new HashMap<>(); + fr.put("summary", frSummary); + + final String nlSummary = "hulpprogramma voor het verkrijgen van informatie over de APK die zijn geïnstalle"; + HashMap nl = new HashMap<>(); + nl.put("summary", nlSummary); + + App app = new App(); + Map> localized = new HashMap<>(); + localized.put("es", es); + localized.put("fr", fr); + + Locale.setDefault(new Locale("nl", "NL")); + app.setLocalized(localized); + assertFalse(app.isLocalized); + + localized.put("nl", nl); + app.setLocalized(localized); + assertTrue(app.isLocalized); + assertEquals(nlSummary, app.summary); + + app = new App(); + localized.clear(); + localized.put("nl", nl); + app.setLocalized(localized); + assertTrue(app.isLocalized); + + app = new App(); + localized.clear(); + localized.put("en-US", en); + app.setLocalized(localized); + assertFalse(app.isLocalized); + + Locale.setDefault(new Locale("en", "US")); + app = new App(); + localized.clear(); + localized.put("en-US", en); + app.setLocalized(localized); + assertTrue(app.isLocalized); + } + @Test public void testInsertTrimsNamesAndSummary() { // Insert a new record with unwanted newlines...